From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45677) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ar78m-0003gv-6x for qemu-devel@nongnu.org; Fri, 15 Apr 2016 13:02:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ar78l-0003iP-5t for qemu-devel@nongnu.org; Fri, 15 Apr 2016 13:02:44 -0400 From: Kevin Wolf Date: Fri, 15 Apr 2016 19:02:09 +0200 Message-Id: <1460739742-5315-7-git-send-email-kwolf@redhat.com> In-Reply-To: <1460739742-5315-1-git-send-email-kwolf@redhat.com> References: <1460739742-5315-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PULL 06/19] block/vpc: Use the correct max sector count for VHD images List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-block@nongnu.org Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Jeff Cody The old VHD_MAX_SECTORS value is incorrect, and is a throwback to the CHS calculations. The VHD specification allows images up to 2040 GiB, which (using 512 byte sectors) corresponds to a maximum number of sectors of 0xff000000, rather than the old value of 0xfe0001ff. Update VHD_MAX_SECTORS to reflect the correct value. Also, update comment references to the actual size limit, and correct one compare so that we can have sizes up to the limit. Signed-off-by: Jeff Cody Reviewed-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf --- block/vpc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/block/vpc.c b/block/vpc.c index c9ebc4a..03aee81 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -52,7 +52,7 @@ enum vhd_type { #define VHD_CHS_MAX_H 16 #define VHD_CHS_MAX_S 255 -#define VHD_MAX_SECTORS (65535LL * 255 * 255) +#define VHD_MAX_SECTORS 0xff000000 /* 2040 GiB max image size */ #define VHD_MAX_GEOMETRY (VHD_CHS_MAX_C * VHD_CHS_MAX_H * VHD_CHS_MAX_S) #define VPC_OPT_FORCE_SIZE "force_size" @@ -317,8 +317,8 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags, BDRV_SECTOR_SIZE; } - /* Allow a maximum disk size of approximately 2 TB */ - if (bs->total_sectors >= VHD_MAX_SECTORS) { + /* Allow a maximum disk size of 2040 GiB */ + if (bs->total_sectors > VHD_MAX_SECTORS) { ret = -EFBIG; goto fail; } @@ -722,7 +722,7 @@ static int64_t coroutine_fn vpc_co_get_block_status(BlockDriverState *bs, * 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 ~2 TB. Override + * Returns 0 on success, -EFBIG if the size is larger than 2040 GiB. Override * the hardware EIDE and ATA-2 limit of 16 heads (max disk size of 127 GB) * and instead allow up to 255 heads. */ @@ -927,7 +927,7 @@ static int vpc_create(const char *filename, QemuOpts *opts, Error **errp) if ((int64_t)cyls * heads * secs_per_cyl == VHD_MAX_GEOMETRY) { total_sectors = total_size / BDRV_SECTOR_SIZE; - /* Allow a maximum disk size of approximately 2 TB */ + /* Allow a maximum disk size of 2040 GiB */ if (total_sectors > VHD_MAX_SECTORS) { error_setg(errp, "Disk size is too large, max size is 2040 GiB"); ret = -EFBIG; -- 1.8.3.1