[libvirt] [PATCH] storage: Update pool metadata after adding/removing/resizing volume

Osier Yang jyang at redhat.com
Fri Aug 16 12:08:07 UTC 2013


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.

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




More information about the libvir-list mailing list