aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorDmitry Monakhov <dmonakhov@openvz.org>2014-10-01 22:57:09 -0400
committerTheodore Ts'o <tytso@mit.edu>2014-10-01 22:57:09 -0400
commitbe5cd90ddaf471e676fad6ced29e69e8610c5d20 (patch)
tree3009c16441b2c134588c714c61e629b07a4974cf /fs/ext4
parentdfe076c106f63cf6bcd375c56db9c8c89a088dab (diff)
ext4: optimize block allocation on grow indepth
It is reasonable to prepend newly created index to older one. [ Dropped no longer used function parameter newext. -tytso ] Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/extents.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 8170b3254767..c3ed9af20d20 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -1263,16 +1263,24 @@ cleanup:
1263 * just created block 1263 * just created block
1264 */ 1264 */
1265static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode, 1265static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode,
1266 unsigned int flags, 1266 unsigned int flags)
1267 struct ext4_extent *newext)
1268{ 1267{
1269 struct ext4_extent_header *neh; 1268 struct ext4_extent_header *neh;
1270 struct buffer_head *bh; 1269 struct buffer_head *bh;
1271 ext4_fsblk_t newblock; 1270 ext4_fsblk_t newblock, goal = 0;
1271 struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es;
1272 int err = 0; 1272 int err = 0;
1273 1273
1274 newblock = ext4_ext_new_meta_block(handle, inode, NULL, 1274 /* Try to prepend new index to old one */
1275 newext, &err, flags); 1275 if (ext_depth(inode))
1276 goal = ext4_idx_pblock(EXT_FIRST_INDEX(ext_inode_hdr(inode)));
1277 if (goal > le32_to_cpu(es->s_first_data_block)) {
1278 flags |= EXT4_MB_HINT_TRY_GOAL;
1279 goal--;
1280 } else
1281 goal = ext4_inode_to_goal_block(inode);
1282 newblock = ext4_new_meta_blocks(handle, inode, goal, flags,
1283 NULL, &err);
1276 if (newblock == 0) 1284 if (newblock == 0)
1277 return err; 1285 return err;
1278 1286
@@ -1373,7 +1381,7 @@ repeat:
1373 err = PTR_ERR(path); 1381 err = PTR_ERR(path);
1374 } else { 1382 } else {
1375 /* tree is full, time to grow in depth */ 1383 /* tree is full, time to grow in depth */
1376 err = ext4_ext_grow_indepth(handle, inode, mb_flags, newext); 1384 err = ext4_ext_grow_indepth(handle, inode, mb_flags);
1377 if (err) 1385 if (err)
1378 goto out; 1386 goto out;
1379 1387