btrfs: make the logic from btrfs_block_can_be_shared() easier to read
authorFilipe Manana <fdmanana@suse.com>
Thu, 19 Oct 2023 12:19:30 +0000 (13:19 +0100)
committerDavid Sterba <dsterba@suse.com>
Fri, 15 Dec 2023 19:27:00 +0000 (20:27 +0100)
The logic in btrfs_block_can_be_shared() is hard to follow as we have a
lot of conditions in a single if statement including a subexpression with
a logical or and two nested if statements inside the main if statement.

Make this easier to read by using separate if statements that return
immediately when we find a condition that determines if a block can be
or can not be shared.

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 1e4d5bd1ec480cdc77bd8aa13948d6d16d102cce..137c4eb24c28dd277780ac510c70e5798188b1fa 100644 (file)
@@ -374,27 +374,35 @@ bool btrfs_block_can_be_shared(struct btrfs_trans_handle *trans,
                               struct btrfs_root *root,
                               struct extent_buffer *buf)
 {
+       const u64 buf_gen = btrfs_header_generation(buf);
+
        /*
         * Tree blocks not in shareable trees and tree roots are never shared.
         * If a block was allocated after the last snapshot and the block was
         * not allocated by tree relocation, we know the block is not shared.
         */
-       if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state) &&
-           buf != root->node &&
-           (btrfs_header_generation(buf) <=
-            btrfs_root_last_snapshot(&root->root_item) ||
-            btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))) {
-               if (buf != root->commit_root)
-                       return true;
-               /*
-                * An extent buffer that used to be the commit root may still be
-                * shared because the tree height may have increased and it
-                * became a child of a higher level root. This can happen when
-                * snapshotting a subvolume created in the current transaction.
-                */
-               if (btrfs_header_generation(buf) == trans->transid)
-                       return true;
-       }
+
+       if (!test_bit(BTRFS_ROOT_SHAREABLE, &root->state))
+               return false;
+
+       if (buf == root->node)
+               return false;
+
+       if (buf_gen > btrfs_root_last_snapshot(&root->root_item) &&
+           !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))
+               return false;
+
+       if (buf != root->commit_root)
+               return true;
+
+       /*
+        * An extent buffer that used to be the commit root may still be shared
+        * because the tree height may have increased and it became a child of a
+        * higher level root. This can happen when snapshotting a subvolume
+        * created in the current transaction.
+        */
+       if (buf_gen == trans->transid)
+               return true;
 
        return false;
 }