diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index eaac44547b22eb8f85a62be44f97a10a49f0fa95..d72e51b73c12bd15c40a3ba66d505872030aa379 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -66,23 +66,22 @@ qemuBlockJobDataOnceInit(void) 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; } @@ -98,15 +97,16 @@ qemuBlockJobDataPtr 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; } @@ -141,6 +141,22 @@ qemuBlockJobStarted(qemuBlockJobDataPtr 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 @@ -156,7 +172,7 @@ qemuBlockJobStartupFinalize(qemuBlockJobDataPtr job) return; if (job->state == QEMU_BLOCKJOB_STATE_NEW) - qemuBlockJobDataReset(job); + qemuBlockJobTerminate(job); virObjectUnref(job); } @@ -201,11 +217,15 @@ qemuBlockJobEmitEvents(virQEMUDriverPtr driver, 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; @@ -257,6 +277,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver, virStorageSourceBackingStoreClear(disk->src); ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, true)); ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob)); + qemuBlockJobTerminate(job); } @@ -295,7 +316,7 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver, * 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: @@ -311,6 +332,7 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver, } 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: @@ -412,3 +434,15 @@ qemuBlockJobSyncEndDisk(virDomainObjPtr vm, 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); +} diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h index ad8d0879df5335dbb871dd4f65b3cb505b3fd18b..2f6d1afcf33faa392c5202ce2a62c5200852ed24 100644 --- a/src/qemu/qemu_blockjob.h +++ b/src/qemu/qemu_blockjob.h @@ -74,7 +74,6 @@ struct _qemuBlockJobData { int newstate; /* virConnectDomainEventBlockJobStatus - new state to be processed */ }; -qemuBlockJobDataPtr qemuBlockJobDataNew(void); qemuBlockJobDataPtr qemuBlockJobDiskNew(virDomainDiskDefPtr disk, diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9924730b89225a0eddca1365e73a6342a64fe400..e07c1646f15eb04ceae8c72dffe055430dae68da 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1063,11 +1063,6 @@ qemuDomainDiskPrivateNew(void) if (!(priv = virObjectNew(qemuDomainDiskPrivateClass))) return NULL; - if (!(priv->blockjob = qemuBlockJobDataNew())) { - virObjectUnref(priv); - priv = NULL; - } - return (virObjectPtr) priv; }