Commit fbec9a5d authored by Yangtao Li's avatar Yangtao Li Committed by David Sterba
Browse files

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: default avatarYangtao Li <frank.li@vivo.com>
Signed-off-by: default avatarPan Chuang <panchuang@vivo.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 844e5f90
Loading
Loading
Loading
Loading
+24 −31
Original line number Diff line number Diff line
@@ -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,30 +4760,19 @@ 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 ||
		if (entry->subvol_generation != block->subvol_generation ||
		    entry->reloc_bytenr != block->reloc_bytenr ||
			    entry->reloc_generation !=
					block->reloc_generation) {
		    entry->reloc_generation != block->reloc_generation) {
			/*
				 * Duplicated but mismatch entry found.
				 * Shouldn't happen.
				 *
				 * Marking qgroup inconsistent should be enough
				 * for end users.
			 * 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;
@@ -4784,9 +4780,6 @@ int btrfs_qgroup_add_swapped_blocks(struct btrfs_root *subvol_root,
		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);