Re: [f2fs-dev] [PATCH v8 06/12] f2fs: cache: initialize node cache
From: Zhiguo Niu
Date: Wed Sep 16 2026 - 04:54:50 EST
Chao Yu via Linux-f2fs-devel <linux-f2fs-devel@xxxxxxxxxxxxxxxxxxxxx>
于2026年9月16日周三 09:57写道:
>
> From: Chao Yu <chao@xxxxxxxxxx>
>
> This patch introduces node_blocks in f2fs_sb_info structure, initializes
> and destroys the node cache during filesystem mount and unmount.
>
> It also introduces helper wrappers for node cache operation, and registers
> node cache into the memory shrinker and writeback kthread.
>
> Signed-off-by: Chao Yu <chao@xxxxxxxxxx>
Reviewed-by: Zhiguo Niu <zhiguo.niu@xxxxxxxxxx>
thanks!
> ---
> fs/f2fs/cache.c | 9 ++++++++-
> fs/f2fs/cache.h | 11 +++++++++++
> fs/f2fs/f2fs.h | 1 +
> fs/f2fs/super.c | 7 +++++--
> 4 files changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/fs/f2fs/cache.c b/fs/f2fs/cache.c
> index 4d82697060d0..8ab5e0e46b4e 100644
> --- a/fs/f2fs/cache.c
> +++ b/fs/f2fs/cache.c
> @@ -624,7 +624,14 @@ static unsigned long f2fs_do_shrink_cache(struct f2fs_cached_block_list *cache,
> unsigned long f2fs_shrink_cache(struct f2fs_sb_info *sbi,
> unsigned long nr_to_scan)
> {
> - return f2fs_do_shrink_cache(META_CACHE(sbi), nr_to_scan);
> + unsigned long freed;
> +
> + freed = f2fs_do_shrink_cache(META_CACHE(sbi), nr_to_scan);
> + if (freed >= nr_to_scan)
> + return freed;
> +
> + freed += f2fs_do_shrink_cache(NODE_CACHE(sbi), nr_to_scan - freed);
> + return freed;
> }
>
> static int f2fs_cache_writeback_kthread(void *data)
> diff --git a/fs/f2fs/cache.h b/fs/f2fs/cache.h
> index 1e84e66eca79..1eabd787b4b7 100644
> --- a/fs/f2fs/cache.h
> +++ b/fs/f2fs/cache.h
> @@ -194,6 +194,7 @@ void f2fs_drop_cache_range(struct f2fs_cached_block_list *cache,
> unsigned long start, unsigned long len, bool drop_dirty);
>
> #define META_CACHE(sbi) (&(sbi)->meta_blocks)
> +#define NODE_CACHE(sbi) (&(sbi)->node_blocks)
>
> #define f2fs_find_meta_cache(sbi, blkaddr) \
> f2fs_find_cache(META_CACHE(sbi), blkaddr, 0)
> @@ -202,6 +203,16 @@ void f2fs_drop_cache_range(struct f2fs_cached_block_list *cache,
> #define f2fs_truncate_meta_caches(sbi, start, len) \
> f2fs_drop_cache_range(META_CACHE(sbi), start, len, true)
>
> +#define f2fs_grab_node_cache(sbi, blkaddr) \
> + f2fs_grab_cache(NODE_CACHE(sbi), blkaddr, \
> + F2FS_CACHE_LOCK_CREATE)
> +#define f2fs_find_node_cache(sbi, blkaddr) \
> + f2fs_find_cache(NODE_CACHE(sbi), blkaddr)
> +#define f2fs_invalidate_node_cache(sbi, blkaddr) \
> + f2fs_drop_cache_range(NODE_CACHE(sbi), blkaddr, 1, false)
> +#define f2fs_truncate_node_caches(sbi, start, len) \
> + f2fs_drop_cache_range(NODE_CACHE(sbi), start, len, true)
> +
> unsigned long f2fs_shrink_cache(struct f2fs_sb_info *sbi,
> unsigned long nr_to_scan);
>
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index e2b29067eb0a..51c191c514bc 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -2108,6 +2108,7 @@ struct f2fs_sb_info {
>
> /* f2fs internal cache */
> struct f2fs_cached_block_list meta_blocks;
> + struct f2fs_cached_block_list node_blocks;
>
> /* internal cache flush thread */
> struct f2fs_cache_kthread cache_thread;
> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> index 1e6b9374df97..fa19152cd4da 100644
> --- a/fs/f2fs/super.c
> +++ b/fs/f2fs/super.c
> @@ -2092,6 +2092,7 @@ static void f2fs_put_super(struct super_block *sb)
> sbi->node_inode = NULL;
>
> f2fs_destroy_cache(META_CACHE(sbi));
> + f2fs_destroy_cache(NODE_CACHE(sbi));
>
> /* Should check the page counts after dropping all node/meta pages */
> for (i = 0; i < NR_COUNT_TYPE; i++) {
> @@ -5282,11 +5283,12 @@ static int f2fs_fill_super(struct super_block *sb, struct fs_context *fc)
> goto free_percpu;
>
> f2fs_init_cache(sbi, META_CACHE(sbi), F2FS_META_CACHE);
> + f2fs_init_cache(sbi, NODE_CACHE(sbi), F2FS_NODE_CACHE);
>
> err = f2fs_get_valid_checkpoint(sbi);
> if (err) {
> f2fs_err(sbi, "Failed to get valid F2FS checkpoint");
> - goto free_meta_cache;
> + goto free_node_cache;
> }
>
> if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_QUOTA_NEED_FSCK_FLAG))
> @@ -5612,7 +5614,8 @@ static int f2fs_fill_super(struct super_block *sb, struct fs_context *fc)
> free_devices:
> destroy_device_list(sbi);
> kvfree(sbi->ckpt);
> -free_meta_cache:
> +free_node_cache:
> + f2fs_destroy_cache(NODE_CACHE(sbi));
> f2fs_destroy_cache(META_CACHE(sbi));
> f2fs_destroy_page_array_cache(sbi);
> free_percpu:
> --
> 2.49.0
>
>
>
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@xxxxxxxxxxxxxxxxxxxxx
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel