mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-14 13:33:30 -04:00
btrfs: use rb_find() in btrfs_qgroup_trace_subtree_after_cow()
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>
This commit is contained in:
@@ -4670,6 +4670,20 @@ void btrfs_qgroup_clean_swapped_blocks(struct btrfs_root *root)
|
||||
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++) {
|
||||
|
||||
Reference in New Issue
Block a user