]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: prepare cleanup for <transient/> disk overlays
authorPeter Krempa <pkrempa@redhat.com>
Tue, 22 Sep 2020 12:39:27 +0000 (14:39 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 1 Oct 2020 07:55:02 +0000 (09:55 +0200)
Later patches will implement support for <transient/> disks in libvirt
by installing an overlay on top of the configured image. This will
require cleanup after the VM will be stopped so that the state is
correctly discarded.

Since the overlay will be installed only during the startup phase of the
VM we need to ensure that qemuProcessStop doesn't delete the original
file on some previous failure. This is solved by adding
'inhibitDiskTransientDelete' VM private data member which is set prior
to any startup step and will be cleared once transient disk overlays are
established.

Based on that we can then delete the overlays for any <transient/> disk.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Tested-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Tested-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_process.c

index 279de2997d5caadbff0ec6d81f0a36918df2ac6d..dc5949edfa6f582d12f987d15586a403f6db3bb0 100644 (file)
@@ -1792,6 +1792,8 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv)
     priv->dbusVMStateIds = NULL;
 
     priv->dbusVMState = false;
+
+    priv->inhibitDiskTransientDelete = false;
 }
 
 
index c7c3c5c073ea3bde4d6eb7ba01a6cdb7e7e51d6e..ec776ced72b6b71b6df188892bcd7aa42eccb5ee 100644 (file)
@@ -263,6 +263,10 @@ struct _qemuDomainObjPrivate {
     char **dbusVMStateIds;
     /* true if -object dbus-vmstate was added */
     bool dbusVMState;
+
+    /* prevent deletion of <transient> disk overlay files between startup and
+     * succesful setup of the overlays */
+    bool inhibitDiskTransientDelete;
 };
 
 #define QEMU_DOMAIN_PRIVATE(vm) \
index f21b8f1585b458863467840e5a33b42dd4c4b8e0..ffb3afa9c55cd1f129ad69a1bbebe5cf563611d7 100644 (file)
@@ -5616,6 +5616,9 @@ qemuProcessInit(virQEMUDriverPtr driver,
     if (virDomainObjSetDefTransient(driver->xmlopt, vm, priv->qemuCaps) < 0)
         goto cleanup;
 
+    /* don't clean up files for <transient> disks until we set them up */
+    priv->inhibitDiskTransientDelete = true;
+
     if (flags & VIR_QEMU_PROCESS_START_PRETEND) {
         if (qemuDomainSetPrivatePaths(driver, vm) < 0) {
             virDomainObjRemoveTransientDef(vm);
@@ -7710,6 +7713,18 @@ void qemuProcessStop(virQEMUDriverPtr driver,
             }
 
             qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->src);
+
+            /* for now transient disks are forbidden with migration so they
+             * can be handled here */
+            if (disk->transient &&
+                !priv->inhibitDiskTransientDelete) {
+                VIR_DEBUG("Removing transient overlay '%s' of disk '%s'",
+                          disk->src->path, disk->dst);
+                if (qemuDomainStorageFileInit(driver, vm, disk->src, NULL) >= 0) {
+                    virStorageFileUnlink(disk->src);
+                    virStorageFileDeinit(disk->src);
+                }
+            }
         }
     }
 
@@ -8125,6 +8140,10 @@ qemuProcessReconnect(void *opaque)
     cfg = virQEMUDriverGetConfig(driver);
     priv = obj->privateData;
 
+    /* expect that libvirt might have crashed during VM start, so prevent
+     * cleanup of transient disks */
+    priv->inhibitDiskTransientDelete = true;
+
     if (qemuDomainObjBeginJob(driver, obj, QEMU_JOB_MODIFY) < 0)
         goto error;
     jobStarted = true;
@@ -8228,6 +8247,9 @@ qemuProcessReconnect(void *opaque)
         goto error;
     }
 
+    /* vm startup complete, we can remove transient disks if required */
+    priv->inhibitDiskTransientDelete = false;
+
     /* In case the domain shutdown while we were not running,
      * we need to finish the shutdown process. And we need to do it after
      * we have virQEMUCaps filled in.