|
@@ -560,8 +560,29 @@ static noinline int check_leaf(struct btrfs_root *root,
|
|
|
u32 nritems = btrfs_header_nritems(leaf);
|
|
|
int slot;
|
|
|
|
|
|
- if (nritems == 0)
|
|
|
+ if (nritems == 0) {
|
|
|
+ struct btrfs_root *check_root;
|
|
|
+
|
|
|
+ key.objectid = btrfs_header_owner(leaf);
|
|
|
+ key.type = BTRFS_ROOT_ITEM_KEY;
|
|
|
+ key.offset = (u64)-1;
|
|
|
+
|
|
|
+ check_root = btrfs_get_fs_root(root->fs_info, &key, false);
|
|
|
+ /*
|
|
|
+ * The only reason we also check NULL here is that during
|
|
|
+ * open_ctree() some roots has not yet been set up.
|
|
|
+ */
|
|
|
+ if (!IS_ERR_OR_NULL(check_root)) {
|
|
|
+ /* if leaf is the root, then it's fine */
|
|
|
+ if (leaf->start !=
|
|
|
+ btrfs_root_bytenr(&check_root->root_item)) {
|
|
|
+ CORRUPT("non-root leaf's nritems is 0",
|
|
|
+ leaf, root, 0);
|
|
|
+ return -EIO;
|
|
|
+ }
|
|
|
+ }
|
|
|
return 0;
|
|
|
+ }
|
|
|
|
|
|
/* Check the 0 item */
|
|
|
if (btrfs_item_offset_nr(leaf, 0) + btrfs_item_size_nr(leaf, 0) !=
|