Commit f2071b21 authored by Filipe Manana's avatar Filipe Manana Committed by Josef Bacik

Btrfs: more efficient split extent state insertion

When we split an extent state there's no need to start the rbtree search
from the root node - we can start it from the original extent state node,
since we would end up in its subtree if we do the search starting at the
root node anyway.
Signed-off-by: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
parent cbc0e928
...@@ -229,12 +229,14 @@ void free_extent_state(struct extent_state *state) ...@@ -229,12 +229,14 @@ void free_extent_state(struct extent_state *state)
} }
} }
static struct rb_node *tree_insert(struct rb_root *root, u64 offset, static struct rb_node *tree_insert(struct rb_root *root,
struct rb_node *search_start,
u64 offset,
struct rb_node *node, struct rb_node *node,
struct rb_node ***p_in, struct rb_node ***p_in,
struct rb_node **parent_in) struct rb_node **parent_in)
{ {
struct rb_node **p = &root->rb_node; struct rb_node **p;
struct rb_node *parent = NULL; struct rb_node *parent = NULL;
struct tree_entry *entry; struct tree_entry *entry;
...@@ -244,6 +246,7 @@ static struct rb_node *tree_insert(struct rb_root *root, u64 offset, ...@@ -244,6 +246,7 @@ static struct rb_node *tree_insert(struct rb_root *root, u64 offset,
goto do_insert; goto do_insert;
} }
p = search_start ? &search_start : &root->rb_node;
while (*p) { while (*p) {
parent = *p; parent = *p;
entry = rb_entry(parent, struct tree_entry, rb_node); entry = rb_entry(parent, struct tree_entry, rb_node);
...@@ -430,7 +433,7 @@ static int insert_state(struct extent_io_tree *tree, ...@@ -430,7 +433,7 @@ static int insert_state(struct extent_io_tree *tree,
set_state_bits(tree, state, bits); set_state_bits(tree, state, bits);
node = tree_insert(&tree->state, end, &state->rb_node, p, parent); node = tree_insert(&tree->state, NULL, end, &state->rb_node, p, parent);
if (node) { if (node) {
struct extent_state *found; struct extent_state *found;
found = rb_entry(node, struct extent_state, rb_node); found = rb_entry(node, struct extent_state, rb_node);
...@@ -477,8 +480,8 @@ static int split_state(struct extent_io_tree *tree, struct extent_state *orig, ...@@ -477,8 +480,8 @@ static int split_state(struct extent_io_tree *tree, struct extent_state *orig,
prealloc->state = orig->state; prealloc->state = orig->state;
orig->start = split; orig->start = split;
node = tree_insert(&tree->state, prealloc->end, &prealloc->rb_node, node = tree_insert(&tree->state, &orig->rb_node, prealloc->end,
NULL, NULL); &prealloc->rb_node, NULL, NULL);
if (node) { if (node) {
free_extent_state(prealloc); free_extent_state(prealloc);
return -EEXIST; return -EEXIST;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment