Commit d6b58f89 authored by Mark Fasheh's avatar Mark Fasheh

ocfs2: fix regression in ocfs2_read_blocks_sync()

We're panicing in ocfs2_read_blocks_sync() if a jbd-managed buffer is seen.
At first glance, this seems ok but in reality it can happen. My test case
was to just run 'exorcist'. A struct inode is being pushed out of memory but
is then re-read at a later time, before the buffer has been checkpointed by
jbd. This causes a BUG to be hit in ocfs2_read_blocks_sync().
Reviewed-by: default avatarJoel Becker <joel.becker@oracle.com>
Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
parent 07d9a395
...@@ -112,7 +112,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, ...@@ -112,7 +112,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block,
bh = bhs[i]; bh = bhs[i];
if (buffer_jbd(bh)) { if (buffer_jbd(bh)) {
mlog(ML_ERROR, mlog(ML_BH_IO,
"trying to sync read a jbd " "trying to sync read a jbd "
"managed bh (blocknr = %llu), skipping\n", "managed bh (blocknr = %llu), skipping\n",
(unsigned long long)bh->b_blocknr); (unsigned long long)bh->b_blocknr);
...@@ -147,15 +147,10 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, ...@@ -147,15 +147,10 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block,
for (i = nr; i > 0; i--) { for (i = nr; i > 0; i--) {
bh = bhs[i - 1]; bh = bhs[i - 1];
if (buffer_jbd(bh)) { /* No need to wait on the buffer if it's managed by JBD. */
mlog(ML_ERROR, if (!buffer_jbd(bh))
"the journal got the buffer while it was "
"locked for io! (blocknr = %llu)\n",
(unsigned long long)bh->b_blocknr);
BUG();
}
wait_on_buffer(bh); wait_on_buffer(bh);
if (!buffer_uptodate(bh)) { if (!buffer_uptodate(bh)) {
/* Status won't be cleared from here on out, /* Status won't be cleared from here on out,
* so we can safely record this and loop back * so we can safely record this and loop back
...@@ -251,8 +246,6 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, ...@@ -251,8 +246,6 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
ignore_cache = 1; ignore_cache = 1;
} }
/* XXX: Can we ever get this and *not* have the cached
* flag set? */
if (buffer_jbd(bh)) { if (buffer_jbd(bh)) {
if (ignore_cache) if (ignore_cache)
mlog(ML_BH_IO, "trying to sync read a jbd " mlog(ML_BH_IO, "trying to sync read a jbd "
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment