]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: make sure report_eb_range() is not inlined
authorFilipe Manana <fdmanana@suse.com>
Fri, 24 Apr 2026 15:08:57 +0000 (16:08 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Jun 2026 13:53:31 +0000 (15:53 +0200)
If report_rb_range() is inlined into its single caller (check_eb_range()),
we end up with a larger module size, which is undesirable and does not
provide any advantage since this code is for a cold path which we don't
expect to ever hit.

Add the noinline attribute to report_rb_range() and while at it also make
it return void as it always returns true.

Before this change (with gcc 14.2.0-19 from Debian):

  $ size fs/btrfs/btrfs.ko
     text    data     bss     dec     hex filename
  2018267  176232   15592 2210091  21b92b fs/btrfs/btrfs.ko

After this change:

  $ size fs/btrfs/btrfs.ko
     text    data     bss     dec     hex filename
  2017835  176048   15592 2209475  21b6c3 fs/btrfs/btrfs.ko

Also, replacing the noinline with __cold, yields slighty worse results:

  $ size fs/btrfs/btrfs.ko
     text    data     bss     dec     hex filename
  2017889  176048   15592 2209529  21b6f9 fs/btrfs/btrfs.ko

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_io.c

index 8800faa8b4bedea6d9286a95d34e060765de6d73..e9ca4f6f47d1ecfad98207797dc170e48c3e1763 100644 (file)
@@ -3986,15 +3986,14 @@ int read_extent_buffer_pages(struct extent_buffer *eb, int mirror_num,
        return 0;
 }
 
-static bool report_eb_range(const struct extent_buffer *eb, unsigned long start,
-                           unsigned long len)
+/* Never inlined to decrease code size, as this is called in a cold path. */
+static noinline void report_eb_range(const struct extent_buffer *eb,
+                                    unsigned long start, unsigned long len)
 {
        btrfs_warn(eb->fs_info,
                "access to eb bytenr %llu len %u out of range start %lu len %lu",
                eb->start, eb->len, start, len);
        DEBUG_WARN();
-
-       return true;
 }
 
 /*
@@ -4010,8 +4009,10 @@ static inline bool check_eb_range(const struct extent_buffer *eb,
        unsigned long offset;
 
        /* start, start + len should not go beyond eb->len nor overflow */
-       if (unlikely(check_add_overflow(start, len, &offset) || offset > eb->len))
-               return report_eb_range(eb, start, len);
+       if (unlikely(check_add_overflow(start, len, &offset) || offset > eb->len)) {
+               report_eb_range(eb, start, len);
+               return true;
+       }
 
        return false;
 }