diff --git a/blockjob.c b/blockjob.c index 3ca009bea5..38f18e9ba3 100644 --- a/blockjob.c +++ b/blockjob.c @@ -269,7 +269,7 @@ BlockJobInfo *block_job_query(BlockJob *job, Error **errp) info->offset = job->offset; info->speed = job->speed; info->io_status = job->iostatus; - info->ready = job->ready; + info->ready = job_is_ready(&job->job), info->status = job->job.status; info->auto_finalize = job->job.auto_finalize; info->auto_dismiss = job->job.auto_dismiss; @@ -436,7 +436,6 @@ void block_job_user_resume(Job *job) void block_job_event_ready(BlockJob *job) { job_state_transition(&job->job, JOB_STATUS_READY); - job->ready = true; if (block_job_is_internal(job)) { return; diff --git a/include/block/blockjob.h b/include/block/blockjob.h index 5a81afc6c3..8e1e1ee0de 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -49,11 +49,6 @@ typedef struct BlockJob { /** The block device on which the job is operating. */ BlockBackend *blk; - /** - * Set to true when the job is ready to be completed. - */ - bool ready; - /** Status that is published by the query-block-jobs QMP API */ BlockDeviceIoStatus iostatus; diff --git a/include/qemu/job.h b/include/qemu/job.h index 1e8050c6fb..487f9d9a32 100644 --- a/include/qemu/job.h +++ b/include/qemu/job.h @@ -367,6 +367,9 @@ bool job_is_cancelled(Job *job); /** Returns whether the job is in a completed state. */ bool job_is_completed(Job *job); +/** Returns whether the job is ready to be completed. */ +bool job_is_ready(Job *job); + /** * Request @job to pause at the next pause point. Must be paired with * job_resume(). If the job is supposed to be resumed by user action, call diff --git a/job.c b/job.c index 7cd3602782..aa4c746c8a 100644 --- a/job.c +++ b/job.c @@ -199,6 +199,28 @@ bool job_is_cancelled(Job *job) return job->cancelled; } +bool job_is_ready(Job *job) +{ + switch (job->status) { + case JOB_STATUS_UNDEFINED: + case JOB_STATUS_CREATED: + case JOB_STATUS_RUNNING: + case JOB_STATUS_PAUSED: + case JOB_STATUS_WAITING: + case JOB_STATUS_PENDING: + case JOB_STATUS_ABORTING: + case JOB_STATUS_CONCLUDED: + case JOB_STATUS_NULL: + return false; + case JOB_STATUS_READY: + case JOB_STATUS_STANDBY: + return true; + default: + g_assert_not_reached(); + } + return false; +} + bool job_is_completed(Job *job) { switch (job->status) { diff --git a/qemu-img.c b/qemu-img.c index efa7b755d4..700e4e187b 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -866,7 +866,7 @@ static void run_block_job(BlockJob *job, Error **errp) aio_poll(aio_context, true); qemu_progress_print(job->len ? ((float)job->offset / job->len * 100.f) : 0.0f, 0); - } while (!job->ready && !job_is_completed(&job->job)); + } while (!job_is_ready(&job->job) && !job_is_completed(&job->job)); if (!job_is_completed(&job->job)) { ret = job_complete_sync(&job->job, errp); diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c index 7131cabb16..8180d03a5f 100644 --- a/tests/test-blockjob.c +++ b/tests/test-blockjob.c @@ -185,7 +185,7 @@ static void coroutine_fn cancel_job_start(void *opaque) goto defer; } - if (!s->common.ready && s->should_converge) { + if (!job_is_ready(&s->common.job) && s->should_converge) { block_job_event_ready(&s->common); }