
Thx Le 11/02/2014 12:33, Daniel P. Berrange a écrit :
On Fri, Feb 07, 2014 at 12:45:42PM +0100, joel SIMOES wrote:
+static int +virStorageBackendSheepdogAddVolume(virConnectPtr conn ATTRIBUTE_UNUSED, + virStoragePoolObjPtr pool, const char *diskInfo) +{ + virStorageVolDefPtr vol = NULL; + + if (diskInfo == NULL) + goto error; Missing error report
+ + if (VIR_ALLOC(vol) < 0 || VIR_STRDUP(vol->name, diskInfo) < 0) + goto error; + + vol->type = VIR_STORAGE_VOL_NETWORK; + + if (VIR_EXPAND_N(pool->volumes.objs, pool->volumes.count, 1) < 0) + goto error; + + pool->volumes.objs[pool->volumes.count - 1] = vol; + + if (virStorageBackendSheepdogRefreshVol(conn, pool, vol) < 0) + goto error; If refreshing fails, when we free 'vol', but we've already added it to the pool->volumes array. So the refresh call needs to be moved up a few lines.
+ + return 0; + +error: + virStorageVolDefFree(vol); + return -1; +} + +static int +virStorageBackendSheepdogRefreshAllVol(virConnectPtr conn ATTRIBUTE_UNUSED, + virStoragePoolObjPtr pool) +{ + int ret = -1; + char *output = NULL; + char **lines = NULL; + char **cells = NULL; + size_t i; + + virCommandPtr cmd = virCommandNewArgList(COLLIE, "vdi", "list", "-r", NULL); + virStorageBackendSheepdogAddHostArg(cmd, pool); + virCommandSetOutputBuffer(cmd, &output); + if (virCommandRun(cmd, NULL) < 0) + goto cleanup; + + lines = virStringSplit(output, "\n", 0); + if (lines == NULL) + goto cleanup; + + for (i = 0; lines[i]; i++) { + char *line = lines[i]; This could be marked const.
+ if (line == NULL) + break; + + cells = virStringSplit(line, " ", 0); + + if (cells != NULL && virStringListLength(cells) > 2) { + if (virStorageBackendSheepdogAddVolume(conn, pool, cells[1]) < 0) + goto cleanup; + } + + virStringFreeList(cells); + cells = NULL; + } + + ret = 0; + +cleanup: + virCommandFree(cmd); + virStringFreeList(lines); + virStringFreeList(cells); We need VIR_FREE(output) here.
+ return ret; +}
I'm going to commit this with the following change applied:
diff --git a/src/storage/storage_backend_sheepdog.c b/src/storage/storage_backend_sheepdog.c index 08e5473..82df274 100644 --- a/src/storage/storage_backend_sheepdog.c +++ b/src/storage/storage_backend_sheepdog.c @@ -115,22 +115,25 @@ virStorageBackendSheepdogAddVolume(virConnectPtr conn ATTRIBUTE_UNUSED, { virStorageVolDefPtr vol = NULL;
- if (diskInfo == NULL) + if (diskInfo == NULL) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Missing disk info when adding volume")); goto error; + }
if (VIR_ALLOC(vol) < 0 || VIR_STRDUP(vol->name, diskInfo) < 0) goto error;
vol->type = VIR_STORAGE_VOL_NETWORK;
+ if (virStorageBackendSheepdogRefreshVol(conn, pool, vol) < 0) + goto error; + if (VIR_EXPAND_N(pool->volumes.objs, pool->volumes.count, 1) < 0) goto error;
pool->volumes.objs[pool->volumes.count - 1] = vol;
- if (virStorageBackendSheepdogRefreshVol(conn, pool, vol) < 0) - goto error; - return 0;
error: @@ -159,7 +162,7 @@ virStorageBackendSheepdogRefreshAllVol(virConnectPtr conn ATTRIBUTE_UNUSED, goto cleanup;
for (i = 0; lines[i]; i++) { - char *line = lines[i]; + const char *line = lines[i]; if (line == NULL) break;
@@ -180,6 +183,7 @@ cleanup: virCommandFree(cmd); virStringFreeList(lines); virStringFreeList(cells); + VIR_FREE(output); return ret; }
Thanks for your contribution !
Regards, Daniel