[libvirt] [PATCH V5] Sheepdog: Adding volume and on pool and refresh.
Joel Simoes
joel.simoes at laposte.net
Tue Feb 11 13:06:11 UTC 2014
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
More information about the libvir-list
mailing list