Commit 0a3896d0 authored by Josef Bacik's avatar Josef Bacik

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: default avatarJosef Bacik <jbacik@fusionio.com>
parent 62dbd717
...@@ -419,8 +419,7 @@ static noinline void caching_thread(struct btrfs_work *work) ...@@ -419,8 +419,7 @@ static noinline void caching_thread(struct btrfs_work *work)
if (ret) if (ret)
break; break;
if (need_resched() || if (need_resched()) {
btrfs_next_leaf(extent_root, path)) {
caching_ctl->progress = last; caching_ctl->progress = last;
btrfs_release_path(path); btrfs_release_path(path);
up_read(&fs_info->extent_commit_sem); up_read(&fs_info->extent_commit_sem);
...@@ -428,6 +427,12 @@ static noinline void caching_thread(struct btrfs_work *work) ...@@ -428,6 +427,12 @@ static noinline void caching_thread(struct btrfs_work *work)
cond_resched(); cond_resched();
goto again; goto again;
} }
ret = btrfs_next_leaf(extent_root, path);
if (ret < 0)
goto err;
if (ret)
break;
leaf = path->nodes[0]; leaf = path->nodes[0];
nritems = btrfs_header_nritems(leaf); nritems = btrfs_header_nritems(leaf);
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment