Since commit e0139e3, we update the pool allocation with
the user-provided allocation values.
For qcow2, the allocation is ignored for volume building,
but we still subtracted it from pool's allocation.
This can result in interesting values if the user-provided
allocation is large enough:
Capacity: 104.71 GiB
Allocation: 109.13 GiB
Available: 16.00 EiB
We already do a VolRefresh on volume creation. Also refresh
the volume after creating and use the new value to update the pool.
https://bugzilla.redhat.com/show_bug.cgi?id=1163091
---
src/storage/storage_driver.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index 0494e5d..16d0b6c 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -1878,8 +1878,8 @@ storageVolCreateXML(virStoragePoolPtr obj,
* it updates the pool values.
*/
if (pool->def->type != VIR_STORAGE_POOL_DISK) {
- pool->def->allocation += buildvoldef->target.allocation;
- pool->def->available -= buildvoldef->target.allocation;
+ pool->def->allocation += voldef->target.allocation;
+ pool->def->available -= voldef->target.allocation;
}
VIR_INFO("Creating volume '%s' in storage pool '%s'",
@@ -2057,25 +2057,27 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj,
origpool = NULL;
}
- if (buildret < 0) {
+ if (buildret < 0 ||
+ (backend->refreshVol &&
+ backend->refreshVol(obj->conn, pool, newvol) < 0)) {
storageVolDeleteInternal(volobj, backend, pool, newvol, 0, false);
newvol = NULL;
goto cleanup;
}
- newvol = NULL;
/* Updating pool metadata ignoring the disk backend since
* it updates the pool values
*/
if (pool->def->type != VIR_STORAGE_POOL_DISK) {
- pool->def->allocation += shadowvol->target.allocation;
- pool->def->available -= shadowvol->target.allocation;
+ pool->def->allocation += newvol->target.allocation;
+ pool->def->available -= newvol->target.allocation;
}
VIR_INFO("Creating volume '%s' in storage pool '%s'",
volobj->name, pool->def->name);
ret = volobj;
volobj = NULL;
+ newvol = NULL;
cleanup:
virObjectUnref(volobj);
--
2.4.6