]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: improve error reporting in lookup_inline_extent_backref
authorNikolay Borisov <nborisov@suse.com>
Fri, 29 Apr 2022 14:17:34 +0000 (17:17 +0300)
committerDavid Sterba <dsterba@suse.com>
Mon, 16 May 2022 15:17:32 +0000 (17:17 +0200)
When iterating the backrefs in an extent item if the ptr to the
'current' backref record goes beyond the extent item a warning is
generated and -ENOENT is returned. However what's more appropriate to
debug such cases would be to return EUCLEAN and also print identifying
information about the performed search as well as the current content of
the leaf containing the possibly corrupted extent item.

Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent-tree.c

index 856c6252ef9f6c8b2d6c4c03b2961fbd7b6001e5..8ef4aa5a46d65f5a5773c9aeb670b95d638731d4 100644 (file)
@@ -895,7 +895,13 @@ again:
        err = -ENOENT;
        while (1) {
                if (ptr >= end) {
-                       WARN_ON(ptr > end);
+                       if (ptr > end) {
+                               err = -EUCLEAN;
+                               btrfs_print_leaf(path->nodes[0]);
+                               btrfs_crit(fs_info,
+"overrun extent record at slot %d while looking for inline extent for root %llu owner %llu offset %llu parent %llu",
+                                       path->slots[0], root_objectid, owner, offset, parent);
+                       }
                        break;
                }
                iref = (struct btrfs_extent_inline_ref *)ptr;