summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
authorFilipe Manana2014-03-31 15:53:25 +0200
committerChris Mason2014-04-07 18:08:47 +0200
commitc50d3e71c3d0378bcc9e116f48dab4148854a7bb (patch)
tree97d715d396f0c2134f6ec85b0d1c5805d1a601c9 /fs/btrfs/extent_io.c
parentBtrfs: send, build path string only once in send_hole (diff)
downloadkernel-qcow2-linux-c50d3e71c3d0378bcc9e116f48dab4148854a7bb.tar.gz
kernel-qcow2-linux-c50d3e71c3d0378bcc9e116f48dab4148854a7bb.tar.xz
kernel-qcow2-linux-c50d3e71c3d0378bcc9e116f48dab4148854a7bb.zip
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/btrfs/extent_io.c')
-rw-r--r--fs/btrfs/extent_io.c6
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:
* our range starts
*/
node = tree_search(tree, start);
+process_node:
if (!node)
break;
@@ -769,7 +770,10 @@ again:
if (start > end)
break;
- cond_resched_lock(&tree->lock);
+ if (!cond_resched_lock(&tree->lock)) {
+ node = rb_next(node);
+ goto process_node;
+ }
}
out:
spin_unlock(&tree->lock);