]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: blockjob: Register new and running blockjobs in the global table
authorPeter Krempa <pkrempa@redhat.com>
Thu, 29 Nov 2018 16:35:52 +0000 (17:35 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 18 Jul 2019 15:59:34 +0000 (17:59 +0200)
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>
src/qemu/qemu_blockjob.c
src/qemu/qemu_blockjob.h
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_process.c

index 08d131ca2b4080346fa2c4b02fcdc66318c51849..0e2cdd63b9fceaf67d8f33120254ba340d16c55a 100644 (file)
@@ -94,8 +94,16 @@ qemuBlockJobDataNew(qemuBlockJobType type,
 
 static int
 qemuBlockJobRegister(qemuBlockJobDataPtr job,
+                     virDomainObjPtr vm,
                      virDomainDiskDefPtr disk)
 {
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+
+    if (virHashAddEntry(priv->blockjobs, job->name, virObjectRef(job)) < 0) {
+        virObjectUnref(job);
+        return -1;
+    }
+
     if (disk) {
         job->disk = disk;
         QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
@@ -106,8 +114,10 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job,
 
 
 static void
-qemuBlockJobUnregister(qemuBlockJobDataPtr job)
+qemuBlockJobUnregister(qemuBlockJobDataPtr job,
+                       virDomainObjPtr vm)
 {
+    qemuDomainObjPrivatePtr priv = vm->privateData;
     qemuDomainDiskPrivatePtr diskPriv;
 
     if (job->disk) {
@@ -120,6 +130,9 @@ qemuBlockJobUnregister(qemuBlockJobDataPtr job)
 
         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.
  */
 qemuBlockJobDataPtr
-qemuBlockJobDiskNew(virDomainDiskDefPtr disk,
+qemuBlockJobDiskNew(virDomainObjPtr vm,
+                    virDomainDiskDefPtr disk,
                     qemuBlockJobType type,
                     const char *jobname)
 {
@@ -141,7 +155,7 @@ qemuBlockJobDiskNew(virDomainDiskDefPtr disk,
     if (!(job = qemuBlockJobDataNew(type, jobname)))
         return NULL;
 
-    if (qemuBlockJobRegister(job, disk) < 0)
+    if (qemuBlockJobRegister(job, vm, disk) < 0)
         return NULL;
 
     VIR_RETURN_PTR(job);
@@ -189,13 +203,14 @@ qemuBlockJobStarted(qemuBlockJobDataPtr job)
  * to @job if it was started.
  */
 void
-qemuBlockJobStartupFinalize(qemuBlockJobDataPtr job)
+qemuBlockJobStartupFinalize(virDomainObjPtr vm,
+                            qemuBlockJobDataPtr job)
 {
     if (!job)
         return;
 
     if (job->state == QEMU_BLOCKJOB_STATE_NEW)
-        qemuBlockJobUnregister(job);
+        qemuBlockJobUnregister(job, vm);
 
     virObjectUnref(job);
 }
@@ -314,7 +329,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
     virStorageSourceBackingStoreClear(disk->src);
     ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true));
     ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob));
-    qemuBlockJobUnregister(job);
+    qemuBlockJobUnregister(job, vm);
     qemuDomainSaveConfig(vm);
 }
 
@@ -373,7 +388,7 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver,
         }
         disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
         disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
-        qemuBlockJobUnregister(job);
+        qemuBlockJobUnregister(job, vm);
         break;
 
     case VIR_DOMAIN_BLOCK_JOB_LAST:
index da529090adb7a8b64cf3c06db354265213df4b2a..b7aaa86f4d68ab699052c56dbc8d79acc14a5d09 100644 (file)
@@ -80,7 +80,8 @@ struct _qemuBlockJobData {
 
 
 qemuBlockJobDataPtr
-qemuBlockJobDiskNew(virDomainDiskDefPtr disk,
+qemuBlockJobDiskNew(virDomainObjPtr vm,
+                    virDomainDiskDefPtr disk,
                     qemuBlockJobType type,
                     const char *jobname)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
@@ -98,7 +99,8 @@ qemuBlockJobIsRunning(qemuBlockJobDataPtr job)
     ATTRIBUTE_NONNULL(1);
 
 void
-qemuBlockJobStartupFinalize(qemuBlockJobDataPtr job);
+qemuBlockJobStartupFinalize(virDomainObjPtr vm,
+                            qemuBlockJobDataPtr job);
 
 int qemuBlockJobUpdate(virDomainObjPtr vm,
                        qemuBlockJobDataPtr job,
index 0c89f10489a24286a74759a800d026c295ee3056..766181bd5d687a8563abd66625cbd968c410feb3 100644 (file)
@@ -4702,7 +4702,7 @@ processBlockJobEvent(virQEMUDriverPtr driver,
     }
 
     if (!(job = qemuBlockJobDiskGetJob(disk))) {
-        if (!(job = qemuBlockJobDiskNew(disk, type, diskAlias)))
+        if (!(job = qemuBlockJobDiskNew(vm, disk, type, diskAlias)))
             goto endjob;
         qemuBlockJobStarted(job);
     }
@@ -4712,7 +4712,7 @@ processBlockJobEvent(virQEMUDriverPtr driver,
     qemuBlockJobUpdate(vm, job, QEMU_ASYNC_JOB_NONE);
 
  endjob:
-    qemuBlockJobStartupFinalize(job);
+    qemuBlockJobStartupFinalize(vm, job);
     qemuDomainObjEndJob(driver, vm);
 }
 
@@ -17084,7 +17084,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
         speed <<= 20;
     }
 
-    if (!(job = qemuBlockJobDiskNew(disk, QEMU_BLOCKJOB_TYPE_PULL, device)))
+    if (!(job = qemuBlockJobDiskNew(vm, disk, QEMU_BLOCKJOB_TYPE_PULL, device)))
         goto endjob;
 
     qemuDomainObjEnterMonitor(driver, vm);
@@ -17110,7 +17110,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
     qemuDomainObjEndJob(driver, vm);
 
  cleanup:
-    qemuBlockJobStartupFinalize(job);
+    qemuBlockJobStartupFinalize(vm, job);
     virDomainObjEndAPI(&vm);
     return ret;
 }
@@ -17655,7 +17655,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
     if (qemuDomainStorageSourceChainAccessAllow(driver, vm, mirror) < 0)
         goto endjob;
 
-    if (!(job = qemuBlockJobDiskNew(disk, QEMU_BLOCKJOB_TYPE_COPY, device)))
+    if (!(job = qemuBlockJobDiskNew(vm, disk, QEMU_BLOCKJOB_TYPE_COPY, device)))
         goto endjob;
 
     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"));
     virStorageFileDeinit(mirror);
     qemuDomainObjEndJob(driver, vm);
-    qemuBlockJobStartupFinalize(job);
+    qemuBlockJobStartupFinalize(vm, job);
 
     return ret;
 }
@@ -18042,7 +18042,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
          qemuDomainStorageSourceAccessAllow(driver, vm, top_parent, false, false) < 0))
         goto endjob;
 
-    if (!(job = qemuBlockJobDiskNew(disk, jobtype, device)))
+    if (!(job = qemuBlockJobDiskNew(vm, disk, jobtype, device)))
         goto endjob;
 
     disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
@@ -18089,7 +18089,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
             virFreeError(orig_err);
         }
     }
-    qemuBlockJobStartupFinalize(job);
+    qemuBlockJobStartupFinalize(vm, job);
     qemuDomainObjEndJob(driver, vm);
 
  cleanup:
index c9a2d8cd451b58b3a89dc3aec6ec7ee23a2da0fc..ce4f3428f1f5d077fd5c94e8bc31f996abe2cf88 100644 (file)
@@ -923,7 +923,7 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver,
     if (!(diskAlias = qemuAliasDiskDriveFromDisk(disk)))
         goto cleanup;
 
-    if (!(job = qemuBlockJobDiskNew(disk, QEMU_BLOCKJOB_TYPE_COPY, diskAlias)))
+    if (!(job = qemuBlockJobDiskNew(vm, disk, QEMU_BLOCKJOB_TYPE_COPY, diskAlias)))
         goto cleanup;
 
     qemuBlockJobSyncBegin(job);
@@ -951,7 +951,7 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver,
     ret = 0;
 
  cleanup:
-    qemuBlockJobStartupFinalize(job);
+    qemuBlockJobStartupFinalize(vm, job);
     VIR_FREE(diskAlias);
     return ret;
 }
index 746d701640aa65d8910a01318d725ab5a34496d4..b1a89aa26d9b42e9b88e696077db9fdf33efe458 100644 (file)
@@ -976,7 +976,7 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
     }
 
  cleanup:
-    qemuBlockJobStartupFinalize(job);
+    qemuBlockJobStartupFinalize(vm, job);
     qemuProcessEventFree(processEvent);
     virObjectUnlock(vm);
     return 0;
@@ -7816,7 +7816,7 @@ qemuProcessRefreshLegacyBlockjob(void *payload,
         disk->mirrorJob == VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT)
         jobtype = disk->mirrorJob;
 
-    if (!(job = qemuBlockJobDiskNew(disk, jobtype, jobname)))
+    if (!(job = qemuBlockJobDiskNew(vm, disk, jobtype, jobname)))
         return -1;
 
     qemuBlockJobStarted(job);
@@ -7850,7 +7850,7 @@ qemuProcessRefreshLegacyBlockjob(void *payload,
     }
 
  cleanup:
-    qemuBlockJobStartupFinalize(job);
+    qemuBlockJobStartupFinalize(vm, job);
 
     return 0;
 }