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

John Ferlan jferlan at redhat.com
Fri Apr 29 15:34:42 UTC 2016


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(-)

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;
 
-- 
2.5.5




More information about the libvir-list mailing list