]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
backup: Store 'apiFlags' in private section of virDomainBackupDef
authorPeter Krempa <pkrempa@redhat.com>
Thu, 11 Mar 2021 15:14:17 +0000 (16:14 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 12 Mar 2021 09:59:05 +0000 (10:59 +0100)
'qemuBackupJobTerminate' needs the API flags to see whether
VIR_DOMAIN_BACKUP_BEGIN_REUSE_EXTERNAL. Unfortunately when called via
qemuProcessReconnect()->qemuProcessStop() early (e.g. if the qemu
process died while we were reconnecting) the job is cleared temporarily
so that other APIs can be called. This would mean that we couldn't clean
up the files in some cases.

Save the 'apiFlags' inside the backup object and set it from the
'qemuDomainJobObj' 'apiFlags' member when reconnecting to a VM.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/conf/backup_conf.h
src/qemu/qemu_backup.c
src/qemu/qemu_process.c

index bda2bdcfe4d823b78c7c201965c2b98d5ef323ab..2902f39fb7de59a2cbfbf36d7e656ca4af6b06b1 100644 (file)
@@ -99,6 +99,8 @@ struct _virDomainBackupDef {
     unsigned long long pull_tmp_total;
 
     char *errmsg; /* error message of failed sub-blockjob */
+
+    unsigned int apiFlags; /* original flags used when starting the job */
 };
 
 typedef enum {
index 6ce29c28e1b9a2fcc774d81b0d3f4c948cd3aafc..f6096f643faf5629896fdf26104a5aeccdec0035 100644 (file)
@@ -560,7 +560,7 @@ qemuBackupJobTerminate(virDomainObjPtr vm,
     qemuDomainObjPrivatePtr priv = vm->privateData;
     size_t i;
 
-    if (!(priv->job.apiFlags & VIR_DOMAIN_BACKUP_BEGIN_REUSE_EXTERNAL) &&
+    if (!(priv->backup->apiFlags & VIR_DOMAIN_BACKUP_BEGIN_REUSE_EXTERNAL) &&
         (priv->backup->type == VIR_DOMAIN_BACKUP_TYPE_PULL ||
          (priv->backup->type == VIR_DOMAIN_BACKUP_TYPE_PUSH &&
           jobstatus != QEMU_DOMAIN_JOB_STATUS_COMPLETED))) {
@@ -766,6 +766,8 @@ qemuBackupBegin(virDomainObjPtr vm,
     if (def->type == VIR_DOMAIN_BACKUP_TYPE_PULL)
         pull = true;
 
+    def->apiFlags = flags;
+
     /* we'll treat this kind of backup job as an asyncjob as it uses some of the
      * infrastructure for async jobs. We'll allow standard modify-type jobs
      * as the interlocking of conflicting operations is handled on the block
index 89ede2775172f179900b45c7b0fc9ef829c194f1..971a270793c49adb3f635555477f8c716b9011e0 100644 (file)
@@ -96,6 +96,7 @@
 #include "virthreadjob.h"
 #include "virutil.h"
 #include "storage_source.h"
+#include "backup_conf.h"
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
 
@@ -8315,12 +8316,14 @@ qemuProcessReconnect(void *opaque)
     g_clear_object(&data->identity);
     VIR_FREE(data);
 
+    cfg = virQEMUDriverGetConfig(driver);
+    priv = obj->privateData;
+
     qemuDomainObjRestoreJob(obj, &oldjob);
     if (oldjob.asyncJob == QEMU_ASYNC_JOB_MIGRATION_IN)
         stopFlags |= VIR_QEMU_PROCESS_STOP_MIGRATED;
-
-    cfg = virQEMUDriverGetConfig(driver);
-    priv = obj->privateData;
+    if (oldjob.asyncJob == QEMU_ASYNC_JOB_BACKUP && priv->backup)
+        priv->backup->apiFlags = oldjob.apiFlags;
 
     /* expect that libvirt might have crashed during VM start, so prevent
      * cleanup of transient disks */