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

Commit d4a8c93c authored by Joel Becker's avatar Joel Becker Committed by Mark Fasheh
Browse files

ocfs2: Make cached block reads the common case.



ocfs2_read_blocks() currently requires the CACHED flag for cached I/O.
However, that's the common case.  Let's flip it around and provide an
IGNORE_CACHE flag for the special users.  This has the added benefit of
cleaning up the code some (ignore_cache takes on its special meaning
earlier in the loop).

Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
parent 5e0b3dec
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -181,7 +181,8 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
		   inode, (unsigned long long)block, nr, flags);

	BUG_ON(!inode);
	BUG_ON((flags & OCFS2_BH_READAHEAD) && !(flags & OCFS2_BH_CACHED));
	BUG_ON((flags & OCFS2_BH_READAHEAD) &&
	       (flags & OCFS2_BH_IGNORE_CACHE));

	if (bhs == NULL) {
		status = -EINVAL;
@@ -214,7 +215,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
			}
		}
		bh = bhs[i];
		ignore_cache = 0;
		ignore_cache = (flags & OCFS2_BH_IGNORE_CACHE);

		/* There are three read-ahead cases here which we need to
		 * be concerned with. All three assume a buffer has
@@ -240,26 +241,27 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
		 *    before our is-it-in-flight check.
		 */

		if (flags & OCFS2_BH_CACHED &&
		    !ocfs2_buffer_uptodate(inode, bh)) {
		if (!ignore_cache && !ocfs2_buffer_uptodate(inode, bh)) {
			mlog(ML_UPTODATE,
			     "bh (%llu), inode %llu not uptodate\n",
			     (unsigned long long)bh->b_blocknr,
			     (unsigned long long)OCFS2_I(inode)->ip_blkno);
			/* We're using ignore_cache here to say
			 * "go to disk" */
			ignore_cache = 1;
		}

		/* XXX: Can we ever get this and *not* have the cached
		 * flag set? */
		if (buffer_jbd(bh)) {
			if (!(flags & OCFS2_BH_CACHED) || ignore_cache)
			if (ignore_cache)
				mlog(ML_BH_IO, "trying to sync read a jbd "
					       "managed bh (blocknr = %llu)\n",
				     (unsigned long long)bh->b_blocknr);
			continue;
		}

		if (!(flags & OCFS2_BH_CACHED) || ignore_cache) {
		if (ignore_cache) {
			if (buffer_dirty(bh)) {
				/* This should probably be a BUG, or
				 * at least return an error. */
@@ -294,7 +296,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
			 * previously read-ahead buffer may have
			 * completed I/O while we were waiting for the
			 * buffer lock. */
			if ((flags & OCFS2_BH_CACHED)
			if (!(flags & OCFS2_BH_IGNORE_CACHE)
			    && !(flags & OCFS2_BH_READAHEAD)
			    && ocfs2_buffer_uptodate(inode, bh)) {
				unlock_buffer(bh);
@@ -344,7 +346,8 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,

	mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n", 
	     (unsigned long long)block, nr,
	     (!(flags & OCFS2_BH_CACHED) || ignore_cache) ? "no" : "yes", flags);
	     ((flags & OCFS2_BH_IGNORE_CACHE) || ignore_cache) ? "no" : "yes",
	     flags);

bail:

+2 −2
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block,
int ocfs2_write_super_or_backup(struct ocfs2_super *osb,
				struct buffer_head *bh);

#define OCFS2_BH_CACHED            1
#define OCFS2_BH_IGNORE_CACHE      1
#define OCFS2_BH_READAHEAD         8

static inline int ocfs2_read_block(struct inode *inode, u64 off,
@@ -63,7 +63,7 @@ static inline int ocfs2_read_block(struct inode *inode, u64 off,
		goto bail;
	}

	status = ocfs2_read_blocks(inode, off, 1, bh, OCFS2_BH_CACHED);
	status = ocfs2_read_blocks(inode, off, 1, bh, 0);

bail:
	return status;
+1 −1
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ static struct buffer_head *ocfs2_bread(struct inode *inode,
	struct buffer_head *bh = NULL;
	int tmperr;
	u64 p_blkno;
	int readflags = OCFS2_BH_CACHED;
	int readflags = 0;

	if (reada)
		readflags |= OCFS2_BH_READAHEAD;
+2 −1
Original line number Diff line number Diff line
@@ -461,7 +461,8 @@ static int ocfs2_read_locked_inode(struct inode *inode,
	}

	if (can_lock)
		status = ocfs2_read_blocks(inode, args->fi_blkno, 1, &bh, 0);
		status = ocfs2_read_blocks(inode, args->fi_blkno, 1, &bh,
					   OCFS2_BH_IGNORE_CACHE);
	else
		status = ocfs2_read_blocks_sync(osb, args->fi_blkno, 1, &bh);
	if (status < 0) {
+2 −1
Original line number Diff line number Diff line
@@ -1134,7 +1134,8 @@ static int ocfs2_read_journal_inode(struct ocfs2_super *osb,
	}
	SET_INODE_JOURNAL(inode);

	status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, bh, 0);
	status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, bh,
				   OCFS2_BH_IGNORE_CACHE);
	if (status < 0) {
		mlog_errno(status);
		goto bail;
Loading