]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: backup: Properly propagate async job type when cancelling the job
authorPeter Krempa <pkrempa@redhat.com>
Fri, 20 Dec 2019 10:15:47 +0000 (11:15 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 6 Jan 2020 09:15:36 +0000 (10:15 +0100)
When cancelling the blockjobs as part of failed backup job startup
recover we didn't pass in the correct async job type. Luckily the block
job handler and cancellation code paths use no block job at all
currently so those were correct.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/qemu/qemu_backup.c
src/qemu/qemu_backup.h
src/qemu/qemu_blockjob.c
src/qemu/qemu_driver.c

index cab991a078bd6303bce29cf1f499198cc441c34c..04c07dfaaf158541574a60326cbdc44aba4361c8 100644 (file)
@@ -661,6 +661,7 @@ qemuBackupJobTerminate(virDomainObjPtr vm,
  * @vm: domain object
  * @backup: backup definition
  * @terminatebackup: flag whether to terminate and unregister the backup
+ * @asyncJob: currently used qemu asynchronous job type
  *
  * Sends all active blockjobs which are part of @backup of @vm a signal to
  * cancel. If @terminatebackup is true qemuBackupJobTerminate is also called
@@ -669,7 +670,8 @@ qemuBackupJobTerminate(virDomainObjPtr vm,
 void
 qemuBackupJobCancelBlockjobs(virDomainObjPtr vm,
                              virDomainBackupDefPtr backup,
-                             bool terminatebackup)
+                             bool terminatebackup,
+                             int asyncJob)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     size_t i;
@@ -703,7 +705,8 @@ qemuBackupJobCancelBlockjobs(virDomainObjPtr vm,
         if (backupdisk->state != VIR_DOMAIN_BACKUP_DISK_STATE_RUNNING)
             continue;
 
-        qemuDomainObjEnterMonitor(priv->driver, vm);
+        if (qemuDomainObjEnterMonitorAsync(priv->driver, vm, asyncJob) < 0)
+            return;
 
         rc = qemuMonitorJobCancel(priv->mon, job->name, false);
 
@@ -868,7 +871,7 @@ qemuBackupBegin(virDomainObjPtr vm,
             goto endjob;
 
         if (rc < 0) {
-            qemuBackupJobCancelBlockjobs(vm, priv->backup, false);
+            qemuBackupJobCancelBlockjobs(vm, priv->backup, false, QEMU_ASYNC_JOB_BACKUP);
             goto endjob;
         }
     }
@@ -919,7 +922,8 @@ qemuBackupNotifyBlockjobEnd(virDomainObjPtr vm,
                             virDomainDiskDefPtr disk,
                             qemuBlockjobState state,
                             unsigned long long cur,
-                            unsigned long long end)
+                            unsigned long long end,
+                            int asyncJob)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     bool has_running = false;
@@ -937,7 +941,8 @@ qemuBackupNotifyBlockjobEnd(virDomainObjPtr vm,
         return;
 
     if (backup->type == VIR_DOMAIN_BACKUP_TYPE_PULL) {
-        qemuDomainObjEnterMonitor(priv->driver, vm);
+        if (qemuDomainObjEnterMonitorAsync(priv->driver, vm, asyncJob) < 0)
+            return;
         ignore_value(qemuMonitorNBDServerStop(priv->mon));
         if (qemuDomainObjExitMonitor(priv->driver, vm) < 0)
             return;
@@ -1010,7 +1015,7 @@ qemuBackupNotifyBlockjobEnd(virDomainObjPtr vm,
 
     if (has_running && (has_failed || has_cancelled)) {
         /* cancel the rest of the jobs */
-        qemuBackupJobCancelBlockjobs(vm, backup, false);
+        qemuBackupJobCancelBlockjobs(vm, backup, false, asyncJob);
     } else if (!has_running && !has_cancelling) {
         /* all sub-jobs have stopped */
 
index df67b849be921ad512782f86095f89a3ce1bdc6b..1b8a03612c2a64ada2fe5e415b39e67f8cbce982 100644 (file)
@@ -31,14 +31,17 @@ qemuBackupGetXMLDesc(virDomainObjPtr vm,
 void
 qemuBackupJobCancelBlockjobs(virDomainObjPtr vm,
                              virDomainBackupDefPtr backup,
-                             bool terminatebackup);
+                             bool terminatebackup,
+                             int asyncJob);
 
 void
 qemuBackupNotifyBlockjobEnd(virDomainObjPtr vm,
                             virDomainDiskDefPtr disk,
                             qemuBlockjobState state,
                             unsigned long long cur,
-                            unsigned long long end);
+                            unsigned long long end,
+                            int asyncJob);
+
 
 int
 qemuBackupGetJobInfoStats(virQEMUDriverPtr driver,
index c536c19bb6d58e15b0e67e4a30dbb7dd04802599..e04fcf69d117e5d4fb83fb64a62e878c181ce43b 100644 (file)
@@ -1336,7 +1336,8 @@ qemuBlockJobProcessEventConcludedBackup(virQEMUDriverPtr driver,
     g_autoptr(qemuBlockStorageSourceAttachData) backend = NULL;
     g_autoptr(virJSONValue) actions = NULL;
 
-    qemuBackupNotifyBlockjobEnd(vm, job->disk, newstate, progressCurrent, progressTotal);
+    qemuBackupNotifyBlockjobEnd(vm, job->disk, newstate,
+                                progressCurrent, progressTotal, asyncJob);
 
     if (job->data.backup.store &&
         !(backend = qemuBlockStorageSourceDetachPrepare(job->data.backup.store, NULL)))
index 9dffeefce7740009f4e015008ba4565a1ca59222..540131eb41b9506d254b50fc1df090dc9eb5e982 100644 (file)
@@ -14121,7 +14121,7 @@ static int qemuDomainAbortJob(virDomainPtr dom)
         break;
 
     case QEMU_ASYNC_JOB_BACKUP:
-        qemuBackupJobCancelBlockjobs(vm, priv->backup, true);
+        qemuBackupJobCancelBlockjobs(vm, priv->backup, true, QEMU_ASYNC_JOB_NONE);
         ret = 0;
         break;