diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 89e94ea2fef5..4ba005c41983 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4632,6 +4632,17 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info)  	int ret;  	set_bit(BTRFS_FS_CLOSING_START, &fs_info->flags); + +	/* +	 * We may have the reclaim task running and relocating a data block group, +	 * in which case it may create delayed iputs. So stop it before we park +	 * the cleaner kthread otherwise we can get new delayed iputs after +	 * parking the cleaner, and that can make the async reclaim task to hang +	 * if it's waiting for delayed iputs to complete, since the cleaner is +	 * parked and can not run delayed iputs - this will make us hang when +	 * trying to stop the async reclaim task. +	 */ +	cancel_work_sync(&fs_info->reclaim_bgs_work);  	/*  	 * We don't want the cleaner to start new transactions, add more delayed  	 * iputs, etc. while we're closing. We can't use kthread_stop() yet @@ -4672,8 +4683,6 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info)  	cancel_work_sync(&fs_info->async_data_reclaim_work);  	cancel_work_sync(&fs_info->preempt_reclaim_work); -	cancel_work_sync(&fs_info->reclaim_bgs_work); -  	/* Cancel or finish ongoing discard work */  	btrfs_discard_cleanup(fs_info);  | 
