]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: backup: Move deletion of backup images to job termination
authorPeter Krempa <pkrempa@redhat.com>
Fri, 20 Dec 2019 10:00:57 +0000 (11:00 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 6 Jan 2020 09:15:35 +0000 (10:15 +0100)
While qemu is running both locations are identical in semantics, but the
move will allow us to fix the scenario when the VM is destroyed or
crashes where we'd leak the images.

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

index 24a53fd85fd1b493ff6a5ee709ead92967fc8484..c5484c7b9321e553e80b74eda69e8eb35fb4dedd 100644 (file)
@@ -614,6 +614,7 @@ qemuBackupJobTerminate(virDomainObjPtr vm,
 
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
+    size_t i;
 
     qemuDomainJobInfoUpdateTime(priv->job.current);
 
@@ -630,6 +631,29 @@ qemuBackupJobTerminate(virDomainObjPtr vm,
 
     qemuDomainEventEmitJobCompleted(priv->driver, vm);
 
+    if (!(priv->job.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))) {
+
+        g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(priv->driver);
+
+        for (i = 0; i < priv->backup->ndisks; i++) {
+            virDomainBackupDiskDefPtr backupdisk = priv->backup->disks + i;
+            uid_t uid;
+            gid_t gid;
+
+            if (!backupdisk->store ||
+                backupdisk->store->type != VIR_STORAGE_TYPE_FILE)
+                continue;
+
+            qemuDomainGetImageIds(cfg, vm, backupdisk->store, NULL, &uid, &gid);
+            if (virFileRemove(backupdisk->store->path, uid, gid) < 0)
+                VIR_WARN("failed to remove scratch file '%s'",
+                         backupdisk->store->path);
+        }
+    }
+
     virDomainBackupDefFree(priv->backup);
     priv->backup = NULL;
     qemuDomainObjEndAsyncJob(priv->driver, vm);
index 498e2a716f54c60ec537c515cd998338cb9766d0..131b53d88deb31fd45fb67ec0a7648a6efd3de8a 100644 (file)
@@ -1335,9 +1335,6 @@ qemuBlockJobProcessEventConcludedBackup(virQEMUDriverPtr driver,
                                         unsigned long long progressCurrent,
                                         unsigned long long progressTotal)
 {
-    g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
-    uid_t uid;
-    gid_t gid;
     g_autoptr(qemuBlockStorageSourceAttachData) backend = NULL;
     g_autoptr(virJSONValue) actions = NULL;
 
@@ -1369,18 +1366,8 @@ qemuBlockJobProcessEventConcludedBackup(virQEMUDriverPtr driver,
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
         return;
 
-    if (job->data.backup.store) {
+    if (job->data.backup.store)
         qemuDomainStorageSourceAccessRevoke(driver, vm, job->data.backup.store);
-
-        if (job->data.backup.deleteStore &&
-            job->data.backup.store->type == VIR_STORAGE_TYPE_FILE) {
-            qemuDomainGetImageIds(cfg, vm, job->data.backup.store, NULL, &uid, &gid);
-
-            if (virFileRemove(job->data.backup.store->path, uid, gid) < 0)
-                VIR_WARN("failed to remove scratch file '%s'",
-                         job->data.backup.store->path);
-        }
-    }
 }