diff options
Diffstat (limited to 'fs/btrfs/tree-checker.c')
-rw-r--r-- | fs/btrfs/tree-checker.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c index 3bade2ad39e8..db835635372f 100644 --- a/fs/btrfs/tree-checker.c +++ b/fs/btrfs/tree-checker.c | |||
@@ -496,9 +496,22 @@ static int check_leaf(struct btrfs_fs_info *fs_info, struct extent_buffer *leaf, | |||
496 | * skip this check for relocation trees. | 496 | * skip this check for relocation trees. |
497 | */ | 497 | */ |
498 | if (nritems == 0 && !btrfs_header_flag(leaf, BTRFS_HEADER_FLAG_RELOC)) { | 498 | if (nritems == 0 && !btrfs_header_flag(leaf, BTRFS_HEADER_FLAG_RELOC)) { |
499 | u64 owner = btrfs_header_owner(leaf); | ||
499 | struct btrfs_root *check_root; | 500 | struct btrfs_root *check_root; |
500 | 501 | ||
501 | key.objectid = btrfs_header_owner(leaf); | 502 | /* These trees must never be empty */ |
503 | if (owner == BTRFS_ROOT_TREE_OBJECTID || | ||
504 | owner == BTRFS_CHUNK_TREE_OBJECTID || | ||
505 | owner == BTRFS_EXTENT_TREE_OBJECTID || | ||
506 | owner == BTRFS_DEV_TREE_OBJECTID || | ||
507 | owner == BTRFS_FS_TREE_OBJECTID || | ||
508 | owner == BTRFS_DATA_RELOC_TREE_OBJECTID) { | ||
509 | generic_err(fs_info, leaf, 0, | ||
510 | "invalid root, root %llu must never be empty", | ||
511 | owner); | ||
512 | return -EUCLEAN; | ||
513 | } | ||
514 | key.objectid = owner; | ||
502 | key.type = BTRFS_ROOT_ITEM_KEY; | 515 | key.type = BTRFS_ROOT_ITEM_KEY; |
503 | key.offset = (u64)-1; | 516 | key.offset = (u64)-1; |
504 | 517 | ||