qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Lieven <pl@kamp.de>
To: Max Reitz <mreitz@redhat.com>, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Stefan Weil <sw@weilnetz.de>,
	Jeff Cody <jcody@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH] block/vdi: Limit maximum size even futher
Date: Mon, 27 Oct 2014 12:10:10 +0100	[thread overview]
Message-ID: <544E2812.2000301@kamp.de> (raw)
In-Reply-To: <1414407405-20895-1-git-send-email-mreitz@redhat.com>

On 27.10.2014 11:56, Max Reitz wrote:
> The block layer read and write functions do not like requests which are
> bigger than INT_MAX bytes. Since the VDI bmap is read and written in a
> single operation, its size is therefore limited accordingly. This
> reduces the maximum VDI image size supported by QEMU to half of what it
> currently is (down to approximately 512 TB).
>
> The VDI test 084 has to be adapted accordingly. Actually, one could
> clearly see that it was broken from the "Could not open
> 'TEST_DIR/t.IMGFMT': Invalid argument" line for an image which was
> supposed to work just fine.
>
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
> The really funny thing about this is that test 084 still fails after
> this patch for me because the computer I am currently working on only
> has 4G of main memory (which is exactly what VDI requires for a 512T
> image). Any reviewer is therefore kindly asked to test this test
> him-/herself; I will do so once I am home (and once I remember to do
> it).
> ---
>   block/vdi.c                |  6 ++++--
>   tests/qemu-iotests/084     | 14 +++++++-------
>   tests/qemu-iotests/084.out | 13 ++++++++-----
>   3 files changed, 19 insertions(+), 14 deletions(-)
>
> diff --git a/block/vdi.c b/block/vdi.c
> index 19701ee..f25e4b5 100644
> --- a/block/vdi.c
> +++ b/block/vdi.c
> @@ -120,8 +120,10 @@ typedef unsigned char uuid_t[16];
>   
>   #define VDI_IS_ALLOCATED(X) ((X) < VDI_DISCARDED)
>   
> -/* max blocks in image is (0xffffffff / 4) */
> -#define VDI_BLOCKS_IN_IMAGE_MAX  0x3fffffff
> +/* The bmap will take up VDI_BLOCKS_IN_IMAGE_MAX * sizeof(uint32_t) bytes; since
> + * the bmap is read and written in a single operation, its size needs to be
> + * limited to INT_MAX */
> +#define VDI_BLOCKS_IN_IMAGE_MAX  ((unsigned)(INT_MAX / sizeof(uint32_t)))
Test 084 doesn't work:

lieven@lieven-pc:~/git/qemu/tests/qemu-iotests$ ./check -vdi 084
QEMU          -- ./qemu
QEMU_IMG      -- ./qemu-img
QEMU_IO       -- ./qemu-io
QEMU_NBD      -- /home/lieven/git/qemu/tests/qemu-iotests/../../qemu-nbd
IMGFMT        -- vdi
IMGPROTO      -- file
PLATFORM      -- Linux/x86_64 lieven-pc 3.13.0-38-generic
SOCKET_SCM_HELPER -- /home/lieven/git/qemu/tests/qemu-iotests/socket_scm_helper

084 4s ... - output mismatch (see 084.out.bad)
--- /home/lieven/git/qemu/tests/qemu-iotests/084.out    2014-10-27 12:08:40.229116502 +0100
+++ 084.out.bad    2014-10-27 12:09:01.516700174 +0100
@@ -18,10 +18,7 @@
  cluster_size: 1048576
  disk image file size in bytes: 1024
  Test 1: Maximum size (512 TB):
-image: TEST_DIR/t.IMGFMT
-file format: IMGFMT
-virtual size: 512T (562949952372736 bytes)
-cluster_size: 1048576
+qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Could not open 'TEST_DIR/t.IMGFMT': Invalid argument

  Test 2: Size too large (512TB + 1)
  qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Unsupported VDI image size (size is 0x1fffffff10000, max supported is 0x1fffffff00000)
Failures: 084
Failed 1 of 1 tests

Peter

>   #define VDI_DISK_SIZE_MAX        ((uint64_t)VDI_BLOCKS_IN_IMAGE_MAX * \
>                                     (uint64_t)DEFAULT_CLUSTER_SIZE)
>   
> diff --git a/tests/qemu-iotests/084 b/tests/qemu-iotests/084
> index 2712c02..9b710e5 100755
> --- a/tests/qemu-iotests/084
> +++ b/tests/qemu-iotests/084
> @@ -66,15 +66,15 @@ stat -c"disk image file size in bytes: %s" "${TEST_IMG}"
>   
>   # check for image size too large
>   # poke max image size, and appropriate blocks_in_image value
> -echo "Test 1: Maximum size (1024 TB):"
> -poke_file "$TEST_IMG" "$ds_offset" "\x00\x00\xf0\xff\xff\xff\x03\x00"
> -poke_file "$TEST_IMG" "$bii_offset" "\xff\xff\xff\x3f"
> +echo "Test 1: Maximum size (512 TB):"
> +poke_file "$TEST_IMG" "$ds_offset" "\x00\x00\xf0\xff\xff\xff\x01\x00"
> +poke_file "$TEST_IMG" "$bii_offset" "\xff\xff\xff\x1f"
>   _img_info
>   
>   echo
> -echo "Test 2: Size too large (1024TB + 1)"
> +echo "Test 2: Size too large (512TB + 1)"
>   # This should be too large (-EINVAL):
> -poke_file "$TEST_IMG" "$ds_offset" "\x00\x00\xf1\xff\xff\xff\x03\x00"
> +poke_file "$TEST_IMG" "$ds_offset" "\x00\x00\xf1\xff\xff\xff\x01\x00"
>   _img_info
>   
>   echo
> @@ -89,9 +89,9 @@ _img_info
>   
>   echo
>   echo "Test 4: Size valid (64M), but Blocks In Image exceeds max allowed"
> -# Now check the bounds of blocks_in_image - 0x3fffffff should be the max
> +# Now check the bounds of blocks_in_image - 0x1fffffff should be the max
>   # value here, and we should get -ENOTSUP
> -poke_file "$TEST_IMG" "$bii_offset" "\x00\x00\x00\x40"
> +poke_file "$TEST_IMG" "$bii_offset" "\x00\x00\x00\x20"
>   _img_info
>   
>   # Finally, 1MB is the only block size supported.  Verify that
> diff --git a/tests/qemu-iotests/084.out b/tests/qemu-iotests/084.out
> index ea29ae0..4ac0157 100644
> --- a/tests/qemu-iotests/084.out
> +++ b/tests/qemu-iotests/084.out
> @@ -17,17 +17,20 @@ file format: IMGFMT
>   virtual size: 64M (67108864 bytes)
>   cluster_size: 1048576
>   disk image file size in bytes: 1024
> -Test 1: Maximum size (1024 TB):
> -qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Could not open 'TEST_DIR/t.IMGFMT': Invalid argument
> +Test 1: Maximum size (512 TB):
> +image: TEST_DIR/t.IMGFMT
> +file format: IMGFMT
> +virtual size: 512T (562949952372736 bytes)
> +cluster_size: 1048576
>   
> -Test 2: Size too large (1024TB + 1)
> -qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Unsupported VDI image size (size is 0x3fffffff10000, max supported is 0x3fffffff00000)
> +Test 2: Size too large (512TB + 1)
> +qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Unsupported VDI image size (size is 0x1fffffff10000, max supported is 0x1fffffff00000)
>   
>   Test 3: Size valid (64M), but Blocks In Image too small (63)
>   qemu-img: Could not open 'TEST_DIR/t.IMGFMT': unsupported VDI image (disk size 67108864, image bitmap has room for 66060288)
>   
>   Test 4: Size valid (64M), but Blocks In Image exceeds max allowed
> -qemu-img: Could not open 'TEST_DIR/t.IMGFMT': unsupported VDI image (too many blocks 1073741824, max is 1073741823)
> +qemu-img: Could not open 'TEST_DIR/t.IMGFMT': unsupported VDI image (too many blocks 536870912, max is 536870911)
>   
>   Test 5: Valid Image: 64MB, Blocks In Image 64, Block Size 1MB
>   image: TEST_DIR/t.IMGFMT

  reply	other threads:[~2014-10-27 11:10 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-27 10:56 [Qemu-devel] [PATCH] block/vdi: Limit maximum size even futher Max Reitz
2014-10-27 11:10 ` Peter Lieven [this message]
2014-10-27 11:39   ` Max Reitz
2014-10-27 11:40     ` Max Reitz

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=544E2812.2000301@kamp.de \
    --to=pl@kamp.de \
    --cc=jcody@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=sw@weilnetz.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).