From: "Serge E. Hallyn" <serge@hallyn.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 1/1] block/vpc.c: Detect too-large vpc file
Date: Wed, 27 Jul 2011 15:16:58 +0000 [thread overview]
Message-ID: <20110727151658.GA17040@hallyn.com> (raw)
In-Reply-To: <4E2FD01E.9080102@redhat.com>
Quoting Kevin Wolf (kwolf@redhat.com):
> > The footer->size appears to be double the 'real' size. So I'm actually doing
> > the blow. Does this seem sensible?
>
> Double size sounds really weird. 'qemu-img create' uses the size in
> bytes for it. Is that wrong?
>
> > Doing it this way, trying to convert the image gives me '-EPERM' rather than
> > -EFBIG. Not sure where we are best off catching that.
>
> Hm, any idea where the -EPERM (-1) comes from? Maybe wrong total_sectors
> number you're calculating?
No, vpc.c in some places just returns 0 or -1, while that return value is
taken to be a more meaningful errno by the caller. -1 is EPERM. That's
why my original patch had to return -EFBIG.
> > Subject: [PATCH 1/1] vpc: accurately detect file size
> >
> > VHD files technically can be up to 2Tb, but virtual pc uses CHS which
> > is limited to 127G. Currently qemu-img refused to create vpc files > 127G,
> > but it reports any file >= 127G as being 127G. If asked to convert such a
> > file, it creates a 127G (truncated) file without returning error.
> >
> > This patch uses the size reported in the footer to detect whether the
> > size is > 127G, and reports the size stored in footer if so.
> >
> > qemu-img info now reports the correct size.
> >
> > qemu-img convert refuses, but returns -EPERM rather than -EFBIG.
> >
> > See https://bugs.launchpad.net/qemu/+bug/814222 for details.
> >
> > Changelog: follow Kevin Wolf's suggestion for detecting true file size.
> >
> > Signed-off-by: Serge Hallyn <serge.hallyn@canonical.com>
> > ---
> > block/vpc.c | 10 ++++++++--
> > 1 files changed, 8 insertions(+), 2 deletions(-)
> >
> > diff --git a/block/vpc.c b/block/vpc.c
> > index 56865da..37eebc2 100644
> > --- a/block/vpc.c
> > +++ b/block/vpc.c
> > @@ -173,8 +173,14 @@ static int vpc_open(BlockDriverState *bs, int flags)
> > // The visible size of a image in Virtual PC depends on the geometry
> > // rather than on the size stored in the footer (the size in the footer
> > // is too large usually)
> > - bs->total_sectors = (int64_t)
> > - be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl;
> > + // If the size stored in the footer is larger than CHS can represent,
> > + // then use the size stored in the footer.
> > + if (footer->size > (uint64_t) 65536 * 16 * 255 * 2) {
> > + bs->total_sectors = footer->size / 2;
>
> If footer->size is the double byte count, then it would be:;
>
> + if (footer->size / 2 > (uint64_t) 65536 * 16 * 255 * 512) {
> + bs->total_sectors = 512 * footer->size / 2;
I'm just reporting the facts :) The patch I sent ended up returning
the right size for 140G dynamic VHD image.
So given our fuzziness on the actual meanings, I think the right thing
to do is just:
if (footer->size > 65536 * 16 * 255 * 2)
return -EFBIG;
> Your calculation would assume that footer->size uses units of 256 bytes,
> which appears rather unlikely.
next prev parent reply other threads:[~2011-07-27 15:16 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-25 18:34 [Qemu-devel] [PATCH 1/1] block/vpc.c: Detect too-large vpc file Serge E. Hallyn
2011-07-26 9:01 ` Kevin Wolf
2011-07-26 16:08 ` Serge E. Hallyn
2011-07-26 16:20 ` Kevin Wolf
2011-07-26 20:26 ` Serge E. Hallyn
2011-07-27 8:45 ` Kevin Wolf
2011-07-27 15:16 ` Serge E. Hallyn [this message]
2011-07-27 8:51 ` Kevin Wolf
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=20110727151658.GA17040@hallyn.com \
--to=serge@hallyn.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
/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.