Hi Chao, On 07/21, Chao Yu wrote: > When ->freeze_fs is called from lvm for doing snapshot, it needs to > make sure there will be no more changes in filesystem's data, however, > previously, background GC wasn't aware of freezing, so in environment > with active background GC thread, data of snapshot becomes unstable.
What about flush/discard threads? Thanks, > > This patch fixes this issue by adding sb_{start,end}_intwrite in GC > flow. > > Signed-off-by: Chao Yu <yuch...@huawei.com> > --- > fs/f2fs/gc.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c > index 76ad2c3d88db..1c0117f60083 100644 > --- a/fs/f2fs/gc.c > +++ b/fs/f2fs/gc.c > @@ -55,6 +55,8 @@ static int gc_thread_func(void *data) > } > #endif > > + sb_start_intwrite(sbi->sb); > + > /* > * [GC triggering condition] > * 0. GC is not conducted currently. > @@ -69,12 +71,12 @@ static int gc_thread_func(void *data) > * So, I'd like to wait some time to collect dirty segments. > */ > if (!mutex_trylock(&sbi->gc_mutex)) > - continue; > + goto next; > > if (!is_idle(sbi)) { > increase_sleep_time(gc_th, &wait_ms); > mutex_unlock(&sbi->gc_mutex); > - continue; > + goto next; > } > > if (has_enough_invalid_blocks(sbi)) > @@ -93,6 +95,8 @@ static int gc_thread_func(void *data) > > /* balancing f2fs's metadata periodically */ > f2fs_balance_fs_bg(sbi); > +next: > + sb_end_intwrite(sbi->sb); > > } while (!kthread_should_stop()); > return 0; > -- > 2.13.1.388.g69e6b9b4f4a9