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@xxxxxxxxxx> > --- > 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; > > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list