diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2014-10-01 22:57:09 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2014-10-01 22:57:09 -0400 |
commit | be5cd90ddaf471e676fad6ced29e69e8610c5d20 (patch) | |
tree | 3009c16441b2c134588c714c61e629b07a4974cf /fs/ext4 | |
parent | dfe076c106f63cf6bcd375c56db9c8c89a088dab (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.c | 20 |
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 | */ |
1265 | static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode, | 1265 | static 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 | ||