xfs: Add verifiers to dir2 data readahead.
authorDave Chinner <dchinner@redhat.com>
Mon, 12 Nov 2012 11:54:18 +0000 (22:54 +1100)
committerBen Myers <bpm@sgi.com>
Fri, 16 Nov 2012 03:34:57 +0000 (21:34 -0600)
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Phil White <pwhite@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
fs/xfs/xfs_da_btree.c
fs/xfs/xfs_da_btree.h
fs/xfs/xfs_dir2_data.c
fs/xfs/xfs_dir2_leaf.c
fs/xfs/xfs_dir2_priv.h
fs/xfs/xfs_file.c

index 1b84fc50a05387fb5ebfc3fe154fad7dac4191c4..93ebc0fc6dd9895275b0e7ee5152cf377e4723d6 100644 (file)
@@ -2285,10 +2285,10 @@ xfs_da_reada_buf(
        struct xfs_trans        *trans,
        struct xfs_inode        *dp,
        xfs_dablk_t             bno,
+       xfs_daddr_t             mappedbno,
        int                     whichfork,
        xfs_buf_iodone_t        verifier)
 {
-       xfs_daddr_t             mappedbno = -1;
        struct xfs_buf_map      map;
        struct xfs_buf_map      *mapp;
        int                     nmap;
@@ -2296,7 +2296,7 @@ xfs_da_reada_buf(
 
        mapp = &map;
        nmap = 1;
-       error = xfs_dabuf_map(trans, dp, bno, -1, whichfork,
+       error = xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork,
                                &mapp, &nmap);
        if (error) {
                /* mapping a hole is not an error, but we don't continue */
index 2d1bec4b75951ec1304aef3e94131e171950c85b..521b008445ab526ab8e8d4de3a14c83507861265 100644 (file)
@@ -231,8 +231,8 @@ int xfs_da_read_buf(struct xfs_trans *trans, struct xfs_inode *dp,
                               struct xfs_buf **bpp, int whichfork,
                               xfs_buf_iodone_t verifier);
 xfs_daddr_t    xfs_da_reada_buf(struct xfs_trans *trans, struct xfs_inode *dp,
-                               xfs_dablk_t bno, int whichfork,
-                               xfs_buf_iodone_t verifier);
+                               xfs_dablk_t bno, xfs_daddr_t mapped_bno,
+                               int whichfork, xfs_buf_iodone_t verifier);
 int    xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno,
                                          struct xfs_buf *dead_buf);
 
index 0ef04f1bf51123722b09d3ca1502715c1d44a1a4..1a43c8593c0077787781f73a8df28c8479fec1c8 100644 (file)
@@ -185,7 +185,7 @@ __xfs_dir2_data_check(
        return 0;
 }
 
-static void
+void
 xfs_dir2_data_verify(
        struct xfs_buf          *bp)
 {
@@ -217,6 +217,17 @@ xfs_dir2_data_read(
                                        XFS_DATA_FORK, xfs_dir2_data_verify);
 }
 
+int
+xfs_dir2_data_readahead(
+       struct xfs_trans        *tp,
+       struct xfs_inode        *dp,
+       xfs_dablk_t             bno,
+       xfs_daddr_t             mapped_bno)
+{
+       return xfs_da_reada_buf(tp, dp, bno, mapped_bno,
+                                       XFS_DATA_FORK, xfs_dir2_data_verify);
+}
+
 /*
  * Given a data block and an unused entry from that block,
  * return the bestfree entry if any that corresponds to it.
index 67cc21c2a45dbc43619f0a42cdc42ab94e41e809..8a95547d42ac7b72a8dbca3fcea0cf1b7e224b29 100644 (file)
@@ -972,11 +972,11 @@ xfs_dir2_leaf_readbuf(
                 */
                if (i > mip->ra_current &&
                    map[mip->ra_index].br_blockcount >= mp->m_dirblkfsbs) {
-                       xfs_buf_readahead(mp->m_ddev_targp,
+                       xfs_dir2_data_readahead(NULL, dp,
+                               map[mip->ra_index].br_startoff + mip->ra_offset,
                                XFS_FSB_TO_DADDR(mp,
                                        map[mip->ra_index].br_startblock +
-                                                       mip->ra_offset),
-                               (int)BTOBB(mp->m_dirblksize), NULL);
+                                                       mip->ra_offset));
                        mip->ra_current = i;
                }
 
@@ -985,10 +985,9 @@ xfs_dir2_leaf_readbuf(
                 * use our mapping, but this is a very rare case.
                 */
                else if (i > mip->ra_current) {
-                       xfs_da_reada_buf(NULL, dp,
+                       xfs_dir2_data_readahead(NULL, dp,
                                        map[mip->ra_index].br_startoff +
-                                                       mip->ra_offset,
-                                       XFS_DATA_FORK, NULL);
+                                                       mip->ra_offset, -1);
                        mip->ra_current = i;
                }
 
index e0b96e7693ea2d6e15d6f65b164a8bef33353d66..daf5d0fc6165a939915d068460226d4ca2327360 100644 (file)
@@ -48,6 +48,8 @@ extern int xfs_dir2_leaf_to_block(struct xfs_da_args *args,
 extern int __xfs_dir2_data_check(struct xfs_inode *dp, struct xfs_buf *bp);
 extern int xfs_dir2_data_read(struct xfs_trans *tp, struct xfs_inode *dp,
                xfs_dablk_t bno, xfs_daddr_t mapped_bno, struct xfs_buf **bpp);
+extern int xfs_dir2_data_readahead(struct xfs_trans *tp, struct xfs_inode *dp,
+               xfs_dablk_t bno, xfs_daddr_t mapped_bno);
 
 extern struct xfs_dir2_data_free *
 xfs_dir2_data_freeinsert(struct xfs_dir2_data_hdr *hdr,
index f6dab7da7bcc5b707ecac67fb16e64af16e91d39..400b187595bb5454383362d9e60af40a5ab2aa35 100644 (file)
@@ -31,6 +31,8 @@
 #include "xfs_error.h"
 #include "xfs_vnodeops.h"
 #include "xfs_da_btree.h"
+#include "xfs_dir2_format.h"
+#include "xfs_dir2_priv.h"
 #include "xfs_ioctl.h"
 #include "xfs_trace.h"
 
@@ -891,7 +893,7 @@ xfs_dir_open(
         */
        mode = xfs_ilock_map_shared(ip);
        if (ip->i_d.di_nextents > 0)
-               xfs_da_reada_buf(NULL, ip, 0, XFS_DATA_FORK, NULL);
+               xfs_dir2_data_readahead(NULL, ip, 0, -1);
        xfs_iunlock(ip, mode);
        return 0;
 }