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: Josef Bacik <josef@redhat.com>
This commit is contained in:
parent
d82a6f1d7e
commit
589d8ade83
@ -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]++;
|
||||||
|
Loading…
Reference in New Issue
Block a user