[libvirt] [PATCH v5 3/5] storage: add support for creating qcow2 images with extensions

John Ferlan jferlan at redhat.com
Fri Jun 21 18:40:13 UTC 2013


On 06/19/2013 11:24 AM, Ján Tomko wrote:
> Add -o compat= and -o lazy_refcounts options for qemu-img.
> ---
>  src/storage/storage_backend.c                   | 62 ++++++++++++++++++++++---
>  tests/storagevolxml2argvdata/qcow2-1.1.argv     |  1 +
>  tests/storagevolxml2argvdata/qcow2-lazy.argv    |  1 +
>  tests/storagevolxml2argvdata/vol-qcow2-1.1.xml  | 32 +++++++++++++
>  tests/storagevolxml2argvdata/vol-qcow2-lazy.xml | 35 ++++++++++++++
>  tests/storagevolxml2argvtest.c                  |  2 +
>  6 files changed, 126 insertions(+), 7 deletions(-)
>  create mode 100644 tests/storagevolxml2argvdata/qcow2-1.1.argv
>  create mode 100644 tests/storagevolxml2argvdata/qcow2-lazy.argv
>  create mode 100644 tests/storagevolxml2argvdata/vol-qcow2-1.1.xml
>  create mode 100644 tests/storagevolxml2argvdata/vol-qcow2-lazy.xml
> 
> diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
> index deea850..b2c9608 100644
> --- a/src/storage/storage_backend.c
> +++ b/src/storage/storage_backend.c
> @@ -633,9 +633,15 @@ static int
>  virStorageBackendCreateQemuImgOpts(char **opts,
>                                     const char *backingType,
>                                     bool encryption,
> -                                   bool preallocate)
> +                                   bool preallocate,
> +                                   int format,
> +                                   const char *compat,
> +                                   virBitmapPtr features)
>  {
>      virBuffer buf = VIR_BUFFER_INITIALIZER;
> +    bool b;
> +    int i;
> +
>      if (backingType)
>          virBufferAsprintf(&buf, "backing_fmt=%s,", backingType);
>      if (encryption)
> @@ -643,16 +649,45 @@ virStorageBackendCreateQemuImgOpts(char **opts,
>      if (preallocate)
>          virBufferAddLit(&buf, "preallocation=metadata,");
>  
> +    if (compat)
> +        virBufferAsprintf(&buf, "compat=%s,", compat);
> +    if (features && format == VIR_STORAGE_FILE_QCOW2) {
> +        for (i = 0; i < VIR_STORAGE_FILE_FEATURE_LAST; i++) {
> +            ignore_value(virBitmapGetBit(features, i, &b));
> +            if (b) {
> +                switch (i) {
> +                case VIR_STORAGE_FILE_FEATURE_LAZY_REFCOUNTS:
> +                    if (STREQ(compat, "0.10")) {
> +                        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                                       _("Feature %s not supported with compat"
> +                                         " level %s"),
> +                                       virStorageFileFeatureTypeToString(i),
> +                                       compat);
> +                        goto error;
> +                    }
> +                    break;


With the patches for virNetDevSetupControlFull() my Coverity now runs;
however, it's not very happy here...

The pushed source code  has:
...
+                case VIR_STORAGE_FILE_FEATURE_NONE:
+                case VIR_STORAGE_FILE_FEATURE_LAST:
+                    ;

But VIR_STORAGE_FILE_FEATURE_NONE = -1 and VIR_STORAGE_FILE_FEATURE_LAST
is used as the loop ender and thus Coverity deems the code unreachable
eliciting a "DEADCODE" error since 'i' could never be one or the other.

I suppose the loop could change to:

for (i = VIR_STORAGE_FILE_FEATURE_NONE;
     i <= VIR_STORAGE_FILE_FEATURE_LAST; i++)

but that'd cause virBitmapGetBit() failure since 'i' cannot be negative
in the call to it.

John






> +                case VIR_STORAGE_FILE_FEATURE_LAST:
> +                    ;
> +                }
> +                virBufferAsprintf(&buf, "%s,",
> +                                  virStorageFileFeatureTypeToString(i));
> +            }
> +        }
> +    }
> +
>      virBufferTrim(&buf, ",", -1);
...




More information about the libvir-list mailing list