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