[libvirt] [PATCH] Sheepdog: Auto Adding volume and correct refresh volume problem.

Ján Tomko jtomko at redhat.com
Mon Jan 27 08:31:26 UTC 2014


On 01/22/2014 04:19 PM, joel SIMOES wrote:
> From: Joel SIMOES <joel.simoes at laposte.net>
> 
> ---
>  src/storage/storage_backend_sheepdog.c | 91 ++++++++++++++++++++++++++++++----
>  1 file changed, 81 insertions(+), 10 deletions(-)
> 
> diff --git a/src/storage/storage_backend_sheepdog.c b/src/storage/storage_backend_sheepdog.c
> index a6981ce..fbed11a 100644
> --- a/src/storage/storage_backend_sheepdog.c
> +++ b/src/storage/storage_backend_sheepdog.c
> @@ -109,6 +110,71 @@ virStorageBackendSheepdogAddHostArg(virCommandPtr cmd,
>      virCommandAddArgFormat(cmd, "%d", port);
>  }
>  
> +static int
> +virStorageBackendSheepdogRefreshAllVol(virConnectPtr conn ATTRIBUTE_UNUSED,
> +                                       virStoragePoolObjPtr pool)
> +{
> +    int ret;
> +    char *output = NULL;
> +
> +    virCommandPtr cmd = virCommandNewArgList(COLLIE, "vdi", "list", "-r", NULL);
> +    virStorageBackendSheepdogAddHostArg(cmd, pool);
> +    virCommandSetOutputBuffer(cmd, &output);
> +    ret = virCommandRun(cmd, NULL);

If the command is run succesfully, ret gets set to 0 and the function returns
0 even if something fails.

You don't use the return value of virCommandRun later, so you can just do:
if (virCommandRun(cmd, NULL) < 0)
    goto cleanup;

And set ret = 0 just before the cleanup: label, as we do in most of libvirt.

> +    char** lines;
> +    char** cells;
> +
> +    if (ret < 0)
> +        goto cleanup;
> +
> +    lines = virStringSplit(output, "\n", 0);
> +    size_t i;
> +    for (i = 0; *(lines + i); i++) {
> +        char *line = *(lines + i);
> +        cells = virStringSplit(line, " ", 0);
> +        size_t j;
> +        for (j = 0; *(cells + j); j++) {
> +
> +            char *cell = *(cells + j);
> +            if (j == 1) {
> +                virStorageVolDefPtr vol = NULL;
> +                if (VIR_ALLOC(vol) < 0)
> +                    goto cleanup;
> +
> +                if (VIR_STRDUP(vol->name, cell) < 0)
> +                    goto cleanup;
> +
> +                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;
> +            }
> +
> +            VIR_FREE(*(cells + j));

We also have a virStringFreeList function, that frees the list generated by
virStringSplit. You wouldn't need the inner 'for' loop then.

> +        }
> +
> +        VIR_FREE(cells);
> +        VIR_FREE(*(lines + i));
> +    }
> +
> +
> +    VIR_FREE(lines);
> +
> +
> +
> +
> +cleanup:
> +    virCommandFree(cmd);
> +    VIR_FREE(lines);
> +    VIR_FREE(cells);
> +    return ret;
> +}
>  
>  static int
>  virStorageBackendSheepdogRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,

Jan

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140127/0e2d8645/attachment-0001.sig>


More information about the libvir-list mailing list