diff options
author | Jan Kara <jack@suse.cz> | 2013-06-04 12:56:55 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2013-06-04 12:56:55 -0400 |
commit | fa55a0ed0386e1fcbb8a229a06a5c70477d0d6e5 (patch) | |
tree | 8b1abbd432fd799ff7d537851d758c0a7b1e26a8 /fs/ext4/indirect.c | |
parent | f2d50a65c93cfe718742bc85dff55bf8f11967b6 (diff) | |
download | linux-stable-fa55a0ed0386e1fcbb8a229a06a5c70477d0d6e5.tar.gz linux-stable-fa55a0ed0386e1fcbb8a229a06a5c70477d0d6e5.tar.bz2 linux-stable-fa55a0ed0386e1fcbb8a229a06a5c70477d0d6e5.zip |
ext4: improve writepage credit estimate for files with indirect blocks
ext4_ind_trans_blocks() wrongly used 'chunk' argument to decide whether
blocks mapped are logically contiguous. That is wrong since the argument
informs whether the blocks are physically contiguous. As the blocks
mapped are always logically contiguous and that's all
ext4_ind_trans_blocks() cares about, just remove the 'chunk' argument.
Reviewed-by: Zheng Liu <wenqing.lz@taobao.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/indirect.c')
-rw-r--r-- | fs/ext4/indirect.c | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c index b8d5d351e24f..f7742f03cdcb 100644 --- a/fs/ext4/indirect.c +++ b/fs/ext4/indirect.c @@ -779,27 +779,18 @@ int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock) return (blk_bits / EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb)) + 1; } -int ext4_ind_trans_blocks(struct inode *inode, int nrblocks, int chunk) +/* + * Calculate number of indirect blocks touched by mapping @nrblocks logically + * contiguous blocks + */ +int ext4_ind_trans_blocks(struct inode *inode, int nrblocks) { - int indirects; - - /* if nrblocks are contiguous */ - if (chunk) { - /* - * With N contiguous data blocks, we need at most - * N/EXT4_ADDR_PER_BLOCK(inode->i_sb) + 1 indirect blocks, - * 2 dindirect blocks, and 1 tindirect block - */ - return DIV_ROUND_UP(nrblocks, - EXT4_ADDR_PER_BLOCK(inode->i_sb)) + 4; - } /* - * if nrblocks are not contiguous, worse case, each block touch - * a indirect block, and each indirect block touch a double indirect - * block, plus a triple indirect block + * With N contiguous data blocks, we need at most + * N/EXT4_ADDR_PER_BLOCK(inode->i_sb) + 1 indirect blocks, + * 2 dindirect blocks, and 1 tindirect block */ - indirects = nrblocks * 2 + 1; - return indirects; + return DIV_ROUND_UP(nrblocks, EXT4_ADDR_PER_BLOCK(inode->i_sb)) + 4; } /* |