Add a helper to do all the lookup steps and remove a ton of duplicated
code.
---
src/storage/storage_driver.c | 292 ++++++++++---------------------------------
1 file changed, 69 insertions(+), 223 deletions(-)
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index c9916ff..26b2601 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -1520,45 +1520,75 @@ storageVolDeleteInternal(virStorageVolPtr obj,
}
-static int
-storageVolDelete(virStorageVolPtr obj,
- unsigned int flags)
+static virStorageVolDefPtr
+virStorageVolDefFromVol(virStorageVolPtr obj,
+ virStoragePoolObjPtr *pool,
+ virStorageBackendPtr *backend)
{
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
- virStoragePoolObjPtr pool;
- virStorageBackendPtr backend;
virStorageVolDefPtr vol = NULL;
- int ret = -1;
+
+ *pool = NULL;
+ if (backend)
+ *backend = NULL;
storageDriverLock(driver);
- pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
+ *pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
storageDriverUnlock(driver);
- if (!pool) {
+ if (!*pool) {
virReportError(VIR_ERR_NO_STORAGE_POOL,
_("no storage pool with matching name '%s'"),
obj->pool);
- goto cleanup;
+ return NULL;
}
- if (!virStoragePoolObjIsActive(pool)) {
+ if (!virStoragePoolObjIsActive(*pool)) {
virReportError(VIR_ERR_OPERATION_INVALID,
- _("storage pool '%s' is not active"),
pool->def->name);
- goto cleanup;
+ _("storage pool '%s' is not active"),
+ (*pool)->def->name);
+ goto error;
}
- if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
- goto cleanup;
-
- vol = virStorageVolDefFindByName(pool, obj->name);
+ if (backend) {
+ if (!(*backend = virStorageBackendForType((*pool)->def->type)))
+ goto error;
+ }
- if (!vol) {
+ if (!(vol = virStorageVolDefFindByName(*pool, obj->name))) {
virReportError(VIR_ERR_NO_STORAGE_VOL,
_("no storage vol with matching name '%s'"),
obj->name);
- goto cleanup;
+ goto error;
}
+ return vol;
+
+ error:
+ if (*pool) {
+ virStoragePoolObjUnlock(*pool);
+ *pool = NULL;
+ }
+
+ if (backend)
+ *backend = NULL;
+
+ return NULL;
+}
+
+
+static int
+storageVolDelete(virStorageVolPtr obj,
+ unsigned int flags)
+{
+ virStoragePoolObjPtr pool;
+ virStorageBackendPtr backend;
+ virStorageVolDefPtr vol = NULL;
+ int ret = -1;
+
+ if (!(vol = virStorageVolDefFromVol(obj, &pool, &backend)))
+ goto cleanup;
+
if (virStorageVolDeleteEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
@@ -1898,38 +1928,14 @@ storageVolDownload(virStorageVolPtr obj,
unsigned long long length,
unsigned int flags)
{
- virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
virStoragePoolObjPtr pool = NULL;
virStorageVolDefPtr vol = NULL;
int ret = -1;
virCheckFlags(0, -1);
- storageDriverLock(driver);
- pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
- storageDriverUnlock(driver);
-
- if (!pool) {
- virReportError(VIR_ERR_NO_STORAGE_POOL,
- _("no storage pool with matching name '%s'"),
- obj->pool);
- goto cleanup;
- }
-
- if (!virStoragePoolObjIsActive(pool)) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("storage pool '%s' is not active"),
pool->def->name);
- goto cleanup;
- }
-
- vol = virStorageVolDefFindByName(pool, obj->name);
-
- if (vol == NULL) {
- virReportError(VIR_ERR_NO_STORAGE_VOL,
- _("no storage vol with matching name '%s'"),
- obj->name);
- goto cleanup;
- }
+ if (!(vol = virStorageVolDefFromVol(obj, &pool, NULL)))
+ return -1;
if (virStorageVolDownloadEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
@@ -1950,8 +1956,7 @@ storageVolDownload(virStorageVolPtr obj,
ret = 0;
cleanup:
- if (pool)
- virStoragePoolObjUnlock(pool);
+ virStoragePoolObjUnlock(pool);
return ret;
}
@@ -1964,38 +1969,14 @@ storageVolUpload(virStorageVolPtr obj,
unsigned long long length,
unsigned int flags)
{
- virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
virStoragePoolObjPtr pool = NULL;
virStorageVolDefPtr vol = NULL;
int ret = -1;
virCheckFlags(0, -1);
- storageDriverLock(driver);
- pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
- storageDriverUnlock(driver);
-
- if (!pool) {
- virReportError(VIR_ERR_NO_STORAGE_POOL,
- _("no storage pool with matching name '%s'"),
- obj->pool);
- goto cleanup;
- }
-
- if (!virStoragePoolObjIsActive(pool)) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("storage pool '%s' is not active"),
pool->def->name);
- goto cleanup;
- }
-
- vol = virStorageVolDefFindByName(pool, obj->name);
-
- if (vol == NULL) {
- virReportError(VIR_ERR_NO_STORAGE_VOL,
- _("no storage vol with matching name '%s'"),
- obj->name);
- goto cleanup;
- }
+ if (!(vol = virStorageVolDefFromVol(obj, &pool, NULL)))
+ return -1;
if (virStorageVolUploadEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
@@ -2044,8 +2025,7 @@ storageVolUpload(virStorageVolPtr obj,
ret = 0;
cleanup:
- if (pool)
- virStoragePoolObjUnlock(pool);
+ virStoragePoolObjUnlock(pool);
return ret;
}
@@ -2055,7 +2035,6 @@ storageVolResize(virStorageVolPtr obj,
unsigned long long capacity,
unsigned int flags)
{
- virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
virStorageBackendPtr backend;
virStoragePoolObjPtr pool = NULL;
virStorageVolDefPtr vol = NULL;
@@ -2066,34 +2045,8 @@ storageVolResize(virStorageVolPtr obj,
VIR_STORAGE_VOL_RESIZE_DELTA |
VIR_STORAGE_VOL_RESIZE_SHRINK, -1);
- storageDriverLock(driver);
- pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
- storageDriverUnlock(driver);
-
- if (!pool) {
- virReportError(VIR_ERR_NO_STORAGE_POOL,
- _("no storage pool with matching name '%s'"),
- obj->pool);
- goto cleanup;
- }
-
- if (!virStoragePoolObjIsActive(pool)) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("storage pool '%s' is not active"),
pool->def->name);
- goto cleanup;
- }
-
- if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
- goto cleanup;
-
- vol = virStorageVolDefFindByName(pool, obj->name);
-
- if (vol == NULL) {
- virReportError(VIR_ERR_NO_STORAGE_VOL,
- _("no storage vol with matching name '%s'"),
- obj->name);
- goto cleanup;
- }
+ if (!(vol = virStorageVolDefFromVol(obj, &pool, &backend)))
+ return -1;
if (virStorageVolResizeEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
@@ -2161,8 +2114,7 @@ storageVolResize(virStorageVolPtr obj,
ret = 0;
cleanup:
- if (pool)
- virStoragePoolObjUnlock(pool);
+ virStoragePoolObjUnlock(pool);
return ret;
}
@@ -2369,7 +2321,6 @@ storageVolWipePattern(virStorageVolPtr obj,
unsigned int algorithm,
unsigned int flags)
{
- virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
virStoragePoolObjPtr pool = NULL;
virStorageVolDefPtr vol = NULL;
int ret = -1;
@@ -2383,31 +2334,9 @@ storageVolWipePattern(virStorageVolPtr obj,
return -1;
}
- storageDriverLock(driver);
- pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
- storageDriverUnlock(driver);
-
- if (!pool) {
- virReportError(VIR_ERR_NO_STORAGE_POOL,
- _("no storage pool with matching name '%s'"),
- obj->pool);
- goto cleanup;
- }
-
- if (!virStoragePoolObjIsActive(pool)) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("storage pool '%s' is not active"),
pool->def->name);
- goto cleanup;
- }
+ if (!(vol = virStorageVolDefFromVol(obj, &pool, NULL)))
+ return -1;
- vol = virStorageVolDefFindByName(pool, obj->name);
-
- if (vol == NULL) {
- virReportError(VIR_ERR_NO_STORAGE_VOL,
- _("no storage vol with matching name '%s'"),
- obj->name);
- goto cleanup;
- }
if (virStorageVolWipePatternEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
@@ -2433,12 +2362,9 @@ storageVolWipePattern(virStorageVolPtr obj,
ret = 0;
cleanup:
- if (pool) {
- virStoragePoolObjUnlock(pool);
- }
+ virStoragePoolObjUnlock(pool);
return ret;
-
}
static int
@@ -2453,44 +2379,17 @@ static int
storageVolGetInfo(virStorageVolPtr obj,
virStorageVolInfoPtr info)
{
- virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
virStoragePoolObjPtr pool;
virStorageBackendPtr backend;
virStorageVolDefPtr vol;
int ret = -1;
- storageDriverLock(driver);
- pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
- storageDriverUnlock(driver);
-
- if (!pool) {
- virReportError(VIR_ERR_NO_STORAGE_POOL,
- _("no storage pool with matching name '%s'"),
- obj->pool);
- goto cleanup;
- }
-
- if (!virStoragePoolObjIsActive(pool)) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("storage pool '%s' is not active"),
pool->def->name);
- goto cleanup;
- }
-
- vol = virStorageVolDefFindByName(pool, obj->name);
-
- if (!vol) {
- virReportError(VIR_ERR_NO_STORAGE_VOL,
- _("no storage vol with matching name '%s'"),
- obj->name);
- goto cleanup;
- }
+ if (!(vol = virStorageVolDefFromVol(obj, &pool, &backend)))
+ return -1;
if (virStorageVolGetInfoEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
- if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
- goto cleanup;
-
if (backend->refreshVol &&
backend->refreshVol(obj->conn, pool, vol) < 0)
goto cleanup;
@@ -2502,8 +2401,7 @@ storageVolGetInfo(virStorageVolPtr obj,
ret = 0;
cleanup:
- if (pool)
- virStoragePoolObjUnlock(pool);
+ virStoragePoolObjUnlock(pool);
return ret;
}
@@ -2511,7 +2409,6 @@ static char *
storageVolGetXMLDesc(virStorageVolPtr obj,
unsigned int flags)
{
- virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
virStoragePoolObjPtr pool;
virStorageBackendPtr backend;
virStorageVolDefPtr vol;
@@ -2519,38 +2416,12 @@ storageVolGetXMLDesc(virStorageVolPtr obj,
virCheckFlags(0, NULL);
- storageDriverLock(driver);
- pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
- storageDriverUnlock(driver);
-
- if (!pool) {
- virReportError(VIR_ERR_NO_STORAGE_POOL,
- _("no storage pool with matching name '%s'"),
- obj->pool);
- goto cleanup;
- }
-
- if (!virStoragePoolObjIsActive(pool)) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("storage pool '%s' is not active"),
pool->def->name);
- goto cleanup;
- }
-
- vol = virStorageVolDefFindByName(pool, obj->name);
-
- if (!vol) {
- virReportError(VIR_ERR_NO_STORAGE_VOL,
- _("no storage vol with matching name '%s'"),
- obj->name);
- goto cleanup;
- }
+ if (!(vol = virStorageVolDefFromVol(obj, &pool, &backend)))
+ return NULL;
if (virStorageVolGetXMLDescEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
- if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
- goto cleanup;
-
if (backend->refreshVol &&
backend->refreshVol(obj->conn, pool, vol) < 0)
goto cleanup;
@@ -2558,8 +2429,7 @@ storageVolGetXMLDesc(virStorageVolPtr obj,
ret = virStorageVolDefFormat(pool->def, vol);
cleanup:
- if (pool)
- virStoragePoolObjUnlock(pool);
+ virStoragePoolObjUnlock(pool);
return ret;
}
@@ -2567,35 +2437,12 @@ storageVolGetXMLDesc(virStorageVolPtr obj,
static char *
storageVolGetPath(virStorageVolPtr obj)
{
- virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
virStoragePoolObjPtr pool;
virStorageVolDefPtr vol;
char *ret = NULL;
- storageDriverLock(driver);
- pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
- storageDriverUnlock(driver);
- if (!pool) {
- virReportError(VIR_ERR_NO_STORAGE_POOL,
- _("no storage pool with matching name '%s'"),
- obj->pool);
- goto cleanup;
- }
-
- if (!virStoragePoolObjIsActive(pool)) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("storage pool '%s' is not active"),
pool->def->name);
- goto cleanup;
- }
-
- vol = virStorageVolDefFindByName(pool, obj->name);
-
- if (!vol) {
- virReportError(VIR_ERR_NO_STORAGE_VOL,
- _("no storage vol with matching name '%s'"),
- obj->name);
- goto cleanup;
- }
+ if (!(vol = virStorageVolDefFromVol(obj, &pool, NULL)))
+ return NULL;
if (virStorageVolGetPathEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
@@ -2603,8 +2450,7 @@ storageVolGetPath(virStorageVolPtr obj)
ignore_value(VIR_STRDUP(ret, vol->target.path));
cleanup:
- if (pool)
- virStoragePoolObjUnlock(pool);
+ virStoragePoolObjUnlock(pool);
return ret;
}
--
1.9.3