[libvirt] [PATCHv2 11/20] snapshot: qemu: Remove restrictions preventing external snapshots

Peter Krempa pkrempa at redhat.com
Thu Nov 1 16:22:17 UTC 2012


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 | 27 ++++++++++++---------------
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 21d558e..53f6e4b 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -10789,14 +10789,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 &&
@@ -10842,12 +10834,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)) {
@@ -11429,7 +11424,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;
             }
@@ -11459,9 +11455,10 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
             def->memory = VIR_DOMAIN_SNAPSHOT_LOCATION_NONE;
         } else {
             def->state = virDomainObjGetState(vm, NULL);
-            def->memory = (def->state == VIR_DOMAIN_SHUTOFF ?
-                           VIR_DOMAIN_SNAPSHOT_LOCATION_NONE :
-                           VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL);
+            if (def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) {
+                align_match = false;
+                align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
+            }
         }
         if (virDomainSnapshotAlignDisks(def, align_location,
                                         align_match) < 0 ||
-- 
1.7.12.4




More information about the libvir-list mailing list