From 87ed28f6a577ca5353c071a71526c964d42e2def Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 30 Mar 2017 13:45:45 +0200 Subject: [PATCH] storage: driver: Split out code fixing pool state after deactivation After a pool is made inactive the definition objects need to be updated (if a new definition is prepared) and transient pools need to be completely removed. Split out the code doing these steps into a separate function for later reuse. (cherry picked from commit aced6b23560b7d697069b0d81cfab230e2b20c47) --- src/storage/storage_driver.c | 40 +++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 6f1e3727d6..df3d78ca13 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; } -- GitLab