f2fs: The GC triggered by ioctl also needs to mark the segno as victim
authorYongpeng Yang <yangyongpeng1@oppo.com>
Wed, 4 Dec 2024 03:31:13 +0000 (11:31 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 16 Dec 2024 16:12:29 +0000 (16:12 +0000)
commite9a844f6e487ee0f64d995d1d8ffde2e270e2479
treee5f132f02f3ba70cd2e1e3ae25c8243a7a2eb71e
parent5f6594542779e69c6c6e2b57341c352174135eed
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: e066b83c9b40 ("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>
fs/f2fs/gc.c