[libvirt] [PATCH 03/20] snapshot: populate new XML info for qemu snapshots
Osier Yang
jyang at redhat.com
Wed Oct 24 04:47:43 UTC 2012
On 2012年10月23日 23:12, Peter Krempa wrote:
> From: Eric Blake<eblake at redhat.com>
>
> 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 | 47 ++++++++++++++++++++++++++++++++++-------------
> 1 file changed, 34 insertions(+), 13 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 8af316f..cbabd62 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -11159,8 +11159,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 |
> @@ -11184,8 +11186,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);
> @@ -11206,6 +11206,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,
> @@ -11246,6 +11249,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,
> @@ -11295,10 +11307,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 {
> @@ -11317,13 +11332,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
> @@ -11334,9 +11350,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);
> }
> }
>
ACK.
More information about the libvir-list
mailing list