There are several cases where we do not handle transient pool destroy and cleanup correctly. For example: https://bugzilla.redhat.com/show_bug.cgi?id=1227475 Move the pool cleanup logic to a new function storagePoolSetInactive and use it consistently. --- src/storage/storage_driver.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index e2d729f..74af35d 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -77,6 +77,21 @@ static void storageDriverUnlock(void) } static void +storagePoolSetInactive(virStoragePoolObjPtr pool) +{ + 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; + } +} + +static void storagePoolUpdateState(virStoragePoolObjPtr pool) { bool active; @@ -143,6 +158,7 @@ storagePoolUpdateAllState(void) virStoragePoolObjPtr pool = driver->pools.objs[i]; virStoragePoolObjLock(pool); + storagePoolSetInactive(pool); storagePoolUpdateState(pool); virStoragePoolObjUnlock(pool); } @@ -198,6 +214,7 @@ storageDriverAutostart(void) unlink(stateFile); if (backend->stopPool) backend->stopPool(conn, pool); + storagePoolSetInactive(pool); virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to autostart storage pool '%s': %s"), pool->def->name, virGetLastErrorMessage()); @@ -737,7 +754,7 @@ storagePoolCreateXML(virConnectPtr conn, unlink(stateFile); if (backend->stopPool) backend->stopPool(conn, pool); - virStoragePoolObjRemove(&driver->pools, pool); + storagePoolSetInactive(pool); pool = NULL; goto cleanup; } @@ -1068,16 +1085,7 @@ storagePoolDestroy(virStoragePoolPtr obj) VIR_STORAGE_POOL_EVENT_STOPPED, 0); - 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; - } + storagePoolSetInactive(pool); ret = 0; @@ -1197,13 +1205,7 @@ storagePoolRefresh(virStoragePoolPtr obj, pool->def->uuid, VIR_STORAGE_POOL_EVENT_STOPPED, 0); - pool->active = false; - - if (pool->configFile == NULL) { - virStoragePoolObjRemove(&driver->pools, pool); - pool = NULL; - } - goto cleanup; + storagePoolSetInactive(pool); } event = virStoragePoolEventLifecycleNew(pool->def->name, -- 2.5.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list