Commit 589d8ade authored by Josef Bacik's avatar Josef Bacik

Btrfs: try not to sleep as much when doing slow caching

When the fs is super full and we unmount the fs, we could get stuck in this
thing where unmount is waiting for the caching kthread to make progress and the
caching kthread keeps scheduling because we're in the middle of a commit.  So
instead just let the caching kthread keep going and only yeild if
need_resched().  This makes my horrible umount case go from taking up to 10
minutes to taking less than 20 seconds.  Thanks,
Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
parent d82a6f1d
...@@ -378,16 +378,19 @@ static int caching_kthread(void *data) ...@@ -378,16 +378,19 @@ static int caching_kthread(void *data)
if (ret) if (ret)
break; break;
if (need_resched() ||
btrfs_next_leaf(extent_root, path)) {
caching_ctl->progress = last; caching_ctl->progress = last;
btrfs_release_path(extent_root, path); btrfs_release_path(extent_root, path);
up_read(&fs_info->extent_commit_sem); up_read(&fs_info->extent_commit_sem);
mutex_unlock(&caching_ctl->mutex); mutex_unlock(&caching_ctl->mutex);
if (btrfs_transaction_in_commit(fs_info))
schedule_timeout(1);
else
cond_resched(); cond_resched();
goto again; goto again;
} }
leaf = path->nodes[0];
nritems = btrfs_header_nritems(leaf);
continue;
}
if (key.objectid < block_group->key.objectid) { if (key.objectid < block_group->key.objectid) {
path->slots[0]++; path->slots[0]++;
......
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