Patchwork virtio-blk.c handling of i/o which is not a 512 multiple

login
register
mail settings
Submitter Christoph Hellwig
Date March 30, 2011, 6:55 p.m.
Message ID <20110330185546.GA26589@lst.de>
Download mbox | patch
Permalink /patch/88952/
State New
Headers show

Comments

Christoph Hellwig - March 30, 2011, 6:55 p.m.
On Wed, Mar 30, 2011 at 08:48:18AM +0000, Conor Murphy wrote:
> Is there a requirement for virtio-blk guest drivers that all i/o requests are
> sized in multiples of 512 bytes?

Yes, like for any other block driver.  Of course this should not actually
crash qemu, but rather fail the request.

Does the patch below give you a correct error report?
Conor Murphy - March 31, 2011, 7:52 a.m.
Hi Christoph,

I had already updated my driver to reject non 512 multiple sized requests. I
rolled back this update and applied your patch and I now get a non-zero status
response and no qemu crash!

Thanks for your help,
Conor

Patch

Index: qemu/hw/virtio-blk.c
===================================================================
--- qemu.orig/hw/virtio-blk.c	2011-03-30 20:46:10.268665534 +0200
+++ qemu/hw/virtio-blk.c	2011-03-30 20:49:45.655247322 +0200
@@ -290,6 +290,10 @@  static void virtio_blk_handle_write(Virt
         virtio_blk_rw_complete(req, -EIO);
         return;
     }
+    if (req->qiov.size % req->dev->conf->logical_block_size) {
+        virtio_blk_rw_complete(req, -EIO);
+        return;
+    }
 
     if (mrb->num_writes == 32) {
         virtio_submit_multiwrite(req->dev->bs, mrb);
@@ -317,6 +321,10 @@  static void virtio_blk_handle_read(VirtI
         virtio_blk_rw_complete(req, -EIO);
         return;
     }
+    if (req->qiov.size % req->dev->conf->logical_block_size) {
+        virtio_blk_rw_complete(req, -EIO);
+        return;
+    }
 
     acb = bdrv_aio_readv(req->dev->bs, sector, &req->qiov,
                          req->qiov.size / BDRV_SECTOR_SIZE,