diff options
author | Josef Bacik <jbacik@fusionio.com> | 2013-05-30 22:55:44 +0200 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2013-06-08 21:11:35 +0200 |
commit | 13e6c37b989859e70b0d73d3f2cb0aa022159b17 (patch) | |
tree | 20fa0ee3fd51a6b0ea3d1099eed52e8f609eb76f /fs/btrfs/disk-io.c | |
parent | Btrfs: fix use-after-free bug during umount (diff) | |
download | linux-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 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 6 |
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)) |