diff options
Diffstat (limited to 'fs/btrfs/root-tree.c')
-rw-r--r-- | fs/btrfs/root-tree.c | 28 |
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 | |||
181 | int btrfs_find_dead_roots(struct btrfs_root *root, u64 objectid) | 181 | int 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); |
333 | out: | 345 | out: |
334 | btrfs_free_path(path); | 346 | btrfs_free_path(path); |