diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 71bb143ea267362f9e07d2932a7ab03b9477fd6e..d9d22d8f61b0f855040aa066ddd50f35fec80c0d 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 5b3af69d894f1233234659ca7de777e1353cb2f8..c5fd6363404726d35383a7e92a330d447352ebcb 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 faa68e86fd1e853caf79c1abb24d3c0dfcd30e5a..1be602cc991e9eebfb36f4ec8af4e9db1715ca31 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 766181bd5d687a8563abd66625cbd968c410feb3..af58dacbaa44cc4266abda63b1ea20cfc8ef2845 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 ce4f3428f1f5d077fd5c94e8bc31f996abe2cf88..7c6be201b9d355d933a14f9405db14c94a2071f8 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 b1a89aa26d9b42e9b88e696077db9fdf33efe458..0e9eedd9d692f8b62d21161d7c48afc79cc58948 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);