btrfs: avoid re-searching tree when converting bits in an extent range
authorFilipe Manana <fdmanana@suse.com>
Wed, 16 Apr 2025 14:43:25 +0000 (15:43 +0100)
committerDavid Sterba <dsterba@suse.com>
Thu, 15 May 2025 12:30:51 +0000 (14:30 +0200)
When converting bits for an extent range (btrfs_convert_extent_bit()), if
the current extent state record starts after the target range, we always
do a jump to the 'search_again' label, which will cause us to do a full
tree search for the next state if the current state ends before the target
range. Unless we need to reschedule, we can just grab the next state and
process it, avoiding a full tree search, even if that next state is not
contiguous, as we'll allocate and insert a new prealloc state if needed.

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

index 14383f92c38134f7b10404f0bbeb5ac29acd3aee..1458c3306161129b4a88c19b2925f95c78c224c9 100644 (file)
@@ -1456,6 +1456,22 @@ hit_next:
                if (inserted_state == prealloc)
                        prealloc = NULL;
                start = inserted_state->end + 1;
+
+               /* Beyond target range, stop. */
+               if (start > end)
+                       goto out;
+
+               if (need_resched())
+                       goto search_again;
+
+               state = next_search_state(inserted_state, end);
+               /*
+                * If there's a next state, whether contiguous or not, we don't
+                * need to unlock and start search again. If it's not contiguous
+                * we will end up here and try to allocate a prealloc state and insert.
+                */
+               if (state)
+                       goto hit_next;
                goto search_again;
        }
        /*