ocfs2: Make cached block reads the common case.
authorJoel Becker <joel.becker@oracle.com>
Fri, 10 Oct 2008 00:20:34 +0000 (17:20 -0700)
committerMark Fasheh <mfasheh@suse.com>
Tue, 14 Oct 2008 18:58:22 +0000 (11:58 -0700)
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: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
fs/ocfs2/buffer_head_io.c
fs/ocfs2/buffer_head_io.h
fs/ocfs2/dir.c
fs/ocfs2/inode.c
fs/ocfs2/journal.c
fs/ocfs2/localalloc.c
fs/ocfs2/slot_map.c

index 718dbe5607ca744f902febbcf9bc0bbf6da9a5e0..7e947c6724694c74f7a1658392f83e15970fb7cd 100644 (file)
@@ -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:
 
index a2ef9e5f8bfe4ae8dc1da77236efc7ab28add4c6..75e1dcb1ade7d19d92a70684f1d3daaf851c67ed 100644 (file)
@@ -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;
index 60be3ba1f5dc4ef540f75232698bb5df9ec60874..026e6eb85187844b60ba55eb9893651090ac1c4f 100644 (file)
@@ -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;
index 8381c26b21a84bfb3c1ffc99820f8a1758b69fc0..4903688f72a9314f03ab66183de3104b54a3eed1 100644 (file)
@@ -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) {
index d161fe5e3bde908ea3201db01661ab69b8a1d7a7..81e40677eecbddf989722e51f0336f43d6f84ff8 100644 (file)
@@ -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;
index 3ea740d15feb73502d4e609e01f51284659164bd..687b28713c3253631b3588ceb41d90ca51cfa867 100644 (file)
@@ -249,7 +249,7 @@ int ocfs2_load_local_alloc(struct ocfs2_super *osb)
        }
 
        status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1,
-                                  &alloc_bh, 0);
+                                  &alloc_bh, OCFS2_BH_IGNORE_CACHE);
        if (status < 0) {
                mlog_errno(status);
                goto bail;
@@ -460,7 +460,7 @@ int ocfs2_begin_local_alloc_recovery(struct ocfs2_super *osb,
        mutex_lock(&inode->i_mutex);
 
        status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1,
-                                  &alloc_bh, 0);
+                                  &alloc_bh, OCFS2_BH_IGNORE_CACHE);
        if (status < 0) {
                mlog_errno(status);
                goto bail;
index 357d3fe18c3fe0e4caae57651d3f4abece4dbc12..bdda2d8f85080a5a883c1b01b4cc1fbe68d83d18 100644 (file)
@@ -150,7 +150,8 @@ int ocfs2_refresh_slot_info(struct ocfs2_super *osb)
         * be !NULL.  Thus, ocfs2_read_blocks() will ignore blocknr.  If
         * this is not true, the read of -1 (UINT64_MAX) will fail.
         */
-       ret = ocfs2_read_blocks(si->si_inode, -1, si->si_blocks, si->si_bh, 0);
+       ret = ocfs2_read_blocks(si->si_inode, -1, si->si_blocks, si->si_bh,
+                               OCFS2_BH_IGNORE_CACHE);
        if (ret == 0) {
                spin_lock(&osb->osb_lock);
                ocfs2_update_slot_info(si);
@@ -403,7 +404,8 @@ static int ocfs2_map_slot_buffers(struct ocfs2_super *osb,
                     (unsigned long long)blkno);
 
                bh = NULL;  /* Acquire a fresh bh */
-               status = ocfs2_read_blocks(si->si_inode, blkno, 1, &bh, 0);
+               status = ocfs2_read_blocks(si->si_inode, blkno, 1, &bh,
+                                          OCFS2_BH_IGNORE_CACHE);
                if (status < 0) {
                        mlog_errno(status);
                        goto bail;