summaryrefslogtreecommitdiff
path: root/blockjob.c
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2012-07-23 15:15:47 +0200
committerKevin Wolf <kwolf@redhat.com>2012-10-24 10:26:19 +0200
commita66a2a368383e627b929bf42d1b972822491404b (patch)
treefcec5bb544b797dcb2e7b40929bf304311e0c86a /blockjob.c
parentaeae883baf2377b714a41529f94905046fa058f3 (diff)
downloadqemu-a66a2a368383e627b929bf42d1b972822491404b.tar.gz
qemu-a66a2a368383e627b929bf42d1b972822491404b.tar.bz2
qemu-a66a2a368383e627b929bf42d1b972822491404b.zip
block: introduce BLOCK_JOB_READY event
Even for jobs that need to be manually completed, management may want to take care itself of the completion, not requiring the user to issue a command to terminate the job. In this case we want to avoid that they poll us continuously, waiting for completion to become available. Thus, add a new event that signals the phase switch and the availability of the block-job-complete command. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'blockjob.c')
-rw-r--r--blockjob.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/blockjob.c b/blockjob.c
index c93a0e0187..fbb7e1cd58 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -225,6 +225,27 @@ static void block_job_iostatus_set_err(BlockJob *job, int error)
}
+QObject *qobject_from_block_job(BlockJob *job)
+{
+ return qobject_from_jsonf("{ 'type': %s,"
+ "'device': %s,"
+ "'len': %" PRId64 ","
+ "'offset': %" PRId64 ","
+ "'speed': %" PRId64 " }",
+ job->job_type->job_type,
+ bdrv_get_device_name(job->bs),
+ job->len,
+ job->offset,
+ job->speed);
+}
+
+void block_job_ready(BlockJob *job)
+{
+ QObject *data = qobject_from_block_job(job);
+ monitor_protocol_event(QEVENT_BLOCK_JOB_READY, data);
+ qobject_decref(data);
+}
+
BlockErrorAction block_job_error_action(BlockJob *job, BlockDriverState *bs,
BlockdevOnError on_err,
int is_read, int error)