]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-cached-block-reads-the-common-case.patch
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.suse / ocfs2-Make-cached-block-reads-the-common-case.patch
diff --git a/src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-cached-block-reads-the-common-case.patch b/src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-cached-block-reads-the-common-case.patch
new file mode 100644 (file)
index 0000000..23eb293
--- /dev/null
@@ -0,0 +1,205 @@
+From: Joel Becker <joel.becker@oracle.com>
+Subject: ocfs2: Make cached block reads the common case.
+Patch-mainline: 2.6.28
+
+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 |   19 +++++++++++--------
+ fs/ocfs2/buffer_head_io.h |    4 ++--
+ fs/ocfs2/dir.c            |    2 +-
+ fs/ocfs2/inode.c          |    3 ++-
+ fs/ocfs2/journal.c        |    3 ++-
+ fs/ocfs2/localalloc.c     |    4 ++--
+ fs/ocfs2/slot_map.c       |    6 ++++--
+ 7 files changed, 24 insertions(+), 17 deletions(-)
+
+Index: linux-2.6.27/fs/ocfs2/buffer_head_io.c
+===================================================================
+--- linux-2.6.27.orig/fs/ocfs2/buffer_head_io.c
++++ linux-2.6.27/fs/ocfs2/buffer_head_io.c
+@@ -181,7 +181,8 @@ int ocfs2_read_blocks(struct inode *inod
+                  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 *inod
+                       }
+               }
+               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 *inod
+                *    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 *inod
+                        * 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 *inod
+       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: linux-2.6.27/fs/ocfs2/buffer_head_io.h
+===================================================================
+--- linux-2.6.27.orig/fs/ocfs2/buffer_head_io.h
++++ linux-2.6.27/fs/ocfs2/buffer_head_io.h
+@@ -49,7 +49,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_
+ 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(struc
+               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: linux-2.6.27/fs/ocfs2/dir.c
+===================================================================
+--- linux-2.6.27.orig/fs/ocfs2/dir.c
++++ linux-2.6.27/fs/ocfs2/dir.c
+@@ -88,7 +88,7 @@ static struct buffer_head *ocfs2_bread(s
+       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: linux-2.6.27/fs/ocfs2/inode.c
+===================================================================
+--- linux-2.6.27.orig/fs/ocfs2/inode.c
++++ linux-2.6.27/fs/ocfs2/inode.c
+@@ -461,7 +461,8 @@ static int ocfs2_read_locked_inode(struc
+       }
+       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: linux-2.6.27/fs/ocfs2/journal.c
+===================================================================
+--- linux-2.6.27.orig/fs/ocfs2/journal.c
++++ linux-2.6.27/fs/ocfs2/journal.c
+@@ -1134,7 +1134,8 @@ static int ocfs2_read_journal_inode(stru
+       }
+       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: linux-2.6.27/fs/ocfs2/localalloc.c
+===================================================================
+--- linux-2.6.27.orig/fs/ocfs2/localalloc.c
++++ linux-2.6.27/fs/ocfs2/localalloc.c
+@@ -249,7 +249,7 @@ int ocfs2_load_local_alloc(struct ocfs2_
+       }
+       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(str
+       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: linux-2.6.27/fs/ocfs2/slot_map.c
+===================================================================
+--- linux-2.6.27.orig/fs/ocfs2/slot_map.c
++++ linux-2.6.27/fs/ocfs2/slot_map.c
+@@ -150,7 +150,8 @@ int ocfs2_refresh_slot_info(struct ocfs2
+        * 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
+                    (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;