[libvirt] [PATCH 02/20] snapshot: improve disk align checking

Osier Yang jyang at redhat.com
Wed Oct 24 04:05:28 UTC 2012


On 2012年10月23日 23:12, Peter Krempa wrote:
> From: Eric Blake<eblake at redhat.com>
>
> There were not previous callers with require_match set to true.
> I originally implemented this bool with the intent of supporting
> ESX snapshot semantics, where the choice of internal vs. external
> vs. non-checkpointable must be made at domain start, but as ESX
> has not been wired up to use it yet, we might as well fix it to
> work with our next qemu patch for now, and worry about any further
> improvements (changing the bool to a flags argument) if the ESX
> driver decides to use this function in the future.
>
> * src/conf/snapshot_conf.c (virDomainSnapshotAlignDisks): Alter
> logic when require_match is true to deal with new XML.
> ---
>   src/conf/snapshot_conf.c | 25 +++++++++++++++----------
>   1 file changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
> index 6f77026..691950a 100644
> --- a/src/conf/snapshot_conf.c
> +++ b/src/conf/snapshot_conf.c
> @@ -368,9 +368,8 @@ disksorter(const void *a, const void *b)
>    * the domain, with a fallback to a passed in default.  Convert paths
>    * to disk targets for uniformity.  Issue an error and return -1 if
>    * any def->disks[n]->name appears more than once or does not map to
> - * dom->disks.  If require_match, also require that existing
> - * def->disks snapshot states do not override explicit def->dom
> - * settings.  */
> + * dom->disks.  If require_match, also ensure that there is no
> + * conflicting requests for both internal and external snapshots.  */
>   int
>   virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr def,
>                               int default_snapshot,
> @@ -416,7 +415,6 @@ virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr def,
>                              _("no disk named '%s'"), disk->name);
>               goto cleanup;
>           }
> -        disk_snapshot = def->dom->disks[idx]->snapshot;
>
>           if (virBitmapGetBit(map, idx,&inuse)<  0 || inuse) {
>               virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> @@ -426,15 +424,22 @@ virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr def,
>           }
>           ignore_value(virBitmapSetBit(map, idx));
>           disk->index = idx;
> -        if (!disk_snapshot)
> -            disk_snapshot = default_snapshot;
> +
> +        disk_snapshot = def->dom->disks[idx]->snapshot;
>           if (!disk->snapshot) {
> -            disk->snapshot = disk_snapshot;
> -        } else if (disk_snapshot&&  require_match&&
> -                   disk->snapshot != disk_snapshot) {
> +            if (disk_snapshot&&
> +                (!require_match ||
> +                 disk_snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_NONE))
> +                disk->snapshot = disk_snapshot;
> +            else
> +                disk->snapshot = default_snapshot;
> +        } else if (require_match&&
> +                   disk->snapshot != default_snapshot&&
> +                   !(disk->snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_NONE&&
> +                     disk_snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_NONE)) {
>               const char *tmp;
>
> -            tmp = virDomainSnapshotLocationTypeToString(disk_snapshot);
> +            tmp = virDomainSnapshotLocationTypeToString(default_snapshot);
>               virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                              _("disk '%s' must use snapshot mode '%s'"),
>                              disk->name, tmp);

ACK




More information about the libvir-list mailing list