]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
f2fs:Fix incomplete search range in f2fs_get_victim when f2fs_need_rand_seg is enabled
authorliujinbao1 <liujinbao1@xiaomi.com>
Fri, 13 Feb 2026 12:26:30 +0000 (20:26 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 24 Mar 2026 17:20:59 +0000 (17:20 +0000)
During the f2fs_get_victim process, when the f2fs_need_rand_seg is enabled in select_policy,
p->offset is a random value, and the search range is from p->offset to MAIN_SECS.
When segno >= last_segment, the loop breaks and exits directly without searching
the range from 0 to p->offset.This results in an incomplete search when the random
offset is not zero.

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

index f46b2673d31f5a334bac543947e713cfe85dc68a..d15e122b470c0111c7241d283979b58e04201e31 100644 (file)
@@ -316,10 +316,11 @@ static void select_policy(struct f2fs_sb_info *sbi, int gc_type,
                p->max_search = sbi->max_victim_search;
 
        /* let's select beginning hot/small space first. */
-       if (f2fs_need_rand_seg(sbi))
+       if (f2fs_need_rand_seg(sbi)) {
                p->offset = get_random_u32_below(MAIN_SECS(sbi) *
                                                SEGS_PER_SEC(sbi));
-       else if (type == CURSEG_HOT_DATA || IS_NODESEG(type))
+               SIT_I(sbi)->last_victim[p->gc_mode] = p->offset;
+       } else if (type == CURSEG_HOT_DATA || IS_NODESEG(type))
                p->offset = 0;
        else
                p->offset = SIT_I(sbi)->last_victim[p->gc_mode];