OSDN Git Service

btrfs: avoid searching twice for previous node when merging free space entries
authorFilipe Manana <fdmanana@suse.com>
Thu, 4 May 2023 11:04:20 +0000 (12:04 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2023 11:59:23 +0000 (13:59 +0200)
At try_merge_free_space(), avoid calling twice rb_prev() to find the
previous node, as that requires looping through the red black tree, so
store the result of the rb_prev() call and then use it.

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/free-space-cache.c

index ec53119..7f69fcc 100644 (file)
@@ -2449,6 +2449,7 @@ static bool try_merge_free_space(struct btrfs_free_space_ctl *ctl,
        u64 offset = info->offset;
        u64 bytes = info->bytes;
        const bool is_trimmed = btrfs_free_space_trimmed(info);
+       struct rb_node *right_prev = NULL;
 
        /*
         * first we want to see if there is free space adjacent to the range we
@@ -2456,9 +2457,11 @@ static bool try_merge_free_space(struct btrfs_free_space_ctl *ctl,
         * cover the entire range
         */
        right_info = tree_search_offset(ctl, offset + bytes, 0, 0);
-       if (right_info && rb_prev(&right_info->offset_index))
-               left_info = rb_entry(rb_prev(&right_info->offset_index),
-                                    struct btrfs_free_space, offset_index);
+       if (right_info)
+               right_prev = rb_prev(&right_info->offset_index);
+
+       if (right_prev)
+               left_info = rb_entry(right_prev, struct btrfs_free_space, offset_index);
        else if (!right_info)
                left_info = tree_search_offset(ctl, offset - 1, 0, 0);