summaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2013-04-19 14:37:26 -0400
committerJosef Bacik <jbacik@fusionio.com>2013-05-06 15:55:01 -0400
commit0a3896d0f563d4472c75ab2c26afd8940d24b5a1 (patch)
tree35106cf7f93687515e9bc90fdfeaf2a71b8b3277 /fs/btrfs
parent62dbd7176e196cd042c5542696981b268264fe92 (diff)
downloadop-kernel-dev-0a3896d0f563d4472c75ab2c26afd8940d24b5a1.zip
op-kernel-dev-0a3896d0f563d4472c75ab2c26afd8940d24b5a1.tar.gz
Btrfs: fix possible infinite loop in slow caching
So I noticed there is an infinite loop in the slow caching code. If we return 1 when we hit the end of the tree, so we could end up caching the last block group the slow way and suddenly we're looping forever because we just keep re-searching and trying again. Fix this by only doing btrfs_next_leaf() if we don't need_resched(). Thanks, Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/extent-tree.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 8464d36..fa57965 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -419,8 +419,7 @@ again:
if (ret)
break;
- if (need_resched() ||
- btrfs_next_leaf(extent_root, path)) {
+ if (need_resched()) {
caching_ctl->progress = last;
btrfs_release_path(path);
up_read(&fs_info->extent_commit_sem);
@@ -428,6 +427,12 @@ again:
cond_resched();
goto again;
}
+
+ ret = btrfs_next_leaf(extent_root, path);
+ if (ret < 0)
+ goto err;
+ if (ret)
+ break;
leaf = path->nodes[0];
nritems = btrfs_header_nritems(leaf);
continue;
OpenPOWER on IntegriCloud