]> xenbits.xensource.com Git - people/pauldu/linux.git/commitdiff
btrfs: simplify check for extent item overrun at lookup_inline_extent_backref()
authorFilipe Manana <fdmanana@suse.com>
Fri, 8 Sep 2023 17:20:33 +0000 (18:20 +0100)
committerDavid Sterba <dsterba@suse.com>
Thu, 12 Oct 2023 14:44:06 +0000 (16:44 +0200)
At lookup_inline_extent_backref() we can simplify the check for an overrun
of the extent item by making the while loop's condition to be "ptr < end"
and then check after the loop if an overrun happened ("ptr > end"). This
reduces indentation and makes the loop condition more clear. So move the
check out of the loop and change the loop condition accordingly, while
also adding the 'unlikely' tag to the check since it's not supposed to be
triggered.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent-tree.c

index ae4380a7f88ea141a998982165c5f94be5fa3276..128fc7840160e731b17f029542c0f30513cf8f82 100644 (file)
@@ -883,17 +883,7 @@ again:
                needed = BTRFS_REF_TYPE_BLOCK;
 
        ret = -ENOENT;
-       while (1) {
-               if (ptr >= end) {
-                       if (ptr > end) {
-                               ret = -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;
-               }
+       while (ptr < end) {
                iref = (struct btrfs_extent_inline_ref *)ptr;
                type = btrfs_get_extent_inline_ref_type(leaf, iref, needed);
                if (type == BTRFS_REF_TYPE_INVALID) {
@@ -940,6 +930,16 @@ again:
                }
                ptr += btrfs_extent_inline_ref_size(type);
        }
+
+       if (unlikely(ptr > end)) {
+               ret = -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);
+               goto out;
+       }
+
        if (ret == -ENOENT && insert) {
                if (item_size + extra_size >=
                    BTRFS_MAX_EXTENT_ITEM_SIZE(root)) {