Add private data pointer to virStoragePool and virStorageVol

This will simplify the refactoring of the ESX storage driver to support
a VMFS and an iSCSI backend.

One of the tasks the storage driver needs to do is to decide which backend
driver needs to be invoked for a given request. This approach extends
virStoragePool and virStorageVol to store extra parameters:

1. privateData: stores pointer to respective backend storage driver.
2. privateDataFreeFunc: stores cleanup function pointer.

virGetStoragePool and virGetStorageVol are modfied to accept these extra
parameters as user params. virStoragePoolDispose and virStorageVolDispose
checks for cleanup operation if available.

The private data pointer allows the ESX storage driver to store a pointer
to the used backend with each storage pool and volume. This avoids the need
to detect the correct backend in each storage driver function call.
This commit is contained in:
Ata E Husain Bohra 2012-11-09 23:18:07 -08:00 committed by Matthias Bolte
parent bb2704e7b5
commit 2b121dbc10
11 changed files with 130 additions and 56 deletions

View File

@ -4651,14 +4651,16 @@ get_nonnull_interface(virConnectPtr conn, remote_nonnull_interface iface)
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;
}

View File

@ -1981,7 +1981,8 @@ virStoragePoolList(virConnectPtr conn,
if (pools) {
if (!(pool = virGetStoragePool(conn,
poolobj->def->name,
poolobj->def->uuid))) {
poolobj->def->uuid,
NULL, NULL))) {
virStoragePoolObjUnlock(poolobj);
goto cleanup;
}

View File

@ -379,6 +379,8 @@ virInterfaceDispose(void *obj)
* @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,
@ -389,7 +391,8 @@ virInterfaceDispose(void *obj)
*/
virStoragePoolPtr
virGetStoragePool(virConnectPtr conn, const char *name,
const unsigned char *uuid)
const unsigned char *uuid,
void *privateData, virFreeCallback freeFunc)
{
virStoragePoolPtr ret = NULL;
@ -412,6 +415,10 @@ virGetStoragePool(virConnectPtr conn, const char *name,
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:
@ -442,6 +449,10 @@ virStoragePoolDispose(void *obj)
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);
}
@ -453,6 +464,8 @@ virStoragePoolDispose(void *obj)
* @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,
@ -463,7 +476,7 @@ virStoragePoolDispose(void *obj)
*/
virStorageVolPtr
virGetStorageVol(virConnectPtr conn, const char *pool, const char *name,
const char *key)
const char *key, void *privateData, virFreeCallback freeFunc)
{
virStorageVolPtr ret = NULL;
@ -489,6 +502,10 @@ virGetStorageVol(virConnectPtr conn, const char *pool, const char *name,
ret->conn = virObjectRef(conn);
/* set driver specific data */
ret->privateData = privateData;
ret->privateDataFreeFunc = freeFunc;
return ret;
no_memory:
@ -516,6 +533,10 @@ virStorageVolDispose(void *obj)
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);

View File

@ -196,6 +196,13 @@ struct _virStoragePool {
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;
};
/**
@ -209,6 +216,13 @@ struct _virStorageVol {
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;
};
/**
@ -293,12 +307,16 @@ virInterfacePtr virGetInterface(virConnectPtr conn,
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,

View File

@ -282,7 +282,7 @@ esxStoragePoolLookupByName(virConnectPtr conn, const char *name)
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);
@ -348,7 +348,7 @@ esxStoragePoolLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
goto cleanup;
}
pool = virGetStoragePool(conn, name, uuid);
pool = virGetStoragePool(conn, name, uuid, NULL, NULL);
cleanup:
esxVI_String_Free(&propertyNameList);
@ -766,7 +766,7 @@ esxStorageVolumeLookupByName(virStoragePoolPtr pool, const char *name)
goto cleanup;
}
volume = virGetStorageVol(pool->conn, pool->name, name, key);
volume = virGetStorageVol(pool->conn, pool->name, name, key, NULL, NULL);
cleanup:
VIR_FREE(datastorePath);
@ -800,7 +800,7 @@ esxStorageVolumeLookupByPath(virConnectPtr conn, const char *path)
goto cleanup;
}
volume = virGetStorageVol(conn, datastoreName, directoryAndFileName, key);
volume = virGetStorageVol(conn, datastoreName, directoryAndFileName, key, NULL, NULL);
cleanup:
VIR_FREE(datastoreName);
@ -934,7 +934,7 @@ esxStorageVolumeLookupByKey(virConnectPtr conn, const char *key)
if (STREQ(key, key_candidate)) {
/* Found matching UUID */
volume = virGetStorageVol(conn, datastoreName,
volumeName, key);
volumeName, key, NULL, NULL);
goto cleanup;
}
}
@ -1155,7 +1155,7 @@ esxStorageVolumeCreateXML(virStoragePoolPtr pool, const char *xmldesc,
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) {
@ -1357,7 +1357,7 @@ esxStorageVolumeCreateXMLFrom(virStoragePoolPtr pool, const char *xmldesc,
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);

View File

@ -350,7 +350,8 @@ parallelsStoragePoolLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
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)
@ -374,7 +375,8 @@ parallelsStoragePoolLookupByName(virConnectPtr conn, const char *name)
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)
@ -459,7 +461,8 @@ parallelsStoragePoolDefine(virConnectPtr conn,
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);
@ -831,7 +834,8 @@ parallelsStorageVolumeLookupByName(virStoragePoolPtr pool,
}
ret = virGetStorageVol(pool->conn, privpool->def->name,
privvol->name, privvol->key);
privvol->name, privvol->key,
NULL, NULL);
cleanup:
if (privpool)
@ -857,7 +861,8 @@ parallelsStorageVolumeLookupByKey(virConnectPtr conn, const char *key)
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;
}
@ -889,7 +894,8 @@ parallelsStorageVolumeLookupByPathLocked(virConnectPtr conn, const char *path)
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;
}
@ -1026,7 +1032,8 @@ parallelsStorageVolumeCreateXML(virStoragePoolPtr pool,
goto cleanup;
ret = virGetStorageVol(pool->conn, privpool->def->name,
privvol->name, privvol->key);
privvol->name, privvol->key,
NULL, NULL);
cleanup:
if (privpool)
virStoragePoolObjUnlock(privpool);
@ -1115,7 +1122,8 @@ parallelsStorageVolumeCreateXMLFrom(virStoragePoolPtr pool,
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:

View File

@ -2021,7 +2021,7 @@ phypVolumeLookupByName(virStoragePoolPtr pool, const char *volname)
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);
@ -2111,7 +2111,7 @@ phypStorageVolCreateXML(virStoragePoolPtr pool,
if ((vol =
virGetStorageVol(pool->conn, pool->name, voldef->name,
key)) == NULL)
key, NULL, NULL)) == NULL)
goto err;
VIR_FREE(key);
@ -2192,7 +2192,7 @@ phypVolumeLookupByPath(virConnectPtr conn, const char *volname)
if (key == NULL)
goto cleanup;
vol = virGetStorageVol(conn, ret, volname, key);
vol = virGetStorageVol(conn, ret, volname, key, NULL, NULL);
cleanup:
VIR_FREE(ret);
@ -2250,7 +2250,7 @@ phypStoragePoolLookupByName(virConnectPtr conn, const char *name)
if (phypGetStoragePoolUUID(conn, uuid, name) == -1)
return NULL;
return virGetStoragePool(conn, name, uuid);
return virGetStoragePool(conn, name, uuid, NULL, NULL);
}
static char *
@ -2684,7 +2684,7 @@ phypGetStoragePoolLookUpByUUID(virConnectPtr conn,
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);
@ -2728,7 +2728,7 @@ phypStoragePoolCreateXML(virConnectPtr conn,
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)

View File

@ -5863,13 +5863,15 @@ get_nonnull_interface(virConnectPtr conn, remote_nonnull_interface iface)
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

View File

@ -273,7 +273,8 @@ storagePoolLookupByUUID(virConnectPtr conn,
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)
@ -298,7 +299,8 @@ storagePoolLookupByName(virConnectPtr conn,
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)
@ -555,7 +557,8 @@ storagePoolCreate(virConnectPtr conn,
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);
@ -601,7 +604,8 @@ storagePoolDefine(virConnectPtr conn,
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);
@ -1202,7 +1206,8 @@ storagePoolListAllVolumes(virStoragePoolPtr pool,
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;
}
@ -1258,7 +1263,8 @@ storageVolumeLookupByName(virStoragePoolPtr obj,
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)
@ -1285,7 +1291,8 @@ storageVolumeLookupByKey(virConnectPtr conn,
ret = virGetStorageVol(conn,
driver->pools.objs[i]->def->name,
vol->name,
vol->key);
vol->key,
NULL, NULL);
}
virStoragePoolObjUnlock(driver->pools.objs[i]);
}
@ -1338,7 +1345,8 @@ storageVolumeLookupByPath(virConnectPtr conn,
ret = virGetStorageVol(conn,
driver->pools.objs[i]->def->name,
vol->name,
vol->key);
vol->key,
NULL, NULL);
}
virStoragePoolObjUnlock(driver->pools.objs[i]);
}
@ -1415,7 +1423,7 @@ storageVolumeCreateXML(virStoragePoolPtr obj,
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;
@ -1587,7 +1595,7 @@ storageVolumeCreateXMLFrom(virStoragePoolPtr obj,
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++;

View File

@ -3885,7 +3885,8 @@ testStoragePoolLookupByUUID(virConnectPtr conn,
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)
@ -3909,7 +3910,8 @@ testStoragePoolLookupByName(virConnectPtr conn,
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)
@ -4201,7 +4203,8 @@ testStoragePoolCreate(virConnectPtr conn,
}
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);
@ -4241,7 +4244,8 @@ testStoragePoolDefine(virConnectPtr conn,
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);
@ -4668,7 +4672,8 @@ testStoragePoolListAllVolumes(virStoragePoolPtr obj,
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;
}
@ -4725,7 +4730,8 @@ testStorageVolumeLookupByName(virStoragePoolPtr pool,
}
ret = virGetStorageVol(pool->conn, privpool->def->name,
privvol->name, privvol->key);
privvol->name, privvol->key,
NULL, NULL);
cleanup:
if (privpool)
@ -4752,7 +4758,8 @@ testStorageVolumeLookupByKey(virConnectPtr conn,
ret = virGetStorageVol(conn,
privconn->pools.objs[i]->def->name,
privvol->name,
privvol->key);
privvol->key,
NULL, NULL);
virStoragePoolObjUnlock(privconn->pools.objs[i]);
break;
}
@ -4786,7 +4793,8 @@ testStorageVolumeLookupByPath(virConnectPtr conn,
ret = virGetStorageVol(conn,
privconn->pools.objs[i]->def->name,
privvol->name,
privvol->key);
privvol->key,
NULL, NULL);
virStoragePoolObjUnlock(privconn->pools.objs[i]);
break;
}
@ -4875,7 +4883,8 @@ testStorageVolumeCreateXML(virStoragePoolPtr pool,
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:
@ -4969,7 +4978,8 @@ testStorageVolumeCreateXMLFrom(virStoragePoolPtr pool,
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:

View File

@ -8321,7 +8321,7 @@ static virStoragePoolPtr vboxStoragePoolLookupByName(virConnectPtr conn, const c
ignore_value(virUUIDParse(uuidstr, uuid));
ret = virGetStoragePool(conn, name, uuid);
ret = virGetStoragePool(conn, name, uuid, NULL, NULL);
}
return ret;
@ -8450,7 +8450,8 @@ static virStorageVolPtr vboxStorageVolLookupByName(virStoragePoolPtr pool, const
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);
@ -8511,7 +8512,8 @@ static virStorageVolPtr vboxStorageVolLookupByKey(virConnectPtr conn, const char
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
@ -8583,7 +8585,8 @@ static virStorageVolPtr vboxStorageVolLookupByPath(virConnectPtr conn, const cha
* 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);
@ -8683,7 +8686,8 @@ static virStorageVolPtr vboxStorageVolCreateXML(virStoragePoolPtr pool,
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);