diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
| -rw-r--r-- | fs/btrfs/extent_io.c | 15 | 
1 files changed, 9 insertions, 6 deletions
| diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 85bbd01f1271..ae69a00387e7 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; | 
| @@ -2757,7 +2760,7 @@ __get_extent_map(struct inode *inode, struct page *page, size_t pg_offset, | |||
| 2757 | 2760 | ||
| 2758 | if (em_cached && *em_cached) { | 2761 | if (em_cached && *em_cached) { | 
| 2759 | em = *em_cached; | 2762 | em = *em_cached; | 
| 2760 | if (em->in_tree && start >= em->start && | 2763 | if (extent_map_in_tree(em) && start >= em->start && | 
| 2761 | start < extent_map_end(em)) { | 2764 | start < extent_map_end(em)) { | 
| 2762 | atomic_inc(&em->refs); | 2765 | atomic_inc(&em->refs); | 
| 2763 | return em; | 2766 | return em; | 
