Message ID | 1504267219-76575-1-git-send-email-yunlong.song@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
ping... On 2017/9/1 20:00, Yunlong Song wrote: > In come corner case, the reserved segments are used to do gc, and there are > not enough free segments for write checkpoint to finish its job, then the > gc process will fail to change the prefree segments to free segments. > > Signed-off-by: Yunlong Song <yunlong.song@huawei.com> > --- > fs/f2fs/gc.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c > index cd147e7..6552b04 100644 > --- a/fs/f2fs/gc.c > +++ b/fs/f2fs/gc.c > @@ -1056,6 +1056,16 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, > if (!sync) { > if (has_not_enough_free_secs(sbi, sec_freed, 0)) { > segno = NULL_SEGNO; > +#ifndef CONFIG_F2FS_CHECK_FS > + if (prefree_segments(sbi) && > + has_not_enough_free_secs(sbi, > + reserved_sections(sbi), 0)) { > + ret = write_checkpoint(sbi, &cpc); > + if (ret) > + goto stop; > + sec_freed = 0; > + } > +#endif > goto gc_more; > } >
On 2017/10/31 9:33, Yunlong Song wrote: > ping... > > On 2017/9/1 20:00, Yunlong Song wrote: >> In come corner case, the reserved segments are used to do gc, and there are >> not enough free segments for write checkpoint to finish its job, then the >> gc process will fail to change the prefree segments to free segments. I agreed to use this in production for robustness, but for upstream, it's better to investigate and fix this issue rather than covering up it. Thanks, >> >> Signed-off-by: Yunlong Song <yunlong.song@huawei.com> >> --- >> fs/f2fs/gc.c | 10 ++++++++++ >> 1 file changed, 10 insertions(+) >> >> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c >> index cd147e7..6552b04 100644 >> --- a/fs/f2fs/gc.c >> +++ b/fs/f2fs/gc.c >> @@ -1056,6 +1056,16 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, >> if (!sync) { >> if (has_not_enough_free_secs(sbi, sec_freed, 0)) { >> segno = NULL_SEGNO; >> +#ifndef CONFIG_F2FS_CHECK_FS >> + if (prefree_segments(sbi) && >> + has_not_enough_free_secs(sbi, >> + reserved_sections(sbi), 0)) { >> + ret = write_checkpoint(sbi, &cpc); >> + if (ret) >> + goto stop; >> + sec_freed = 0; >> + } >> +#endif >> goto gc_more; >> } >> >
So I use CHECK_FS config to control it. When CHECK_FS is off, all the other f2fs_bug_on also only printk WARNING info rather than trigger BUG_ON. On 2017/10/31 9:59, Chao Yu wrote: > On 2017/10/31 9:33, Yunlong Song wrote: >> ping... >> >> On 2017/9/1 20:00, Yunlong Song wrote: >>> In come corner case, the reserved segments are used to do gc, and there are >>> not enough free segments for write checkpoint to finish its job, then the >>> gc process will fail to change the prefree segments to free segments. > I agreed to use this in production for robustness, but for upstream, it's better > to investigate and fix this issue rather than covering up it. > > Thanks, > >>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com> >>> --- >>> fs/f2fs/gc.c | 10 ++++++++++ >>> 1 file changed, 10 insertions(+) >>> >>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c >>> index cd147e7..6552b04 100644 >>> --- a/fs/f2fs/gc.c >>> +++ b/fs/f2fs/gc.c >>> @@ -1056,6 +1056,16 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, >>> if (!sync) { >>> if (has_not_enough_free_secs(sbi, sec_freed, 0)) { >>> segno = NULL_SEGNO; >>> +#ifndef CONFIG_F2FS_CHECK_FS >>> + if (prefree_segments(sbi) && >>> + has_not_enough_free_secs(sbi, >>> + reserved_sections(sbi), 0)) { >>> + ret = write_checkpoint(sbi, &cpc); >>> + if (ret) >>> + goto stop; >>> + sec_freed = 0; >>> + } >>> +#endif >>> goto gc_more; >>> } >>> > > . >
On 2017/10/31 10:05, Yunlong Song wrote: > So I use CHECK_FS config to control it. When CHECK_FS is off, all the > other f2fs_bug_on also > only printk WARNING info rather than trigger BUG_ON. If this runing out-of-free-segments issue explicitly happens, IMO, its better to face and fix it. BTW, it's better to add bug_on here to detect the issue? Thanks, > > On 2017/10/31 9:59, Chao Yu wrote: >> On 2017/10/31 9:33, Yunlong Song wrote: >>> ping... >>> >>> On 2017/9/1 20:00, Yunlong Song wrote: >>>> In come corner case, the reserved segments are used to do gc, and there are >>>> not enough free segments for write checkpoint to finish its job, then the >>>> gc process will fail to change the prefree segments to free segments. >> I agreed to use this in production for robustness, but for upstream, it's better >> to investigate and fix this issue rather than covering up it. >> >> Thanks, >> >>>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com> >>>> --- >>>> fs/f2fs/gc.c | 10 ++++++++++ >>>> 1 file changed, 10 insertions(+) >>>> >>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c >>>> index cd147e7..6552b04 100644 >>>> --- a/fs/f2fs/gc.c >>>> +++ b/fs/f2fs/gc.c >>>> @@ -1056,6 +1056,16 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, >>>> if (!sync) { >>>> if (has_not_enough_free_secs(sbi, sec_freed, 0)) { >>>> segno = NULL_SEGNO; >>>> +#ifndef CONFIG_F2FS_CHECK_FS >>>> + if (prefree_segments(sbi) && >>>> + has_not_enough_free_secs(sbi, >>>> + reserved_sections(sbi), 0)) { >>>> + ret = write_checkpoint(sbi, &cpc); >>>> + if (ret) >>>> + goto stop; >>>> + sec_freed = 0; >>>> + } >>>> +#endif >>>> goto gc_more; >>>> } >>>> >> >> . >> >
diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index cd147e7..6552b04 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -1056,6 +1056,16 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, if (!sync) { if (has_not_enough_free_secs(sbi, sec_freed, 0)) { segno = NULL_SEGNO; +#ifndef CONFIG_F2FS_CHECK_FS + if (prefree_segments(sbi) && + has_not_enough_free_secs(sbi, + reserved_sections(sbi), 0)) { + ret = write_checkpoint(sbi, &cpc); + if (ret) + goto stop; + sec_freed = 0; + } +#endif goto gc_more; }
In come corner case, the reserved segments are used to do gc, and there are not enough free segments for write checkpoint to finish its job, then the gc process will fail to change the prefree segments to free segments. Signed-off-by: Yunlong Song <yunlong.song@huawei.com> --- fs/f2fs/gc.c | 10 ++++++++++ 1 file changed, 10 insertions(+)