Messages in this thread | | | Date | Tue, 20 Sep 2022 23:29:02 +0800 | Subject | Re: [PATCH V3] f2fs: fix some error handling case in gc | From | Chao Yu <> |
| |
On 2022/9/20 9:27, 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 if user use f2fs because of CP_ERROR_FLAG > has been 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 and do not stop checkpoint. > 1. SBI_NEED_FSCK will still be set but not do f2fs_stop_checkpoint for > f2fs.fsck to have opportunity to fix the inconsistent segment type > in SSA and SIT. > 2. Let user can still use fs, avoid EIO error for some operations such > as read and write,etc. > 3. If current segment has inconsistent segment type in SSA and SIT, > we add this segment segno in SIT_I(sbi)->invalid_segmap to skip this > segment to avoid deadloop in gc,similar as commit bbf9f7d90f21 ("f2fs: > Fix indefinite loop in f2fs_gc()") > > Fixes: 793ab1c8a792 ("f2fs: fix to avoid deadloop in foreground GC") > Signed-off-by: zhiguo.niu <zhiguo.niu@unisoc.com> > --- > changes of v3: keep "set SBI_NEED_FSCK and f2fs_err()" as before and > do not depend on CONFIG_F2FS_CHECK_FS as Chao's suggestion. > --- > --- > fs/f2fs/gc.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c > index d5fb426e0747..f354883872f6 100644 > --- a/fs/f2fs/gc.c > +++ b/fs/f2fs/gc.c > @@ -1703,7 +1703,10 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi, > 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);
f2fs_stop_checkpoint() was added in commit 793ab1c8a792 ("f2fs: fix to avoid deadloop in foreground GC"), in order to avoid deadlock issue reported in bugzilla, it needs to check this patch w/ the fuzzed image.
Bug 203211: https://bugzilla.kernel.org/show_bug.cgi?id=203211
Fuzzed image: https://bugzilla.kernel.org/attachment.cgi?id=282203
Thanks,
> +#ifdef CONFIG_F2FS_CHECK_FS > + if (!test_bit(segno, SIT_I(sbi)->invalid_segmap)) > + set_bit(segno, SIT_I(sbi)->invalid_segmap); > +#endif > goto skip; > } >
| |