f2fs: The GC triggered by ioctl also needs to mark the segno as victim

In SSR mode, the segment selected for allocation might be the same as
the target segment of the GC triggered by ioctl, resulting in the GC
moving the CURSEG_I(sbi, type)->segno.
Thread A				Thread B or Thread A
- f2fs_ioc_gc_range
 - __f2fs_ioc_gc_range(.victim_segno=segno#N)
  - f2fs_gc
   - __get_victim
    - f2fs_get_victim
    : segno#N is valid, return segno#N as source segment of GC
					- f2fs_allocate_data_block
						- need_new_seg
						- get_ssr_segment
						- f2fs_get_victim
						: get segno #N as destination segment
						- change_curseg

Fixes: e066b83c9b ("f2fs: add ioctl to flush data from faster device to cold area")
Signed-off-by: Yongpeng Yang <yangyongpeng1@oppo.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Yongpeng Yang
2024-12-04 11:31:13 +08:00
committed by Jaegeuk Kim
parent 5f65945427
commit e9a844f6e4
+7 -4
View File
@@ -806,11 +806,14 @@ retry:
goto out;
}
if (sec_usage_check(sbi, GET_SEC_FROM_SEG(sbi, *result)))
if (sec_usage_check(sbi, GET_SEC_FROM_SEG(sbi, *result))) {
ret = -EBUSY;
else
p.min_segno = *result;
goto out;
goto out;
}
if (gc_type == FG_GC)
clear_bit(GET_SEC_FROM_SEG(sbi, *result), dirty_i->victim_secmap);
p.min_segno = *result;
goto got_result;
}
ret = -ENODATA;