diff options
-rw-r--r-- | fs/btrfs/extent_io.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 2c9fbe3b6eec..fd78c84821c8 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -229,12 +229,14 @@ void free_extent_state(struct extent_state *state) | |||
229 | } | 229 | } |
230 | } | 230 | } |
231 | 231 | ||
232 | static struct rb_node *tree_insert(struct rb_root *root, u64 offset, | 232 | static struct rb_node *tree_insert(struct rb_root *root, |
233 | struct rb_node *search_start, | ||
234 | u64 offset, | ||
233 | struct rb_node *node, | 235 | struct rb_node *node, |
234 | struct rb_node ***p_in, | 236 | struct rb_node ***p_in, |
235 | struct rb_node **parent_in) | 237 | struct rb_node **parent_in) |
236 | { | 238 | { |
237 | struct rb_node **p = &root->rb_node; | 239 | struct rb_node **p; |
238 | struct rb_node *parent = NULL; | 240 | struct rb_node *parent = NULL; |
239 | struct tree_entry *entry; | 241 | struct tree_entry *entry; |
240 | 242 | ||
@@ -244,6 +246,7 @@ static struct rb_node *tree_insert(struct rb_root *root, u64 offset, | |||
244 | goto do_insert; | 246 | goto do_insert; |
245 | } | 247 | } |
246 | 248 | ||
249 | p = search_start ? &search_start : &root->rb_node; | ||
247 | while (*p) { | 250 | while (*p) { |
248 | parent = *p; | 251 | parent = *p; |
249 | entry = rb_entry(parent, struct tree_entry, rb_node); | 252 | entry = rb_entry(parent, struct tree_entry, rb_node); |
@@ -430,7 +433,7 @@ static int insert_state(struct extent_io_tree *tree, | |||
430 | 433 | ||
431 | set_state_bits(tree, state, bits); | 434 | set_state_bits(tree, state, bits); |
432 | 435 | ||
433 | node = tree_insert(&tree->state, end, &state->rb_node, p, parent); | 436 | node = tree_insert(&tree->state, NULL, end, &state->rb_node, p, parent); |
434 | if (node) { | 437 | if (node) { |
435 | struct extent_state *found; | 438 | struct extent_state *found; |
436 | found = rb_entry(node, struct extent_state, rb_node); | 439 | 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 | prealloc->state = orig->state; | 480 | prealloc->state = orig->state; |
478 | orig->start = split; | 481 | orig->start = split; |
479 | 482 | ||
480 | node = tree_insert(&tree->state, prealloc->end, &prealloc->rb_node, | 483 | node = tree_insert(&tree->state, &orig->rb_node, prealloc->end, |
481 | NULL, NULL); | 484 | &prealloc->rb_node, NULL, NULL); |
482 | if (node) { | 485 | if (node) { |
483 | free_extent_state(prealloc); | 486 | free_extent_state(prealloc); |
484 | return -EEXIST; | 487 | return -EEXIST; |