]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: blockjob: Save status XML when modifying job state
authorPeter Krempa <pkrempa@redhat.com>
Wed, 15 May 2019 08:58:42 +0000 (10:58 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 18 Jul 2019 15:59:34 +0000 (17:59 +0200)
Now that block job data is stored in the status XML portion we need to
make sure that everything which changes the state also saves the status
XML. The job registering function is used while parsing the status XML
so in that case we need to skip the XML saving.

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_domain.c
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_process.c

index 71bb143ea267362f9e07d2932a7ab03b9477fd6e..d9d22d8f61b0f855040aa066ddd50f35fec80c0d 100644 (file)
@@ -114,7 +114,8 @@ qemuBlockJobDataNew(qemuBlockJobType type,
 int
 qemuBlockJobRegister(qemuBlockJobDataPtr job,
                      virDomainObjPtr vm,
-                     virDomainDiskDefPtr disk)
+                     virDomainDiskDefPtr disk,
+                     bool savestatus)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
 
@@ -128,6 +129,9 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job,
         QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
     }
 
+    if (savestatus)
+        qemuDomainSaveStatus(vm);
+
     return 0;
 }
 
@@ -152,6 +156,8 @@ qemuBlockJobUnregister(qemuBlockJobDataPtr job,
 
     /* this may remove the last reference of 'job' */
     virHashRemoveEntry(priv->blockjobs, job->name);
+
+    qemuDomainSaveStatus(vm);
 }
 
 
@@ -174,7 +180,7 @@ qemuBlockJobDiskNew(virDomainObjPtr vm,
     if (!(job = qemuBlockJobDataNew(type, jobname)))
         return NULL;
 
-    if (qemuBlockJobRegister(job, vm, disk) < 0)
+    if (qemuBlockJobRegister(job, vm, disk, true) < 0)
         return NULL;
 
     VIR_RETURN_PTR(job);
@@ -206,10 +212,13 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
  * Mark @job as started in qemu.
  */
 void
-qemuBlockJobStarted(qemuBlockJobDataPtr job)
+qemuBlockJobStarted(qemuBlockJobDataPtr job,
+                    virDomainObjPtr vm)
 {
     if (job->state == QEMU_BLOCKJOB_STATE_NEW)
         job->state = QEMU_BLOCKJOB_STATE_RUNNING;
+
+    qemuDomainSaveStatus(vm);
 }
 
 
index 5b3af69d894f1233234659ca7de777e1353cb2f8..c5fd6363404726d35383a7e92a330d447352ebcb 100644 (file)
@@ -87,7 +87,8 @@ struct _qemuBlockJobData {
 int
 qemuBlockJobRegister(qemuBlockJobDataPtr job,
                      virDomainObjPtr vm,
-                     virDomainDiskDefPtr disk)
+                     virDomainDiskDefPtr disk,
+                     bool savestatus)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 qemuBlockJobDataPtr
@@ -107,8 +108,9 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
     ATTRIBUTE_NONNULL(1);
 
 void
-qemuBlockJobStarted(qemuBlockJobDataPtr job)
-    ATTRIBUTE_NONNULL(1);
+qemuBlockJobStarted(qemuBlockJobDataPtr job,
+                    virDomainObjPtr vm)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 bool
 qemuBlockJobIsRunning(qemuBlockJobDataPtr job)
index faa68e86fd1e853caf79c1abb24d3c0dfcd30e5a..1be602cc991e9eebfb36f4ec8af4e9db1715ca31 100644 (file)
@@ -2748,7 +2748,7 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObjPtr vm,
     job->errmsg = virXPathString("string(./errmsg)", ctxt);
     job->invalidData = invalidData;
 
-    if (qemuBlockJobRegister(job, vm, disk) < 0)
+    if (qemuBlockJobRegister(job, vm, disk, false) < 0)
         return -1;
 
     return 0;
index 766181bd5d687a8563abd66625cbd968c410feb3..af58dacbaa44cc4266abda63b1ea20cfc8ef2845 100644 (file)
@@ -4704,7 +4704,7 @@ processBlockJobEvent(virQEMUDriverPtr driver,
     if (!(job = qemuBlockJobDiskGetJob(disk))) {
         if (!(job = qemuBlockJobDiskNew(vm, disk, type, diskAlias)))
             goto endjob;
-        qemuBlockJobStarted(job);
+        job->state = QEMU_BLOCKJOB_STATE_RUNNING;
     }
 
     job->newstate = status;
@@ -17100,7 +17100,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
     if (ret < 0)
         goto endjob;
 
-    qemuBlockJobStarted(job);
+    qemuBlockJobStarted(job, vm);
 
     if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
         VIR_WARN("Unable to save status on vm %s after state change",
@@ -17676,11 +17676,11 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
     }
 
     /* Update vm in place to match changes.  */
-    qemuBlockJobStarted(job);
     need_unlink = false;
     virStorageFileDeinit(mirror);
     VIR_STEAL_PTR(disk->mirror, mirror);
     disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_COPY;
+    qemuBlockJobStarted(job, vm);
 
     if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
         VIR_WARN("Unable to save status on vm %s after state change",
@@ -18066,11 +18066,11 @@ qemuDomainBlockCommit(virDomainPtr dom,
         goto endjob;
     }
 
-    qemuBlockJobStarted(job);
     if (mirror) {
         VIR_STEAL_PTR(disk->mirror, mirror);
         disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT;
     }
+    qemuBlockJobStarted(job, vm);
 
     if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
         VIR_WARN("Unable to save status on vm %s after block job",
index ce4f3428f1f5d077fd5c94e8bc31f996abe2cf88..7c6be201b9d355d933a14f9405db14c94a2071f8 100644 (file)
@@ -946,7 +946,7 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver,
         goto cleanup;
 
     diskPriv->migrating = true;
-    qemuBlockJobStarted(job);
+    qemuBlockJobStarted(job, vm);
 
     ret = 0;
 
index b1a89aa26d9b42e9b88e696077db9fdf33efe458..0e9eedd9d692f8b62d21161d7c48afc79cc58948 100644 (file)
@@ -7819,8 +7819,6 @@ qemuProcessRefreshLegacyBlockjob(void *payload,
     if (!(job = qemuBlockJobDiskNew(vm, disk, jobtype, jobname)))
         return -1;
 
-    qemuBlockJobStarted(job);
-
     if (disk->mirror) {
         if (info->ready == 1 ||
             (info->ready == -1 && info->end == info->cur)) {
@@ -7849,6 +7847,8 @@ qemuProcessRefreshLegacyBlockjob(void *payload,
         }
     }
 
+    qemuBlockJobStarted(job, vm);
+
  cleanup:
     qemuBlockJobStartupFinalize(vm, job);