aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2013-06-04 12:56:55 -0400
committerTheodore Ts'o <tytso@mit.edu>2013-06-04 12:56:55 -0400
commitfa55a0ed0386e1fcbb8a229a06a5c70477d0d6e5 (patch)
tree8b1abbd432fd799ff7d537851d758c0a7b1e26a8 /fs/ext4
parentf2d50a65c93cfe718742bc85dff55bf8f11967b6 (diff)
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')
-rw-r--r--fs/ext4/ext4.h2
-rw-r--r--fs/ext4/indirect.c27
-rw-r--r--fs/ext4/inode.c2
3 files changed, 11 insertions, 20 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 46674058d251..25e261da871f 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2109,7 +2109,7 @@ extern ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb,
2109 const struct iovec *iov, loff_t offset, 2109 const struct iovec *iov, loff_t offset,
2110 unsigned long nr_segs); 2110 unsigned long nr_segs);
2111extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock); 2111extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock);
2112extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks, int chunk); 2112extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks);
2113extern void ext4_ind_truncate(handle_t *, struct inode *inode); 2113extern void ext4_ind_truncate(handle_t *, struct inode *inode);
2114extern int ext4_free_hole_blocks(handle_t *handle, struct inode *inode, 2114extern int ext4_free_hole_blocks(handle_t *handle, struct inode *inode,
2115 ext4_lblk_t first, ext4_lblk_t stop); 2115 ext4_lblk_t first, ext4_lblk_t stop);
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)
779 return (blk_bits / EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb)) + 1; 779 return (blk_bits / EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb)) + 1;
780} 780}
781 781
782int ext4_ind_trans_blocks(struct inode *inode, int nrblocks, int chunk) 782/*
783 * Calculate number of indirect blocks touched by mapping @nrblocks logically
784 * contiguous blocks
785 */
786int ext4_ind_trans_blocks(struct inode *inode, int nrblocks)
783{ 787{
784 int indirects;
785
786 /* if nrblocks are contiguous */
787 if (chunk) {
788 /*
789 * With N contiguous data blocks, we need at most
790 * N/EXT4_ADDR_PER_BLOCK(inode->i_sb) + 1 indirect blocks,
791 * 2 dindirect blocks, and 1 tindirect block
792 */
793 return DIV_ROUND_UP(nrblocks,
794 EXT4_ADDR_PER_BLOCK(inode->i_sb)) + 4;
795 }
796 /* 788 /*
797 * if nrblocks are not contiguous, worse case, each block touch 789 * With N contiguous data blocks, we need at most
798 * a indirect block, and each indirect block touch a double indirect 790 * N/EXT4_ADDR_PER_BLOCK(inode->i_sb) + 1 indirect blocks,
799 * block, plus a triple indirect block 791 * 2 dindirect blocks, and 1 tindirect block
800 */ 792 */
801 indirects = nrblocks * 2 + 1; 793 return DIV_ROUND_UP(nrblocks, EXT4_ADDR_PER_BLOCK(inode->i_sb)) + 4;
802 return indirects;
803} 794}
804 795
805/* 796/*
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 80c710ae470b..23d9a44d721a 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -4653,7 +4653,7 @@ int ext4_getattr(struct vfsmount *mnt, struct dentry *dentry,
4653static int ext4_index_trans_blocks(struct inode *inode, int nrblocks, int chunk) 4653static int ext4_index_trans_blocks(struct inode *inode, int nrblocks, int chunk)
4654{ 4654{
4655 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) 4655 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
4656 return ext4_ind_trans_blocks(inode, nrblocks, chunk); 4656 return ext4_ind_trans_blocks(inode, nrblocks);
4657 return ext4_ext_index_trans_blocks(inode, nrblocks, chunk); 4657 return ext4_ext_index_trans_blocks(inode, nrblocks, chunk);
4658} 4658}
4659 4659