static virStoragePoolPtr
get_nonnull_storage_pool(virConnectPtr conn, remote_nonnull_storage_pool pool)
{
- return virGetStoragePool(conn, pool.name, BAD_CAST pool.uuid);
+ return virGetStoragePool(conn, pool.name, BAD_CAST pool.uuid,
+ NULL, NULL);
}
static virStorageVolPtr
get_nonnull_storage_vol(virConnectPtr conn, remote_nonnull_storage_vol vol)
{
virStorageVolPtr ret;
- ret = virGetStorageVol(conn, vol.pool, vol.name, vol.key);
+ ret = virGetStorageVol(conn, vol.pool, vol.name, vol.key,
+ NULL, NULL);
return ret;
}
if (pools) {
if (!(pool = virGetStoragePool(conn,
poolobj->def->name,
- poolobj->def->uuid))) {
+ poolobj->def->uuid,
+ NULL, NULL))) {
virStoragePoolObjUnlock(poolobj);
goto cleanup;
}
* @conn: the hypervisor connection
* @name: pointer to the storage pool name
* @uuid: pointer to the uuid
+ * @privateData: pointer to driver specific private data
+ * @freeFunc: private data cleanup function pointer specfic to driver
*
* Lookup if the storage pool is already registered for that connection,
* if yes return a new pointer to it, if no allocate a new structure,
*/
virStoragePoolPtr
virGetStoragePool(virConnectPtr conn, const char *name,
- const unsigned char *uuid)
+ const unsigned char *uuid,
+ void *privateData, virFreeCallback freeFunc)
{
virStoragePoolPtr ret = NULL;
ret->conn = virObjectRef(conn);
memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
+ /* set the driver specific data */
+ ret->privateData = privateData;
+ ret->privateDataFreeFunc = freeFunc;
+
return ret;
no_memory:
virUUIDFormat(pool->uuid, uuidstr);
VIR_DEBUG("release pool %p %s %s", pool, pool->name, uuidstr);
+ if (pool->privateDataFreeFunc) {
+ pool->privateDataFreeFunc(pool->privateData);
+ }
+
VIR_FREE(pool->name);
virObjectUnref(pool->conn);
}
* @pool: pool owning the volume
* @name: pointer to the storage vol name
* @key: pointer to unique key of the volume
+ * @privateData: pointer to driver specific private data
+ * @freeFunc: private data cleanup function pointer specfic to driver
*
* Lookup if the storage vol is already registered for that connection,
* if yes return a new pointer to it, if no allocate a new structure,
*/
virStorageVolPtr
virGetStorageVol(virConnectPtr conn, const char *pool, const char *name,
- const char *key)
+ const char *key, void *privateData, virFreeCallback freeFunc)
{
virStorageVolPtr ret = NULL;
ret->conn = virObjectRef(conn);
+ /* set driver specific data */
+ ret->privateData = privateData;
+ ret->privateDataFreeFunc = freeFunc;
+
return ret;
no_memory:
virStorageVolPtr vol = obj;
VIR_DEBUG("release vol %p %s", vol, vol->name);
+ if (vol->privateDataFreeFunc) {
+ vol->privateDataFreeFunc(vol->privateData);
+ }
+
VIR_FREE(vol->key);
VIR_FREE(vol->name);
VIR_FREE(vol->pool);
virConnectPtr conn; /* pointer back to the connection */
char *name; /* the storage pool external name */
unsigned char uuid[VIR_UUID_BUFLEN]; /* the storage pool unique identifier */
+
+ /* Private data pointer which can be used by driver as they wish.
+ * Cleanup function pointer can be hooked to provide custom cleanup
+ * operation.
+ */
+ void *privateData;
+ virFreeCallback privateDataFreeFunc;
};
/**
char *pool; /* Pool name of owner */
char *name; /* the storage vol external name */
char *key; /* unique key for storage vol */
+
+ /* Private data pointer which can be used by driver as they wish.
+ * Cleanup function pointer can be hooked to provide custom cleanup
+ * operation.
+ */
+ void *privateData;
+ virFreeCallback privateDataFreeFunc;
};
/**
const char *name,
const char *mac);
virStoragePoolPtr virGetStoragePool(virConnectPtr conn,
- const char *name,
- const unsigned char *uuid);
+ const char *name,
+ const unsigned char *uuid,
+ void *privateData,
+ virFreeCallback freeFunc);
virStorageVolPtr virGetStorageVol(virConnectPtr conn,
const char *pool,
const char *name,
- const char *key);
+ const char *key,
+ void *privateData,
+ virFreeCallback freeFunc);
virNodeDevicePtr virGetNodeDevice(virConnectPtr conn,
const char *name);
virSecretPtr virGetSecret(virConnectPtr conn,
md5_buffer(hostMount->mountInfo->path,
strlen(hostMount->mountInfo->path), md5);
- pool = virGetStoragePool(conn, name, md5);
+ pool = virGetStoragePool(conn, name, md5, NULL, NULL);
cleanup:
esxVI_ObjectContent_Free(&datastore);
goto cleanup;
}
- pool = virGetStoragePool(conn, name, uuid);
+ pool = virGetStoragePool(conn, name, uuid, NULL, NULL);
cleanup:
esxVI_String_Free(&propertyNameList);
goto cleanup;
}
- volume = virGetStorageVol(pool->conn, pool->name, name, key);
+ volume = virGetStorageVol(pool->conn, pool->name, name, key, NULL, NULL);
cleanup:
VIR_FREE(datastorePath);
goto cleanup;
}
- volume = virGetStorageVol(conn, datastoreName, directoryAndFileName, key);
+ volume = virGetStorageVol(conn, datastoreName, directoryAndFileName, key, NULL, NULL);
cleanup:
VIR_FREE(datastoreName);
if (STREQ(key, key_candidate)) {
/* Found matching UUID */
volume = virGetStorageVol(conn, datastoreName,
- volumeName, key);
+ volumeName, key, NULL, NULL);
goto cleanup;
}
}
goto cleanup;
}
- volume = virGetStorageVol(pool->conn, pool->name, def->name, key);
+ volume = virGetStorageVol(pool->conn, pool->name, def->name, key, NULL, NULL);
cleanup:
if (virtualDiskSpec != NULL) {
goto cleanup;
}
- volume = virGetStorageVol(pool->conn, pool->name, def->name, key);
+ volume = virGetStorageVol(pool->conn, pool->name, def->name, key, NULL, NULL);
cleanup:
VIR_FREE(sourceDatastorePath);
goto cleanup;
}
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
if (pool)
goto cleanup;
}
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
if (pool)
goto cleanup;
}
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
virStoragePoolDefFree(def);
}
ret = virGetStorageVol(pool->conn, privpool->def->name,
- privvol->name, privvol->key);
+ privvol->name, privvol->key,
+ NULL, NULL);
cleanup:
if (privpool)
if (privvol) {
ret = virGetStorageVol(conn,
privconn->pools.objs[i]->def->name,
- privvol->name, privvol->key);
+ privvol->name, privvol->key,
+ NULL, NULL);
virStoragePoolObjUnlock(privconn->pools.objs[i]);
break;
}
if (privvol) {
ret = virGetStorageVol(conn,
privconn->pools.objs[i]->def->name,
- privvol->name, privvol->key);
+ privvol->name, privvol->key,
+ NULL, NULL);
virStoragePoolObjUnlock(privconn->pools.objs[i]);
break;
}
goto cleanup;
ret = virGetStorageVol(pool->conn, privpool->def->name,
- privvol->name, privvol->key);
+ privvol->name, privvol->key,
+ NULL, NULL);
cleanup:
if (privpool)
virStoragePoolObjUnlock(privpool);
privpool->volumes.objs[privpool->volumes.count++] = privvol;
ret = virGetStorageVol(pool->conn, privpool->def->name,
- privvol->name, privvol->key);
+ privvol->name, privvol->key,
+ NULL, NULL);
privvol = NULL;
cleanup:
if (key == NULL)
return NULL;
- vol = virGetStorageVol(pool->conn, pool->name, volname, key);
+ vol = virGetStorageVol(pool->conn, pool->name, volname, key, NULL, NULL);
VIR_FREE(key);
if ((vol =
virGetStorageVol(pool->conn, pool->name, voldef->name,
- key)) == NULL)
+ key, NULL, NULL)) == NULL)
goto err;
VIR_FREE(key);
if (key == NULL)
goto cleanup;
- vol = virGetStorageVol(conn, ret, volname, key);
+ vol = virGetStorageVol(conn, ret, volname, key, NULL, NULL);
cleanup:
VIR_FREE(ret);
if (phypGetStoragePoolUUID(conn, uuid, name) == -1)
return NULL;
- return virGetStoragePool(conn, name, uuid);
+ return virGetStoragePool(conn, name, uuid, NULL, NULL);
}
static char *
continue;
if (!memcmp(local_uuid, uuid, VIR_UUID_BUFLEN)) {
- sp = virGetStoragePool(conn, pools[i], uuid);
+ sp = virGetStoragePool(conn, pools[i], uuid, NULL, NULL);
VIR_FREE(local_uuid);
VIR_FREE(pools);
goto err;
}
- if ((sp = virGetStoragePool(conn, def->name, def->uuid)) == NULL)
+ if ((sp = virGetStoragePool(conn, def->name, def->uuid, NULL, NULL)) == NULL)
goto err;
if (phypBuildStoragePool(conn, def) == -1)
static virStoragePoolPtr
get_nonnull_storage_pool(virConnectPtr conn, remote_nonnull_storage_pool pool)
{
- return virGetStoragePool(conn, pool.name, BAD_CAST pool.uuid);
+ return virGetStoragePool(conn, pool.name, BAD_CAST pool.uuid,
+ NULL, NULL);
}
static virStorageVolPtr
get_nonnull_storage_vol(virConnectPtr conn, remote_nonnull_storage_vol vol)
{
- return virGetStorageVol(conn, vol.pool, vol.name, vol.key);
+ return virGetStorageVol(conn, vol.pool, vol.name, vol.key,
+ NULL, NULL);
}
static virNodeDevicePtr
goto cleanup;
}
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
if (pool)
goto cleanup;
}
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
if (pool)
VIR_INFO("Creating storage pool '%s'", pool->def->name);
pool->active = 1;
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
virStoragePoolDefFree(def);
def = NULL;
VIR_INFO("Defining storage pool '%s'", pool->def->name);
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
virStoragePoolDefFree(def);
for (i = 0 ; i < obj->volumes.count; i++) {
if (!(vol = virGetStorageVol(pool->conn, obj->def->name,
obj->volumes.objs[i]->name,
- obj->volumes.objs[i]->key)))
+ obj->volumes.objs[i]->key,
+ NULL, NULL)))
goto cleanup;
tmp_vols[nvols++] = vol;
}
goto cleanup;
}
- ret = virGetStorageVol(obj->conn, pool->def->name, vol->name, vol->key);
+ ret = virGetStorageVol(obj->conn, pool->def->name, vol->name, vol->key,
+ NULL, NULL);
cleanup:
if (pool)
ret = virGetStorageVol(conn,
driver->pools.objs[i]->def->name,
vol->name,
- vol->key);
+ vol->key,
+ NULL, NULL);
}
virStoragePoolObjUnlock(driver->pools.objs[i]);
}
ret = virGetStorageVol(conn,
driver->pools.objs[i]->def->name,
vol->name,
- vol->key);
+ vol->key,
+ NULL, NULL);
}
virStoragePoolObjUnlock(driver->pools.objs[i]);
}
pool->volumes.objs[pool->volumes.count++] = voldef;
volobj = virGetStorageVol(obj->conn, pool->def->name, voldef->name,
- voldef->key);
+ voldef->key, NULL, NULL);
if (!volobj) {
pool->volumes.count--;
goto cleanup;
pool->volumes.objs[pool->volumes.count++] = newvol;
volobj = virGetStorageVol(obj->conn, pool->def->name, newvol->name,
- newvol->key);
+ newvol->key, NULL, NULL);
/* Drop the pool lock during volume allocation */
pool->asyncjobs++;
goto cleanup;
}
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
if (pool)
goto cleanup;
}
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
if (pool)
}
pool->active = 1;
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
virStoragePoolDefFree(def);
goto cleanup;
}
- ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+ ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
cleanup:
virStoragePoolDefFree(def);
for (i = 0 ; i < pool->volumes.count; i++) {
if (!(vol = virGetStorageVol(obj->conn, pool->def->name,
pool->volumes.objs[i]->name,
- pool->volumes.objs[i]->key)))
+ pool->volumes.objs[i]->key,
+ NULL, NULL)))
goto cleanup;
tmp_vols[nvols++] = vol;
}
}
ret = virGetStorageVol(pool->conn, privpool->def->name,
- privvol->name, privvol->key);
+ privvol->name, privvol->key,
+ NULL, NULL);
cleanup:
if (privpool)
ret = virGetStorageVol(conn,
privconn->pools.objs[i]->def->name,
privvol->name,
- privvol->key);
+ privvol->key,
+ NULL, NULL);
virStoragePoolObjUnlock(privconn->pools.objs[i]);
break;
}
ret = virGetStorageVol(conn,
privconn->pools.objs[i]->def->name,
privvol->name,
- privvol->key);
+ privvol->key,
+ NULL, NULL);
virStoragePoolObjUnlock(privconn->pools.objs[i]);
break;
}
privpool->volumes.objs[privpool->volumes.count++] = privvol;
ret = virGetStorageVol(pool->conn, privpool->def->name,
- privvol->name, privvol->key);
+ privvol->name, privvol->key,
+ NULL, NULL);
privvol = NULL;
cleanup:
privpool->volumes.objs[privpool->volumes.count++] = privvol;
ret = virGetStorageVol(pool->conn, privpool->def->name,
- privvol->name, privvol->key);
+ privvol->name, privvol->key,
+ NULL, NULL);
privvol = NULL;
cleanup:
ignore_value(virUUIDParse(uuidstr, uuid));
- ret = virGetStoragePool(conn, name, uuid);
+ ret = virGetStoragePool(conn, name, uuid, NULL, NULL);
}
return ret;
vboxIIDToUUID(&hddIID, uuid);
virUUIDFormat(uuid, key);
- ret = virGetStorageVol(pool->conn, pool->name, name, key);
+ ret = virGetStorageVol(pool->conn, pool->name, name, key,
+ NULL, NULL);
VIR_DEBUG("virStorageVolPtr: %p", ret);
VIR_DEBUG("Storage Volume Name: %s", name);
if (hddNameUtf8) {
if (vboxStorageNumOfPools(conn) == 1) {
- ret = virGetStorageVol(conn, "default-pool", hddNameUtf8, key);
+ ret = virGetStorageVol(conn, "default-pool", hddNameUtf8, key,
+ NULL, NULL);
VIR_DEBUG("Storage Volume Pool: %s", "default-pool");
} else {
/* TODO: currently only one default pool and thus
* the check below, change it when pools are supported
*/
if (vboxStorageNumOfPools(conn) == 1)
- ret = virGetStorageVol(conn, "default-pool", hddNameUtf8, key);
+ ret = virGetStorageVol(conn, "default-pool", hddNameUtf8, key,
+ NULL, NULL);
VIR_DEBUG("Storage Volume Pool: %s", "default-pool");
VIR_DEBUG("Storage Volume Name: %s", hddNameUtf8);
vboxIIDToUUID(&hddIID, uuid);
virUUIDFormat(uuid, key);
- ret = virGetStorageVol(pool->conn, pool->name, def->name, key);
+ ret = virGetStorageVol(pool->conn, pool->name, def->name, key,
+ NULL, NULL);
}
vboxIIDUnalloc(&hddIID);