Commit c52ea14d authored by Pan Chuang's avatar Pan Chuang Committed by David Sterba
Browse files

btrfs: pass struct rb_simple_node pointer directly in rb_simple_insert()



Replace struct embedding with union to enable safe type conversion in
btrfs_backref_node, tree_block and mapping_node.

Adjust function calls to use the new unified API, eliminating redundant
parameters.

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 fbec9a5d
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -3566,7 +3566,7 @@ int btrfs_backref_finish_upper_links(struct btrfs_backref_cache *cache,

	ASSERT(start->checked);

	rb_node = rb_simple_insert(&cache->rb_root, start->bytenr, &start->rb_node);
	rb_node = rb_simple_insert(&cache->rb_root, &start->simple_node);
	if (rb_node)
		btrfs_backref_panic(cache->fs_info, start->bytenr, -EEXIST);

@@ -3617,8 +3617,7 @@ int btrfs_backref_finish_upper_links(struct btrfs_backref_cache *cache,
			return -EUCLEAN;
		}

		rb_node = rb_simple_insert(&cache->rb_root, upper->bytenr,
					   &upper->rb_node);
		rb_node = rb_simple_insert(&cache->rb_root, &upper->simple_node);
		if (unlikely(rb_node)) {
			btrfs_backref_panic(cache->fs_info, upper->bytenr, -EEXIST);
			return -EUCLEAN;
+9 −4
Original line number Diff line number Diff line
@@ -313,10 +313,15 @@ int btrfs_backref_iter_next(struct btrfs_backref_iter *iter);
 * Represent a tree block in the backref cache
 */
struct btrfs_backref_node {
	union{
		/* Use rb_simple_node for search/insert */
		struct {
			struct rb_node rb_node;
			u64 bytenr;
	}; /* Use rb_simple_node for search/insert */
		};

		struct rb_simple_node simple_node;
	};

	/*
	 * This is a sanity check, whenever we COW a block we will update
+6 −6
Original line number Diff line number Diff line
@@ -119,8 +119,8 @@ static inline struct rb_node *rb_simple_search_first(const struct rb_root *root,
	return ret;
}

static inline struct rb_node *rb_simple_insert(struct rb_root *root, u64 bytenr,
					       struct rb_node *node)
static inline struct rb_node *rb_simple_insert(struct rb_root *root,
					       struct rb_simple_node *simple_node)
{
	struct rb_node **p = &root->rb_node;
	struct rb_node *parent = NULL;
@@ -130,16 +130,16 @@ static inline struct rb_node *rb_simple_insert(struct rb_root *root, u64 bytenr,
		parent = *p;
		entry = rb_entry(parent, struct rb_simple_node, rb_node);

		if (bytenr < entry->bytenr)
		if (simple_node->bytenr < entry->bytenr)
			p = &(*p)->rb_left;
		else if (bytenr > entry->bytenr)
		else if (simple_node->bytenr > entry->bytenr)
			p = &(*p)->rb_right;
		else
			return parent;
	}

	rb_link_node(node, parent, p);
	rb_insert_color(node, root);
	rb_link_node(&simple_node->rb_node, parent, p);
	rb_insert_color(&simple_node->rb_node, root);
	return NULL;
}

+21 −13
Original line number Diff line number Diff line
@@ -90,10 +90,15 @@
 * map address of tree root to tree
 */
struct mapping_node {
	union {
		/* Use rb_simple_node for search/insert */
		struct {
			struct rb_node rb_node;
			u64 bytenr;
	}; /* Use rb_simle_node for search/insert */
		};

		struct rb_simple_node simple_node;
	};
	void *data;
};

@@ -106,10 +111,15 @@ struct mapping_tree {
 * present a tree block to process
 */
struct tree_block {
	union {
		/* Use rb_simple_node for search/insert */
		struct {
			struct rb_node rb_node;
			u64 bytenr;
	}; /* Use rb_simple_node for search/insert */
		};

		struct rb_simple_node simple_node;
	};
	u64 owner;
	struct btrfs_key key;
	u8 level;
@@ -480,8 +490,7 @@ static int __add_reloc_root(struct btrfs_root *root)
	node->data = root;

	spin_lock(&rc->reloc_root_tree.lock);
	rb_node = rb_simple_insert(&rc->reloc_root_tree.rb_root,
				   node->bytenr, &node->rb_node);
	rb_node = rb_simple_insert(&rc->reloc_root_tree.rb_root, &node->simple_node);
	spin_unlock(&rc->reloc_root_tree.lock);
	if (rb_node) {
		btrfs_err(fs_info,
@@ -564,8 +573,7 @@ static int __update_reloc_root(struct btrfs_root *root)

	spin_lock(&rc->reloc_root_tree.lock);
	node->bytenr = root->node->start;
	rb_node = rb_simple_insert(&rc->reloc_root_tree.rb_root,
				   node->bytenr, &node->rb_node);
	rb_node = rb_simple_insert(&rc->reloc_root_tree.rb_root, &node->simple_node);
	spin_unlock(&rc->reloc_root_tree.lock);
	if (rb_node)
		btrfs_backref_panic(fs_info, node->bytenr, -EEXIST);
@@ -3155,7 +3163,7 @@ static int add_tree_block(struct reloc_control *rc,
	block->key_ready = false;
	block->owner = owner;

	rb_node = rb_simple_insert(blocks, block->bytenr, &block->rb_node);
	rb_node = rb_simple_insert(blocks, &block->simple_node);
	if (rb_node)
		btrfs_backref_panic(rc->extent_root->fs_info, block->bytenr,
				    -EEXIST);