Btrfs: cache extent state in find_delalloc_range
authorJosef Bacik <josef@redhat.com>
Tue, 2 Feb 2010 21:19:11 +0000 (21:19 +0000)
committerChris Mason <chris.mason@oracle.com>
Mon, 15 Mar 2010 15:00:13 +0000 (11:00 -0400)
This patch makes us cache the extent state we find in find_delalloc_range since
we'll have to lock the extent later on in the function.  This will keep us from
re-searching for the rang when we try to lock the extent.

Signed-off-by: Josef Bacik <josef@redhat.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent_io.c

index 355a973719a02ae1276c842b69e76aeb5965ec46..3c17c9eb0d98e344c65bd3350c138390d4a2984e 100644 (file)
@@ -1171,7 +1171,8 @@ out:
  * 1 is returned if we find something, 0 if nothing was in the tree
  */
 static noinline u64 find_delalloc_range(struct extent_io_tree *tree,
-                                       u64 *start, u64 *end, u64 max_bytes)
+                                       u64 *start, u64 *end, u64 max_bytes,
+                                       struct extent_state **cached_state)
 {
        struct rb_node *node;
        struct extent_state *state;
@@ -1203,8 +1204,11 @@ static noinline u64 find_delalloc_range(struct extent_io_tree *tree,
                                *end = state->end;
                        goto out;
                }
-               if (!found)
+               if (!found) {
                        *start = state->start;
+                       *cached_state = state;
+                       atomic_inc(&state->refs);
+               }
                found++;
                *end = state->end;
                cur_start = state->end + 1;
@@ -1336,10 +1340,11 @@ again:
        delalloc_start = *start;
        delalloc_end = 0;
        found = find_delalloc_range(tree, &delalloc_start, &delalloc_end,
-                                   max_bytes);
+                                   max_bytes, &cached_state);
        if (!found || delalloc_end <= *start) {
                *start = delalloc_start;
                *end = delalloc_end;
+               free_extent_state(cached_state);
                return found;
        }