Commit 287373c7 authored by Roger L. Beckermeyer III's avatar Roger L. Beckermeyer III Committed by David Sterba
Browse files

btrfs: update btrfs_add_chunk_map() to use rb helpers



Update btrfs_add_chunk_map() to use rb_find_add_cached().

Signed-off-by: default avatarRoger L. Beckermeyer III <beckerlee3@gmail.com>
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 0877597d
Loading
Loading
Loading
Loading
+22 −21
Original line number Diff line number Diff line
@@ -5514,33 +5514,34 @@ void btrfs_remove_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_ma
	btrfs_free_chunk_map(map);
}

static int btrfs_chunk_map_cmp(const struct rb_node *new,
			       const struct rb_node *exist)
{
	const struct btrfs_chunk_map *new_map =
		rb_entry(new, struct btrfs_chunk_map, rb_node);
	const struct btrfs_chunk_map *exist_map =
		rb_entry(exist, struct btrfs_chunk_map, rb_node);

	if (new_map->start == exist_map->start)
		return 0;
	if (new_map->start < exist_map->start)
		return -1;
	return 1;
}

EXPORT_FOR_TESTS
int btrfs_add_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_map *map)
{
	struct rb_node **p;
	struct rb_node *parent = NULL;
	bool leftmost = true;
	struct rb_node *exist;

	write_lock(&fs_info->mapping_tree_lock);
	p = &fs_info->mapping_tree.rb_root.rb_node;
	while (*p) {
		struct btrfs_chunk_map *entry;

		parent = *p;
		entry = rb_entry(parent, struct btrfs_chunk_map, rb_node);

		if (map->start < entry->start) {
			p = &(*p)->rb_left;
		} else if (map->start > entry->start) {
			p = &(*p)->rb_right;
			leftmost = false;
		} else {
	exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree,
				   btrfs_chunk_map_cmp);

	if (exist) {
		write_unlock(&fs_info->mapping_tree_lock);
		return -EEXIST;
	}
	}
	rb_link_node(&map->rb_node, parent, p);
	rb_insert_color_cached(&map->rb_node, &fs_info->mapping_tree, leftmost);
	chunk_map_device_set_bits(map, CHUNK_ALLOCATED);
	chunk_map_device_clear_bits(map, CHUNK_TRIMMED);
	write_unlock(&fs_info->mapping_tree_lock);