From 4cc4357f3e23e8a6a2d39f2df219fd106398eee8 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 15 May 2019 10:58:42 +0200 Subject: [PATCH] qemu: blockjob: Save status XML when modifying job state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that block job data is stored in the status XML portion we need to make sure that everything which changes the state also saves the status XML. The job registering function is used while parsing the status XML so in that case we need to skip the XML saving. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_blockjob.c | 15 ++++++++++++--- src/qemu/qemu_blockjob.h | 8 +++++--- src/qemu/qemu_domain.c | 2 +- src/qemu/qemu_driver.c | 8 ++++---- src/qemu/qemu_migration.c | 2 +- src/qemu/qemu_process.c | 4 ++-- 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 71bb143ea2..d9d22d8f61 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -114,7 +114,8 @@ qemuBlockJobDataNew(qemuBlockJobType type, int qemuBlockJobRegister(qemuBlockJobDataPtr job, virDomainObjPtr vm, - virDomainDiskDefPtr disk) + virDomainDiskDefPtr disk, + bool savestatus) { qemuDomainObjPrivatePtr priv = vm->privateData; @@ -128,6 +129,9 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job, QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job); } + if (savestatus) + qemuDomainSaveStatus(vm); + return 0; } @@ -152,6 +156,8 @@ qemuBlockJobUnregister(qemuBlockJobDataPtr job, /* this may remove the last reference of 'job' */ virHashRemoveEntry(priv->blockjobs, job->name); + + qemuDomainSaveStatus(vm); } @@ -174,7 +180,7 @@ qemuBlockJobDiskNew(virDomainObjPtr vm, if (!(job = qemuBlockJobDataNew(type, jobname))) return NULL; - if (qemuBlockJobRegister(job, vm, disk) < 0) + if (qemuBlockJobRegister(job, vm, disk, true) < 0) return NULL; VIR_RETURN_PTR(job); @@ -206,10 +212,13 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk) * Mark @job as started in qemu. */ void -qemuBlockJobStarted(qemuBlockJobDataPtr job) +qemuBlockJobStarted(qemuBlockJobDataPtr job, + virDomainObjPtr vm) { if (job->state == QEMU_BLOCKJOB_STATE_NEW) job->state = QEMU_BLOCKJOB_STATE_RUNNING; + + qemuDomainSaveStatus(vm); } diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h index 5b3af69d89..c5fd636340 100644 --- a/src/qemu/qemu_blockjob.h +++ b/src/qemu/qemu_blockjob.h @@ -87,7 +87,8 @@ struct _qemuBlockJobData { int qemuBlockJobRegister(qemuBlockJobDataPtr job, virDomainObjPtr vm, - virDomainDiskDefPtr disk) + virDomainDiskDefPtr disk, + bool savestatus) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); qemuBlockJobDataPtr @@ -107,8 +108,9 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk) ATTRIBUTE_NONNULL(1); void -qemuBlockJobStarted(qemuBlockJobDataPtr job) - ATTRIBUTE_NONNULL(1); +qemuBlockJobStarted(qemuBlockJobDataPtr job, + virDomainObjPtr vm) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); bool qemuBlockJobIsRunning(qemuBlockJobDataPtr job) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index faa68e86fd..1be602cc99 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2748,7 +2748,7 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObjPtr vm, job->errmsg = virXPathString("string(./errmsg)", ctxt); job->invalidData = invalidData; - if (qemuBlockJobRegister(job, vm, disk) < 0) + if (qemuBlockJobRegister(job, vm, disk, false) < 0) return -1; return 0; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 766181bd5d..af58dacbaa 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4704,7 +4704,7 @@ processBlockJobEvent(virQEMUDriverPtr driver, if (!(job = qemuBlockJobDiskGetJob(disk))) { if (!(job = qemuBlockJobDiskNew(vm, disk, type, diskAlias))) goto endjob; - qemuBlockJobStarted(job); + job->state = QEMU_BLOCKJOB_STATE_RUNNING; } job->newstate = status; @@ -17100,7 +17100,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver, if (ret < 0) goto endjob; - qemuBlockJobStarted(job); + qemuBlockJobStarted(job, vm); if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) VIR_WARN("Unable to save status on vm %s after state change", @@ -17676,11 +17676,11 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, } /* Update vm in place to match changes. */ - qemuBlockJobStarted(job); need_unlink = false; virStorageFileDeinit(mirror); VIR_STEAL_PTR(disk->mirror, mirror); disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_COPY; + qemuBlockJobStarted(job, vm); if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) VIR_WARN("Unable to save status on vm %s after state change", @@ -18066,11 +18066,11 @@ qemuDomainBlockCommit(virDomainPtr dom, goto endjob; } - qemuBlockJobStarted(job); if (mirror) { VIR_STEAL_PTR(disk->mirror, mirror); disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT; } + qemuBlockJobStarted(job, vm); if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) VIR_WARN("Unable to save status on vm %s after block job", diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index ce4f3428f1..7c6be201b9 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -946,7 +946,7 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver, goto cleanup; diskPriv->migrating = true; - qemuBlockJobStarted(job); + qemuBlockJobStarted(job, vm); ret = 0; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index b1a89aa26d..0e9eedd9d6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7819,8 +7819,6 @@ qemuProcessRefreshLegacyBlockjob(void *payload, if (!(job = qemuBlockJobDiskNew(vm, disk, jobtype, jobname))) return -1; - qemuBlockJobStarted(job); - if (disk->mirror) { if (info->ready == 1 || (info->ready == -1 && info->end == info->cur)) { @@ -7849,6 +7847,8 @@ qemuProcessRefreshLegacyBlockjob(void *payload, } } + qemuBlockJobStarted(job, vm); + cleanup: qemuBlockJobStartupFinalize(vm, job);