Re: [PATCH Vx 1/1] f2fs: fix some error handling case in gc

From: Chao Yu
Date: Sun Sep 18 2022 - 06:46:46 EST


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 <zhiguo.niu@xxxxxxxxxx>
---
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