提交 e0139e30 编写于 作者: O Osier Yang

storage: Update pool metadata after adding/removing/resizing volume

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.
上级 e7c7e322
......@@ -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,10 +1566,6 @@ storageVolCreateXML(virStoragePoolPtr obj,
goto cleanup;
}
if (backend->buildVol) {
int buildret;
virStorageVolDefPtr buildvoldef = NULL;
if (VIR_ALLOC(buildvoldef) < 0) {
voldef = NULL;
goto cleanup;
......@@ -1580,6 +1577,9 @@ storageVolCreateXML(virStoragePoolPtr obj,
*/
memcpy(buildvoldef, voldef, sizeof(*voldef));
if (backend->buildVol) {
int buildret;
/* Drop the pool lock during volume allocation */
pool->asyncjobs++;
voldef->building = 1;
......@@ -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'",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册