]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu_snapshot: create: don't require disk-only flag for offline external snapshot
authorPavel Hrdina <phrdina@redhat.com>
Tue, 30 Jan 2024 11:13:32 +0000 (12:13 +0100)
committerPavel Hrdina <phrdina@redhat.com>
Tue, 30 Jan 2024 12:54:42 +0000 (13:54 +0100)
Historically creating offline external snapshot required disk-only flag
as well. Now when user requests new snapshot for offline VM and at least
one disk is specified to use external snapshot we will no longer require
disk-only flag as all other not specified disk will use external
snapshots as well.

Resolves: https://issues.redhat.com/browse/RHEL-22797
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/qemu/qemu_snapshot.c

index 871e63c9cdd0250e4a509b1e2684638bbed87b79..0cac0c4146d7131e24457c5479d13b0fc7c0af2a 100644 (file)
@@ -1582,15 +1582,27 @@ qemuSnapshotCreateXMLValidateDef(virDomainObj *vm,
  * to internal snapshots.
  */
 static bool
-qemuSnapshotCreateUseExternal(virDomainSnapshotDef *def,
+qemuSnapshotCreateUseExternal(virDomainObj *vm,
+                              virDomainSnapshotDef *def,
                               unsigned int flags)
 {
+    size_t i;
+
     if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY)
         return true;
 
     if (def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL)
         return true;
 
+    if (!virDomainObjIsActive(vm)) {
+        /* No need to check all disks as function qemuSnapshotPrepare() guarantees
+         * that we don't have a combination of internal and external location. */
+        for (i = 0; i < def->ndisks; i++) {
+            if (def->disks[i].snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL)
+                return true;
+        }
+    }
+
     return false;
 }
 
@@ -1623,7 +1635,7 @@ qemuSnapshotCreateAlignDisks(virDomainObj *vm,
             return -1;
     }
 
-    if (qemuSnapshotCreateUseExternal(def, flags)) {
+    if (qemuSnapshotCreateUseExternal(vm, def, flags)) {
         align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
         def->state = virDomainObjGetState(vm, NULL);