static void
virStoragePoolObjAssignDef(virStoragePoolObj *obj,
- virStoragePoolDef *def,
+ virStoragePoolDef **def,
unsigned int flags)
{
if (virStoragePoolObjIsActive(obj) ||
virStoragePoolObjIsStarting(obj)) {
virStoragePoolDefFree(obj->newDef);
- obj->newDef = def;
+ obj->newDef = g_steal_pointer(def);
} else {
if (!obj->newDef &&
flags & VIR_STORAGE_POOL_OBJ_LIST_ADD_LIVE)
obj->newDef = g_steal_pointer(&obj->def);
virStoragePoolDefFree(obj->def);
- obj->def = def;
+ obj->def = g_steal_pointer(def);
}
}
* If VIR_STORAGE_POOL_OBJ_LIST_ADD_CHECK_LIVE is set in @flags
* then this will fail if the pool exists and is active.
*
+ * Upon successful return the virStoragePool object is the owner
+ * of @def and callers should use virStoragePoolObjGetDef() or
+ * virStoragePoolObjGetNewDef() if they need to access the
+ * definition as @def is set to NULL.
+ *
* Returns locked and reffed object pointer or NULL on error
*/
virStoragePoolObj *
virStoragePoolObjListAdd(virStoragePoolObjList *pools,
- virStoragePoolDef *def,
+ virStoragePoolDef **def,
unsigned int flags)
{
virStoragePoolObj *obj = NULL;
virObjectRWLockWrite(pools);
- if (virStoragePoolObjSourceFindDuplicate(pools, def) < 0)
+ if (virStoragePoolObjSourceFindDuplicate(pools, *def) < 0)
goto error;
- rc = virStoragePoolObjIsDuplicate(pools, def,
+ rc = virStoragePoolObjIsDuplicate(pools, *def,
!!(flags & VIR_STORAGE_POOL_OBJ_LIST_ADD_CHECK_LIVE),
&obj);
if (!(obj = virStoragePoolObjNew()))
goto error;
- virUUIDFormat(def->uuid, uuidstr);
+ virUUIDFormat((*def)->uuid, uuidstr);
if (virHashAddEntry(pools->objs, uuidstr, obj) < 0)
goto error;
virObjectRef(obj);
- if (virHashAddEntry(pools->objsName, def->name, obj) < 0) {
+ if (virHashAddEntry(pools->objsName, (*def)->name, obj) < 0) {
virHashRemoveEntry(pools->objs, uuidstr);
goto error;
}
virObjectRef(obj);
- obj->def = def;
+ obj->def = g_steal_pointer(def);
virObjectRWUnlock(pools);
return obj;
return NULL;
}
- if (!(obj = virStoragePoolObjListAdd(pools, def, 0)))
+ if (!(obj = virStoragePoolObjListAdd(pools, &def, 0)))
return NULL;
- def = NULL;
VIR_FREE(obj->configFile); /* for driver reload */
obj->configFile = g_strdup(path);
}
/* create the object */
- if (!(obj = virStoragePoolObjListAdd(pools, def,
+ if (!(obj = virStoragePoolObjListAdd(pools, &def,
VIR_STORAGE_POOL_OBJ_LIST_ADD_CHECK_LIVE)))
return NULL;
- def = NULL;
/* XXX: future handling of some additional useful status data,
* for now, if a status file for a pool exists, the pool will be marked
if ((backend = virStorageBackendForType(newDef->type)) == NULL)
goto cleanup;
- if (!(obj = virStoragePoolObjListAdd(driver->pools, newDef,
+ if (!(obj = virStoragePoolObjListAdd(driver->pools, &newDef,
VIR_STORAGE_POOL_OBJ_LIST_ADD_LIVE |
VIR_STORAGE_POOL_OBJ_LIST_ADD_CHECK_LIVE)))
goto cleanup;
- newDef = NULL;
def = virStoragePoolObjGetDef(obj);
virStoragePoolObjSetStarting(obj, true);
if (virStorageBackendForType(newDef->type) == NULL)
goto cleanup;
- if (!(obj = virStoragePoolObjListAdd(driver->pools, newDef, 0)))
+ if (!(obj = virStoragePoolObjListAdd(driver->pools, &newDef, 0)))
goto cleanup;
newDef = virStoragePoolObjGetNewDef(obj);
def = virStoragePoolObjGetDef(obj);
if (!def)
return -1;
- if (!(obj = virStoragePoolObjListAdd(privconn->pools, def, 0))) {
+ if (!(obj = virStoragePoolObjListAdd(privconn->pools, &def, 0))) {
virStoragePoolDefFree(def);
return -1;
}
if (!(newDef = virStoragePoolDefParseString(xml, 0)))
goto cleanup;
- if (!(obj = virStoragePoolObjListAdd(privconn->pools, newDef,
+ if (!(obj = virStoragePoolObjListAdd(privconn->pools, &newDef,
VIR_STORAGE_POOL_OBJ_LIST_ADD_CHECK_LIVE)))
goto cleanup;
- newDef = NULL;
def = virStoragePoolObjGetDef(obj);
if (def->source.adapter.type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST) {
newDef->allocation = defaultPoolAlloc;
newDef->available = defaultPoolCap - defaultPoolAlloc;
- if (!(obj = virStoragePoolObjListAdd(privconn->pools, newDef, 0)))
+ if (!(obj = virStoragePoolObjListAdd(privconn->pools, &newDef, 0)))
goto cleanup;
- newDef = NULL;
def = virStoragePoolObjGetDef(obj);
event = virStoragePoolEventLifecycleNew(def->name, def->uuid,