}
+static int
+qemuBlockJobRegister(qemuBlockJobDataPtr job,
+ virDomainDiskDefPtr disk)
+{
+ if (disk) {
+ job->disk = disk;
+ QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
+ }
+
+ return 0;
+}
+
+
+static void
+qemuBlockJobUnregister(qemuBlockJobDataPtr job)
+{
+ qemuDomainDiskPrivatePtr diskPriv;
+
+ if (job->disk) {
+ diskPriv = QEMU_DOMAIN_DISK_PRIVATE(job->disk);
+
+ if (job == diskPriv->blockjob) {
+ virObjectUnref(diskPriv->blockjob);
+ diskPriv->blockjob = NULL;
+ }
+
+ job->disk = NULL;
+ }
+}
+
+
/**
* qemuBlockJobDiskNew:
* @disk: disk definition
qemuBlockJobType type,
const char *jobname)
{
- qemuBlockJobDataPtr job = NULL;
+ VIR_AUTOUNREF(qemuBlockJobDataPtr) job = NULL;
if (!(job = qemuBlockJobDataNew(type, jobname)))
return NULL;
- job->disk = disk;
- if (disk)
- QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
+ if (qemuBlockJobRegister(job, disk) < 0)
+ return NULL;
- return job;
+ VIR_RETURN_PTR(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)
- qemuBlockJobTerminate(job);
+ qemuBlockJobUnregister(job);
virObjectUnref(job);
}
virStorageSourceBackingStoreClear(disk->src);
ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true));
ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob));
- qemuBlockJobTerminate(job);
+ qemuBlockJobUnregister(job);
}
}
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
- qemuBlockJobTerminate(job);
+ qemuBlockJobUnregister(job);
break;
case VIR_DOMAIN_BLOCK_JOB_LAST: