btrfs: use rb_find_add() in btrfs_qgroup_add_swapped_blocks()
authorYangtao Li <frank.li@vivo.com>
Fri, 16 May 2025 03:03:31 +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 and insert
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 d916b67bd152ed8cce4c66fcdd469483859724f7..90685812ee56de11a1e7bf2e80e3a5f058a04da5 100644 (file)
@@ -4684,6 +4684,14 @@ static int qgroup_swapped_block_bytenr_key_cmp(const void *key, const struct rb_
        return 0;
 }
 
+static int qgroup_swapped_block_bytenr_cmp(struct rb_node *new, const struct rb_node *existing)
+{
+       const struct btrfs_qgroup_swapped_block *new_block = rb_entry(new,
+                                             struct btrfs_qgroup_swapped_block, node);
+
+       return qgroup_swapped_block_bytenr_key_cmp(&new_block->subvol_bytenr, existing);
+}
+
 /*
  * Add subtree roots record into @subvol_root.
  *
@@ -4703,8 +4711,7 @@ int btrfs_qgroup_add_swapped_blocks(struct btrfs_root *subvol_root,
        struct btrfs_fs_info *fs_info = subvol_root->fs_info;
        struct btrfs_qgroup_swapped_blocks *blocks = &subvol_root->swapped_blocks;
        struct btrfs_qgroup_swapped_block *block;
-       struct rb_node **cur;
-       struct rb_node *parent = NULL;
+       struct rb_node *node;
        int level = btrfs_header_level(subvol_parent) - 1;
        int ret = 0;
 
@@ -4753,40 +4760,26 @@ int btrfs_qgroup_add_swapped_blocks(struct btrfs_root *subvol_root,
 
        /* Insert @block into @blocks */
        spin_lock(&blocks->lock);
-       cur = &blocks->blocks[level].rb_node;
-       while (*cur) {
+       node = rb_find_add(&block->node, &blocks->blocks[level], qgroup_swapped_block_bytenr_cmp);
+       if (node) {
                struct btrfs_qgroup_swapped_block *entry;
 
-               parent = *cur;
-               entry = rb_entry(parent, struct btrfs_qgroup_swapped_block,
-                                node);
+               entry = rb_entry(node, struct btrfs_qgroup_swapped_block, node);
 
-               if (entry->subvol_bytenr < block->subvol_bytenr) {
-                       cur = &(*cur)->rb_left;
-               } else if (entry->subvol_bytenr > block->subvol_bytenr) {
-                       cur = &(*cur)->rb_right;
-               } else {
-                       if (entry->subvol_generation !=
-                                       block->subvol_generation ||
-                           entry->reloc_bytenr != block->reloc_bytenr ||
-                           entry->reloc_generation !=
-                                       block->reloc_generation) {
-                               /*
-                                * Duplicated but mismatch entry found.
-                                * Shouldn't happen.
-                                *
-                                * Marking qgroup inconsistent should be enough
-                                * for end users.
-                                */
-                               DEBUG_WARN("duplicated but mismatched entry found");
-                               ret = -EEXIST;
-                       }
-                       kfree(block);
-                       goto out_unlock;
+               if (entry->subvol_generation != block->subvol_generation ||
+                   entry->reloc_bytenr != block->reloc_bytenr ||
+                   entry->reloc_generation != block->reloc_generation) {
+                       /*
+                        * Duplicated but mismatch entry found.  Shouldn't happen.
+                        * Marking qgroup inconsistent should be enough for end
+                        * users.
+                        */
+                       DEBUG_WARN("duplicated but mismatched entry found");
+                       ret = -EEXIST;
                }
+               kfree(block);
+               goto out_unlock;
        }
-       rb_link_node(&block->node, parent, cur);
-       rb_insert_color(&block->node, &blocks->blocks[level]);
        blocks->swapped = true;
 out_unlock:
        spin_unlock(&blocks->lock);