Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

f2fs: disable extent_cache for fcollapse/finsert inodes

This reduces the elapsed time to do xfstests/generic/017.

Before: 458 s
After: 390 s

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

+19
+13
fs/f2fs/extent_cache.c
··· 631 631 return node_cnt; 632 632 } 633 633 634 + void f2fs_drop_extent_tree(struct inode *inode) 635 + { 636 + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 637 + struct extent_tree *et = F2FS_I(inode)->extent_tree; 638 + 639 + set_inode_flag(inode, FI_NO_EXTENT); 640 + 641 + write_lock(&et->lock); 642 + __free_extent_tree(sbi, et); 643 + __drop_largest_extent(inode, 0, UINT_MAX); 644 + write_unlock(&et->lock); 645 + } 646 + 634 647 void f2fs_destroy_extent_tree(struct inode *inode) 635 648 { 636 649 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+1
fs/f2fs/f2fs.h
··· 2297 2297 */ 2298 2298 unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *, int); 2299 2299 bool f2fs_init_extent_tree(struct inode *, struct f2fs_extent *); 2300 + void f2fs_drop_extent_tree(struct inode *); 2300 2301 unsigned int f2fs_destroy_extent_node(struct inode *); 2301 2302 void f2fs_destroy_extent_tree(struct inode *); 2302 2303 bool f2fs_lookup_extent_cache(struct inode *, pgoff_t, struct extent_info *);
+5
fs/f2fs/file.c
··· 1044 1044 1045 1045 f2fs_balance_fs(sbi, true); 1046 1046 f2fs_lock_op(sbi); 1047 + 1048 + f2fs_drop_extent_tree(inode); 1049 + 1047 1050 ret = __exchange_data_block(inode, inode, end, start, nrpages - end, true); 1048 1051 f2fs_unlock_op(sbi); 1049 1052 return ret; ··· 1281 1278 idx -= nr; 1282 1279 1283 1280 f2fs_lock_op(sbi); 1281 + f2fs_drop_extent_tree(inode); 1282 + 1284 1283 ret = __exchange_data_block(inode, inode, idx, 1285 1284 idx + delta, nr, false); 1286 1285 f2fs_unlock_op(sbi);