]> git.hungrycats.org Git - linux/commitdiff
Proper implementation of jfs_get_blocks
authorDave Kleikamp <shaggy@kleikamp.austin.ibm.com>
Fri, 30 Aug 2002 08:21:28 +0000 (03:21 -0500)
committerDave Kleikamp <shaggy@kleikamp.austin.ibm.com>
Fri, 30 Aug 2002 08:21:28 +0000 (03:21 -0500)
jfs_get_blocks should return up to the number of blocks in the
extent rather than limiting itself to one block, as the initial,
trivial implementation did.  This greatly reduces the overhead of
O_DIRECT reads and writes.

Submitted by Badari Pulavarty (pbadari@us.ibm.com)

fs/jfs/inode.c

index 21499e73d2dff5f1995d452437190c7a952f01a0..5eeff1090b9f244a74857bf00a7223d986a96c0b 100644 (file)
@@ -165,8 +165,9 @@ void jfs_dirty_inode(struct inode *inode)
        set_cflag(COMMIT_Dirty, inode);
 }
 
-static int jfs_get_block(struct inode *ip, sector_t lblock,
-                        struct buffer_head *bh_result, int create)
+static int
+jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks,
+                       struct buffer_head *bh_result, int create)
 {
        s64 lblock64 = lblock;
        int no_size_check = 0;
@@ -202,7 +203,7 @@ static int jfs_get_block(struct inode *ip, sector_t lblock,
 
        if ((no_size_check ||
             ((lblock64 << ip->i_sb->s_blocksize_bits) < ip->i_size)) &&
-           (xtLookup(ip, lblock64, 1, &xflag, &xaddr, &xlen, no_size_check)
+           (xtLookup(ip, lblock64, max_blocks, &xflag, &xaddr, &xlen, no_size_check)
             == 0) && xlen) {
                if (xflag & XAD_NOTRECORDED) {
                        if (!create)
@@ -230,6 +231,7 @@ static int jfs_get_block(struct inode *ip, sector_t lblock,
                }
 
                map_bh(bh_result, ip->i_sb, xaddr);
+               bh_result->b_size = xlen << ip->i_blkbits;
                goto unlock;
        }
        if (!create)
@@ -241,12 +243,13 @@ static int jfs_get_block(struct inode *ip, sector_t lblock,
 #ifdef _JFS_4K
        if ((rc = extHint(ip, lblock64 << ip->i_sb->s_blocksize_bits, &xad)))
                goto unlock;
-       rc = extAlloc(ip, 1, lblock64, &xad, FALSE);
+       rc = extAlloc(ip, max_blocks, lblock64, &xad, FALSE);
        if (rc)
                goto unlock;
 
        set_buffer_new(bh_result);
        map_bh(bh_result, ip->i_sb, addressXAD(&xad));
+       bh_result->b_size = lengthXAD(&xad) << ip->i_blkbits;
 
 #else                          /* _JFS_4K */
        /*
@@ -269,6 +272,12 @@ static int jfs_get_block(struct inode *ip, sector_t lblock,
        return -rc;
 }
 
+static int jfs_get_block(struct inode *ip, sector_t lblock,
+                        struct buffer_head *bh_result, int create)
+{
+       return jfs_get_blocks(ip, lblock, 1, bh_result, create);
+}
+
 static int jfs_writepage(struct page *page)
 {
        return block_write_full_page(page, jfs_get_block);
@@ -301,18 +310,6 @@ static int jfs_bmap(struct address_space *mapping, long block)
        return generic_block_bmap(mapping, block, jfs_get_block);
 }
 
-static int
-jfs_get_blocks(struct inode *inode, sector_t iblock, unsigned long max_blocks,
-                       struct buffer_head *bh_result, int create)
-{
-       int ret;
-
-       ret = jfs_get_block(inode, iblock, bh_result, create);
-       if (ret == 0)
-               bh_result->b_size = (1 << inode->i_blkbits);
-       return ret;
-}
-
 static int jfs_direct_IO(int rw, struct inode *inode, char *buf,
                        loff_t offset, size_t count)
 {