mirror of
https://github.com/torvalds/linux.git
synced 2026-06-05 13:06:59 +02:00
btrfs: avoid re-searching tree when setting bits in an extent range
When setting bits for an extent range (set_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>
This commit is contained in:
parent
b61dd9b1cb
commit
aa2c80a9ae
|
|
@ -1226,6 +1226,22 @@ static int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
|
|||
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 agian. 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;
|
||||
}
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user