|
@@ -559,7 +559,15 @@ static noinline int check_leaf(struct btrfs_root *root,
|
|
|
u32 nritems = btrfs_header_nritems(leaf);
|
|
|
int slot;
|
|
|
|
|
|
- if (nritems == 0) {
|
|
|
+ /*
|
|
|
+ * Extent buffers from a relocation tree have a owner field that
|
|
|
+ * corresponds to the subvolume tree they are based on. So just from an
|
|
|
+ * extent buffer alone we can not find out what is the id of the
|
|
|
+ * corresponding subvolume tree, so we can not figure out if the extent
|
|
|
+ * buffer corresponds to the root of the relocation tree or not. So skip
|
|
|
+ * this check for relocation trees.
|
|
|
+ */
|
|
|
+ if (nritems == 0 && !btrfs_header_flag(leaf, BTRFS_HEADER_FLAG_RELOC)) {
|
|
|
struct btrfs_root *check_root;
|
|
|
|
|
|
key.objectid = btrfs_header_owner(leaf);
|
|
@@ -587,6 +595,9 @@ static noinline int check_leaf(struct btrfs_root *root,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ if (nritems == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
/* Check the 0 item */
|
|
|
if (btrfs_item_offset_nr(leaf, 0) + btrfs_item_size_nr(leaf, 0) !=
|
|
|
BTRFS_LEAF_DATA_SIZE(root)) {
|