On 2022/9/15 14:18, zhiguo.niu wrote:
During GC, if segment type stored in SSA and SIT is inconsistent,
we set SBI_NEED_FSCK first and then stop checkpoint, this will
cause the following issues:
1. SBI_NEED_FSCK can not be set to flash truly because of checkpoint
has been stopped.
2. Will cause more EIO error because of CP_ERROR_FLAG is set in
f2fs_stop_checkpoint, this is not reasonable.

So we fix this error handling case by recording current victim segment
as invalid for gc.

Signed-off-by: zhiguo.niu <[email protected]>
---
  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 d5fb426e0747..66bdf2678b5e 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -1700,10 +1700,13 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi,

                 sum = page_address(sum_page);
                 if (type != GET_SUM_TYPE((&sum->footer))) {
-                       f2fs_err(sbi, "Inconsistent segment (%u) type [%d, %d] in 
SSA and SIT",
-                                segno, type, GET_SUM_TYPE((&sum->footer)));
-                       set_sbi_flag(sbi, SBI_NEED_FSCK);
-                       f2fs_stop_checkpoint(sbi, false);
+#ifdef CONFIG_F2FS_CHECK_FS
+                       if (!test_and_set_bit(segno, 
SIT_I(sbi)->invalid_segmap)) {
+                               f2fs_err(sbi, "Inconsistent segment (%u) type [%d, 
%d] in SSA and SIT",
+                                       segno, type, 
GET_SUM_TYPE((&sum->footer)));
+                               set_sbi_flag(sbi, SBI_NEED_FSCK);
+                       }
+#endif

What about:

f2fs_err(sbi, "...");
set_sbi_flag(sbi, SBI_NEED_FSCK);

#ifdef CONFIG_F2FS_CHECK_FS
if (test_bit())
        set_bit();
#endif

                         goto skip;
                 }

--
2.17.1


_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to