mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
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: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
d3158852fa
commit
4cc4357f3e
@ -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,
|
|||||||
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,
|
|||||||
|
|
||||||
/* 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,
|
|||||||
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)
|
|||||||
* 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 {
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qemuBlockJobStarted(job, vm);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
qemuBlockJobStartupFinalize(vm, job);
|
qemuBlockJobStartupFinalize(vm, job);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user