int
qemuBlockJobRegister(qemuBlockJobDataPtr job,
virDomainObjPtr vm,
- virDomainDiskDefPtr disk)
+ virDomainDiskDefPtr disk,
+ bool savestatus)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
}
+ if (savestatus)
+ qemuDomainSaveStatus(vm);
+
return 0;
}
/* this may remove the last reference of 'job' */
virHashRemoveEntry(priv->blockjobs, job->name);
+
+ qemuDomainSaveStatus(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);
* 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);
}
int
qemuBlockJobRegister(qemuBlockJobDataPtr job,
virDomainObjPtr vm,
- virDomainDiskDefPtr disk)
+ virDomainDiskDefPtr disk,
+ bool savestatus)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
qemuBlockJobDataPtr
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)
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;
if (!(job = qemuBlockJobDiskGetJob(disk))) {
if (!(job = qemuBlockJobDiskNew(vm, disk, type, diskAlias)))
goto endjob;
- qemuBlockJobStarted(job);
+ job->state = QEMU_BLOCKJOB_STATE_RUNNING;
}
job->newstate = status;
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",
}
/* 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",
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",
goto cleanup;
diskPriv->migrating = true;
- qemuBlockJobStarted(job);
+ qemuBlockJobStarted(job, vm);
ret = 0;
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)) {
}
}
+ qemuBlockJobStarted(job, vm);
+
cleanup:
qemuBlockJobStartupFinalize(vm, job);