diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index 6066c6eecf41..ebaf6b6fc65c 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -203,14 +203,22 @@ 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; + static DEFINE_MUTEX(gct_mutex); - if (!gc_th) - return; + mutex_lock(&gct_mutex); + gc_th = sbi->gc_thread; + printk("gc thread: %p, gc thread valid: %d, %s\n", gc_th, virt_addr_valid(gc_th), __func__); + if (!gc_th || !virt_addr_valid(gc_th)) + goto unlock; + + sbi->gc_thread = NULL; + printk("2gc thread: %p, %s\n", gc_th, __func__); kthread_stop(gc_th->f2fs_gc_task); wake_up_all(&gc_th->fggc_wq); kfree(gc_th); - sbi->gc_thread = NULL; +unlock: + mutex_unlock(&gct_mutex); } static int select_gc_type(struct f2fs_sb_info *sbi, int gc_type)