btrfs: use rb_find() in btrfs_qgroup_trace_subtree_after_cow()
authorYangtao Li <frank.li@vivo.com>
Fri, 16 May 2025 03:03:30 +0000 (11:03 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 21 Jul 2025 21:53:26 +0000 (23:53 +0200)
Use the rb-tree helper so we don't open code the search code.

Signed-off-by: Yangtao Li <frank.li@vivo.com>
Signed-off-by: Pan Chuang <panchuang@vivo.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/qgroup.c

index 694df7f64f94b56ce5dcde9415fd5d343c588302..d916b67bd152ed8cce4c66fcdd469483859724f7 100644 (file)
@@ -4670,6 +4670,20 @@ out:
        spin_unlock(&swapped_blocks->lock);
 }
 
+static int qgroup_swapped_block_bytenr_key_cmp(const void *key, const struct rb_node *node)
+{
+       const u64 *bytenr = key;
+       const struct btrfs_qgroup_swapped_block *block = rb_entry(node,
+                                         struct btrfs_qgroup_swapped_block, node);
+
+       if (block->subvol_bytenr < *bytenr)
+               return -1;
+       else if (block->subvol_bytenr > *bytenr)
+               return 1;
+
+       return 0;
+}
+
 /*
  * Add subtree roots record into @subvol_root.
  *
@@ -4798,7 +4812,6 @@ int btrfs_qgroup_trace_subtree_after_cow(struct btrfs_trans_handle *trans,
        struct btrfs_qgroup_swapped_block *block;
        struct extent_buffer *reloc_eb = NULL;
        struct rb_node *node;
-       bool found = false;
        bool swapped = false;
        int level = btrfs_header_level(subvol_eb);
        int ret = 0;
@@ -4814,23 +4827,14 @@ int btrfs_qgroup_trace_subtree_after_cow(struct btrfs_trans_handle *trans,
                spin_unlock(&blocks->lock);
                return 0;
        }
-       node = blocks->blocks[level].rb_node;
-
-       while (node) {
-               block = rb_entry(node, struct btrfs_qgroup_swapped_block, node);
-               if (block->subvol_bytenr < subvol_eb->start) {
-                       node = node->rb_left;
-               } else if (block->subvol_bytenr > subvol_eb->start) {
-                       node = node->rb_right;
-               } else {
-                       found = true;
-                       break;
-               }
-       }
-       if (!found) {
+       node = rb_find(&subvol_eb->start, &blocks->blocks[level],
+                       qgroup_swapped_block_bytenr_key_cmp);
+       if (!node) {
                spin_unlock(&blocks->lock);
                goto out;
        }
+       block = rb_entry(node, struct btrfs_qgroup_swapped_block, node);
+
        /* Found one, remove it from @blocks first and update blocks->swapped */
        rb_erase(&block->node, &blocks->blocks[level]);
        for (i = 0; i < BTRFS_MAX_LEVEL; i++) {