summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2013-05-30 22:55:44 +0200
committerChris Mason <chris.mason@fusionio.com>2013-06-08 21:11:35 +0200
commit13e6c37b989859e70b0d73d3f2cb0aa022159b17 (patch)
tree20fa0ee3fd51a6b0ea3d1099eed52e8f609eb76f /fs/btrfs/disk-io.c
parentBtrfs: fix use-after-free bug during umount (diff)
downloadlinux-13e6c37b989859e70b0d73d3f2cb0aa022159b17.tar.xz
linux-13e6c37b989859e70b0d73d3f2cb0aa022159b17.zip
Btrfs: stop all workers before cleaning up roots
Dave reported a panic because the extent_root->commit_root was NULL in the caching kthread. That is because we just unset it in free_root_pointers, which is not the correct thing to do, we have to either wait for the caching kthread to complete or hold the extent_commit_sem lock so we know the thread has exited. This patch makes the kthreads all stop first and then we do our cleanup. This should fix the race. Thanks, Reported-by: David Sterba <dsterba@suse.cz> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to '')
-rw-r--r--fs/btrfs/disk-io.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 7c66c2314c14..b8b60b660c8f 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -3514,13 +3514,13 @@ int close_ctree(struct btrfs_root *root)
btrfs_free_block_groups(fs_info);
- free_root_pointers(fs_info, 1);
+ btrfs_stop_all_workers(fs_info);
del_fs_roots(fs_info);
- iput(fs_info->btree_inode);
+ free_root_pointers(fs_info, 1);
- btrfs_stop_all_workers(fs_info);
+ iput(fs_info->btree_inode);
#ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
if (btrfs_test_opt(root, CHECK_INTEGRITY))