]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: tree-checker: don't fail on empty extent roots for extent tree v2
authorJosef Bacik <josef@toxicpanda.com>
Wed, 15 Dec 2021 20:40:05 +0000 (15:40 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 14 Mar 2022 12:13:48 +0000 (13:13 +0100)
For extent tree v2 we can definitely have empty extent roots, so skip
this particular check if we have that set.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tree-checker.c

index aae5697dde329325c412fe5a8ba203ffb5358f54..64c7d2a2bb3e4244b9bc02e49a8f44e489c0f052 100644 (file)
@@ -1648,7 +1648,6 @@ static int check_leaf(struct extent_buffer *leaf, bool check_item_data)
                /* These trees must never be empty */
                if (unlikely(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)) {
@@ -1657,12 +1656,25 @@ static int check_leaf(struct extent_buffer *leaf, bool check_item_data)
                                    owner);
                        return -EUCLEAN;
                }
+
                /* Unknown tree */
                if (unlikely(owner == 0)) {
                        generic_err(leaf, 0,
                                "invalid owner, root 0 is not defined");
                        return -EUCLEAN;
                }
+
+               /* EXTENT_TREE_V2 can have empty extent trees. */
+               if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2))
+                       return 0;
+
+               if (unlikely(owner == BTRFS_EXTENT_TREE_OBJECTID)) {
+                       generic_err(leaf, 0,
+                       "invalid root, root %llu must never be empty",
+                                   owner);
+                       return -EUCLEAN;
+               }
+
                return 0;
        }