From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50666) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZxGKl-00067j-9Q for qemu-devel@nongnu.org; Fri, 13 Nov 2015 10:32:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZxGKg-00084h-Nh for qemu-devel@nongnu.org; Fri, 13 Nov 2015 10:32:15 -0500 Received: from mail-wm0-x233.google.com ([2a00:1450:400c:c09::233]:33491) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZxGKg-00084T-Ih for qemu-devel@nongnu.org; Fri, 13 Nov 2015 10:32:10 -0500 Received: by wmec201 with SMTP id c201so86867405wme.0 for ; Fri, 13 Nov 2015 07:32:09 -0800 (PST) From: Lucian Petrut Date: Fri, 13 Nov 2015 17:32:04 +0200 Message-Id: <1447428724-28116-1-git-send-email-lpetrut@cloudbasesolutions.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------2.1.4" Subject: [Qemu-devel] block/vpc: Fix vhd extra sectors issue List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, Lucian Petrut This is a multi-part message in MIME format. --------------2.1.4 Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit At the moment, qemu-img extends new image virtual sizes based on the CHS algorithm provided by the VHD specs in order to ensure that the disk geometry (and payload as seen by some guests which use the CHS value) can fit in the requested disk. This patch drops this behavior, as it breaks compatibility with Azure, which requires the MB alignment to be preserved. Signed-off-by: Lucian Petrut --- Proposed fix for https://bugs.launchpad.net/qemu/+bug/1490611 block/vpc.c | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) --------------2.1.4 Content-Type: text/x-patch; name="0001-block-vpc-Fix-vhd-extra-sectors-issue.patch" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="0001-block-vpc-Fix-vhd-extra-sectors-issue.patch" diff --git a/block/vpc.c b/block/vpc.c index 299d373..77c0a28 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -762,7 +762,6 @@ static int vpc_create(const char *filename, QemuOpts *opts, Error **errp) uint8_t buf[1024]; VHDFooter *footer = (VHDFooter *) buf; char *disk_type_param; - int i; uint16_t cyls = 0; uint8_t heads = 0; uint8_t secs_per_cyl = 0; @@ -802,31 +801,16 @@ static int vpc_create(const char *filename, QemuOpts *opts, Error **errp) goto out; } - /* - * Calculate matching total_size and geometry. Increase the number of - * sectors requested until we get enough (or fail). This ensures that - * qemu-img convert doesn't truncate images, but rather rounds up. - * - * If the image size can't be represented by a spec conform CHS geometry, - * we set the geometry to 65535 x 16 x 255 (CxHxS) sectors and use - * the image size from the VHD footer to calculate total_sectors. - */ - total_sectors = MIN(VHD_MAX_GEOMETRY, total_size / BDRV_SECTOR_SIZE); - for (i = 0; total_sectors > (int64_t)cyls * heads * secs_per_cyl; i++) { - calculate_geometry(total_sectors + i, &cyls, &heads, &secs_per_cyl); - } - - if ((int64_t)cyls * heads * secs_per_cyl == VHD_MAX_GEOMETRY) { - total_sectors = total_size / BDRV_SECTOR_SIZE; + total_sectors = total_size / BDRV_SECTOR_SIZE; + if (total_sectors > VHD_MAX_SECTORS) { /* Allow a maximum disk size of approximately 2 TB */ - if (total_sectors > VHD_MAX_SECTORS) { - ret = -EFBIG; - goto out; - } - } else { - total_sectors = (int64_t)cyls * heads * secs_per_cyl; - total_size = total_sectors * BDRV_SECTOR_SIZE; + ret = -EFBIG; + goto out; } + /* + * Calculate geometry. + */ + calculate_geometry(total_sectors, &cyls, &heads, &secs_per_cyl); /* Prepare the Hard Disk Footer */ memset(buf, 0, 1024); --------------2.1.4--