mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-14 14:42:34 -04:00
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user