btrfs: use rb_find_add() in btrfs_qgroup_add_swapped_blocks()

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>
This commit is contained in:
Yangtao Li
2025-05-16 11:03:31 +08:00
committed by David Sterba
parent 844e5f902d
commit fbec9a5d3e

View 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);