[libvirt] [PATCH 08/30] storagefile: Push 'start' into qcow2GetBackingStoreFormat

Daniel Henrique Barboza danielhb413 at gmail.com
Wed Oct 9 21:00:38 UTC 2019



On 10/7/19 6:49 PM, Cole Robinson wrote:
> This is a step towards making this qcow2GetBackingStoreFormat into
> a generic qcow2 extensions parser
>
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---

Reviewed-by: Daniel Henrique Barboza <danielhb413 at gmail.com>

>   src/util/virstoragefile.c | 33 +++++++++++++++++----------------
>   1 file changed, 17 insertions(+), 16 deletions(-)
>
> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
> index a9a6c3e132..4a3c9df7a2 100644
> --- a/src/util/virstoragefile.c
> +++ b/src/util/virstoragefile.c
> @@ -430,10 +430,22 @@ static int
>   qcow2GetBackingStoreFormat(int *format,
>                              const char *buf,
>                              size_t buf_size,
> -                           size_t extension_start,
>                              size_t extension_end)
>   {
> -    size_t offset = extension_start;
> +    size_t offset;
> +    size_t extension_start;
> +    int version = virReadBufInt32BE(buf + QCOWX_HDR_VERSION);
> +
> +    if (version < 2) {
> +        /* QCow1 doesn't have the extensions capability
> +         * used to store backing format */
> +        return 0;
> +    }
> +
> +    if (version == 2)
> +        extension_start = QCOW2_HDR_TOTAL_SIZE;
> +    else
> +        extension_start = virReadBufInt32BE(buf + QCOW2v3_HDR_SIZE);
>   
>       /*
>        * The extensions take format of
> @@ -445,6 +457,7 @@ qcow2GetBackingStoreFormat(int *format,
>        * Unknown extensions can be ignored by skipping
>        * over "length" bytes in the data stream.
>        */
> +    offset = extension_start;
>       while (offset < (buf_size-8) &&
>              offset < (extension_end-8)) {
>           unsigned int magic = virReadBufInt32BE(buf + offset);
> @@ -487,8 +500,6 @@ qcowXGetBackingStore(char **res,
>   {
>       unsigned long long offset;
>       unsigned int size;
> -    unsigned long long start;
> -    int version;
>   
>       *res = NULL;
>       *format = VIR_STORAGE_FILE_AUTO;
> @@ -546,18 +557,8 @@ qcowXGetBackingStore(char **res,
>        * is stored at QCOW2v3_HDR_SIZE
>        */
>   
> -    version = virReadBufInt32BE(buf + QCOWX_HDR_VERSION);
> -    if (version >= 2) {
> -        /* QCow1 doesn't have the extensions capability
> -         * used to store backing format */
> -        if (version == 2)
> -            start = QCOW2_HDR_TOTAL_SIZE;
> -        else
> -            start = virReadBufInt32BE(buf + QCOW2v3_HDR_SIZE);
> -        if (qcow2GetBackingStoreFormat(format, buf, buf_size,
> -                                       start, offset) < 0)
> -            return BACKING_STORE_INVALID;
> -    }
> +    if (qcow2GetBackingStoreFormat(format, buf, buf_size, offset) < 0)
> +        return BACKING_STORE_INVALID;
>   
>       return BACKING_STORE_OK;
>   }




More information about the libvir-list mailing list