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

rbtree: add rb_find_add_cached() to rbtree.h



Adds rb_find_add_cached() as a helper function for use with red-black
trees. Used in btrfs to reduce boilerplate code.

And since it's a new helper, the cmp() function will require both
parameter to be const rb_node pointers.

Suggested-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarRoger L. Beckermeyer III <beckerlee3@gmail.com>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
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 57e42186
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -210,6 +210,43 @@ rb_add(struct rb_node *node, struct rb_root *tree,
	rb_insert_color(node, tree);
}

/**
 * rb_find_add_cached() - find equivalent @node in @tree, or add @node
 * @node: node to look-for / insert
 * @tree: tree to search / modify
 * @cmp: operator defining the node order
 *
 * Returns the rb_node matching @node, or NULL when no match is found and @node
 * is inserted.
 */
static __always_inline struct rb_node *
rb_find_add_cached(struct rb_node *node, struct rb_root_cached *tree,
	    int (*cmp)(const struct rb_node *new, const struct rb_node *exist))
{
	bool leftmost = true;
	struct rb_node **link = &tree->rb_root.rb_node;
	struct rb_node *parent = NULL;
	int c;

	while (*link) {
		parent = *link;
		c = cmp(node, parent);

		if (c < 0) {
			link = &parent->rb_left;
		} else if (c > 0) {
			link = &parent->rb_right;
			leftmost = false;
		} else {
			return parent;
		}
	}

	rb_link_node(node, parent, link);
	rb_insert_color_cached(node, tree, leftmost);
	return NULL;
}

/**
 * rb_find_add() - find equivalent @node in @tree, or add @node
 * @node: node to look-for / insert