[libvirt] [PATCH 2/1] storage: Merge into 1/1

John Ferlan jferlan at redhat.com
Tue May 10 11:20:09 UTC 2016



On 04/29/2016 11:34 AM, John Ferlan wrote:
> As it turns out, trusting that <allocation> being 0 means it wasn't
> provided isn't such a good idea.
> 
> If someone provided a <capacity> of 10 and <allocation> of 0, then
> we need to honor it.
> 
> So this patch which I'll merge into the previous patch will track
> when the XML is read if the allocation was provided or not. That
> way we can determine in this code that if allocation = 0, then
> "overwrite" with the capacity value if it wasn't provided.
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  src/conf/storage_conf.c      |  1 +
>  src/storage/storage_driver.c | 11 ++++++-----
>  src/util/virstoragefile.c    |  1 +
>  src/util/virstoragefile.h    |  2 ++
>  4 files changed, 10 insertions(+), 5 deletions(-)
> 

ping - any thoughts regarding squashing this in as well?

Tks -

John
> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
> index daf8f99..a4708f6 100644
> --- a/src/conf/storage_conf.c
> +++ b/src/conf/storage_conf.c
> @@ -1364,6 +1364,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
>          unit = virXPathString("string(./allocation/@unit)", ctxt);
>          if (virStorageSize(unit, allocation, &ret->target.allocation) < 0)
>              goto error;
> +        ret->target.has_allocation = true;
>      } else {
>          ret->target.allocation = ret->target.capacity;
>      }
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index 4415a4c..1ebee5b 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -2043,11 +2043,12 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj,
>      if (newvol->target.capacity == 0)
>          newvol->target.capacity = origvol->target.capacity;
>  
> -    /* If the new allocation is 0, then use capacity as it's specifically
> -     * documented "If omitted when creating a volume, the volume will be
> -     * fully allocated at time of creation.". This is especially important
> -     * for logical volume creation. */
> -    if (newvol->target.allocation == 0)
> +    /* If the new allocation is 0 and the allocation was not provided in
> +     * the XML, then use capacity as it's specifically documented "If
> +     * omitted when creating a volume, the volume will be fully allocated
> +     * at time of creation.". This is especially important for logical
> +     * volume creation. */
> +    if (newvol->target.allocation == 0 && !newvol->target.has_allocation)
>          newvol->target.allocation = newvol->target.capacity;
>  
>      if (!backend->buildVolFrom) {
> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
> index 05ac254..73151bd 100644
> --- a/src/util/virstoragefile.c
> +++ b/src/util/virstoragefile.c
> @@ -1835,6 +1835,7 @@ virStorageSourceCopy(const virStorageSource *src,
>      ret->format = src->format;
>      ret->capacity = src->capacity;
>      ret->allocation = src->allocation;
> +    ret->has_allocation = src->has_allocation;
>      ret->physical = src->physical;
>      ret->readonly = src->readonly;
>      ret->shared = src->shared;
> diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
> index b98fe25..6edc789 100644
> --- a/src/util/virstoragefile.h
> +++ b/src/util/virstoragefile.h
> @@ -260,6 +260,8 @@ struct _virStorageSource {
>      unsigned long long capacity; /* in bytes, 0 if unknown */
>      unsigned long long allocation; /* in bytes, 0 if unknown */
>      unsigned long long physical; /* in bytes, 0 if unknown */
> +    bool has_allocation; /* Set to true when provided in XML */
> +
>      size_t nseclabels;
>      virSecurityDeviceLabelDefPtr *seclabels;
>  
> 




More information about the libvir-list mailing list