
On Fri, Aug 16, 2013 at 08:08:07PM +0800, Osier Yang wrote:
RHEL6.5: https://bugzilla.redhat.com/show_bug.cgi?id=965442
One has to refresh the pool to get the correct pool info after adding/removing/resizing a volume, this updates the pool metadata (allocation, available) after those operation are done.
I didn't look more closely but it seems this broke libvirt-tck: http://honk.sigxcpu.org:8001/job/libvirt-tck-debian-wheezy-qemu-session/1351... If you look at the libvirtd.log http://honk.sigxcpu.org:8001/job/libvirt-tck-debian-wheezy-qemu-session/1351... the volume name looks rather weird: info : storageVolDelete:2379 : Deleting volume '8Ü!¹àÂ,¹@' from storage pool 'tck' after this patch got applied. Cheers, -- Guido
v1: https://www.redhat.com/archives/libvir-list/2013-May/msg01957.html --- src/storage/storage_driver.c | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-)
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 72786dd..7908ba6 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1507,6 +1507,7 @@ storageVolCreateXML(virStoragePoolPtr obj, virStorageBackendPtr backend; virStorageVolDefPtr voldef = NULL; virStorageVolPtr ret = NULL, volobj = NULL; + virStorageVolDefPtr buildvoldef = NULL;
virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, NULL);
@@ -1565,20 +1566,19 @@ storageVolCreateXML(virStoragePoolPtr obj, goto cleanup; }
- if (backend->buildVol) { - int buildret; - virStorageVolDefPtr buildvoldef = NULL; + if (VIR_ALLOC(buildvoldef) < 0) { + voldef = NULL; + goto cleanup; + }
- if (VIR_ALLOC(buildvoldef) < 0) { - voldef = NULL; - goto cleanup; - } + /* Make a shallow copy of the 'defined' volume definition, since the + * original allocation value will change as the user polls 'info', + * but we only need the initial requested values + */ + memcpy(buildvoldef, voldef, sizeof(*voldef));
- /* Make a shallow copy of the 'defined' volume definition, since the - * original allocation value will change as the user polls 'info', - * but we only need the initial requested values - */ - memcpy(buildvoldef, voldef, sizeof(*voldef)); + if (backend->buildVol) { + int buildret;
/* Drop the pool lock during volume allocation */ pool->asyncjobs++; @@ -1595,7 +1595,6 @@ storageVolCreateXML(virStoragePoolPtr obj, pool->asyncjobs--;
voldef = NULL; - VIR_FREE(buildvoldef);
if (buildret < 0) { virStoragePoolObjUnlock(pool); @@ -1606,6 +1605,10 @@ storageVolCreateXML(virStoragePoolPtr obj,
}
+ /* Update pool metadata */ + pool->def->allocation += buildvoldef->allocation; + pool->def->available -= buildvoldef->allocation; + VIR_INFO("Creating volume '%s' in storage pool '%s'", volobj->name, pool->def->name); ret = volobj; @@ -1615,6 +1618,7 @@ storageVolCreateXML(virStoragePoolPtr obj, cleanup: virObjectUnref(volobj); virStorageVolDefFree(voldef); + virStorageVolDefFree(buildvoldef); if (pool) virStoragePoolObjUnlock(pool); return ret; @@ -1770,6 +1774,10 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj, goto cleanup; }
+ /* Updating pool metadata */ + pool->def->allocation += newvol->allocation; + pool->def->available -= newvol->allocation; + VIR_INFO("Creating volume '%s' in storage pool '%s'", volobj->name, pool->def->name); ret = volobj; @@ -2013,6 +2021,11 @@ storageVolResize(virStorageVolPtr obj, goto out;
vol->capacity = abs_capacity; + + /* Update pool metadata */ + pool->def->allocation += (abs_capacity - vol->capacity); + pool->def->available -= (abs_capacity - vol->capacity); + ret = 0;
out: @@ -2356,6 +2369,10 @@ storageVolDelete(virStorageVolPtr obj, if (backend->deleteVol(obj->conn, pool, vol, flags) < 0) goto cleanup;
+ /* Update pool metadata */ + pool->def->allocation -= vol->allocation; + pool->def->available += vol->allocation; + for (i = 0; i < pool->volumes.count; i++) { if (pool->volumes.objs[i] == vol) { VIR_INFO("Deleting volume '%s' from storage pool '%s'", -- 1.8.1.4
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list