All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Cody <jcody@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: stefanha@gmail.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2 2/2] vmdk: Read footer for streamOptimized images
Date: Fri, 17 Aug 2012 07:16:20 -0400	[thread overview]
Message-ID: <502E2804.9000803@redhat.com> (raw)
In-Reply-To: <1345110646-12487-1-git-send-email-kwolf@redhat.com>

On 08/16/2012 05:50 AM, Kevin Wolf wrote:
> The footer takes precedence over the header when it exists. It contains
> the real grain directory offset that is missing in the header. Without
> this patch, streamOptimized images with a footer cannot be read.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> v2:
> - Enough footer sanity checks, I hope? :-)
> 
>  block/vmdk.c |   56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 56 insertions(+), 0 deletions(-)
> 
> diff --git a/block/vmdk.c b/block/vmdk.c
> index 9648398..bba4c61 100644
> --- a/block/vmdk.c
> +++ b/block/vmdk.c
> @@ -35,6 +35,7 @@
>  #define VMDK4_FLAG_RGD (1 << 1)
>  #define VMDK4_FLAG_COMPRESS (1 << 16)
>  #define VMDK4_FLAG_MARKER (1 << 17)
> +#define VMDK4_GD_AT_END 0xffffffffffffffffULL
>  
>  typedef struct {
>      uint32_t version;
> @@ -115,6 +116,13 @@ typedef struct VmdkGrainMarker {
>      uint8_t  data[0];
>  } VmdkGrainMarker;
>  
> +enum {
> +    MARKER_END_OF_STREAM    = 0,
> +    MARKER_GRAIN_TABLE      = 1,
> +    MARKER_GRAIN_DIRECTORY  = 2,
> +    MARKER_FOOTER           = 3,
> +};
> +
>  static int vmdk_probe(const uint8_t *buf, int buf_size, const char *filename)
>  {
>      uint32_t magic;
> @@ -451,6 +459,54 @@ static int vmdk_open_vmdk4(BlockDriverState *bs,
>      if (header.capacity == 0 && header.desc_offset) {
>          return vmdk_open_desc_file(bs, flags, header.desc_offset << 9);
>      }
> +
> +    if (le64_to_cpu(header.gd_offset) == VMDK4_GD_AT_END) {
> +        /*
> +         * The footer takes precedence over the header, so read it in. The
> +         * footer starts at offset -1024 from the end: One sector for the
> +         * footer, and another one for the end-of-stream marker.
> +         */
> +        struct {
> +            struct {
> +                uint64_t val;
> +                uint32_t size;
> +                uint32_t type;
> +                uint8_t pad[512 - 16];
> +            } QEMU_PACKED footer_marker;
> +
> +            uint32_t magic;
> +            VMDK4Header header;
> +            uint8_t pad[512 - 4 - sizeof(VMDK4Header)];
> +
> +            struct {
> +                uint64_t val;
> +                uint32_t size;
> +                uint32_t type;
> +                uint8_t pad[512 - 16];
> +            } QEMU_PACKED eos_marker;
> +        } QEMU_PACKED footer;
> +
> +        ret = bdrv_pread(file,
> +            bs->file->total_sectors * 512 - 1536,
> +            &footer, sizeof(footer));
> +        if (ret < 0) {
> +            return ret;
> +        }
> +
> +        /* Some sanity checks for the footer */
> +        if (be32_to_cpu(footer.magic) != VMDK4_MAGIC ||
> +            le32_to_cpu(footer.footer_marker.size) != 0  ||
> +            le32_to_cpu(footer.footer_marker.type) != MARKER_FOOTER ||
> +            le64_to_cpu(footer.eos_marker.val) != 0  ||
> +            le32_to_cpu(footer.eos_marker.size) != 0  ||
> +            le32_to_cpu(footer.eos_marker.type) != MARKER_END_OF_STREAM)
> +        {
> +            return -EINVAL;
> +        }
> +
> +        header = footer.header;
> +    }
> +
>      l1_entry_sectors = le32_to_cpu(header.num_gtes_per_gte)
>                          * le64_to_cpu(header.granularity);
>      if (l1_entry_sectors == 0) {
> 

Reviewed-by: Jeff Cody <jcody@redhat.com>

      parent reply	other threads:[~2012-08-17 11:16 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-16  8:54 [Qemu-devel] [PATCH 0/2] vmdk: Fix streamOptimized images Kevin Wolf
2012-08-16  8:54 ` [Qemu-devel] [PATCH 1/2] vmdk: Fix header structure Kevin Wolf
2012-08-16  8:54 ` [Qemu-devel] [PATCH 2/2] vmdk: Read footer for streamOptimized images Kevin Wolf
2012-08-16  9:17   ` Stefan Hajnoczi
2012-08-16  9:50     ` [Qemu-devel] [PATCH v2 " Kevin Wolf
2012-08-16 10:13       ` Stefan Hajnoczi
2012-08-17 11:16       ` Jeff Cody [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=502E2804.9000803@redhat.com \
    --to=jcody@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.