diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 6f1e3727d6e880b5288163cee2b1575063f8db4c..df3d78ca1318ac6e792a75ea9133404c0da1ea50 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -76,6 +76,31 @@ static void storageDriverUnlock(void) virMutexUnlock(&driver->lock); } + +/** + * virStoragePoolUpdateInactive: + * @poolptr: pointer to a variable holding the pool object pointer + * + * This function is supposed to be called after a pool becomes inactive. The + * function switches to the new config object for persistent pools. Inactive + * pools are removed. + */ +static void +virStoragePoolUpdateInactive(virStoragePoolObjPtr *poolptr) +{ + virStoragePoolObjPtr pool = *poolptr; + + if (pool->configFile == NULL) { + virStoragePoolObjRemove(&driver->pools, pool); + *poolptr = NULL; + } else if (pool->newDef) { + virStoragePoolDefFree(pool->def); + pool->def = pool->newDef; + pool->newDef = NULL; + } +} + + static void storagePoolUpdateState(virStoragePoolObjPtr pool) { @@ -1067,14 +1092,7 @@ storagePoolDestroy(virStoragePoolPtr obj) pool->active = false; - if (pool->configFile == NULL) { - virStoragePoolObjRemove(&driver->pools, pool); - pool = NULL; - } else if (pool->newDef) { - virStoragePoolDefFree(pool->def); - pool->def = pool->newDef; - pool->newDef = NULL; - } + virStoragePoolUpdateInactive(&pool); ret = 0; @@ -1196,10 +1214,8 @@ storagePoolRefresh(virStoragePoolPtr obj, 0); pool->active = false; - if (pool->configFile == NULL) { - virStoragePoolObjRemove(&driver->pools, pool); - pool = NULL; - } + virStoragePoolUpdateInactive(&pool); + goto cleanup; }