diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index 6066c6eecf41..1f4542a899c3 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -27,6 +27,7 @@ static struct kmem_cache *victim_entry_slab; static unsigned int count_bits(const unsigned long *addr, unsigned int offset, unsigned int len); +static DEFINE_MUTEX(gc_lock); static int gc_thread_func(void *data) { @@ -203,10 +204,13 @@ int f2fs_start_gc_thread(struct f2fs_sb_info *sbi) void f2fs_stop_gc_thread(struct f2fs_sb_info *sbi) { - struct f2fs_gc_kthread *gc_th = sbi->gc_thread; + struct f2fs_gc_kthread *gc_th; - if (!gc_th) + guard(mutex)(&gc_lock); + gc_th = sbi->gc_thread; + if (gc_th < PAGE_OFFSET) return; + kthread_stop(gc_th->f2fs_gc_task); wake_up_all(&gc_th->fggc_wq); kfree(gc_th);