Commit fb8f07d2 authored by David Sterba's avatar David Sterba
Browse files

btrfs: add fast path for extent_state insertion



In two cases the exact location where to insert the extent state is
known at the call time so we don't need to pass it to insert_state that
takes the fast path.

Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 6d92b304
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -569,6 +569,20 @@ static int insert_state(struct extent_io_tree *tree,
	return 0;
}

/*
 * Insert state to @tree to the location given by @node and @parent.
 */
static void insert_state_fast(struct extent_io_tree *tree,
			      struct extent_state *state, struct rb_node **node,
			      struct rb_node *parent, unsigned bits,
			      struct extent_changeset *changeset)
{
	set_state_bits(tree, state, bits, changeset);
	rb_link_node(&state->rb_node, parent, node);
	rb_insert_color(&state->rb_node, &tree->state);
	merge_state(tree, state);
}

/*
 * split a given extent state struct in two, inserting the preallocated
 * struct 'prealloc' as the newly created second half.  'split' indicates an
@@ -1021,10 +1035,7 @@ int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, u32 bits,
		BUG_ON(!prealloc);
		prealloc->start = start;
		prealloc->end = end;
		err = insert_state(tree, prealloc, &p, &parent, bits, changeset);
		if (err)
			extent_io_tree_panic(tree, err);

		insert_state_fast(tree, prealloc, p, parent, bits, changeset);
		cache_state(prealloc, cached_state);
		prealloc = NULL;
		goto out;
@@ -1264,9 +1275,7 @@ int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
		}
		prealloc->start = start;
		prealloc->end = end;
		err = insert_state(tree, prealloc, &p, &parent, bits, NULL);
		if (err)
			extent_io_tree_panic(tree, err);
		insert_state_fast(tree, prealloc, p, parent, bits, NULL);
		cache_state(prealloc, cached_state);
		prealloc = NULL;
		goto out;