diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 9 | 
1 files changed, 9 insertions, 0 deletions
| diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 43b7b331b2da..563f106774e5 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4264,6 +4264,15 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info)  	 * already the cleaner, but below we run all pending delayed iputs.  	 */  	btrfs_flush_workqueue(fs_info->fixup_workers); +	/* +	 * Similar case here, we have to wait for delalloc workers before we +	 * proceed below and stop the cleaner kthread, otherwise we trigger a +	 * use-after-tree on the cleaner kthread task_struct when a delalloc +	 * worker running submit_compressed_extents() adds a delayed iput, which +	 * does a wake up on the cleaner kthread, which was already freed below +	 * when we call kthread_stop(). +	 */ +	btrfs_flush_workqueue(fs_info->delalloc_workers);  	/*  	 * After we parked the cleaner kthread, ordered extents may have | 
