From ee1aaacdf386f0f786de11524995b0513a314c8c Mon Sep 17 00:00:00 2001 From: Dave Kleikamp Date: Fri, 30 Aug 2002 03:21:28 -0500 Subject: [PATCH] Proper implementation of jfs_get_blocks 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 | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 21499e73d2df..5eeff1090b9f 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c @@ -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) { -- 2.39.5