提交 a54acc85 编写于 作者: P Peter Krempa

qemu: Allocate diskPriv->blockjob only when there's a blockjob

Rather than storing the presence of the blockjob in a flag we can bind
together the lifecycle of the job with the lifecycle of the object which
is tracking the data for it.
Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 103a4245
...@@ -66,23 +66,22 @@ qemuBlockJobDataOnceInit(void) ...@@ -66,23 +66,22 @@ qemuBlockJobDataOnceInit(void)
VIR_ONCE_GLOBAL_INIT(qemuBlockJobData) VIR_ONCE_GLOBAL_INIT(qemuBlockJobData)
qemuBlockJobDataPtr static qemuBlockJobDataPtr
qemuBlockJobDataNew(void) qemuBlockJobDataNew(qemuBlockJobType type)
{ {
qemuBlockJobDataPtr job = NULL;
if (qemuBlockJobDataInitialize() < 0) if (qemuBlockJobDataInitialize() < 0)
return NULL; return NULL;
return virObjectNew(qemuBlockJobDataClass); if (!(job = virObjectNew(qemuBlockJobDataClass)))
} return NULL;
static void job->state = QEMU_BLOCKJOB_STATE_NEW;
qemuBlockJobDataReset(qemuBlockJobDataPtr job)
{
job->type = -1;
job->newstate = -1; job->newstate = -1;
VIR_FREE(job->errmsg); job->type = type;
job->synchronous = false;
return job;
} }
...@@ -98,15 +97,16 @@ qemuBlockJobDataPtr ...@@ -98,15 +97,16 @@ qemuBlockJobDataPtr
qemuBlockJobDiskNew(virDomainDiskDefPtr disk, qemuBlockJobDiskNew(virDomainDiskDefPtr disk,
qemuBlockJobType type) qemuBlockJobType type)
{ {
qemuBlockJobDataPtr job = QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob; qemuBlockJobDataPtr job = NULL;
job->disk = disk;
qemuBlockJobDataReset(job); if (!(job = qemuBlockJobDataNew(type)))
return NULL;
job->state = QEMU_BLOCKJOB_STATE_NEW; job->disk = disk;
job->type = type; if (disk)
QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
return virObjectRef(job); return job;
} }
...@@ -141,6 +141,22 @@ qemuBlockJobStarted(qemuBlockJobDataPtr 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: * qemuBlockJobStartupFinalize:
* @job: job being started * @job: job being started
...@@ -156,7 +172,7 @@ qemuBlockJobStartupFinalize(qemuBlockJobDataPtr job) ...@@ -156,7 +172,7 @@ qemuBlockJobStartupFinalize(qemuBlockJobDataPtr job)
return; return;
if (job->state == QEMU_BLOCKJOB_STATE_NEW) if (job->state == QEMU_BLOCKJOB_STATE_NEW)
qemuBlockJobDataReset(job); qemuBlockJobTerminate(job);
virObjectUnref(job); virObjectUnref(job);
} }
...@@ -201,11 +217,15 @@ qemuBlockJobEmitEvents(virQEMUDriverPtr driver, ...@@ -201,11 +217,15 @@ qemuBlockJobEmitEvents(virQEMUDriverPtr driver,
static void static void
qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver, qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainDiskDefPtr disk, qemuBlockJobDataPtr job,
int asyncJob) int asyncJob)
{ {
virDomainDiskDefPtr disk = job->disk;
virDomainDiskDefPtr persistDisk = NULL; virDomainDiskDefPtr persistDisk = NULL;
if (!disk)
return;
if (disk->mirrorState == VIR_DOMAIN_DISK_MIRROR_STATE_PIVOT) { if (disk->mirrorState == VIR_DOMAIN_DISK_MIRROR_STATE_PIVOT) {
if (vm->newDef) { if (vm->newDef) {
virStorageSourcePtr copy = NULL; virStorageSourcePtr copy = NULL;
...@@ -257,6 +277,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver, ...@@ -257,6 +277,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
virStorageSourceBackingStoreClear(disk->src); virStorageSourceBackingStoreClear(disk->src);
ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, true)); ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, true));
ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob)); ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob));
qemuBlockJobTerminate(job);
} }
...@@ -295,7 +316,7 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver, ...@@ -295,7 +316,7 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver,
* to match. */ * to match. */
switch ((virConnectDomainEventBlockJobStatus) job->newstate) { switch ((virConnectDomainEventBlockJobStatus) job->newstate) {
case VIR_DOMAIN_BLOCK_JOB_COMPLETED: case VIR_DOMAIN_BLOCK_JOB_COMPLETED:
qemuBlockJobEventProcessLegacyCompleted(driver, vm, disk, asyncJob); qemuBlockJobEventProcessLegacyCompleted(driver, vm, job, asyncJob);
break; break;
case VIR_DOMAIN_BLOCK_JOB_READY: case VIR_DOMAIN_BLOCK_JOB_READY:
...@@ -311,6 +332,7 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver, ...@@ -311,6 +332,7 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver,
} }
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE; disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN; disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
qemuBlockJobTerminate(job);
break; break;
case VIR_DOMAIN_BLOCK_JOB_LAST: case VIR_DOMAIN_BLOCK_JOB_LAST:
...@@ -412,3 +434,15 @@ qemuBlockJobSyncEndDisk(virDomainObjPtr vm, ...@@ -412,3 +434,15 @@ qemuBlockJobSyncEndDisk(virDomainObjPtr vm,
qemuBlockJobUpdate(vm, job, asyncJob); qemuBlockJobUpdate(vm, job, asyncJob);
job->synchronous = false; job->synchronous = false;
} }
qemuBlockJobDataPtr
qemuBlockJobGetByDisk(virDomainDiskDefPtr disk)
{
qemuBlockJobDataPtr job = QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob;
if (!job)
return NULL;
return virObjectRef(job);
}
...@@ -74,7 +74,6 @@ struct _qemuBlockJobData { ...@@ -74,7 +74,6 @@ struct _qemuBlockJobData {
int newstate; /* virConnectDomainEventBlockJobStatus - new state to be processed */ int newstate; /* virConnectDomainEventBlockJobStatus - new state to be processed */
}; };
qemuBlockJobDataPtr qemuBlockJobDataNew(void);
qemuBlockJobDataPtr qemuBlockJobDataPtr
qemuBlockJobDiskNew(virDomainDiskDefPtr disk, qemuBlockJobDiskNew(virDomainDiskDefPtr disk,
......
...@@ -1063,11 +1063,6 @@ qemuDomainDiskPrivateNew(void) ...@@ -1063,11 +1063,6 @@ qemuDomainDiskPrivateNew(void)
if (!(priv = virObjectNew(qemuDomainDiskPrivateClass))) if (!(priv = virObjectNew(qemuDomainDiskPrivateClass)))
return NULL; return NULL;
if (!(priv->blockjob = qemuBlockJobDataNew())) {
virObjectUnref(priv);
priv = NULL;
}
return (virObjectPtr) priv; return (virObjectPtr) priv;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册