aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2009-08-05 12:57:59 -0400
committerChris Mason <chris.mason@oracle.com>2009-09-11 13:31:03 -0400
commit40431d6c1288793a682fc6f5e5b5c9d5cac34608 (patch)
treea840fb38459476ff0aecda8369f965c344a25562 /fs/btrfs/extent_io.c
parent9042846bc7ae69cc3288d85af6bad16208d93a95 (diff)
Btrfs: optimize set extent bit
The Btrfs set_extent_bit call currently searches the rbtree every time it needs to find more extent_state objects to fill the requested operation. This adds a simple test with rb_next to see if the next object in the tree was adjacent to the one we just found. If so, we skip the search and just use the next object. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r--fs/btrfs/extent_io.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 68260180f587..7e5c5a0749e2 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -694,8 +694,8 @@ again:
694 BUG_ON(err == -EEXIST); 694 BUG_ON(err == -EEXIST);
695 goto out; 695 goto out;
696 } 696 }
697
698 state = rb_entry(node, struct extent_state, rb_node); 697 state = rb_entry(node, struct extent_state, rb_node);
698hit_next:
699 last_start = state->start; 699 last_start = state->start;
700 last_end = state->end; 700 last_end = state->end;
701 701
@@ -706,6 +706,7 @@ again:
706 * Just lock what we found and keep going 706 * Just lock what we found and keep going
707 */ 707 */
708 if (state->start == start && state->end <= end) { 708 if (state->start == start && state->end <= end) {
709 struct rb_node *next_node;
709 set = state->state & bits; 710 set = state->state & bits;
710 if (set && exclusive) { 711 if (set && exclusive) {
711 *failed_start = state->start; 712 *failed_start = state->start;
@@ -716,7 +717,17 @@ again:
716 merge_state(tree, state); 717 merge_state(tree, state);
717 if (last_end == (u64)-1) 718 if (last_end == (u64)-1)
718 goto out; 719 goto out;
720
719 start = last_end + 1; 721 start = last_end + 1;
722 if (start < end && prealloc && !need_resched()) {
723 next_node = rb_next(node);
724 if (next_node) {
725 state = rb_entry(next_node, struct extent_state,
726 rb_node);
727 if (state->start == start)
728 goto hit_next;
729 }
730 }
720 goto search_again; 731 goto search_again;
721 } 732 }
722 733
@@ -852,7 +863,7 @@ int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end,
852 gfp_t mask) 863 gfp_t mask)
853{ 864{
854 return set_extent_bit(tree, start, end, 865 return set_extent_bit(tree, start, end,
855 EXTENT_DELALLOC | EXTENT_DIRTY, 866 EXTENT_DELALLOC | EXTENT_DIRTY | EXTENT_UPTODATE,
856 0, NULL, mask); 867 0, NULL, mask);
857} 868}
858 869