Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d6b58f89 authored by Mark Fasheh's avatar Mark Fasheh
Browse files

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
Loading
Loading
Loading
Loading
+4 −11
Original line number Original line Diff line number Diff line
@@ -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,
	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,
			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 "