Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux...
[cascardo/linux.git] / fs / btrfs / extent_io.c
index 85bbd01..ae69a00 100644 (file)
@@ -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 ***p_in,
                                   struct rb_node **parent_in)
 {
-       struct rb_node **p = &root->rb_node;
+       struct rb_node **p;
        struct rb_node *parent = NULL;
        struct tree_entry *entry;
 
@@ -244,6 +246,7 @@ static struct rb_node *tree_insert(struct rb_root *root, u64 offset,
                goto do_insert;
        }
 
+       p = search_start ? &search_start : &root->rb_node;
        while (*p) {
                parent = *p;
                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);
 
-       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) {
                struct extent_state *found;
                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;
        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) {
                free_extent_state(prealloc);
                return -EEXIST;
@@ -2757,7 +2760,7 @@ __get_extent_map(struct inode *inode, struct page *page, size_t pg_offset,
 
        if (em_cached && *em_cached) {
                em = *em_cached;
-               if (em->in_tree && start >= em->start &&
+               if (extent_map_in_tree(em) && start >= em->start &&
                    start < extent_map_end(em)) {
                        atomic_inc(&em->refs);
                        return em;