aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2011-06-13 20:00:16 -0400
committerChris Mason <chris.mason@oracle.com>2011-06-17 13:36:58 -0400
commit7585717f304f5ed005cc4ad933a69aab3efbd136 (patch)
tree2bbef7f61c61b125778d3631237094594b408e0a /fs/btrfs/disk-io.c
parentf4c44016218a6fce357715b9bbabbbbe1f69853c (diff)
Btrfs: fix relocation races
The recent commit to get rid of our trans_mutex introduced some races with block group relocation. The problem is that relocation needs to do some record keeping about each root, and it was relying on the transaction mutex to coordinate things in subtle ways. This fix adds a mutex just for the relocation code and makes sure it doesn't have a big impact on normal operations. The race is really fixed in btrfs_record_root_in_trans, which is where we step back and wait for the relocation code to finish accounting setup. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 20c111b3fa0..0b2b4b75913 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1620,6 +1620,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1620 spin_lock_init(&fs_info->fs_roots_radix_lock); 1620 spin_lock_init(&fs_info->fs_roots_radix_lock);
1621 spin_lock_init(&fs_info->delayed_iput_lock); 1621 spin_lock_init(&fs_info->delayed_iput_lock);
1622 spin_lock_init(&fs_info->defrag_inodes_lock); 1622 spin_lock_init(&fs_info->defrag_inodes_lock);
1623 mutex_init(&fs_info->reloc_mutex);
1623 1624
1624 init_completion(&fs_info->kobj_unregister); 1625 init_completion(&fs_info->kobj_unregister);
1625 fs_info->tree_root = tree_root; 1626 fs_info->tree_root = tree_root;