diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 02480fce8ec4..e376bd6150f8 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3172,6 +3172,7 @@ struct rb_entry *__lookup_rb_tree_ret(struct rb_root *root, bool __check_rb_tree_consistence(struct f2fs_sb_info *sbi, struct rb_root *root); unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink); +unsigned long __count_extent_cache(struct f2fs_sb_info *sbi); bool f2fs_init_extent_tree(struct inode *inode, struct f2fs_extent *i_ext); void f2fs_drop_extent_tree(struct inode *inode); unsigned int f2fs_destroy_extent_node(struct inode *inode); diff --git a/fs/f2fs/shrinker.c b/fs/f2fs/shrinker.c index 0b5664a1a6cc..75e353bfe4a3 100644 --- a/fs/f2fs/shrinker.c +++ b/fs/f2fs/shrinker.c @@ -33,7 +33,7 @@ static unsigned long __count_free_nids(struct f2fs_sb_info *sbi) return count > 0 ? count : 0; } -static unsigned long __count_extent_cache(struct f2fs_sb_info *sbi) +unsigned long __count_extent_cache(struct f2fs_sb_info *sbi) { return atomic_read(&sbi->total_zombie_tree) + atomic_read(&sbi->total_ext_node); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index ecd760311721..00137aa5a03b 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -2637,6 +2637,16 @@ static void f2fs_tuning_parameters(struct f2fs_sb_info *sbi) } } +static void f2fs_cleanup_inodes(struct f2fs_sb_info *sbi) +{ + struct super_block *sb = sbi->sb; + + sync_filesystem(sb); + shrink_dcache_sb(sb); + evict_inodes(sb); + f2fs_shrink_extent_tree(sbi, __count_extent_cache(sbi)); +} + static int f2fs_fill_super(struct super_block *sb, void *data, int silent) { struct f2fs_sb_info *sbi; @@ -3011,6 +3021,8 @@ free_meta: * falls into an infinite loop in sync_meta_pages(). */ truncate_inode_pages_final(META_MAPPING(sbi)); + /* cleanup recovery and quota inodes */ + f2fs_cleanup_inodes(sbi); #ifdef CONFIG_QUOTA free_sysfs: #endif @@ -3057,7 +3069,6 @@ free_sbi: /* give only one another chance */ if (retry) { retry = false; - shrink_dcache_sb(sb); goto try_onemore; } return err;