qemu: blockjob: Register new and running blockjobs in the global table

Add the job structure to the table when instantiating a new job and
remove it when it terminates/fails.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2018-11-29 17:35:52 +01:00
parent acff582915
commit 5ff46aaa7f
5 changed files with 39 additions and 22 deletions

View File

@ -94,8 +94,16 @@ qemuBlockJobDataNew(qemuBlockJobType type,
static int static int
qemuBlockJobRegister(qemuBlockJobDataPtr job, qemuBlockJobRegister(qemuBlockJobDataPtr job,
virDomainObjPtr vm,
virDomainDiskDefPtr disk) virDomainDiskDefPtr disk)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData;
if (virHashAddEntry(priv->blockjobs, job->name, virObjectRef(job)) < 0) {
virObjectUnref(job);
return -1;
}
if (disk) { if (disk) {
job->disk = disk; job->disk = disk;
QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job); QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
@ -106,8 +114,10 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job,
static void static void
qemuBlockJobUnregister(qemuBlockJobDataPtr job) qemuBlockJobUnregister(qemuBlockJobDataPtr job,
virDomainObjPtr vm)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainDiskPrivatePtr diskPriv; qemuDomainDiskPrivatePtr diskPriv;
if (job->disk) { if (job->disk) {
@ -120,6 +130,9 @@ qemuBlockJobUnregister(qemuBlockJobDataPtr job)
job->disk = NULL; job->disk = NULL;
} }
/* this may remove the last reference of 'job' */
virHashRemoveEntry(priv->blockjobs, job->name);
} }
@ -132,7 +145,8 @@ qemuBlockJobUnregister(qemuBlockJobDataPtr job)
* Returns 0 on success and -1 on failure. * Returns 0 on success and -1 on failure.
*/ */
qemuBlockJobDataPtr qemuBlockJobDataPtr
qemuBlockJobDiskNew(virDomainDiskDefPtr disk, qemuBlockJobDiskNew(virDomainObjPtr vm,
virDomainDiskDefPtr disk,
qemuBlockJobType type, qemuBlockJobType type,
const char *jobname) const char *jobname)
{ {
@ -141,7 +155,7 @@ qemuBlockJobDiskNew(virDomainDiskDefPtr disk,
if (!(job = qemuBlockJobDataNew(type, jobname))) if (!(job = qemuBlockJobDataNew(type, jobname)))
return NULL; return NULL;
if (qemuBlockJobRegister(job, disk) < 0) if (qemuBlockJobRegister(job, vm, disk) < 0)
return NULL; return NULL;
VIR_RETURN_PTR(job); VIR_RETURN_PTR(job);
@ -189,13 +203,14 @@ qemuBlockJobStarted(qemuBlockJobDataPtr job)
* to @job if it was started. * to @job if it was started.
*/ */
void void
qemuBlockJobStartupFinalize(qemuBlockJobDataPtr job) qemuBlockJobStartupFinalize(virDomainObjPtr vm,
qemuBlockJobDataPtr job)
{ {
if (!job) if (!job)
return; return;
if (job->state == QEMU_BLOCKJOB_STATE_NEW) if (job->state == QEMU_BLOCKJOB_STATE_NEW)
qemuBlockJobUnregister(job); qemuBlockJobUnregister(job, vm);
virObjectUnref(job); virObjectUnref(job);
} }
@ -314,7 +329,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
virStorageSourceBackingStoreClear(disk->src); virStorageSourceBackingStoreClear(disk->src);
ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true)); ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true));
ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob)); ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob));
qemuBlockJobUnregister(job); qemuBlockJobUnregister(job, vm);
qemuDomainSaveConfig(vm); qemuDomainSaveConfig(vm);
} }
@ -373,7 +388,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;
qemuBlockJobUnregister(job); qemuBlockJobUnregister(job, vm);
break; break;
case VIR_DOMAIN_BLOCK_JOB_LAST: case VIR_DOMAIN_BLOCK_JOB_LAST:

View File

@ -80,7 +80,8 @@ struct _qemuBlockJobData {
qemuBlockJobDataPtr qemuBlockJobDataPtr
qemuBlockJobDiskNew(virDomainDiskDefPtr disk, qemuBlockJobDiskNew(virDomainObjPtr vm,
virDomainDiskDefPtr disk,
qemuBlockJobType type, qemuBlockJobType type,
const char *jobname) const char *jobname)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
@ -98,7 +99,8 @@ qemuBlockJobIsRunning(qemuBlockJobDataPtr job)
ATTRIBUTE_NONNULL(1); ATTRIBUTE_NONNULL(1);
void void
qemuBlockJobStartupFinalize(qemuBlockJobDataPtr job); qemuBlockJobStartupFinalize(virDomainObjPtr vm,
qemuBlockJobDataPtr job);
int qemuBlockJobUpdate(virDomainObjPtr vm, int qemuBlockJobUpdate(virDomainObjPtr vm,
qemuBlockJobDataPtr job, qemuBlockJobDataPtr job,

View File

@ -4702,7 +4702,7 @@ processBlockJobEvent(virQEMUDriverPtr driver,
} }
if (!(job = qemuBlockJobDiskGetJob(disk))) { if (!(job = qemuBlockJobDiskGetJob(disk))) {
if (!(job = qemuBlockJobDiskNew(disk, type, diskAlias))) if (!(job = qemuBlockJobDiskNew(vm, disk, type, diskAlias)))
goto endjob; goto endjob;
qemuBlockJobStarted(job); qemuBlockJobStarted(job);
} }
@ -4712,7 +4712,7 @@ processBlockJobEvent(virQEMUDriverPtr driver,
qemuBlockJobUpdate(vm, job, QEMU_ASYNC_JOB_NONE); qemuBlockJobUpdate(vm, job, QEMU_ASYNC_JOB_NONE);
endjob: endjob:
qemuBlockJobStartupFinalize(job); qemuBlockJobStartupFinalize(vm, job);
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
} }
@ -17084,7 +17084,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
speed <<= 20; speed <<= 20;
} }
if (!(job = qemuBlockJobDiskNew(disk, QEMU_BLOCKJOB_TYPE_PULL, device))) if (!(job = qemuBlockJobDiskNew(vm, disk, QEMU_BLOCKJOB_TYPE_PULL, device)))
goto endjob; goto endjob;
qemuDomainObjEnterMonitor(driver, vm); qemuDomainObjEnterMonitor(driver, vm);
@ -17110,7 +17110,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
cleanup: cleanup:
qemuBlockJobStartupFinalize(job); qemuBlockJobStartupFinalize(vm, job);
virDomainObjEndAPI(&vm); virDomainObjEndAPI(&vm);
return ret; return ret;
} }
@ -17655,7 +17655,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
if (qemuDomainStorageSourceChainAccessAllow(driver, vm, mirror) < 0) if (qemuDomainStorageSourceChainAccessAllow(driver, vm, mirror) < 0)
goto endjob; goto endjob;
if (!(job = qemuBlockJobDiskNew(disk, QEMU_BLOCKJOB_TYPE_COPY, device))) if (!(job = qemuBlockJobDiskNew(vm, disk, QEMU_BLOCKJOB_TYPE_COPY, device)))
goto endjob; goto endjob;
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE; disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
@ -17691,7 +17691,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
VIR_WARN("%s", _("unable to remove just-created copy target")); VIR_WARN("%s", _("unable to remove just-created copy target"));
virStorageFileDeinit(mirror); virStorageFileDeinit(mirror);
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
qemuBlockJobStartupFinalize(job); qemuBlockJobStartupFinalize(vm, job);
return ret; return ret;
} }
@ -18042,7 +18042,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
qemuDomainStorageSourceAccessAllow(driver, vm, top_parent, false, false) < 0)) qemuDomainStorageSourceAccessAllow(driver, vm, top_parent, false, false) < 0))
goto endjob; goto endjob;
if (!(job = qemuBlockJobDiskNew(disk, jobtype, device))) if (!(job = qemuBlockJobDiskNew(vm, disk, jobtype, device)))
goto endjob; goto endjob;
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE; disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
@ -18089,7 +18089,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
virFreeError(orig_err); virFreeError(orig_err);
} }
} }
qemuBlockJobStartupFinalize(job); qemuBlockJobStartupFinalize(vm, job);
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
cleanup: cleanup:

View File

@ -923,7 +923,7 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver,
if (!(diskAlias = qemuAliasDiskDriveFromDisk(disk))) if (!(diskAlias = qemuAliasDiskDriveFromDisk(disk)))
goto cleanup; goto cleanup;
if (!(job = qemuBlockJobDiskNew(disk, QEMU_BLOCKJOB_TYPE_COPY, diskAlias))) if (!(job = qemuBlockJobDiskNew(vm, disk, QEMU_BLOCKJOB_TYPE_COPY, diskAlias)))
goto cleanup; goto cleanup;
qemuBlockJobSyncBegin(job); qemuBlockJobSyncBegin(job);
@ -951,7 +951,7 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver,
ret = 0; ret = 0;
cleanup: cleanup:
qemuBlockJobStartupFinalize(job); qemuBlockJobStartupFinalize(vm, job);
VIR_FREE(diskAlias); VIR_FREE(diskAlias);
return ret; return ret;
} }

View File

@ -976,7 +976,7 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
qemuBlockJobStartupFinalize(job); qemuBlockJobStartupFinalize(vm, job);
qemuProcessEventFree(processEvent); qemuProcessEventFree(processEvent);
virObjectUnlock(vm); virObjectUnlock(vm);
return 0; return 0;
@ -7816,7 +7816,7 @@ qemuProcessRefreshLegacyBlockjob(void *payload,
disk->mirrorJob == VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT) disk->mirrorJob == VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT)
jobtype = disk->mirrorJob; jobtype = disk->mirrorJob;
if (!(job = qemuBlockJobDiskNew(disk, jobtype, jobname))) if (!(job = qemuBlockJobDiskNew(vm, disk, jobtype, jobname)))
return -1; return -1;
qemuBlockJobStarted(job); qemuBlockJobStarted(job);
@ -7850,7 +7850,7 @@ qemuProcessRefreshLegacyBlockjob(void *payload,
} }
cleanup: cleanup:
qemuBlockJobStartupFinalize(job); qemuBlockJobStartupFinalize(vm, job);
return 0; return 0;
} }