mirror of https://github.com/xemu-project/xemu.git
block/vpc: Use the correct max sector count for VHD images
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 <jcody@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
bab246db1d
commit
c23fb11bbb
10
block/vpc.c
10
block/vpc.c
|
@ -52,7 +52,7 @@ enum vhd_type {
|
||||||
#define VHD_CHS_MAX_H 16
|
#define VHD_CHS_MAX_H 16
|
||||||
#define VHD_CHS_MAX_S 255
|
#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 VHD_MAX_GEOMETRY (VHD_CHS_MAX_C * VHD_CHS_MAX_H * VHD_CHS_MAX_S)
|
||||||
|
|
||||||
#define VPC_OPT_FORCE_SIZE "force_size"
|
#define VPC_OPT_FORCE_SIZE "force_size"
|
||||||
|
@ -317,8 +317,8 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
|
||||||
BDRV_SECTOR_SIZE;
|
BDRV_SECTOR_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow a maximum disk size of approximately 2 TB */
|
/* Allow a maximum disk size of 2040 GiB */
|
||||||
if (bs->total_sectors >= VHD_MAX_SECTORS) {
|
if (bs->total_sectors > VHD_MAX_SECTORS) {
|
||||||
ret = -EFBIG;
|
ret = -EFBIG;
|
||||||
goto fail;
|
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
|
* Note that the geometry doesn't always exactly match total_sectors but
|
||||||
* may round it down.
|
* 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)
|
* the hardware EIDE and ATA-2 limit of 16 heads (max disk size of 127 GB)
|
||||||
* and instead allow up to 255 heads.
|
* 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) {
|
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;
|
||||||
/* Allow a maximum disk size of approximately 2 TB */
|
/* Allow a maximum disk size of 2040 GiB */
|
||||||
if (total_sectors > VHD_MAX_SECTORS) {
|
if (total_sectors > VHD_MAX_SECTORS) {
|
||||||
error_setg(errp, "Disk size is too large, max size is 2040 GiB");
|
error_setg(errp, "Disk size is too large, max size is 2040 GiB");
|
||||||
ret = -EFBIG;
|
ret = -EFBIG;
|
||||||
|
|
Loading…
Reference in New Issue