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.

Fixes: e066b83c9b40 ("f2fs: add ioctl to flush data from faster device to cold 
area")
Signed-off-by: Yongpeng Yang <yangyongpe...@oppo.com>
---
 fs/f2fs/gc.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index 3e1b6d2ff3a7..8029369bb71d 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -806,11 +806,14 @@ int f2fs_get_victim(struct f2fs_sb_info *sbi, unsigned 
int *result,
                        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;
-- 
2.34.1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to