提交 4cc4357f 编写于 作者: P Peter Krempa

qemu: blockjob: Save status XML when modifying job state

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: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 d3158852
...@@ -114,7 +114,8 @@ qemuBlockJobDataNew(qemuBlockJobType type, ...@@ -114,7 +114,8 @@ qemuBlockJobDataNew(qemuBlockJobType type,
int int
qemuBlockJobRegister(qemuBlockJobDataPtr job, qemuBlockJobRegister(qemuBlockJobDataPtr job,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainDiskDefPtr disk) virDomainDiskDefPtr disk,
bool savestatus)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
...@@ -128,6 +129,9 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job, ...@@ -128,6 +129,9 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job,
QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job); QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
} }
if (savestatus)
qemuDomainSaveStatus(vm);
return 0; return 0;
} }
...@@ -152,6 +156,8 @@ qemuBlockJobUnregister(qemuBlockJobDataPtr job, ...@@ -152,6 +156,8 @@ qemuBlockJobUnregister(qemuBlockJobDataPtr job,
/* this may remove the last reference of 'job' */ /* this may remove the last reference of 'job' */
virHashRemoveEntry(priv->blockjobs, job->name); virHashRemoveEntry(priv->blockjobs, job->name);
qemuDomainSaveStatus(vm);
} }
...@@ -174,7 +180,7 @@ qemuBlockJobDiskNew(virDomainObjPtr vm, ...@@ -174,7 +180,7 @@ qemuBlockJobDiskNew(virDomainObjPtr vm,
if (!(job = qemuBlockJobDataNew(type, jobname))) if (!(job = qemuBlockJobDataNew(type, jobname)))
return NULL; return NULL;
if (qemuBlockJobRegister(job, vm, disk) < 0) if (qemuBlockJobRegister(job, vm, disk, true) < 0)
return NULL; return NULL;
VIR_RETURN_PTR(job); VIR_RETURN_PTR(job);
...@@ -206,10 +212,13 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk) ...@@ -206,10 +212,13 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
* Mark @job as started in qemu. * Mark @job as started in qemu.
*/ */
void void
qemuBlockJobStarted(qemuBlockJobDataPtr job) qemuBlockJobStarted(qemuBlockJobDataPtr job,
virDomainObjPtr vm)
{ {
if (job->state == QEMU_BLOCKJOB_STATE_NEW) if (job->state == QEMU_BLOCKJOB_STATE_NEW)
job->state = QEMU_BLOCKJOB_STATE_RUNNING; job->state = QEMU_BLOCKJOB_STATE_RUNNING;
qemuDomainSaveStatus(vm);
} }
......
...@@ -87,7 +87,8 @@ struct _qemuBlockJobData { ...@@ -87,7 +87,8 @@ struct _qemuBlockJobData {
int int
qemuBlockJobRegister(qemuBlockJobDataPtr job, qemuBlockJobRegister(qemuBlockJobDataPtr job,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainDiskDefPtr disk) virDomainDiskDefPtr disk,
bool savestatus)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
qemuBlockJobDataPtr qemuBlockJobDataPtr
...@@ -107,8 +108,9 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk) ...@@ -107,8 +108,9 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
ATTRIBUTE_NONNULL(1); ATTRIBUTE_NONNULL(1);
void void
qemuBlockJobStarted(qemuBlockJobDataPtr job) qemuBlockJobStarted(qemuBlockJobDataPtr job,
ATTRIBUTE_NONNULL(1); virDomainObjPtr vm)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
bool bool
qemuBlockJobIsRunning(qemuBlockJobDataPtr job) qemuBlockJobIsRunning(qemuBlockJobDataPtr job)
......
...@@ -2748,7 +2748,7 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObjPtr vm, ...@@ -2748,7 +2748,7 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObjPtr vm,
job->errmsg = virXPathString("string(./errmsg)", ctxt); job->errmsg = virXPathString("string(./errmsg)", ctxt);
job->invalidData = invalidData; job->invalidData = invalidData;
if (qemuBlockJobRegister(job, vm, disk) < 0) if (qemuBlockJobRegister(job, vm, disk, false) < 0)
return -1; return -1;
return 0; return 0;
......
...@@ -4704,7 +4704,7 @@ processBlockJobEvent(virQEMUDriverPtr driver, ...@@ -4704,7 +4704,7 @@ processBlockJobEvent(virQEMUDriverPtr driver,
if (!(job = qemuBlockJobDiskGetJob(disk))) { if (!(job = qemuBlockJobDiskGetJob(disk))) {
if (!(job = qemuBlockJobDiskNew(vm, disk, type, diskAlias))) if (!(job = qemuBlockJobDiskNew(vm, disk, type, diskAlias)))
goto endjob; goto endjob;
qemuBlockJobStarted(job); job->state = QEMU_BLOCKJOB_STATE_RUNNING;
} }
job->newstate = status; job->newstate = status;
...@@ -17100,7 +17100,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver, ...@@ -17100,7 +17100,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
if (ret < 0) if (ret < 0)
goto endjob; goto endjob;
qemuBlockJobStarted(job); qemuBlockJobStarted(job, vm);
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
VIR_WARN("Unable to save status on vm %s after state change", VIR_WARN("Unable to save status on vm %s after state change",
...@@ -17676,11 +17676,11 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, ...@@ -17676,11 +17676,11 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
} }
/* Update vm in place to match changes. */ /* Update vm in place to match changes. */
qemuBlockJobStarted(job);
need_unlink = false; need_unlink = false;
virStorageFileDeinit(mirror); virStorageFileDeinit(mirror);
VIR_STEAL_PTR(disk->mirror, mirror); VIR_STEAL_PTR(disk->mirror, mirror);
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_COPY; disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_COPY;
qemuBlockJobStarted(job, vm);
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
VIR_WARN("Unable to save status on vm %s after state change", VIR_WARN("Unable to save status on vm %s after state change",
...@@ -18066,11 +18066,11 @@ qemuDomainBlockCommit(virDomainPtr dom, ...@@ -18066,11 +18066,11 @@ qemuDomainBlockCommit(virDomainPtr dom,
goto endjob; goto endjob;
} }
qemuBlockJobStarted(job);
if (mirror) { if (mirror) {
VIR_STEAL_PTR(disk->mirror, mirror); VIR_STEAL_PTR(disk->mirror, mirror);
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT; disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT;
} }
qemuBlockJobStarted(job, vm);
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
VIR_WARN("Unable to save status on vm %s after block job", VIR_WARN("Unable to save status on vm %s after block job",
......
...@@ -946,7 +946,7 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver, ...@@ -946,7 +946,7 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver,
goto cleanup; goto cleanup;
diskPriv->migrating = true; diskPriv->migrating = true;
qemuBlockJobStarted(job); qemuBlockJobStarted(job, vm);
ret = 0; ret = 0;
......
...@@ -7819,8 +7819,6 @@ qemuProcessRefreshLegacyBlockjob(void *payload, ...@@ -7819,8 +7819,6 @@ qemuProcessRefreshLegacyBlockjob(void *payload,
if (!(job = qemuBlockJobDiskNew(vm, disk, jobtype, jobname))) if (!(job = qemuBlockJobDiskNew(vm, disk, jobtype, jobname)))
return -1; return -1;
qemuBlockJobStarted(job);
if (disk->mirror) { if (disk->mirror) {
if (info->ready == 1 || if (info->ready == 1 ||
(info->ready == -1 && info->end == info->cur)) { (info->ready == -1 && info->end == info->cur)) {
...@@ -7849,6 +7847,8 @@ qemuProcessRefreshLegacyBlockjob(void *payload, ...@@ -7849,6 +7847,8 @@ qemuProcessRefreshLegacyBlockjob(void *payload,
} }
} }
qemuBlockJobStarted(job, vm);
cleanup: cleanup:
qemuBlockJobStartupFinalize(vm, job); qemuBlockJobStartupFinalize(vm, job);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册