From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lu6NL-0006gw-IS for qemu-devel@nongnu.org; Wed, 15 Apr 2009 10:46:07 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lu6NK-0006gj-CI for qemu-devel@nongnu.org; Wed, 15 Apr 2009 10:46:06 -0400 Received: from [199.232.76.173] (port=46617 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lu6NK-0006gg-9W for qemu-devel@nongnu.org; Wed, 15 Apr 2009 10:46:06 -0400 Received: from hall.aurel32.net ([88.191.82.174]:47273) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Lu6NJ-0003RI-FZ for qemu-devel@nongnu.org; Wed, 15 Apr 2009 10:46:06 -0400 Date: Wed, 15 Apr 2009 16:45:58 +0200 From: Aurelien Jarno Subject: Re: [Qemu-devel] [PATCH v2] block-vpc: Don't silently create smaller image than requested Message-ID: <20090415144558.GD13794@volta.aurel32.net> References: <1239202145-18271-1-git-send-email-kwolf@redhat.com> <20090408225316.GA23493@volta.aurel32.net> <49DDA71A.7050307@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <49DDA71A.7050307@redhat.com> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf Cc: qemu-devel@nongnu.org On Thu, Apr 09, 2009 at 09:43:22AM +0200, Kevin Wolf wrote: > Aurelien Jarno schrieb: >> On Wed, Apr 08, 2009 at 04:49:05PM +0200, Kevin Wolf wrote: >>> The algorithm from the VHD specification for CHS calculation silently limits >>> images to 127 GB which may confuse a user who requested a larger image. Better >>> output an error message and abort. >>> >>> Signed-off-by: Kevin Wolf >>> --- >>> block-vpc.c | 9 ++++++--- >>> qemu-img.c | 4 ++++ >>> 2 files changed, 10 insertions(+), 3 deletions(-) >>> >>> diff --git a/block-vpc.c b/block-vpc.c >>> index 7ae5202..d915d20 100644 >>> --- a/block-vpc.c >>> +++ b/block-vpc.c >>> @@ -433,14 +433,16 @@ static int vpc_write(BlockDriverState *bs, int64_t sector_num, >>> * >>> * Note that the geometry doesn't always exactly match total_sectors but >>> * may round it down. >>> + * >>> + * Returns 0 on success, -EFBIG if the size is larger than 127 GB >>> */ >> >> Actually 0 is never returned, leading to a warning: >> CC block-vpc.o >> block-vpc.c: In function ‘calculate_geometry’: >> block-vpc.c:475: warning: control reaches end of non-void function > > Oops, you're right. I'm pretty sure that it compiled fine when I tested > it. Maybe forgot to commit or something. > > Please find attached a new version which actually contains a return 0. Thanks, applied. > Kevin > From 9d612c70ee232443337c79825afd754aad1db878 Mon Sep 17 00:00:00 2001 > From: Kevin Wolf > Date: Wed, 8 Apr 2009 15:44:04 +0200 > Subject: [PATCH] block-vpc: Don't silently create smaller image than requested > > The algorithm from the VHD specification for CHS calculation silently limits > images to 127 GB which may confuse a user who requested a larger image. Better > output an error message and abort. > > Signed-off-by: Kevin Wolf > --- > block-vpc.c | 11 ++++++++--- > qemu-img.c | 4 ++++ > 2 files changed, 12 insertions(+), 3 deletions(-) > > diff --git a/block-vpc.c b/block-vpc.c > index 7ae5202..71a171d 100644 > --- a/block-vpc.c > +++ b/block-vpc.c > @@ -433,14 +433,16 @@ static int vpc_write(BlockDriverState *bs, int64_t sector_num, > * > * Note that the geometry doesn't always exactly match total_sectors but > * may round it down. > + * > + * Returns 0 on success, -EFBIG if the size is larger than 127 GB > */ > -static void calculate_geometry(int64_t total_sectors, uint16_t* cyls, > +static int calculate_geometry(int64_t total_sectors, uint16_t* cyls, > uint8_t* heads, uint8_t* secs_per_cyl) > { > uint32_t cyls_times_heads; > > if (total_sectors > 65535 * 16 * 255) > - total_sectors = 65535 * 16 * 255; > + return -EFBIG; > > if (total_sectors > 65535 * 16 * 63) { > *secs_per_cyl = 255; > @@ -470,6 +472,8 @@ static void calculate_geometry(int64_t total_sectors, uint16_t* cyls, > // Note: Rounding up deviates from the Virtual PC behaviour > // However, we need this to avoid truncating images in qemu-img convert > *cyls = (cyls_times_heads + *heads - 1) / *heads; > + > + return 0; > } > > static int vpc_create(const char *filename, int64_t total_sectors, > @@ -493,7 +497,8 @@ static int vpc_create(const char *filename, int64_t total_sectors, > return -EIO; > > // Calculate matching total_size and geometry > - calculate_geometry(total_sectors, &cyls, &heads, &secs_per_cyl); > + if (calculate_geometry(total_sectors, &cyls, &heads, &secs_per_cyl)) > + return -EFBIG; > total_sectors = (int64_t) cyls * heads * secs_per_cyl; > > // Prepare the Hard Disk Footer > diff --git a/qemu-img.c b/qemu-img.c > index 913ad34..ccf4a6f 100644 > --- a/qemu-img.c > +++ b/qemu-img.c > @@ -306,6 +306,8 @@ static int img_create(int argc, char **argv) > if (ret < 0) { > if (ret == -ENOTSUP) { > error("Formatting or formatting option not supported for file format '%s'", fmt); > + } else if (ret == -EFBIG) { > + error("The image size is too large for file format '%s'", fmt); > } else { > error("Error while formatting"); > } > @@ -494,6 +496,8 @@ static int img_convert(int argc, char **argv) > if (ret < 0) { > if (ret == -ENOTSUP) { > error("Formatting not supported for file format '%s'", out_fmt); > + } else if (ret == -EFBIG) { > + error("The image size is too large for file format '%s'", out_fmt); > } else { > error("Error while formatting '%s'", out_filename); > } > -- > 1.6.0.6 > -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurelien@aurel32.net http://www.aurel32.net