[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