|
@@ -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,
|
|
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,
|
|
|
|
|
|
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,
|
|
prealloc->state = orig->state;
|
|
prealloc->state = orig->state;
|
|
orig->start = split;
|
|
orig->start = split;
|
|
|
|
|
|
- node = tree_insert(&tree->state, prealloc->end, &prealloc->rb_node,
|
|
|
|
- NULL, NULL);
|
|
|
|
|
|
+ node = tree_insert(&tree->state, &orig->rb_node, prealloc->end,
|
|
|
|
+ &prealloc->rb_node, NULL, NULL);
|
|
if (node) {
|
|
if (node) {
|
|
free_extent_state(prealloc);
|
|
free_extent_state(prealloc);
|
|
return -EEXIST;
|
|
return -EEXIST;
|