VIR_ONCE_GLOBAL_INIT(qemuBlockJobData)
-qemuBlockJobDataPtr
-qemuBlockJobDataNew(void)
+static qemuBlockJobDataPtr
+qemuBlockJobDataNew(qemuBlockJobType type)
{
+ qemuBlockJobDataPtr job = NULL;
+
if (qemuBlockJobDataInitialize() < 0)
return NULL;
- return virObjectNew(qemuBlockJobDataClass);
-}
-
+ if (!(job = virObjectNew(qemuBlockJobDataClass)))
+ return NULL;
-static void
-qemuBlockJobDataReset(qemuBlockJobDataPtr job)
-{
- job->type = -1;
+ job->state = QEMU_BLOCKJOB_STATE_NEW;
job->newstate = -1;
- VIR_FREE(job->errmsg);
- job->synchronous = false;
+ job->type = type;
+
+ return job;
}
qemuBlockJobDiskNew(virDomainDiskDefPtr disk,
qemuBlockJobType type)
{
- qemuBlockJobDataPtr job = QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob;
- job->disk = disk;
+ qemuBlockJobDataPtr job = NULL;
- qemuBlockJobDataReset(job);
+ if (!(job = qemuBlockJobDataNew(type)))
+ return NULL;
- job->state = QEMU_BLOCKJOB_STATE_NEW;
- job->type = type;
+ job->disk = disk;
+ if (disk)
+ QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
- return virObjectRef(job);
+ return job;
}
}
+static void
+qemuBlockJobTerminate(qemuBlockJobDataPtr job)
+{
+ qemuDomainDiskPrivatePtr diskPriv;
+
+ if (job->disk) {
+ diskPriv = QEMU_DOMAIN_DISK_PRIVATE(job->disk);
+
+ if (job == diskPriv->blockjob) {
+ virObjectUnref(diskPriv->blockjob);
+ diskPriv->blockjob = NULL;
+ }
+ }
+}
+
+
/**
* qemuBlockJobStartupFinalize:
* @job: job being started
return;
if (job->state == QEMU_BLOCKJOB_STATE_NEW)
- qemuBlockJobDataReset(job);
+ qemuBlockJobTerminate(job);
virObjectUnref(job);
}
static void
qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainDiskDefPtr disk,
+ qemuBlockJobDataPtr job,
int asyncJob)
{
+ virDomainDiskDefPtr disk = job->disk;
virDomainDiskDefPtr persistDisk = NULL;
+ if (!disk)
+ return;
+
if (disk->mirrorState == VIR_DOMAIN_DISK_MIRROR_STATE_PIVOT) {
if (vm->newDef) {
virStorageSourcePtr copy = NULL;
virStorageSourceBackingStoreClear(disk->src);
ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, true));
ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob));
+ qemuBlockJobTerminate(job);
}
* to match. */
switch ((virConnectDomainEventBlockJobStatus) job->newstate) {
case VIR_DOMAIN_BLOCK_JOB_COMPLETED:
- qemuBlockJobEventProcessLegacyCompleted(driver, vm, disk, asyncJob);
+ qemuBlockJobEventProcessLegacyCompleted(driver, vm, job, asyncJob);
break;
case VIR_DOMAIN_BLOCK_JOB_READY:
}
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
+ qemuBlockJobTerminate(job);
break;
case VIR_DOMAIN_BLOCK_JOB_LAST:
qemuBlockJobUpdate(vm, job, asyncJob);
job->synchronous = false;
}
+
+
+qemuBlockJobDataPtr
+qemuBlockJobGetByDisk(virDomainDiskDefPtr disk)
+{
+ qemuBlockJobDataPtr job = QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob;
+
+ if (!job)
+ return NULL;
+
+ return virObjectRef(job);
+}