Btrfs: Add locking around volume management (device add/remove/balance)
[deliverable/linux.git] / fs / btrfs / ctree.c
index 0cb80f32a9c7aef48db4699ee88416343cabceec..bbf9bf3740664e6e3d521377d1cff0de4afa9e87 100644 (file)
@@ -1251,10 +1251,6 @@ int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
        WARN_ON(p->nodes[0] != NULL);
        WARN_ON(cow && root == root->fs_info->extent_root &&
                !mutex_is_locked(&root->fs_info->alloc_mutex));
-       WARN_ON(root == root->fs_info->chunk_root &&
-               !mutex_is_locked(&root->fs_info->chunk_mutex));
-       WARN_ON(root == root->fs_info->dev_root &&
-               !mutex_is_locked(&root->fs_info->chunk_mutex));
        if (ins_len < 0)
                lowest_unlock = 2;
 again:
@@ -1313,16 +1309,13 @@ again:
                                slot = p->slots[level];
                                BUG_ON(btrfs_header_nritems(b) == 1);
                        }
+                       unlock_up(p, level, lowest_unlock);
+
                        /* this is only true while dropping a snapshot */
                        if (level == lowest_level) {
-                               unlock_up(p, level, lowest_unlock);
                                break;
                        }
 
-                       if (should_reada)
-                               reada_for_search(root, p, level, slot,
-                                                key->objectid);
-
                        blocknr = btrfs_node_blockptr(b, slot);
                        gen = btrfs_node_ptr_generation(b, slot);
                        blocksize = btrfs_level_size(root, level - 1);
@@ -1340,6 +1333,11 @@ again:
                                        btrfs_release_path(NULL, p);
                                        if (tmp)
                                                free_extent_buffer(tmp);
+                                       if (should_reada)
+                                               reada_for_search(root, p,
+                                                                level, slot,
+                                                                key->objectid);
+
                                        tmp = read_tree_block(root, blocknr,
                                                         blocksize, gen);
                                        if (tmp)
@@ -1348,12 +1346,15 @@ again:
                                } else {
                                        if (tmp)
                                                free_extent_buffer(tmp);
+                                       if (should_reada)
+                                               reada_for_search(root, p,
+                                                                level, slot,
+                                                                key->objectid);
                                        b = read_node_slot(root, b, slot);
                                }
                        }
                        if (!p->skip_locking)
                                btrfs_tree_lock(b);
-                       unlock_up(p, level, lowest_unlock);
                } else {
                        p->slots[level] = slot;
                        if (ins_len > 0 && btrfs_leaf_free_space(root, b) <
This page took 0.032637 seconds and 5 git commands to generate.