From aab38451da325bd84b77c4c6f44e85851edb2175 Mon Sep 17 00:00:00 2001 From: zyf1116 Date: Thu, 17 Apr 2025 17:08:07 +0800 Subject: [PATCH] Revert "f2fs: fix to shrink read extent node in batches" This reverts commit a45823e4ea2d113b5731b8e9fdbf74ac92094ab8. Signed-off-by: zyf1116 --- fs/f2fs/extent_cache.c | 66 ++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 41 deletions(-) diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c index 3cb08065a4b0..ad0b83a41226 100644 --- a/fs/f2fs/extent_cache.c +++ b/fs/f2fs/extent_cache.c @@ -330,22 +330,21 @@ static struct extent_node *__init_extent_tree(struct f2fs_sb_info *sbi, } static unsigned int __free_extent_tree(struct f2fs_sb_info *sbi, - struct extent_tree *et, unsigned int nr_shrink) + struct extent_tree *et) { struct rb_node *node, *next; struct extent_node *en; - unsigned int count; + unsigned int count = atomic_read(&et->node_cnt); node = rb_first_cached(&et->root); - - for (count = 0; node && count < nr_shrink; count++) { + while (node) { next = rb_next(node); en = rb_entry(node, struct extent_node, rb_node); __release_extent_node(sbi, et, en); node = next; } - return count; + return count - atomic_read(&et->node_cnt); } static void __drop_largest_extent(struct extent_tree *et, @@ -528,27 +527,6 @@ static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi, return en; } -static unsigned int __destroy_extent_node(struct inode *inode) -{ - struct f2fs_sb_info *sbi = F2FS_I_SB(inode); - struct extent_tree *et = F2FS_I(inode)->extent_tree; - unsigned int nr_shrink = 128; - unsigned int node_cnt = 0; - - if (!et || !atomic_read(&et->node_cnt)) - return 0; - - while (atomic_read(&et->node_cnt)) { - write_lock(&et->lock); - node_cnt += __free_extent_tree(sbi, et, nr_shrink); - write_unlock(&et->lock); - } - - f2fs_bug_on(sbi, atomic_read(&et->node_cnt)); - - return node_cnt; -} - static void f2fs_update_extent_tree_range(struct inode *inode, pgoff_t fofs, block_t blkaddr, unsigned int len) { @@ -670,6 +648,9 @@ static void f2fs_update_extent_tree_range(struct inode *inode, } } + if (is_inode_flag_set(inode, FI_NO_EXTENT)) + __free_extent_tree(sbi, et); + if (et->largest_updated) { et->largest_updated = false; updated = true; @@ -677,9 +658,6 @@ static void f2fs_update_extent_tree_range(struct inode *inode, write_unlock(&et->lock); - if (is_inode_flag_set(inode, FI_NO_EXTENT)) - __destroy_extent_node(inode, EX_READ); - if (updated) f2fs_mark_inode_dirty_sync(inode, true); } @@ -704,14 +682,10 @@ unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink) list_for_each_entry_safe(et, next, &sbi->zombie_list, list) { if (atomic_read(&et->node_cnt)) { write_lock(&et->lock); - node_cnt += __free_extent_tree(sbi, et, - nr_shrink - node_cnt - tree_cnt); + node_cnt += __free_extent_tree(sbi, et); write_unlock(&et->lock); } - - if (atomic_read(&et->node_cnt)) - goto unlock_out; - + f2fs_bug_on(sbi, atomic_read(&et->node_cnt)); list_del_init(&et->list); radix_tree_delete(&sbi->extent_tree_root, et->ino); kmem_cache_free(extent_tree_slab, et); @@ -764,13 +738,25 @@ unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink) return node_cnt + tree_cnt; } -void f2fs_destroy_extent_node(struct inode *inode) +unsigned int f2fs_destroy_extent_node(struct inode *inode) { - __destroy_extent_node(inode); + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); + struct extent_tree *et = F2FS_I(inode)->extent_tree; + unsigned int node_cnt = 0; + + if (!et || !atomic_read(&et->node_cnt)) + return 0; + + write_lock(&et->lock); + node_cnt = __free_extent_tree(sbi, et); + write_unlock(&et->lock); + + return node_cnt; } void f2fs_drop_extent_tree(struct inode *inode) { + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); struct extent_tree *et = F2FS_I(inode)->extent_tree; bool updated = false; @@ -779,14 +765,12 @@ void f2fs_drop_extent_tree(struct inode *inode) write_lock(&et->lock); set_inode_flag(inode, FI_NO_EXTENT); + __free_extent_tree(sbi, et); if (et->largest.len) { et->largest.len = 0; updated = true; } write_unlock(&et->lock); - - __destroy_extent_node(inode); - if (updated) f2fs_mark_inode_dirty_sync(inode, true); } @@ -810,7 +794,7 @@ void f2fs_destroy_extent_tree(struct inode *inode) } /* free all extent info belong to this extent tree */ - node_cnt = __destroy_extent_node(inode); + node_cnt = f2fs_destroy_extent_node(inode); /* delete extent tree entry in radix tree */ mutex_lock(&sbi->extent_tree_lock); -- Gitee