]> xenbits.xensource.com Git - libvirt.git/commitdiff
snapshot: populate new XML info for qemu snapshots
authorEric Blake <eblake@redhat.com>
Tue, 23 Oct 2012 15:12:25 +0000 (17:12 +0200)
committerEric Blake <eblake@redhat.com>
Fri, 2 Nov 2012 16:11:50 +0000 (10:11 -0600)
Now that the XML supports listing internal snapshots, it is worth
always populating the <memory> and <disks> element to match.

* src/qemu/qemu_driver.c (qemuDomainSnapshotCreateXML): Always
parse disk info and set memory info.

src/qemu/qemu_driver.c

index c18c2053d71c96e05c0107f8433ee8ed25583b65..4eda29466abd1867478baaca6182e42b615965ce 100644 (file)
@@ -11192,8 +11192,10 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
     char uuidstr[VIR_UUID_STRING_BUFLEN];
     virDomainSnapshotDefPtr def = NULL;
     bool update_current = true;
-    unsigned int parse_flags = 0;
+    unsigned int parse_flags = VIR_DOMAIN_SNAPSHOT_PARSE_DISKS;
     virDomainSnapshotObjPtr other = NULL;
+    int align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL;
+    int align_match = true;
 
     virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE |
                   VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT |
@@ -11217,8 +11219,6 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
         update_current = false;
     if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE)
         parse_flags |= VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE;
-    if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY)
-        parse_flags |= VIR_DOMAIN_SNAPSHOT_PARSE_DISKS;
 
     qemuDriverLock(driver);
     virUUIDFormat(domain->uuid, uuidstr);
@@ -11245,6 +11245,9 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
                        _("cannot halt after transient domain snapshot"));
         goto cleanup;
     }
+    if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY) ||
+        !virDomainObjIsActive(vm))
+        parse_flags |= VIR_DOMAIN_SNAPSHOT_PARSE_OFFLINE;
 
     if (!(def = virDomainSnapshotDefParseString(xmlDesc, driver->caps,
                                                 QEMU_EXPECTED_VIRT_TYPES,
@@ -11285,6 +11288,15 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
         }
 
         /* Check that any replacement is compatible */
+        if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY) &&
+            def->state != VIR_DOMAIN_DISK_SNAPSHOT) {
+            virReportError(VIR_ERR_INVALID_ARG,
+                           _("disk-only flag for snapshot %s requires "
+                             "disk-snapshot state"),
+                           def->name);
+            goto cleanup;
+
+        }
         if (def->dom &&
             memcmp(def->dom->uuid, domain->uuid, VIR_UUID_BUFLEN)) {
             virReportError(VIR_ERR_INVALID_ARG,
@@ -11334,10 +11346,13 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
             other->def = NULL;
             snap = other;
         }
-        if (def->state == VIR_DOMAIN_DISK_SNAPSHOT && def->dom) {
-            if (virDomainSnapshotAlignDisks(def,
-                                            VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL,
-                                            false) < 0)
+        if (def->dom) {
+            if (def->state == VIR_DOMAIN_DISK_SNAPSHOT) {
+                align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
+                align_match = false;
+            }
+            if (virDomainSnapshotAlignDisks(def, align_location,
+                                            align_match) < 0)
                 goto cleanup;
         }
     } else {
@@ -11356,13 +11371,14 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
                                  "implemented yet"));
                 goto cleanup;
             }
-            if (virDomainSnapshotAlignDisks(def,
-                                            VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL,
-                                            false) < 0)
-                goto cleanup;
-            if (qemuDomainSnapshotDiskPrepare(vm, def, &flags) < 0)
+            align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
+            align_match = false;
+            if (virDomainSnapshotAlignDisks(def, align_location,
+                                            align_match) < 0 ||
+                qemuDomainSnapshotDiskPrepare(vm, def, &flags) < 0)
                 goto cleanup;
             def->state = VIR_DOMAIN_DISK_SNAPSHOT;
+            def->memory = VIR_DOMAIN_SNAPSHOT_LOCATION_NONE;
         } else {
             /* In a perfect world, we would allow qemu to tell us this.
              * The problem is that qemu only does this check
@@ -11373,9 +11389,14 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
              * the boot device.  This is probably a bug in qemu, but we'll
              * work around it here for now.
              */
-            if (!qemuDomainSnapshotIsAllowed(vm))
+            if (!qemuDomainSnapshotIsAllowed(vm) ||
+                virDomainSnapshotAlignDisks(def, align_location,
+                                            align_match) < 0)
                 goto cleanup;
             def->state = virDomainObjGetState(vm, NULL);
+            def->memory = (def->state == VIR_DOMAIN_SHUTOFF ?
+                           VIR_DOMAIN_SNAPSHOT_LOCATION_NONE :
+                           VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL);
         }
     }