diff options
author | Filipe Manana <fdmanana@gmail.com> | 2014-03-31 09:53:25 -0400 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-04-07 12:08:47 -0400 |
commit | c50d3e71c3d0378bcc9e116f48dab4148854a7bb (patch) | |
tree | 97d715d396f0c2134f6ec85b0d1c5805d1a601c9 /fs | |
parent | c715e155c94ba0b3657820d676ec3c7213a5ce81 (diff) |
Btrfs: more efficient io tree navigation on wait_extent_bit
If we don't reschedule use rb_next to find the next extent state
instead of a full tree search, which is more efficient and safe
since we didn't release the io tree's lock.
Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com>
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/extent_io.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index d35a3ca15fb5..0c4389634985 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -749,6 +749,7 @@ again: | |||
749 | * our range starts | 749 | * our range starts |
750 | */ | 750 | */ |
751 | node = tree_search(tree, start); | 751 | node = tree_search(tree, start); |
752 | process_node: | ||
752 | if (!node) | 753 | if (!node) |
753 | break; | 754 | break; |
754 | 755 | ||
@@ -769,7 +770,10 @@ again: | |||
769 | if (start > end) | 770 | if (start > end) |
770 | break; | 771 | break; |
771 | 772 | ||
772 | cond_resched_lock(&tree->lock); | 773 | if (!cond_resched_lock(&tree->lock)) { |
774 | node = rb_next(node); | ||
775 | goto process_node; | ||
776 | } | ||
773 | } | 777 | } |
774 | out: | 778 | out: |
775 | spin_unlock(&tree->lock); | 779 | spin_unlock(&tree->lock); |