This patch removes the linked list in the virStoragePoolObjPtr and
and virStorageVolDefPtr objects, and adds new virStoragePoolObjList
and virStorageVolDefList structs to track pools & vols as arrays. The
storage driver driver gets updated to account for this API change.
storage_backend_disk.c | 10 +
storage_backend_fs.c | 75 +++++--------
storage_backend_iscsi.c | 9 +
storage_backend_logical.c | 11 +-
storage_conf.c | 165 ++++++++++++++++--------------
storage_conf.h | 37 ++++--
storage_driver.c | 253 ++++++++++++++++++++++------------------------
7 files changed, 290 insertions(+), 270 deletions(-)
Daniel
diff -r 03f1715be403 src/storage_backend_disk.c
--- a/src/storage_backend_disk.c Fri Oct 03 12:58:28 2008 +0100
+++ b/src/storage_backend_disk.c Fri Oct 03 13:07:54 2008 +0100
@@ -185,9 +185,13 @@
return -1;
}
- vol->next = pool->volumes;
- pool->volumes = vol;
- pool->nvolumes++;
+ if (VIR_REALLOC_N(pool->volumes.objs,
+ pool->volumes.count+1) < 0) {
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, _("volume"));
+ virStorageVolDefFree(vol);
+ return -1;
+ }
+ pool->volumes.objs[pool->volumes.count++] = vol;
/* Prepended path will be same for all partitions, so we can
* strip the path to form a reasonable pool-unique name
diff -r 03f1715be403 src/storage_backend_fs.c
--- a/src/storage_backend_fs.c Fri Oct 03 12:58:28 2008 +0100
+++ b/src/storage_backend_fs.c Fri Oct 03 13:07:54 2008 +0100
@@ -822,6 +822,7 @@
DIR *dir;
struct dirent *ent;
struct statvfs sb;
+ virStorageVolDefPtr vol = NULL;
if (!(dir = opendir(pool->def->target.path))) {
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
@@ -831,61 +832,42 @@
}
while ((ent = readdir(dir)) != NULL) {
- virStorageVolDefPtr vol;
int ret;
- if (VIR_ALLOC(vol) < 0) {
- virStorageReportError(conn, VIR_ERR_NO_MEMORY,
- "%s", _("volume"));
- goto cleanup;
- }
+ if (VIR_ALLOC(vol) < 0)
+ goto no_memory;
- vol->name = strdup(ent->d_name);
- if (vol->name == NULL) {
- VIR_FREE(vol);
- virStorageReportError(conn, VIR_ERR_NO_MEMORY,
- "%s", _("volume name"));
- goto cleanup;
- }
+ if ((vol->name = strdup(ent->d_name)) == NULL)
+ goto no_memory;
vol->target.format = VIR_STORAGE_VOL_RAW; /* Real value is filled in during
probe */
if (VIR_ALLOC_N(vol->target.path, strlen(pool->def->target.path) +
- 1 + strlen(vol->name) + 1) < 0) {
- VIR_FREE(vol->target.path);
- VIR_FREE(vol);
- virStorageReportError(conn, VIR_ERR_NO_MEMORY,
- "%s", _("volume name"));
- goto cleanup;
- }
+ 1 + strlen(vol->name) + 1) < 0)
+ goto no_memory;
+
strcpy(vol->target.path, pool->def->target.path);
strcat(vol->target.path, "/");
strcat(vol->target.path, vol->name);
- if ((vol->key = strdup(vol->target.path)) == NULL) {
- VIR_FREE(vol->name);
- VIR_FREE(vol->target.path);
- VIR_FREE(vol);
- virStorageReportError(conn, VIR_ERR_NO_MEMORY,
- "%s", _("volume key"));
- goto cleanup;
+ if ((vol->key = strdup(vol->target.path)) == NULL)
+ goto no_memory;
+
+ if ((ret = virStorageBackendProbeFile(conn, vol) < 0)) {
+ if (ret == -1)
+ goto no_memory;
+ else {
+ /* Silently ignore non-regular files,
+ * eg '.' '..', 'lost+found' */
+ virStorageVolDefFree(vol);
+ vol = NULL;
+ continue;
+ }
}
- if ((ret = virStorageBackendProbeFile(conn, vol) < 0)) {
- VIR_FREE(vol->key);
- VIR_FREE(vol->name);
- VIR_FREE(vol->target.path);
- VIR_FREE(vol);
- if (ret == -1)
- goto cleanup;
- else
- /* Silently ignore non-regular files,
- * eg '.' '..', 'lost+found' */
- continue;
- }
-
- vol->next = pool->volumes;
- pool->volumes = vol;
- pool->nvolumes++;
- continue;
+ if (VIR_REALLOC_N(pool->volumes.objs,
+ pool->volumes.count+1) < 0)
+ goto no_memory;
+ pool->volumes.objs[pool->volumes.count++] = vol;
+ vol = NULL;
}
closedir(dir);
@@ -904,8 +886,13 @@
return 0;
+no_memory:
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, NULL);
+ /* fallthrough */
+
cleanup:
closedir(dir);
+ virStorageVolDefFree(vol);
virStoragePoolObjClearVols(pool);
return -1;
}
diff -r 03f1715be403 src/storage_backend_iscsi.c
--- a/src/storage_backend_iscsi.c Fri Oct 03 12:58:28 2008 +0100
+++ b/src/storage_backend_iscsi.c Fri Oct 03 13:07:54 2008 +0100
@@ -236,9 +236,12 @@
pool->def->capacity += vol->capacity;
pool->def->allocation += vol->allocation;
- vol->next = pool->volumes;
- pool->volumes = vol;
- pool->nvolumes++;
+ if (VIR_REALLOC_N(pool->volumes.objs,
+ pool->volumes.count+1) < 0) {
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, NULL);
+ goto cleanup;
+ }
+ pool->volumes.objs[pool->volumes.count++] = vol;
close(fd);
diff -r 03f1715be403 src/storage_backend_logical.c
--- a/src/storage_backend_logical.c Fri Oct 03 12:58:28 2008 +0100
+++ b/src/storage_backend_logical.c Fri Oct 03 13:07:54 2008 +0100
@@ -119,12 +119,17 @@
if ((vol->name = strdup(groups[0])) == NULL) {
virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s",
_("volume"));
+ virStorageVolDefFree(vol);
return -1;
}
- vol->next = pool->volumes;
- pool->volumes = vol;
- pool->nvolumes++;
+ if (VIR_REALLOC_N(pool->volumes.objs,
+ pool->volumes.count + 1)) {
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, NULL);
+ virStorageVolDefFree(vol);
+ return -1;
+ }
+ pool->volumes.objs[pool->volumes.count++] = vol;
}
if (vol->target.path == NULL) {
diff -r 03f1715be403 src/storage_conf.c
--- a/src/storage_conf.c Fri Oct 03 12:58:28 2008 +0100
+++ b/src/storage_conf.c Fri Oct 03 13:07:54 2008 +0100
@@ -71,6 +71,10 @@
void
virStorageVolDefFree(virStorageVolDefPtr def) {
int i;
+
+ if (!def)
+ return;
+
VIR_FREE(def->name);
VIR_FREE(def->key);
@@ -87,6 +91,9 @@
void
virStoragePoolDefFree(virStoragePoolDefPtr def) {
int i;
+
+ if (!def)
+ return;
VIR_FREE(def->name);
VIR_FREE(def->source.host.name);
@@ -111,38 +118,48 @@
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 (i < (pools->count - 1))
+ memmove(pools->objs + i, pools->objs + i + 1,
+ sizeof(*(pools->objs)) * (pools->count - (i + 1)));
+
+ if (VIR_REALLOC_N(pools->objs, pools->count - 1) < 0) {
+ ; /* Failure to reduce memory allocation isn't fatal */
+ }
+ pools->count--;
+
+ break;
+ }
}
-
- if (curr) {
- if (prev)
- prev->next = curr->next;
- else
- driver->pools = curr->next;
-
- driver->ninactivePools--;
- }
-
- virStoragePoolObjFree(pool);
}
@@ -925,29 +942,25 @@
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;
}
@@ -955,26 +968,22 @@
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;
}
@@ -982,13 +991,11 @@
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;
}
@@ -996,24 +1003,22 @@
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;
@@ -1033,16 +1038,21 @@
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,
@@ -1064,7 +1074,7 @@
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;
@@ -1091,15 +1101,18 @@
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;
}
@@ -1114,24 +1127,24 @@
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);
}
diff -r 03f1715be403 src/storage_conf.h
--- a/src/storage_conf.h Fri Oct 03 12:58:28 2008 +0100
+++ b/src/storage_conf.h Fri Oct 03 13:07:54 2008 +0100
@@ -87,10 +87,14 @@
virStorageVolSource source;
virStorageVolTarget target;
-
- virStorageVolDefPtr next;
};
+typedef struct _virStorageVolDefList virStorageVolDefList;
+typedef virStorageVolDefList *virStorageVolDefListPtr;
+struct _virStorageVolDefList {
+ unsigned int count;
+ virStorageVolDefPtr *objs;
+};
@@ -222,10 +226,14 @@
virStoragePoolDefPtr def;
virStoragePoolDefPtr newDef;
- int nvolumes;
- virStorageVolDefPtr volumes;
+ virStorageVolDefList volumes;
+};
- virStoragePoolObjPtr next;
+typedef struct _virStoragePoolObjList virStoragePoolObjList;
+typedef virStoragePoolObjList *virStoragePoolObjListPtr;
+struct _virStoragePoolObjList {
+ unsigned int count;
+ virStoragePoolObjPtr *objs;
};
@@ -235,9 +243,8 @@
typedef virStorageDriverState *virStorageDriverStatePtr;
struct _virStorageDriverState {
- int nactivePools;
- int ninactivePools;
- virStoragePoolObjPtr pools;
+ virStoragePoolObjList pools;
+
char *configDir;
char *autostartDir;
};
@@ -252,11 +259,14 @@
const char *fmt, ...)
ATTRIBUTE_FORMAT(printf, 3, 4);
-int virStoragePoolObjScanConfigs(virStorageDriverStatePtr driver);
+int virStoragePoolLoadAllConfigs(virConnectPtr conn,
+ virStoragePoolObjListPtr pools,
+ const char *configDir,
+ const char *autostartDir);
-virStoragePoolObjPtr virStoragePoolObjFindByUUID(virStorageDriverStatePtr driver,
+virStoragePoolObjPtr virStoragePoolObjFindByUUID(virStoragePoolObjListPtr pools,
const unsigned char *uuid);
-virStoragePoolObjPtr virStoragePoolObjFindByName(virStorageDriverStatePtr driver,
+virStoragePoolObjPtr virStoragePoolObjFindByName(virStoragePoolObjListPtr pools,
const char *name);
virStorageVolDefPtr virStorageVolDefFindByKey(virStoragePoolObjPtr pool,
@@ -283,7 +293,7 @@
virStorageVolDefPtr def);
virStoragePoolObjPtr virStoragePoolObjAssignDef(virConnectPtr conn,
- virStorageDriverStatePtr driver,
+ virStoragePoolObjListPtr pools,
virStoragePoolDefPtr def);
int virStoragePoolObjSaveDef(virConnectPtr conn,
@@ -296,7 +306,8 @@
void virStorageVolDefFree(virStorageVolDefPtr def);
void virStoragePoolDefFree(virStoragePoolDefPtr def);
void virStoragePoolObjFree(virStoragePoolObjPtr pool);
-void virStoragePoolObjRemove(virStorageDriverStatePtr driver,
+void virStoragePoolObjListFree(virStoragePoolObjListPtr pools);
+void virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
virStoragePoolObjPtr pool);
#endif /* __VIR_STORAGE_DRIVER_H__ */
diff -r 03f1715be403 src/storage_driver.c
--- a/src/storage_driver.c Fri Oct 03 12:58:28 2008 +0100
+++ b/src/storage_driver.c Fri Oct 03 13:07:54 2008 +0100
@@ -49,11 +49,10 @@
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)) {
@@ -61,7 +60,6 @@
if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
storageLog("Missing backend %d",
pool->def->type);
- pool = next;
continue;
}
@@ -70,7 +68,6 @@
virErrorPtr err = virGetLastError();
storageLog("Failed to autostart storage pool '%s':
%s",
pool->def->name, err ? err->message : NULL);
- pool = next;
continue;
}
@@ -80,15 +77,10 @@
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;
}
}
@@ -149,7 +141,10 @@
}
*/
- if (virStoragePoolObjScanConfigs(driverState) < 0) {
+ if (virStoragePoolLoadAllConfigs(NULL,
+ &driverState->pools,
+ driverState->configDir,
+ driverState->autostartDir) < 0) {
storageDriverShutdown();
return -1;
}
@@ -173,7 +168,13 @@
*/
static int
storageDriverReload(void) {
- virStoragePoolObjScanConfigs(driverState);
+ if (!driverState)
+ return -1;
+
+ virStoragePoolLoadAllConfigs(NULL,
+ &driverState->pools,
+ driverState->configDir,
+ driverState->autostartDir);
storageDriverAutostart(driverState);
return 0;
@@ -188,11 +189,17 @@
*/
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;
@@ -205,15 +212,15 @@
*/
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) {
@@ -229,24 +236,14 @@
}
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;
+ virStoragePoolObjListFree(&driverState->pools);
- free(driverState->configDir);
- free(driverState->autostartDir);
- free(driverState);
- driverState = NULL;
+ VIR_FREE(driverState->configDir);
+ VIR_FREE(driverState->autostartDir);
+ VIR_FREE(driverState);
return 0;
}
@@ -258,7 +255,7 @@
const unsigned char *uuid) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(driver, uuid);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools,
uuid);
virStoragePoolPtr ret;
if (!pool) {
@@ -276,7 +273,7 @@
const char *name) {
virStorageDriverStatePtr driver =
(virStorageDriverStatePtr)conn->storagePrivateData;
- virStoragePoolObjPtr pool = virStoragePoolObjFindByName(driver, name);
+ virStoragePoolObjPtr pool = virStoragePoolObjFindByName(&driver->pools,
name);
virStoragePoolPtr ret;
if (!pool) {
@@ -316,7 +313,13 @@
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
@@ -325,18 +328,17 @@
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;
@@ -353,7 +355,13 @@
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
@@ -362,18 +370,17 @@
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;
@@ -424,8 +431,8 @@
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);
@@ -437,7 +444,7 @@
return NULL;
}
- if (!(pool = virStoragePoolObjAssignDef(conn, driver, def))) {
+ if (!(pool = virStoragePoolObjAssignDef(conn, &driver->pools, def))) {
virStoragePoolDefFree(def);
return NULL;
}
@@ -451,8 +458,6 @@
return NULL;
}
pool->active = 1;
- driver->nactivePools++;
- driver->ninactivePools--;
ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
@@ -478,13 +483,13 @@
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;
}
@@ -496,7 +501,7 @@
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,
@@ -517,12 +522,10 @@
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;
}
@@ -532,7 +535,7 @@
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) {
@@ -560,8 +563,6 @@
}
pool->active = 1;
- driver->nactivePools++;
- driver->ninactivePools--;
return 0;
}
@@ -571,7 +572,7 @@
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) {
@@ -602,7 +603,7 @@
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) {
@@ -628,11 +629,9 @@
virStoragePoolObjClearVols(pool);
pool->active = 0;
- driver->nactivePools--;
- driver->ninactivePools++;
if (pool->configFile == NULL)
- virStoragePoolObjRemove(driver, pool);
+ virStoragePoolObjRemove(&driver->pools, pool);
return 0;
}
@@ -643,7 +642,7 @@
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) {
@@ -679,7 +678,7 @@
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;
@@ -705,11 +704,9 @@
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;
@@ -721,7 +718,7 @@
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) {
@@ -751,7 +748,7 @@
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,
@@ -767,7 +764,7 @@
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,
@@ -789,7 +786,7 @@
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,
@@ -845,7 +842,7 @@
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,
@@ -859,7 +856,7 @@
return -1;
}
- return pool->nvolumes;
+ return pool->volumes.count;
}
static int
@@ -868,9 +865,8 @@
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,
@@ -885,25 +881,20 @@
}
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;
}
@@ -914,7 +905,7 @@
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) {
@@ -946,19 +937,19 @@
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,
@@ -971,19 +962,19 @@
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,
@@ -997,7 +988,7 @@
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;
@@ -1027,6 +1018,13 @@
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"));
@@ -1039,9 +1037,7 @@
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);
}
@@ -1051,9 +1047,10 @@
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,
@@ -1089,22 +1086,22 @@
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;
}
@@ -1114,7 +1111,7 @@
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;
@@ -1158,7 +1155,7 @@
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;
@@ -1192,7 +1189,7 @@
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;
--
|: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://ovirt.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|