Update pool allocation with new values on volume creation

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
(cherry picked from commit 56a4e9cb61)
This commit is contained in:
Ján Tomko 2015-09-24 17:01:40 +02:00 committed by Cole Robinson
parent 5741803ceb
commit 9a51c50048

View File

@ -1878,8 +1878,8 @@ storageVolCreateXML(virStoragePoolPtr obj,
* it updates the pool values. * it updates the pool values.
*/ */
if (pool->def->type != VIR_STORAGE_POOL_DISK) { if (pool->def->type != VIR_STORAGE_POOL_DISK) {
pool->def->allocation += buildvoldef->target.allocation; pool->def->allocation += voldef->target.allocation;
pool->def->available -= buildvoldef->target.allocation; pool->def->available -= voldef->target.allocation;
} }
VIR_INFO("Creating volume '%s' in storage pool '%s'", VIR_INFO("Creating volume '%s' in storage pool '%s'",
@ -2057,25 +2057,27 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj,
origpool = NULL; origpool = NULL;
} }
if (buildret < 0) { if (buildret < 0 ||
(backend->refreshVol &&
backend->refreshVol(obj->conn, pool, newvol) < 0)) {
storageVolDeleteInternal(volobj, backend, pool, newvol, 0, false); storageVolDeleteInternal(volobj, backend, pool, newvol, 0, false);
newvol = NULL; newvol = NULL;
goto cleanup; goto cleanup;
} }
newvol = NULL;
/* Updating pool metadata ignoring the disk backend since /* Updating pool metadata ignoring the disk backend since
* it updates the pool values * it updates the pool values
*/ */
if (pool->def->type != VIR_STORAGE_POOL_DISK) { if (pool->def->type != VIR_STORAGE_POOL_DISK) {
pool->def->allocation += shadowvol->target.allocation; pool->def->allocation += newvol->target.allocation;
pool->def->available -= shadowvol->target.allocation; pool->def->available -= newvol->target.allocation;
} }
VIR_INFO("Creating volume '%s' in storage pool '%s'", VIR_INFO("Creating volume '%s' in storage pool '%s'",
volobj->name, pool->def->name); volobj->name, pool->def->name);
ret = volobj; ret = volobj;
volobj = NULL; volobj = NULL;
newvol = NULL;
cleanup: cleanup:
virObjectUnref(volobj); virObjectUnref(volobj);