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

btrfs: update prelim_ref_insert() to use rb helpers



Update prelim_ref_insert() to use rb_find_add_cached().

There is a special change that the existing prelim_ref_compare() is
called with the first parameter as the existing ref in the rbtree.

But the newer rb_find_add_cached() expects the cmp() function to have
the first parameter as the to-be-added node, thus the new helper
prelim_ref_rb_add_cmp() need to adapt this new order.

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 372484f2
Loading
Loading
Loading
Loading
+39 −40
Original line number Diff line number Diff line
@@ -250,6 +250,21 @@ static int prelim_ref_compare(const struct prelim_ref *ref1,
	return 0;
}

static int prelim_ref_rb_add_cmp(const struct rb_node *new,
				 const struct rb_node *exist)
{
	const struct prelim_ref *ref_new =
		rb_entry(new, struct prelim_ref, rbnode);
	const struct prelim_ref *ref_exist =
		rb_entry(exist, struct prelim_ref, rbnode);

	/*
	 * prelim_ref_compare() expects the first parameter as the existing one,
	 * different from the rb_find_add_cached() order.
	 */
	return prelim_ref_compare(ref_exist, ref_new);
}

static void update_share_count(struct share_check *sc, int oldcount,
			       int newcount, const struct prelim_ref *newref)
{
@@ -278,25 +293,12 @@ static void prelim_ref_insert(const struct btrfs_fs_info *fs_info,
			      struct share_check *sc)
{
	struct rb_root_cached *root;
	struct rb_node **p;
	struct rb_node *parent = NULL;
	struct prelim_ref *ref;
	int result;
	bool leftmost = true;
	struct rb_node *exist;

	root = &preftree->root;
	p = &root->rb_root.rb_node;

	while (*p) {
		parent = *p;
		ref = rb_entry(parent, struct prelim_ref, rbnode);
		result = prelim_ref_compare(ref, newref);
		if (result < 0) {
			p = &(*p)->rb_left;
		} else if (result > 0) {
			p = &(*p)->rb_right;
			leftmost = false;
		} else {
	exist = rb_find_add_cached(&newref->rbnode, root, prelim_ref_rb_add_cmp);
	if (exist) {
		struct prelim_ref *ref = rb_entry(exist, struct prelim_ref, rbnode);
		/* Identical refs, merge them and free @newref */
		struct extent_inode_elem *eie = ref->inode_list;

@@ -320,13 +322,10 @@ static void prelim_ref_insert(const struct btrfs_fs_info *fs_info,
		free_pref(newref);
		return;
	}
	}

	update_share_count(sc, 0, newref->count, newref);
	preftree->count++;
	trace_btrfs_prelim_ref_insert(fs_info, newref, NULL, preftree->count);
	rb_link_node(&newref->rbnode, parent, p);
	rb_insert_color_cached(&newref->rbnode, root, leftmost);
}

/*