]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
snapshot: qemu: Remove restrictions preventing external checkpoints
authorPeter Krempa <pkrempa@redhat.com>
Mon, 8 Oct 2012 17:28:08 +0000 (19:28 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Sun, 4 Nov 2012 19:17:57 +0000 (20:17 +0100)
Some of the pre-snapshot check have restrictions wired in regarding
configuration options that influence taking of external checkpoints.

This patch removes restrictions that would inhibit taking of such a
snapshot.

src/qemu/qemu_driver.c

index 128b98ee22faf0b65561f3a09a2b8ac96cb76870..978af577d00278937bafe415d874669034e0fb1f 100644 (file)
@@ -10792,14 +10792,6 @@ qemuDomainSnapshotPrepare(virDomainObjPtr vm, virDomainSnapshotDefPtr def,
             break;
 
         case VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL:
-            if (def->state != VIR_DOMAIN_DISK_SNAPSHOT) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                               _("system checkpoint external snapshot for "
-                                 "disk %s not implemented yet"),
-                               disk->name);
-                goto cleanup;
-            }
-
             if (!disk->format) {
                 disk->format = VIR_STORAGE_FILE_QCOW2;
             } else if (disk->format != VIR_STORAGE_FILE_QCOW2 &&
@@ -10845,12 +10837,15 @@ qemuDomainSnapshotPrepare(virDomainObjPtr vm, virDomainSnapshotDefPtr def,
         }
     }
 
-    if (!found) {
+    /* external snapshot is possible without specifying a disk to snapshot */
+    if (!found &&
+        def->memory != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("snapshots require at least one disk to be "
-                         "selected for snapshot"));
+                       _("internal and disk-only snapshots require at least "
+                         "one disk to be selected for snapshot"));
         goto cleanup;
     }
+
     if (def->state != VIR_DOMAIN_DISK_SNAPSHOT && active) {
         if (external == 1 ||
             qemuCapsGet(priv->caps, QEMU_CAPS_TRANSACTION)) {
@@ -11436,7 +11431,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
             snap = other;
         }
         if (def->dom) {
-            if (def->state == VIR_DOMAIN_DISK_SNAPSHOT) {
+            if (def->state == VIR_DOMAIN_DISK_SNAPSHOT ||
+                def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) {
                 align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
                 align_match = false;
             }
@@ -11464,6 +11460,10 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
             align_match = false;
             def->state = VIR_DOMAIN_DISK_SNAPSHOT;
             def->memory = VIR_DOMAIN_SNAPSHOT_LOCATION_NONE;
+        } else if (def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) {
+            def->state = virDomainObjGetState(vm, NULL);
+            align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
+            align_match = false;
         } else {
             def->state = virDomainObjGetState(vm, NULL);
             def->memory = (def->state == VIR_DOMAIN_SHUTOFF ?