diff options
Diffstat (limited to 'fs/btrfs/root-tree.c')
| -rw-r--r-- | fs/btrfs/root-tree.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c index 67fa2d29d663..2d958be761c8 100644 --- a/fs/btrfs/root-tree.c +++ b/fs/btrfs/root-tree.c | |||
| @@ -259,6 +259,8 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root) | |||
| 259 | struct extent_buffer *leaf; | 259 | struct extent_buffer *leaf; |
| 260 | struct btrfs_path *path; | 260 | struct btrfs_path *path; |
| 261 | struct btrfs_key key; | 261 | struct btrfs_key key; |
| 262 | struct btrfs_key root_key; | ||
| 263 | struct btrfs_root *root; | ||
| 262 | int err = 0; | 264 | int err = 0; |
| 263 | int ret; | 265 | int ret; |
| 264 | 266 | ||
| @@ -270,6 +272,9 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root) | |||
| 270 | key.type = BTRFS_ORPHAN_ITEM_KEY; | 272 | key.type = BTRFS_ORPHAN_ITEM_KEY; |
| 271 | key.offset = 0; | 273 | key.offset = 0; |
| 272 | 274 | ||
| 275 | root_key.type = BTRFS_ROOT_ITEM_KEY; | ||
| 276 | root_key.offset = (u64)-1; | ||
| 277 | |||
| 273 | while (1) { | 278 | while (1) { |
| 274 | ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0); | 279 | ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0); |
| 275 | if (ret < 0) { | 280 | if (ret < 0) { |
| @@ -294,13 +299,25 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root) | |||
| 294 | key.type != BTRFS_ORPHAN_ITEM_KEY) | 299 | key.type != BTRFS_ORPHAN_ITEM_KEY) |
| 295 | break; | 300 | break; |
| 296 | 301 | ||
| 297 | ret = btrfs_find_dead_roots(tree_root, key.offset); | 302 | root_key.objectid = key.offset; |
| 298 | if (ret) { | 303 | key.offset++; |
| 304 | |||
| 305 | root = btrfs_read_fs_root_no_name(tree_root->fs_info, | ||
| 306 | &root_key); | ||
| 307 | if (!IS_ERR(root)) | ||
| 308 | continue; | ||
| 309 | |||
| 310 | ret = PTR_ERR(root); | ||
| 311 | if (ret != -ENOENT) { | ||
| 299 | err = ret; | 312 | err = ret; |
| 300 | break; | 313 | break; |
| 301 | } | 314 | } |
| 302 | 315 | ||
| 303 | key.offset++; | 316 | ret = btrfs_find_dead_roots(tree_root, root_key.objectid); |
| 317 | if (ret) { | ||
| 318 | err = ret; | ||
| 319 | break; | ||
| 320 | } | ||
| 304 | } | 321 | } |
| 305 | 322 | ||
| 306 | btrfs_free_path(path); | 323 | btrfs_free_path(path); |
| @@ -313,7 +330,6 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
| 313 | { | 330 | { |
| 314 | struct btrfs_path *path; | 331 | struct btrfs_path *path; |
| 315 | int ret; | 332 | int ret; |
| 316 | u32 refs; | ||
| 317 | struct btrfs_root_item *ri; | 333 | struct btrfs_root_item *ri; |
| 318 | struct extent_buffer *leaf; | 334 | struct extent_buffer *leaf; |
| 319 | 335 | ||
| @@ -327,8 +343,6 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
| 327 | leaf = path->nodes[0]; | 343 | leaf = path->nodes[0]; |
| 328 | ri = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_item); | 344 | ri = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_item); |
| 329 | 345 | ||
| 330 | refs = btrfs_disk_root_refs(leaf, ri); | ||
| 331 | BUG_ON(refs != 0); | ||
| 332 | ret = btrfs_del_item(trans, root, path); | 346 | ret = btrfs_del_item(trans, root, path); |
| 333 | out: | 347 | out: |
| 334 | btrfs_free_path(path); | 348 | btrfs_free_path(path); |
