[libvirt PATCH v3 16/25] qemu_snapshot: prepare data for non-active leaf external snapshot deletion

Pavel Hrdina phrdina at redhat.com
Mon Aug 14 09:36:08 UTC 2023


In this case there is no need to run block commit and using qemu process
at all.

Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
Reviewed-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_snapshot.c | 55 +++++++++++++++++++++++-----------------
 1 file changed, 32 insertions(+), 23 deletions(-)

diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
index d47dc72709..8b005cae8f 100644
--- a/src/qemu/qemu_snapshot.c
+++ b/src/qemu/qemu_snapshot.c
@@ -2759,34 +2759,43 @@ qemuSnapshotDeleteExternalPrepare(virDomainObj *vm,
         return 0;
     }
 
-    /* this also serves as validation whether the snapshot can be deleted */
-    if (qemuSnapshotDeleteExternalPrepareData(vm, snap, true, &tmpData) < 0)
-        return -1;
-
-    if (!virDomainObjIsActive(vm)) {
-        if (qemuProcessStart(NULL, driver, vm, NULL, VIR_ASYNC_JOB_SNAPSHOT,
-                             NULL, -1, NULL, NULL,
-                             VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
-                             VIR_QEMU_PROCESS_START_PAUSED) < 0) {
-            return -1;
-        }
-
-        *stop_qemu = true;
-
-        /* Call the prepare again as some data require that the VM is
-         * running to get everything we need. */
-        if (qemuSnapshotDeleteExternalPrepareData(vm, snap, true, externalData) < 0)
+    /* Leaf non-active snapshot doesn't have overlay files for the disk images
+     * so there is no need to do any merge and we can just delete the files
+     * directly. */
+    if (snap != virDomainSnapshotGetCurrent(vm->snapshots) &&
+        snap->nchildren == 0) {
+        if (qemuSnapshotDeleteExternalPrepareData(vm, snap, false, externalData) < 0)
             return -1;
     } else {
-        qemuDomainJobPrivate *jobPriv = vm->job->privateData;
+        /* this also serves as validation whether the snapshot can be deleted */
+        if (qemuSnapshotDeleteExternalPrepareData(vm, snap, true, &tmpData) < 0)
+            return -1;
 
-        *externalData = g_steal_pointer(&tmpData);
+        if (!virDomainObjIsActive(vm)) {
+            if (qemuProcessStart(NULL, driver, vm, NULL, VIR_ASYNC_JOB_SNAPSHOT,
+                                 NULL, -1, NULL, NULL,
+                                 VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
+                                 VIR_QEMU_PROCESS_START_PAUSED) < 0) {
+                return -1;
+            }
 
-        /* If the VM is running we need to indicate that the async snapshot
-         * job is snapshot delete job. */
-        jobPriv->snapshotDelete = true;
+            *stop_qemu = true;
 
-        qemuDomainSaveStatus(vm);
+            /* Call the prepare again as some data require that the VM is
+             * running to get everything we need. */
+            if (qemuSnapshotDeleteExternalPrepareData(vm, snap, true, externalData) < 0)
+                return -1;
+        } else {
+            qemuDomainJobPrivate *jobPriv = vm->job->privateData;
+
+            *externalData = g_steal_pointer(&tmpData);
+
+            /* If the VM is running we need to indicate that the async snapshot
+             * job is snapshot delete job. */
+            jobPriv->snapshotDelete = true;
+
+            qemuDomainSaveStatus(vm);
+        }
     }
 
     return 0;
-- 
2.41.0



More information about the libvir-list mailing list