aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/root-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/root-tree.c')
-rw-r--r--fs/btrfs/root-tree.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c
index 67fa2d29d663..6a1086e83ffc 100644
--- a/fs/btrfs/root-tree.c
+++ b/fs/btrfs/root-tree.c
@@ -181,7 +181,6 @@ int btrfs_insert_root(struct btrfs_trans_handle *trans, struct btrfs_root
181int btrfs_find_dead_roots(struct btrfs_root *root, u64 objectid) 181int btrfs_find_dead_roots(struct btrfs_root *root, u64 objectid)
182{ 182{
183 struct btrfs_root *dead_root; 183 struct btrfs_root *dead_root;
184 struct btrfs_item *item;
185 struct btrfs_root_item *ri; 184 struct btrfs_root_item *ri;
186 struct btrfs_key key; 185 struct btrfs_key key;
187 struct btrfs_key found_key; 186 struct btrfs_key found_key;
@@ -214,7 +213,6 @@ again:
214 nritems = btrfs_header_nritems(leaf); 213 nritems = btrfs_header_nritems(leaf);
215 slot = path->slots[0]; 214 slot = path->slots[0];
216 } 215 }
217 item = btrfs_item_nr(leaf, slot);
218 btrfs_item_key_to_cpu(leaf, &key, slot); 216 btrfs_item_key_to_cpu(leaf, &key, slot);
219 if (btrfs_key_type(&key) != BTRFS_ROOT_ITEM_KEY) 217 if (btrfs_key_type(&key) != BTRFS_ROOT_ITEM_KEY)
220 goto next; 218 goto next;
@@ -259,6 +257,8 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root)
259 struct extent_buffer *leaf; 257 struct extent_buffer *leaf;
260 struct btrfs_path *path; 258 struct btrfs_path *path;
261 struct btrfs_key key; 259 struct btrfs_key key;
260 struct btrfs_key root_key;
261 struct btrfs_root *root;
262 int err = 0; 262 int err = 0;
263 int ret; 263 int ret;
264 264
@@ -270,6 +270,9 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root)
270 key.type = BTRFS_ORPHAN_ITEM_KEY; 270 key.type = BTRFS_ORPHAN_ITEM_KEY;
271 key.offset = 0; 271 key.offset = 0;
272 272
273 root_key.type = BTRFS_ROOT_ITEM_KEY;
274 root_key.offset = (u64)-1;
275
273 while (1) { 276 while (1) {
274 ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0); 277 ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0);
275 if (ret < 0) { 278 if (ret < 0) {
@@ -294,13 +297,25 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root)
294 key.type != BTRFS_ORPHAN_ITEM_KEY) 297 key.type != BTRFS_ORPHAN_ITEM_KEY)
295 break; 298 break;
296 299
297 ret = btrfs_find_dead_roots(tree_root, key.offset); 300 root_key.objectid = key.offset;
298 if (ret) { 301 key.offset++;
302
303 root = btrfs_read_fs_root_no_name(tree_root->fs_info,
304 &root_key);
305 if (!IS_ERR(root))
306 continue;
307
308 ret = PTR_ERR(root);
309 if (ret != -ENOENT) {
299 err = ret; 310 err = ret;
300 break; 311 break;
301 } 312 }
302 313
303 key.offset++; 314 ret = btrfs_find_dead_roots(tree_root, root_key.objectid);
315 if (ret) {
316 err = ret;
317 break;
318 }
304 } 319 }
305 320
306 btrfs_free_path(path); 321 btrfs_free_path(path);
@@ -313,7 +328,6 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
313{ 328{
314 struct btrfs_path *path; 329 struct btrfs_path *path;
315 int ret; 330 int ret;
316 u32 refs;
317 struct btrfs_root_item *ri; 331 struct btrfs_root_item *ri;
318 struct extent_buffer *leaf; 332 struct extent_buffer *leaf;
319 333
@@ -327,8 +341,6 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
327 leaf = path->nodes[0]; 341 leaf = path->nodes[0];
328 ri = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_item); 342 ri = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_item);
329 343
330 refs = btrfs_disk_root_refs(leaf, ri);
331 BUG_ON(refs != 0);
332 ret = btrfs_del_item(trans, root, path); 344 ret = btrfs_del_item(trans, root, path);
333out: 345out:
334 btrfs_free_path(path); 346 btrfs_free_path(path);