[libvirt] [PATCH V4] Sheepdog: Auto Adding volume and pool refresh.

Daniel P. Berrange berrange at redhat.com
Thu Feb 6 17:28:26 UTC 2014


On Mon, Feb 03, 2014 at 05:55:49PM +0100, joel SIMOES wrote:
> From: Joel SIMOES <joel.simoes at laposte.net>
> 
> Libvirt lose sheepdogs volumes on pool refresh or restart.
> When restarting sheepdog pool, all volumes are missing.
> This patch add automatically all volume from the added pool.
> 
> With Jan Tomko help
> ---
>  src/storage/storage_backend_sheepdog.c | 68 ++++++++++++++++++++++++++++++++--
>  1 file changed, 64 insertions(+), 4 deletions(-)
> 
> diff --git a/src/storage/storage_backend_sheepdog.c b/src/storage/storage_backend_sheepdog.c
> index a6981ce..7a139e7 100644
> --- a/src/storage/storage_backend_sheepdog.c
> +++ b/src/storage/storage_backend_sheepdog.c
> @@ -109,22 +109,82 @@ virStorageBackendSheepdogAddHostArg(virCommandPtr cmd,
>      virCommandAddArgFormat(cmd, "%d", port);
>  }
>  
> +static int
> +virStorageBackendSheepdogRefreshAllVol(virConnectPtr conn ATTRIBUTE_UNUSED,
> +                                       virStoragePoolObjPtr pool)
> +{
> +    int ret = -1;
> +    char *output = NULL;
> +    char** lines = NULL;
> +    char** cells = NULL;

Nitpick - the '**' should associate with the variable name
rather than the type name.

> +    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];
> +        if (line == NULL)
> +            break;
> +        cells = virStringSplit(line, " ", 0);
> +        if (cells == NULL || virStringListLength(cells) <= 2)
> +            continue;

If cells != NULL, but the virStringListLength is <= 2
then you leak the memory for 'cells'. You need to fre
cells before skiping to the next look iteration.

> +        char *cell = cells[1];
> +        virStorageVolDefPtr vol = NULL;
> +        if (VIR_ALLOC(vol) < 0)
> +            goto cleanup;
> +
> +        if (VIR_STRDUP(vol->name, cell) < 0)
> +            goto cleanup;

If this strdup fails, then this will leak memory
for 'vol', so need to have a free of that.

> +
> +        vol->type = VIR_STORAGE_VOL_BLOCK;
> +
> +        if (VIR_EXPAND_N(pool->volumes.objs, pool->volumes.count, 1) < 0)
> +            goto cleanup;
> +        pool->volumes.objs[pool->volumes.count - 1] = vol;
> +
> +        if (virStorageBackendSheepdogRefreshVol(conn, pool, vol) < 0)
> +            goto cleanup;
> +        vol = NULL;
> +        virStringFreeList(cells);

You need to assign 'cells = NULL' here, otherwise if
the loop terminates, you may get an attempt to free
the pointer/list again.

> +    }
> +
> +    ret = 0;
> +
> +cleanup:
> +    virCommandFree(cmd);
> +    virStringFreeList(lines);
> +    virStringFreeList(cells);
> +    return ret;
> +}


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list