btrfs: tree-checker: Remove comprehensive root owner check
authorQu Wenruo <wqu@suse.com>
Thu, 4 Apr 2019 03:47:07 +0000 (11:47 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 29 Apr 2019 17:02:39 +0000 (19:02 +0200)
Commit 1ba98d086fe3 ("Btrfs: detect corruption when non-root leaf has
zero item") introduced comprehensive root owner checker.

However it's pretty expensive tree search to locate the owner root,
especially when it get reused by mandatory read and write time
tree-checker.

This patch will remove that check, and completely rely on owner based
empty leaf check, which is much faster and still works fine for most
case.

And since we skip the old root owner check, now write time tree check
can be merged with btrfs_check_leaf_full().

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tree-checker.c

index 5c988b57b90e6cb9a160a900296714c035c871b7..b9dd2a6e133ffab75b95f0dbdc7e12a47a3c953f 100644 (file)
@@ -831,7 +831,6 @@ static int check_leaf(struct extent_buffer *leaf, bool check_item_data)
         */
        if (nritems == 0 && !btrfs_header_flag(leaf, BTRFS_HEADER_FLAG_RELOC)) {
                u64 owner = btrfs_header_owner(leaf);
-               struct btrfs_root *check_root;
 
                /* These trees must never be empty */
                if (owner == BTRFS_ROOT_TREE_OBJECTID ||
@@ -845,29 +844,6 @@ static int check_leaf(struct extent_buffer *leaf, bool check_item_data)
                                    owner);
                        return -EUCLEAN;
                }
-               key.objectid = owner;
-               key.type = BTRFS_ROOT_ITEM_KEY;
-               key.offset = (u64)-1;
-
-               check_root = btrfs_get_fs_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)) {
-                       struct extent_buffer *eb;
-
-                       eb = btrfs_root_node(check_root);
-                       /* if leaf is the root, then it's fine */
-                       if (leaf != eb) {
-                               generic_err(leaf, 0,
-               "invalid nritems, have %u should not be 0 for non-root leaf",
-                                       nritems);
-                               free_extent_buffer(eb);
-                               return -EUCLEAN;
-                       }
-                       free_extent_buffer(eb);
-               }
                return 0;
        }