[libvirt] [PATCH] storage: forbid rebuilding existing disk storage pools

Osier Yang jyang at redhat.com
Mon Nov 14 04:58:08 UTC 2011


于 2011年11月13日 00:19, Guido Günther 写道:
> which would blow away all volumes. Honor VIR_STORAGE_POOL_BUILD_OVERWRITE
> to force a rebuild.
>
> This was caught by libvirt-tck's storage/110-disk-pool.t.
> Cheers,
>   -- Guido
>
> ---
>   src/storage/storage_backend_disk.c |   72 ++++++++++++++++++++++++++++++++++--
>   1 files changed, 68 insertions(+), 4 deletions(-)
>
> diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c
> index 82d6e8a..995ad2f 100644
> --- a/src/storage/storage_backend_disk.c
> +++ b/src/storage/storage_backend_disk.c
> @@ -335,6 +335,40 @@ virStorageBackendDiskRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
>
>
>   /**
> + * Check for a valid disk label (partition table) on device
> + *
> + * return: 0 - valid disk label found
> + *>0 - no or unrecognized disk label
> + *<0 - error finding the disk label
> + */
> +static int
> +virStorageBackendDiskFindLabel(const char* device)
> +{
> +    const char *const args[] = {
> +        device, "print", "--script", NULL,
> +    };
> +    virCommandPtr cmd = virCommandNew(PARTED);
> +    char *output = NULL;
> +    int ret = -1;
> +
> +    virCommandAddArgSet(cmd, args);
> +    virCommandAddEnvString(cmd, "LC_ALL=C");
> +    virCommandSetOutputBuffer(cmd,&output);
> +
> +    /* if parted succeeds we have a valid partition table */
> +    ret = virCommandRun(cmd, NULL);
> +    if (ret<  0) {
> +        if (strstr (output, "unrecognised disk label"))
> +            ret = 1;
> +    }
> +
> +    virCommandFree(cmd);
> +    VIR_FREE(output);
> +    return ret;
> +}
> +
> +
> +/**
>    * Write a new partition table header
>    */
>   static int
> @@ -342,6 +376,8 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
>                                  virStoragePoolObjPtr pool,
>                                  unsigned int flags)
>   {
> +    bool ok_to_mklabel = false;
> +    int ret = -1;
>       /* eg parted /dev/sda mklabel msdos */
>       const char *prog[] = {
>           PARTED,
> @@ -353,12 +389,40 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
>           NULL,
>       };
>
> -    virCheckFlags(0, -1);
> +    virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE |
> +                  VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, ret);
>
> -    if (virRun(prog, NULL)<  0)
> -        return -1;
> +    if (flags == (VIR_STORAGE_POOL_BUILD_OVERWRITE |
> +                  VIR_STORAGE_POOL_BUILD_NO_OVERWRITE)) {
> +        virStorageReportError(VIR_ERR_OPERATION_INVALID,
> +                              _("Overwrite and no overwrite flags"
> +                                " are mutually exclusive"));
> +        goto error;
> +    }
>
> -    return 0;
> +    if (flags&  VIR_STORAGE_POOL_BUILD_OVERWRITE)
> +        ok_to_mklabel = true;
> +    else {
> +        int check;
> +
> +        check = virStorageBackendDiskFindLabel (
> +                    pool->def->source.devices[0].path);
> +        if (check>  0) {
> +            ok_to_mklabel = true;
> +        } else if (check<  0) {
> +            virStorageReportError(VIR_ERR_OPERATION_FAILED,
> +                                  _("Error checking for disk label"));
> +        } else {
> +            virStorageReportError(VIR_ERR_OPERATION_INVALID,
> +                                  _("Disk label already present"));
> +        }
> +    }
> +
> +    if (ok_to_mklabel)
> +        ret = virRun(prog, NULL);
> +
> +error:
> +    return ret;
>   }
>
>   /**

Looks fine, and having the flags is better, ACK

Osier




More information about the libvir-list mailing list