void
virStorageVolDefFree(virStorageVolDefPtr def) {
int i;
+
+ if (!def)
+ return;
+
VIR_FREE(def->name);
VIR_FREE(def->key);
virStoragePoolDefFree(virStoragePoolDefPtr def) {
int i;
+ if (!def)
+ return;
+
VIR_FREE(def->name);
VIR_FREE(def->source.host.name);
for (i = 0 ; i < def->source.ndevice ; i++) {
void
virStoragePoolObjFree(virStoragePoolObjPtr obj) {
- if (obj->def)
- virStoragePoolDefFree(obj->def);
- if (obj->newDef)
- virStoragePoolDefFree(obj->newDef);
+ if (!obj)
+ return;
+
+ virStoragePoolDefFree(obj->def);
+ virStoragePoolDefFree(obj->newDef);
VIR_FREE(obj->configFile);
VIR_FREE(obj->autostartLink);
VIR_FREE(obj);
}
+void virStoragePoolObjListFree(virStoragePoolObjListPtr pools)
+{
+ unsigned int i;
+ for (i = 0 ; i < pools->count ; i++)
+ virStoragePoolObjFree(pools->objs[i]);
+ VIR_FREE(pools->objs);
+ pools->count = 0;
+}
+
void
-virStoragePoolObjRemove(virStorageDriverStatePtr driver,
+virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
virStoragePoolObjPtr pool)
{
- virStoragePoolObjPtr prev = NULL, curr;
+ unsigned int i;
- curr = driver->pools;
- while (curr != pool) {
- prev = curr;
- curr = curr->next;
- }
+ for (i = 0 ; i < pools->count ; i++) {
+ if (pools->objs[i] == pool) {
+ virStoragePoolObjFree(pools->objs[i]);
- if (curr) {
- if (prev)
- prev->next = curr->next;
- else
- driver->pools = curr->next;
+ if (i < (pools->count - 1))
+ memmove(pools->objs + i, pools->objs + i + 1,
+ sizeof(*(pools->objs)) * (pools->count - (i + 1)));
- driver->ninactivePools--;
- }
+ if (VIR_REALLOC_N(pools->objs, pools->count - 1) < 0) {
+ ; /* Failure to reduce memory allocation isn't fatal */
+ }
+ pools->count--;
- virStoragePoolObjFree(pool);
+ break;
+ }
+ }
}
virStoragePoolObjPtr
-virStoragePoolObjFindByUUID(virStorageDriverStatePtr driver,
+virStoragePoolObjFindByUUID(virStoragePoolObjListPtr pools,
const unsigned char *uuid) {
- virStoragePoolObjPtr pool = driver->pools;
+ unsigned int i;
- while (pool) {
- if (!memcmp(pool->def->uuid, uuid, VIR_UUID_BUFLEN))
- return pool;
- pool = pool->next;
- }
+ for (i = 0 ; i < pools->count ; i++)
+ if (!memcmp(pools->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN))
+ return pools->objs[i];
return NULL;
}
virStoragePoolObjPtr
-virStoragePoolObjFindByName(virStorageDriverStatePtr driver,
+virStoragePoolObjFindByName(virStoragePoolObjListPtr pools,
const char *name) {
- virStoragePoolObjPtr pool = driver->pools;
+ unsigned int i;
- while (pool) {
- if (STREQ(pool->def->name, name))
- return pool;
- pool = pool->next;
- }
+ for (i = 0 ; i < pools->count ; i++)
+ if (STREQ(pools->objs[i]->def->name, name))
+ return pools->objs[i];
return NULL;
}
void
virStoragePoolObjClearVols(virStoragePoolObjPtr pool)
{
- virStorageVolDefPtr vol = pool->volumes;
- while (vol) {
- virStorageVolDefPtr next = vol->next;
- virStorageVolDefFree(vol);
- vol = next;
- }
- pool->volumes = NULL;
- pool->nvolumes = 0;
+ unsigned int i;
+ for (i = 0 ; i < pool->volumes.count ; i++)
+ virStorageVolDefFree(pool->volumes.objs[i]);
+
+ VIR_FREE(pool->volumes.objs);
+ pool->volumes.count = 0;
}
virStorageVolDefPtr
virStorageVolDefFindByKey(virStoragePoolObjPtr pool,
const char *key) {
- virStorageVolDefPtr vol = pool->volumes;
+ unsigned int i;
- while (vol) {
- if (STREQ(vol->key, key))
- return vol;
- vol = vol->next;
- }
+ for (i = 0 ; i < pool->volumes.count ; i++)
+ if (STREQ(pool->volumes.objs[i]->key, key))
+ return pool->volumes.objs[i];
return NULL;
}
virStorageVolDefPtr
virStorageVolDefFindByPath(virStoragePoolObjPtr pool,
const char *path) {
- virStorageVolDefPtr vol = pool->volumes;
+ unsigned int i;
- while (vol) {
- if (STREQ(vol->target.path, path))
- return vol;
- vol = vol->next;
- }
+ for (i = 0 ; i < pool->volumes.count ; i++)
+ if (STREQ(pool->volumes.objs[i]->target.path, path))
+ return pool->volumes.objs[i];
return NULL;
}
virStorageVolDefPtr
virStorageVolDefFindByName(virStoragePoolObjPtr pool,
const char *name) {
- virStorageVolDefPtr vol = pool->volumes;
+ unsigned int i;
- while (vol) {
- if (STREQ(vol->name, name))
- return vol;
- vol = vol->next;
- }
+ for (i = 0 ; i < pool->volumes.count ; i++)
+ if (STREQ(pool->volumes.objs[i]->name, name))
+ return pool->volumes.objs[i];
return NULL;
}
virStoragePoolObjPtr
virStoragePoolObjAssignDef(virConnectPtr conn,
- virStorageDriverStatePtr driver,
+ virStoragePoolObjListPtr pools,
virStoragePoolDefPtr def) {
virStoragePoolObjPtr pool;
- if ((pool = virStoragePoolObjFindByName(driver, def->name))) {
+ if ((pool = virStoragePoolObjFindByName(pools, def->name))) {
if (!virStoragePoolObjIsActive(pool)) {
virStoragePoolDefFree(pool->def);
pool->def = def;
pool->active = 0;
pool->def = def;
- pool->next = driver->pools;
- driver->pools = pool;
- driver->ninactivePools++;
+ if (VIR_REALLOC_N(pools->objs, pools->count+1) < 0) {
+ pool->def = NULL;
+ virStoragePoolObjFree(pool);
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, NULL);
+ return NULL;
+ }
+ pools->objs[pools->count++] = pool;
return pool;
}
static virStoragePoolObjPtr
-virStoragePoolObjLoad(virStorageDriverStatePtr driver,
+virStoragePoolObjLoad(virConnectPtr conn,
+ virStoragePoolObjListPtr pools,
const char *file,
const char *path,
const char *xml,
return NULL;
}
- if (!(pool = virStoragePoolObjAssignDef(NULL, driver, def))) {
+ if (!(pool = virStoragePoolObjAssignDef(conn, pools, def))) {
virStorageLog("Failed to load storage pool config '%s': out of memory", path);
virStoragePoolDefFree(def);
return NULL;
int
-virStoragePoolObjScanConfigs(virStorageDriverStatePtr driver) {
+virStoragePoolLoadAllConfigs(virConnectPtr conn,
+ virStoragePoolObjListPtr pools,
+ const char *configDir,
+ const char *autostartDir) {
DIR *dir;
struct dirent *entry;
- if (!(dir = opendir(driver->configDir))) {
+ if (!(dir = opendir(configDir))) {
if (errno == ENOENT)
return 0;
virStorageLog("Failed to open dir '%s': %s",
- driver->configDir, strerror(errno));
+ configDir, strerror(errno));
return -1;
}
if (!virFileHasSuffix(entry->d_name, ".xml"))
continue;
- if (virFileBuildPath(driver->configDir, entry->d_name,
+ if (virFileBuildPath(configDir, entry->d_name,
NULL, path, PATH_MAX) < 0) {
virStorageLog("Config filename '%s/%s' is too long",
- driver->configDir, entry->d_name);
+ configDir, entry->d_name);
continue;
}
- if (virFileBuildPath(driver->autostartDir, entry->d_name,
+ if (virFileBuildPath(autostartDir, entry->d_name,
NULL, autostartLink, PATH_MAX) < 0) {
virStorageLog("Autostart link path '%s/%s' is too long",
- driver->autostartDir, entry->d_name);
+ autostartDir, entry->d_name);
continue;
}
if (virFileReadAll(path, 8192, &xml) < 0)
continue;
- virStoragePoolObjLoad(driver, entry->d_name, path, xml, autostartLink);
+ virStoragePoolObjLoad(conn, pools, entry->d_name, path, xml, autostartLink);
VIR_FREE(xml);
}
static void
storageDriverAutostart(virStorageDriverStatePtr driver) {
- virStoragePoolObjPtr pool;
+ unsigned int i;
- pool = driver->pools;
- while (pool != NULL) {
- virStoragePoolObjPtr next = pool->next;
+ for (i = 0 ; i < driver->pools.count ; i++) {
+ virStoragePoolObjPtr pool = driver->pools.objs[i];
if (pool->autostart &&
!virStoragePoolObjIsActive(pool)) {
if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
storageLog("Missing backend %d",
pool->def->type);
- pool = next;
continue;
}
virErrorPtr err = virGetLastError();
storageLog("Failed to autostart storage pool '%s': %s",
pool->def->name, err ? err->message : NULL);
- pool = next;
continue;
}
backend->stopPool(NULL, pool);
storageLog("Failed to autostart storage pool '%s': %s",
pool->def->name, err ? err->message : NULL);
- pool = next;
continue;
}
pool->active = 1;
- driver->nactivePools++;
- driver->ninactivePools--;
}
-
- pool = next;
}
}
}
*/
- if (virStoragePoolObjScanConfigs(driverState) < 0) {
+ if (virStoragePoolLoadAllConfigs(NULL,
+ &driverState->pools,
+ driverState->configDir,
+ driverState->autostartDir) < 0) {
storageDriverShutdown();
return -1;
}
*/
static int
storageDriverReload(void) {
- virStoragePoolObjScanConfigs(driverState);
+ if (!driverState)
+ return -1;
+
+ virStoragePoolLoadAllConfigs(NULL,
+ &driverState->pools,
+ driverState->configDir,
+ driverState->autostartDir);
storageDriverAutostart(driverState);
return 0;
*/
static int
storageDriverActive(void) {
+ unsigned int i;
+
+ if (!driverState)
+ return 0;
+
/* If we've any active networks or guests, then we
* mark this driver as active
*/
- if (driverState->nactivePools)
- return 1;
+ for (i = 0 ; i < driverState->pools.count ; i++)
+ if (virStoragePoolObjIsActive(driverState->pools.objs[i]))
+ return 1;
/* Otherwise we're happy to deal with a shutdown */
return 0;
*/
static int
storageDriverShutdown(void) {
- virStoragePoolObjPtr pool;
+ unsigned int i;
if (!driverState)
return -1;
/* shutdown active pools */
- pool = driverState->pools;
- while (pool) {
- virStoragePoolObjPtr next = pool->next;
+ for (i = 0 ; i < driverState->pools.count ; i++) {
+ virStoragePoolObjPtr pool = driverState->pools.objs[i];
+
if (virStoragePoolObjIsActive(pool)) {
virStorageBackendPtr backend;
if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
}
virStoragePoolObjClearVols(pool);
}
- pool = next;
}
/* free inactive pools */
- pool = driverState->pools;
- while (pool) {
- virStoragePoolObjPtr next = pool->next;
- virStoragePoolObjFree(pool);
- pool = next;
- }
- driverState->pools = NULL;
- driverState->nactivePools = 0;
- driverState->ninactivePools = 0;
-
- free(driverState->configDir);
- free(driverState->autostartDir);
- free(driverState);
- driverState = NULL;
+ virStoragePoolObjListFree(&driverState->pools);
+
+ VIR_FREE(driverState->configDir);
+ VIR_FREE(driverState->autostartDir);
+ VIR_FREE(driverState);
return 0;
}
const unsigned char *uuid) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, uuid);
virStoragePoolPtr ret;
if (!pool) {
const char *name) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByName(driver, name);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByName(&driver->pools, name);
virStoragePoolPtr ret;
if (!pool) {
storageNumPools(virConnectPtr conn) {
virStorageDriverStatePtr driver
= (virStorageDriverStatePtr)conn->storagePrivateData;
- return driver->nactivePools;
+ unsigned int i, nactive = 0;
+
+ for (i = 0 ; i < driver->pools.count ; i++)
+ if (virStoragePoolObjIsActive(driver->pools.objs[i]))
+ nactive++;
+
+ return nactive;
}
static int
int nnames) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)conn->storagePrivateData;
- virStoragePoolObjPtr pool = driver->pools;
int got = 0, i;
- while (pool && got < nnames) {
- if (virStoragePoolObjIsActive(pool)) {
- if (!(names[got] = strdup(pool->def->name))) {
+
+ for (i = 0 ; i < driver->pools.count && got < nnames ; i++) {
+ if (virStoragePoolObjIsActive(driver->pools.objs[i])) {
+ if (!(names[got] = strdup(driver->pools.objs[i]->def->name))) {
virStorageReportError(conn, VIR_ERR_NO_MEMORY,
"%s", _("names"));
goto cleanup;
}
got++;
}
- pool = pool->next;
}
return got;
storageNumDefinedPools(virConnectPtr conn) {
virStorageDriverStatePtr driver
= (virStorageDriverStatePtr)conn->storagePrivateData;
- return driver->ninactivePools;
+ unsigned int i, nactive = 0;
+
+ for (i = 0 ; i < driver->pools.count ; i++)
+ if (!virStoragePoolObjIsActive(driver->pools.objs[i]))
+ nactive++;
+
+ return nactive;
}
static int
int nnames) {
virStorageDriverStatePtr driver
= (virStorageDriverStatePtr)conn->storagePrivateData;
- virStoragePoolObjPtr pool = driver->pools;
int got = 0, i;
- while (pool && got < nnames) {
- if (!virStoragePoolObjIsActive(pool)) {
- if (!(names[got] = strdup(pool->def->name))) {
+
+ for (i = 0 ; i < driver->pools.count && got < nnames ; i++) {
+ if (!virStoragePoolObjIsActive(driver->pools.objs[i])) {
+ if (!(names[got] = strdup(driver->pools.objs[i]->def->name))) {
virStorageReportError(conn, VIR_ERR_NO_MEMORY,
"%s", _("names"));
goto cleanup;
}
got++;
}
- pool = pool->next;
}
return got;
if (!(def = virStoragePoolDefParse(conn, xml, NULL)))
return NULL;
- if (virStoragePoolObjFindByUUID(driver, def->uuid) ||
- virStoragePoolObjFindByName(driver, def->name)) {
+ if (virStoragePoolObjFindByUUID(&driver->pools, def->uuid) ||
+ virStoragePoolObjFindByName(&driver->pools, def->name)) {
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
"%s", _("storage pool already exists"));
virStoragePoolDefFree(def);
return NULL;
}
- if (!(pool = virStoragePoolObjAssignDef(conn, driver, def))) {
+ if (!(pool = virStoragePoolObjAssignDef(conn, &driver->pools, def))) {
virStoragePoolDefFree(def);
return NULL;
}
return NULL;
}
pool->active = 1;
- driver->nactivePools++;
- driver->ninactivePools--;
ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
return NULL;
}
- if (!(pool = virStoragePoolObjAssignDef(conn, driver, def))) {
+ if (!(pool = virStoragePoolObjAssignDef(conn, &driver->pools, def))) {
virStoragePoolDefFree(def);
return NULL;
}
if (virStoragePoolObjSaveDef(conn, driver, pool, def) < 0) {
- virStoragePoolObjRemove(driver, pool);
+ virStoragePoolObjRemove(&driver->pools, pool);
return NULL;
}
storagePoolUndefine(virStoragePoolPtr obj) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
if (!pool) {
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
storageLog("Failed to delete autostart link '%s': %s",
pool->autostartLink, strerror(errno));
- free(pool->configFile);
- pool->configFile = NULL;
- free(pool->autostartLink);
- pool->autostartLink = NULL;
+ VIR_FREE(pool->configFile);
+ VIR_FREE(pool->autostartLink);
- virStoragePoolObjRemove(driver, pool);
+ virStoragePoolObjRemove(&driver->pools, pool);
return 0;
}
unsigned int flags ATTRIBUTE_UNUSED) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
virStorageBackendPtr backend;
if (!pool) {
}
pool->active = 1;
- driver->nactivePools++;
- driver->ninactivePools--;
return 0;
}
unsigned int flags) {
virStorageDriverStatePtr driver
= (virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
virStorageBackendPtr backend;
if (!pool) {
storagePoolDestroy(virStoragePoolPtr obj) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
virStorageBackendPtr backend;
if (!pool) {
virStoragePoolObjClearVols(pool);
pool->active = 0;
- driver->nactivePools--;
- driver->ninactivePools++;
if (pool->configFile == NULL)
- virStoragePoolObjRemove(driver, pool);
+ virStoragePoolObjRemove(&driver->pools, pool);
return 0;
}
unsigned int flags) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
virStorageBackendPtr backend;
if (!pool) {
unsigned int flags ATTRIBUTE_UNUSED) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
virStorageBackendPtr backend;
int ret = 0;
backend->stopPool(obj->conn, pool);
pool->active = 0;
- driver->nactivePools--;
- driver->ninactivePools++;
if (pool->configFile == NULL)
- virStoragePoolObjRemove(driver, pool);
+ virStoragePoolObjRemove(&driver->pools, pool);
}
return ret;
virStoragePoolInfoPtr info) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
virStorageBackendPtr backend;
if (!pool) {
unsigned int flags ATTRIBUTE_UNUSED) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
if (!pool) {
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
int *autostart) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
if (!pool) {
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
int autostart) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
if (!pool) {
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
storagePoolNumVolumes(virStoragePoolPtr obj) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
if (!pool) {
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
return -1;
}
- return pool->nvolumes;
+ return pool->volumes.count;
}
static int
int maxnames) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
- int i = 0;
- virStorageVolDefPtr vol;
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
+ int i, n = 0;
if (!pool) {
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
}
memset(names, 0, maxnames);
- vol = pool->volumes;
- while (vol && i < maxnames) {
- names[i] = strdup(vol->name);
- if (names[i] == NULL) {
+ for (i = 0 ; i < pool->volumes.count && n < maxnames ; i++) {
+ if ((names[n++] = strdup(pool->volumes.objs[i]->name)) == NULL) {
virStorageReportError(obj->conn, VIR_ERR_NO_MEMORY,
"%s", _("name"));
goto cleanup;
}
- vol = vol->next;
- i++;
}
- return i;
+ return n;
cleanup:
- for (i = 0 ; i < maxnames ; i++) {
- free(names[i]);
- names[i] = NULL;
- }
+ for (n = 0 ; n < maxnames ; n++)
+ VIR_FREE(names[i]);
+
memset(names, 0, maxnames);
return -1;
}
const char *name) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
virStorageVolDefPtr vol;
if (!pool) {
const char *key) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)conn->storagePrivateData;
- virStoragePoolObjPtr pool = driver->pools;
+ unsigned int i;
- while (pool) {
- if (virStoragePoolObjIsActive(pool)) {
- virStorageVolDefPtr vol = virStorageVolDefFindByKey(pool, key);
+ for (i = 0 ; i < driver->pools.count ; i++) {
+ if (virStoragePoolObjIsActive(driver->pools.objs[i])) {
+ virStorageVolDefPtr vol =
+ virStorageVolDefFindByKey(driver->pools.objs[i], key);
if (vol)
return virGetStorageVol(conn,
- pool->def->name,
+ driver->pools.objs[i]->def->name,
vol->name,
vol->key);
}
- pool = pool->next;
}
virStorageReportError(conn, VIR_ERR_INVALID_STORAGE_VOL,
const char *path) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)conn->storagePrivateData;
- virStoragePoolObjPtr pool = driver->pools;
+ unsigned int i;
- while (pool) {
- if (virStoragePoolObjIsActive(pool)) {
- virStorageVolDefPtr vol = virStorageVolDefFindByPath(pool, path);
+ for (i = 0 ; i < driver->pools.count ; i++) {
+ if (virStoragePoolObjIsActive(driver->pools.objs[i])) {
+ virStorageVolDefPtr vol =
+ virStorageVolDefFindByPath(driver->pools.objs[i], path);
if (vol)
return virGetStorageVol(conn,
- pool->def->name,
+ driver->pools.objs[i]->def->name,
vol->name,
vol->key);
}
- pool = pool->next;
}
virStorageReportError(conn, VIR_ERR_INVALID_STORAGE_VOL,
unsigned int flags ATTRIBUTE_UNUSED) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, obj->uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
virStorageBackendPtr backend;
virStorageVolDefPtr vol;
return NULL;
}
+ if (VIR_REALLOC_N(pool->volumes.objs,
+ pool->volumes.count+1) < 0) {
+ virStorageReportError(obj->conn, VIR_ERR_NO_MEMORY, NULL);
+ virStorageVolDefFree(vol);
+ return NULL;
+ }
+
if (!backend->createVol) {
virStorageReportError(obj->conn, VIR_ERR_NO_SUPPORT,
"%s", _("storage pool does not support volume creation"));
return NULL;
}
- vol->next = pool->volumes;
- pool->volumes = vol;
- pool->nvolumes++;
+ pool->volumes.objs[pool->volumes.count++] = vol;
return virGetStorageVol(obj->conn, pool->def->name, vol->name, vol->key);
}
unsigned int flags) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByName(driver, obj->pool);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
virStorageBackendPtr backend;
- virStorageVolDefPtr vol, tmp, prev;
+ virStorageVolDefPtr vol;
+ unsigned int i;
if (!pool) {
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
return -1;
}
- prev = NULL;
- tmp = pool->volumes;
- while (tmp) {
- if (tmp == vol) {
+ for (i = 0 ; i < pool->volumes.count ; i++) {
+ if (pool->volumes.objs[i] == vol) {
+ virStorageVolDefFree(vol);
+
+ if (i < (pool->volumes.count - 1))
+ memmove(pool->volumes.objs + i, pool->volumes.objs + i + 1,
+ sizeof(*(pool->volumes.objs)) * (pool->volumes.count - (i + 1)));
+
+ if (VIR_REALLOC_N(pool->volumes.objs, pool->volumes.count - 1) < 0) {
+ ; /* Failure to reduce memory allocation isn't fatal */
+ }
+ pool->volumes.count--;
+
break;
}
- prev = tmp;
- tmp = tmp->next;
- }
- if (prev) {
- prev->next = vol->next;
- } else {
- pool->volumes = vol->next;
}
- pool->nvolumes--;
- virStorageVolDefFree(vol);
return 0;
}
virStorageVolInfoPtr info) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByName(driver, obj->pool);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
virStorageBackendPtr backend;
virStorageVolDefPtr vol;
unsigned int flags ATTRIBUTE_UNUSED) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByName(driver, obj->pool);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
virStorageBackendPtr backend;
virStorageVolDefPtr vol;
storageVolumeGetPath(virStorageVolPtr obj) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByName(driver, obj->pool);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
virStorageVolDefPtr vol;
char *ret;