diff options
Diffstat (limited to 'fs/btrfs/root-tree.c')
| -rw-r--r-- | fs/btrfs/root-tree.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c index 6a1086e83ffc..6928bff62daa 100644 --- a/fs/btrfs/root-tree.c +++ b/fs/btrfs/root-tree.c | |||
| @@ -88,7 +88,8 @@ int btrfs_find_last_root(struct btrfs_root *root, u64 objectid, | |||
| 88 | search_key.offset = (u64)-1; | 88 | search_key.offset = (u64)-1; |
| 89 | 89 | ||
| 90 | path = btrfs_alloc_path(); | 90 | path = btrfs_alloc_path(); |
| 91 | BUG_ON(!path); | 91 | if (!path) |
| 92 | return -ENOMEM; | ||
| 92 | ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); | 93 | ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); |
| 93 | if (ret < 0) | 94 | if (ret < 0) |
| 94 | goto out; | 95 | goto out; |
| @@ -332,7 +333,8 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
| 332 | struct extent_buffer *leaf; | 333 | struct extent_buffer *leaf; |
| 333 | 334 | ||
| 334 | path = btrfs_alloc_path(); | 335 | path = btrfs_alloc_path(); |
| 335 | BUG_ON(!path); | 336 | if (!path) |
| 337 | return -ENOMEM; | ||
| 336 | ret = btrfs_search_slot(trans, root, key, path, -1, 1); | 338 | ret = btrfs_search_slot(trans, root, key, path, -1, 1); |
| 337 | if (ret < 0) | 339 | if (ret < 0) |
| 338 | goto out; | 340 | goto out; |
| @@ -471,3 +473,21 @@ again: | |||
| 471 | btrfs_free_path(path); | 473 | btrfs_free_path(path); |
| 472 | return 0; | 474 | return 0; |
| 473 | } | 475 | } |
| 476 | |||
| 477 | /* | ||
| 478 | * Old btrfs forgets to init root_item->flags and root_item->byte_limit | ||
| 479 | * for subvolumes. To work around this problem, we steal a bit from | ||
| 480 | * root_item->inode_item->flags, and use it to indicate if those fields | ||
| 481 | * have been properly initialized. | ||
| 482 | */ | ||
| 483 | void btrfs_check_and_init_root_item(struct btrfs_root_item *root_item) | ||
| 484 | { | ||
| 485 | u64 inode_flags = le64_to_cpu(root_item->inode.flags); | ||
| 486 | |||
| 487 | if (!(inode_flags & BTRFS_INODE_ROOT_ITEM_INIT)) { | ||
| 488 | inode_flags |= BTRFS_INODE_ROOT_ITEM_INIT; | ||
| 489 | root_item->inode.flags = cpu_to_le64(inode_flags); | ||
| 490 | root_item->flags = 0; | ||
| 491 | root_item->byte_limit = 0; | ||
| 492 | } | ||
| 493 | } | ||
