aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/extents.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2013-06-04 13:01:11 -0400
committerTheodore Ts'o <tytso@mit.edu>2013-06-04 13:01:11 -0400
commitfffb273997cc52f255bde5f18e7f6b4686c914fb (patch)
tree7a5e338c8b2d0a7a3e1d6ac565b157471cb2ca54 /fs/ext4/extents.c
parentfa55a0ed0386e1fcbb8a229a06a5c70477d0d6e5 (diff)
ext4: better estimate credits needed for ext4_da_writepages()
We limit the number of blocks written in a single loop of ext4_da_writepages() to 64 when inode uses indirect blocks. That is unnecessary as credit estimates for mapping logically continguous run of blocks is rather low even for inode with indirect blocks. So just lift this limitation and properly calculate the number of necessary credits. This better credit estimate will also later allow us to always write at least a single page in one iteration. 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/extents.c')
-rw-r--r--fs/ext4/extents.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 299ee9df546f..94283d06cace 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -2328,17 +2328,15 @@ int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int nrblocks,
2328} 2328}
2329 2329
2330/* 2330/*
2331 * How many index/leaf blocks need to change/allocate to modify nrblocks? 2331 * How many index/leaf blocks need to change/allocate to add @extents extents?
2332 * 2332 *
2333 * if nrblocks are fit in a single extent (chunk flag is 1), then 2333 * If we add a single extent, then in the worse case, each tree level
2334 * in the worse case, each tree level index/leaf need to be changed 2334 * index/leaf need to be changed in case of the tree split.
2335 * if the tree split due to insert a new extent, then the old tree
2336 * index/leaf need to be updated too
2337 * 2335 *
2338 * If the nrblocks are discontiguous, they could cause 2336 * If more extents are inserted, they could cause the whole tree split more
2339 * the whole tree split more than once, but this is really rare. 2337 * than once, but this is really rare.
2340 */ 2338 */
2341int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, int chunk) 2339int ext4_ext_index_trans_blocks(struct inode *inode, int extents)
2342{ 2340{
2343 int index; 2341 int index;
2344 int depth; 2342 int depth;
@@ -2349,7 +2347,7 @@ int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, int chunk)
2349 2347
2350 depth = ext_depth(inode); 2348 depth = ext_depth(inode);
2351 2349
2352 if (chunk) 2350 if (extents <= 1)
2353 index = depth * 2; 2351 index = depth * 2;
2354 else 2352 else
2355 index = depth * 3; 2353 index = depth * 3;