|
@@ -496,9 +496,22 @@ static int check_leaf(struct btrfs_fs_info *fs_info, struct extent_buffer *leaf,
|
|
|
* skip this check for relocation trees.
|
|
|
*/
|
|
|
if (nritems == 0 && !btrfs_header_flag(leaf, BTRFS_HEADER_FLAG_RELOC)) {
|
|
|
+ u64 owner = btrfs_header_owner(leaf);
|
|
|
struct btrfs_root *check_root;
|
|
|
|
|
|
- key.objectid = btrfs_header_owner(leaf);
|
|
|
+ /* These trees must never be empty */
|
|
|
+ if (owner == BTRFS_ROOT_TREE_OBJECTID ||
|
|
|
+ owner == BTRFS_CHUNK_TREE_OBJECTID ||
|
|
|
+ owner == BTRFS_EXTENT_TREE_OBJECTID ||
|
|
|
+ owner == BTRFS_DEV_TREE_OBJECTID ||
|
|
|
+ owner == BTRFS_FS_TREE_OBJECTID ||
|
|
|
+ owner == BTRFS_DATA_RELOC_TREE_OBJECTID) {
|
|
|
+ generic_err(fs_info, leaf, 0,
|
|
|
+ "invalid root, root %llu must never be empty",
|
|
|
+ owner);
|
|
|
+ return -EUCLEAN;
|
|
|
+ }
|
|
|
+ key.objectid = owner;
|
|
|
key.type = BTRFS_ROOT_ITEM_KEY;
|
|
|
key.offset = (u64)-1;
|
|
|
|