@@ -1489,6 +1489,16 @@ static int bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv,
return -EINVAL;
}
+ /*
+ * Unaligned requests will automatically be aligned to bl.request_alignment
+ * and we don't want to extend requests to access space beyond the end of
+ * the image, so it's required that the image size is aligned.
+ */
+ if ((bs->total_sectors * BDRV_SECTOR_SIZE) % bs->bl.request_alignment) {
+ error_setg(errp, "Image size is not a multiple of request alignment");
+ return -EINVAL;
+ }
+
assert(bdrv_opt_mem_align(bs) != 0);
assert(bdrv_min_mem_align(bs) != 0);
assert(is_power_of_2(bs->bl.request_alignment));
Unaligned requests will automatically be aligned to bl.request_alignment and we don't want to extend requests to access space beyond the end of the image, so it's required that the image size is aligned. With write requests, this could cause assertion failures like this if RESIZE permissions weren't requested: qemu-img: block/io.c:1910: bdrv_co_write_req_prepare: Assertion `end_sector <= bs->total_sectors || child->perm & BLK_PERM_RESIZE' failed. This was e.g. triggered by qemu-img converting to a target image with 4k request alignment when the image was only aligned to 512 bytes, but not to 4k. Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block.c | 10 ++++++++++ 1 file changed, 10 insertions(+)