f2fs: ignore valid ratio when free section count is low
authorDaeho Jeong <daehojeong@google.com>
Fri, 18 Jul 2025 22:04:31 +0000 (15:04 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 24 Jul 2025 20:19:13 +0000 (20:19 +0000)
Otherwise F2FS will not do GC in background in low free section.

Signed-off-by: Daeho Jeong <daehojeong@google.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/gc.c

index 1a47a7645790cd625388b250534b248a2c6e90c3..18b9db2e98ba5c28a8ed974ae1ff7656546a8c73 100644 (file)
@@ -384,14 +384,15 @@ static unsigned int get_cb_cost(struct f2fs_sb_info *sbi, unsigned int segno)
 }
 
 static inline unsigned int get_gc_cost(struct f2fs_sb_info *sbi,
-                       unsigned int segno, struct victim_sel_policy *p)
+                       unsigned int segno, struct victim_sel_policy *p,
+                       unsigned int valid_thresh_ratio)
 {
        if (p->alloc_mode == SSR)
                return get_seg_entry(sbi, segno)->ckpt_valid_blocks;
 
-       if (p->one_time_gc && (get_valid_blocks(sbi, segno, true) >=
-               CAP_BLKS_PER_SEC(sbi) * sbi->gc_thread->valid_thresh_ratio /
-               100))
+       if (p->one_time_gc && (valid_thresh_ratio < 100) &&
+                       (get_valid_blocks(sbi, segno, true) >=
+                       CAP_BLKS_PER_SEC(sbi) * valid_thresh_ratio / 100))
                return UINT_MAX;
 
        /* alloc_mode == LFS */
@@ -772,6 +773,7 @@ int f2fs_get_victim(struct f2fs_sb_info *sbi, unsigned int *result,
        unsigned int secno, last_victim;
        unsigned int last_segment;
        unsigned int nsearched;
+       unsigned int valid_thresh_ratio = 100;
        bool is_atgc;
        int ret = 0;
 
@@ -781,7 +783,11 @@ int f2fs_get_victim(struct f2fs_sb_info *sbi, unsigned int *result,
        p.alloc_mode = alloc_mode;
        p.age = age;
        p.age_threshold = sbi->am.age_threshold;
-       p.one_time_gc = one_time;
+       if (one_time) {
+               p.one_time_gc = one_time;
+               if (has_enough_free_secs(sbi, 0, NR_PERSISTENT_LOG))
+                       valid_thresh_ratio = sbi->gc_thread->valid_thresh_ratio;
+       }
 
 retry:
        select_policy(sbi, gc_type, type, &p);
@@ -907,7 +913,7 @@ retry:
                        goto next;
                }
 
-               cost = get_gc_cost(sbi, segno, &p);
+               cost = get_gc_cost(sbi, segno, &p, valid_thresh_ratio);
 
                if (p.min_cost > cost) {
                        p.min_segno = segno;