]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: snapshot: Forbid partial internal snapshots
authorPeter Krempa <pkrempa@redhat.com>
Tue, 20 May 2014 12:04:23 +0000 (14:04 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 20 May 2014 17:28:10 +0000 (19:28 +0200)
qemu's savevm command does a snapshot of all non readonly disks of a VM.
Libvirt though allowed disabling snapshot for certain disk of a VM.

src/qemu/qemu_driver.c

index aa07ef6fed7b524d1ca01ec8d058dc5227bb2021..936e7bda3d2298c9b3d3971b9e778fa285e66b84 100644 (file)
@@ -12621,6 +12621,7 @@ qemuDomainSnapshotPrepare(virConnectPtr conn,
     bool reuse = (*flags & VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT) != 0;
     bool atomic = (*flags & VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC) != 0;
     bool found_internal = false;
+    bool forbid_internal = false;
     int external = 0;
     qemuDomainObjPrivatePtr priv = vm->privateData;
 
@@ -12689,6 +12690,9 @@ qemuDomainSnapshotPrepare(virConnectPtr conn,
             break;
 
         case VIR_DOMAIN_SNAPSHOT_LOCATION_NONE:
+            /* Remember seeing a disk that has snapshot disabled */
+            if (!dom_disk->readonly)
+                forbid_internal = true;
             break;
 
         case VIR_DOMAIN_SNAPSHOT_LOCATION_DEFAULT:
@@ -12699,12 +12703,13 @@ qemuDomainSnapshotPrepare(virConnectPtr conn,
         }
     }
 
-    /* internal snapshot requires a disk image to store the memory image to */
-    if (def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL &&
-        !found_internal) {
+    /* internal snapshot requires a disk image to store the memory image to, and
+     * also disks can't be excluded from an internal snapshot*/
+    if ((def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL && !found_internal) ||
+        (found_internal && forbid_internal)) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("internal checkpoints require at least "
-                         "one disk to be selected for snapshot"));
+                       _("internal snapshots and checkpoints require all "
+                         "disks to be selected for snapshot"));
         goto cleanup;
     }