[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[qemu-xen master] block: Require aligned image size to avoid assertion failure



commit 9c60a5d1978e6dcf85c0e01b50e6f7f54ca09104
Author:     Kevin Wolf <kwolf@xxxxxxxxxx>
AuthorDate: Thu Jul 16 16:26:00 2020 +0200
Commit:     Kevin Wolf <kwolf@xxxxxxxxxx>
CommitDate: Fri Jul 17 14:20:57 2020 +0200

    block: Require aligned image size to avoid assertion failure
    
    Unaligned requests will automatically be aligned to bl.request_alignment
    and we can't extend write requests to access space beyond the end of the
    image without resizing the image, so if we have the WRITE permission,
    but not the RESIZE one, it's required that the image size is aligned.
    
    Failing to meet this requirement 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.
    
    Turn this into a graceful error in bdrv_check_perm() so that WRITE
    without RESIZE can only be taken if the image size is aligned. If a user
    holds both permissions and drops only RESIZE, the function will return
    an error, but bdrv_child_try_set_perm() will ignore the failure silently
    if permissions are only requested to be relaxed and just keep both
    permissions while returning success.
    
    Signed-off-by: Kevin Wolf <kwolf@xxxxxxxxxx>
    Message-Id: <20200716142601.111237-2-kwolf@xxxxxxxxxx>
    Reviewed-by: Max Reitz <mreitz@xxxxxxxxxx>
    Signed-off-by: Kevin Wolf <kwolf@xxxxxxxxxx>
---
 block.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/block.c b/block.c
index 35a372df57..d9ac0e07eb 100644
--- a/block.c
+++ b/block.c
@@ -2025,6 +2025,22 @@ static int bdrv_check_perm(BlockDriverState *bs, 
BlockReopenQueue *q,
         return -EPERM;
     }
 
+    /*
+     * Unaligned requests will automatically be aligned to bl.request_alignment
+     * and without RESIZE we can't extend requests to write to space beyond the
+     * end of the image, so it's required that the image size is aligned.
+     */
+    if ((cumulative_perms & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED)) &&
+        !(cumulative_perms & BLK_PERM_RESIZE))
+    {
+        if ((bs->total_sectors * BDRV_SECTOR_SIZE) % bs->bl.request_alignment) 
{
+            error_setg(errp, "Cannot get 'write' permission without 'resize': "
+                             "Image size is not a multiple of request "
+                             "alignment");
+            return -EPERM;
+        }
+    }
+
     /* Check this node */
     if (!drv) {
         return 0;
--
generated by git-patchbot for /home/xen/git/qemu-xen.git#master



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.