btrfs: fix deadlock between chunk allocation and chunk btree modifications
[sfrench/cifs-2.6.git] / fs / btrfs / relocation.c
index fed8235962488f28f0deede850f381f3e48e3d02..33a0ee7ac590653882b3f4f420b5c4f987052a9a 100644 (file)
@@ -2692,8 +2692,12 @@ static int relocate_tree_block(struct btrfs_trans_handle *trans,
                        list_add_tail(&node->list, &rc->backref_cache.changed);
                } else {
                        path->lowest_level = node->level;
+                       if (root == root->fs_info->chunk_root)
+                               btrfs_reserve_chunk_metadata(trans, false);
                        ret = btrfs_search_slot(trans, root, key, path, 0, 1);
                        btrfs_release_path(path);
+                       if (root == root->fs_info->chunk_root)
+                               btrfs_trans_release_chunk_metadata(trans);
                        if (ret > 0)
                                ret = 0;
                }