]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: make the rule checking more readable for should_cow_block()
authorFilipe Manana <fdmanana@suse.com>
Fri, 19 Sep 2025 08:16:20 +0000 (09:16 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 23 Sep 2025 06:49:24 +0000 (08:49 +0200)
It's quite hard and unreadable the way the rule checks are organized in
should_cow_block(). We have a single if statement that returns 0 (false)
and it checks several conditions, with one them being a negated compound
condition which is particularly hard to reason immediately.

Improve on this by using multiple if statements, each checking a single
condition and returning immediately. Also change the return type from an
integer to a boolean, since all we need is to return true or false.

At least on x86_64 with Debian's gcc 14.2.0-19, this also reduces the
object code size by 64 bytes.

Before this change:

   $ size fs/btrfs/btrfs.ko
      text    data     bss     dec     hex filename
   1913327  161567   15592 2090486  1fe5f6 fs/btrfs/btrfs.ko

After this change:

   $ size fs/btrfs/btrfs.ko
      text    data     bss     dec     hex filename
   1913263  161567   15592 2090422  1fe5b6 fs/btrfs/btrfs.ko

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Qu Wenruo <wqu@suse.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/ctree.c

index dc185322362b3762e8266172f3ed9a1a7f9c1108..13dc44e9076246de9f7cdff323cbfcd8a1108527 100644 (file)
@@ -613,15 +613,12 @@ error_unlock_cow:
        return ret;
 }
 
-static inline int should_cow_block(const struct btrfs_trans_handle *trans,
-                                  const struct btrfs_root *root,
-                                  const struct extent_buffer *buf)
+static inline bool should_cow_block(const struct btrfs_trans_handle *trans,
+                                   const struct btrfs_root *root,
+                                   const struct extent_buffer *buf)
 {
        if (btrfs_is_testing(root->fs_info))
-               return 0;
-
-       /* Ensure we can see the FORCE_COW bit */
-       smp_mb__before_atomic();
+               return false;
 
        /*
         * We do not need to cow a block if
@@ -634,13 +631,25 @@ static inline int should_cow_block(const struct btrfs_trans_handle *trans,
         *    after we've finished copying src root, we must COW the shared
         *    block to ensure the metadata consistency.
         */
-       if (btrfs_header_generation(buf) == trans->transid &&
-           !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN) &&
-           !(btrfs_root_id(root) != BTRFS_TREE_RELOC_OBJECTID &&
-             btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC)) &&
-           !test_bit(BTRFS_ROOT_FORCE_COW, &root->state))
-               return 0;
-       return 1;
+
+       if (btrfs_header_generation(buf) != trans->transid)
+               return true;
+
+       if (btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN))
+               return true;
+
+       /* Ensure we can see the FORCE_COW bit. */
+       smp_mb__before_atomic();
+       if (test_bit(BTRFS_ROOT_FORCE_COW, &root->state))
+               return true;
+
+       if (btrfs_root_id(root) == BTRFS_TREE_RELOC_OBJECTID)
+               return false;
+
+       if (btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))
+               return true;
+
+       return false;
 }
 
 /*