On Wed, Dec 12, 2018 at 06:08:34PM +0100, Peter Krempa wrote:
Rather than direclty modifying fields in the qemuBlockJobDataPtr
directly
structure add a bunch of fields which allow to do the transitions.
This will help later when adding more complexity to the job handing.
handling
APIs introduced in this patch are:
qemuBlockJobDiskNew - prepare for starting a new blockjob on a disk
qemuBlockJobDiskGetJob - get the block job data structure for a disk
For individual job state manipulation the following APIs are added:
qemuBlockJobStarted - Sets the job as started with qemu. Until that
the job can be cancelled without asking qemu.
qemuBlockJobStartupFinalize - finalize job startup. If the job was
started in qemu already, just releases
reference to the job object. Otherwise
clears everything as if the job was never
started.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_blockjob.c | 81 +++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_blockjob.h | 19 +++++++++
src/qemu/qemu_driver.c | 31 ++++++++++++---
src/qemu/qemu_migration.c | 7 +++-
src/qemu/qemu_process.c | 17 ++++----
5 files changed, 141 insertions(+), 14 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 637307806b..9e5171744e 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4716,7 +4716,7 @@ processBlockJobEvent(virQEMUDriverPtr driver,
int status)
{
virDomainDiskDefPtr disk;
- qemuBlockJobDataPtr job;
+ qemuBlockJobDataPtr job = NULL;
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
return;
@@ -4731,7 +4731,11 @@ processBlockJobEvent(virQEMUDriverPtr driver,
goto endjob;
}
- job = QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob;
+ if (!(job = qemuBlockJobDiskGetJob(disk))) {
Can qemuBlockJobDiskGetJob really return NULL here?
+ if (!(job = qemuBlockJobDiskNew(disk)))
+ goto endjob;
+ qemuBlockJobStarted(job);
+ }
job->type = type;
job->newstate = status;
@@ -937,9 +937,9 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
if (!(disk = qemuProcessFindDomainDiskByAliasOrQOM(vm, diskAlias, NULL)))
goto cleanup;
- job = QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob;
+ job = qemuBlockJobDiskGetJob(disk);
- if (job->synchronous) {
+ if (job && job->synchronous) {
Same question
/* We have a SYNC API waiting for this event, dispatch it
back */
job->type = type;
job->newstate = status;
Reviewed-by: Ján Tomko <jtomko(a)redhat.com>
Jano