/* An inactive or completed job doesn't have any pending requests. Jobs
* with !job->busy are either already paused or have a pause point after
* being reentered, so no job driver code will run before they pause. */
- if (!job->busy || job_is_completed(job) || job->deferred_to_main_loop) {
+ if (!job->busy || job_is_completed(job)) {
return false;
}
return 0;
}
-void block_job_wakeup_all_bdrv(BlockJob *job)
-{
- GSList *l;
-
- for (l = job->nodes; l; l = l->next) {
- BdrvChild *c = l->data;
- bdrv_wakeup(c->bs);
- }
-}
-
static void block_job_on_idle(Notifier *n, void *opaque)
{
- BlockJob *job = opaque;
- block_job_wakeup_all_bdrv(job);
+ aio_wait_kick();
}
bool block_job_is_internal(BlockJob *job)
action);
}
if (action == BLOCK_ERROR_ACTION_STOP) {
- job_pause(&job->job);
- /* make the pause user visible, which will be resumed from QMP. */
- job->job.user_paused = true;
+ if (!job->job.user_paused) {
+ job_pause(&job->job);
+ /* make the pause user visible, which will be resumed from QMP. */
+ job->job.user_paused = true;
+ }
block_job_iostatus_set_err(job, error);
}
return action;