From 3deb03367990ac2f4fc41a6786d6a7f491603904 Mon Sep 17 00:00:00 2001 From: Kevin Wolf <kwolf@redhat.com> Date: Wed, 27 Jan 2010 17:46:45 -0200 Subject: [PATCH 2/2] virtio-blk: Handle bdrv_aio_read/write NULL return RH-Author: Kevin Wolf <kwolf@redhat.com> Message-id: <1264614405-21152-3-git-send-email-kwolf@redhat.com> Patchwork-id: 6724 O-Subject: [PATCH 2/2] virtio-blk: Handle bdrv_aio_read/write NULL return Bugzilla: 552487 RH-Acked-by: Christoph Hellwig <chellwig@redhat.com> RH-Acked-by: Gleb Natapov <gleb@redhat.com> The return value of bdrv_aio_read/write is currently ignored, so if it fails right away instead of calling the callback with an error return later, we're missing errors. They should be handled like any other I/O errors. Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- qemu/hw/virtio-blk.c | 19 ++++++++++++++++--- 1 files changed, 16 insertions(+), 3 deletions(-) Signed-off-by: Glauber Costa <glommer@redhat.com> --- qemu/hw/virtio-blk.c | 19 ++++++++++++++++--- 1 files changed, 16 insertions(+), 3 deletions(-) diff --git a/qemu/hw/virtio-blk.c b/qemu/hw/virtio-blk.c index 55e8bdd..8d3e295 100644 --- a/qemu/hw/virtio-blk.c +++ b/qemu/hw/virtio-blk.c @@ -148,6 +148,8 @@ static void virtio_blk_handle_flush(VirtIOBlockReq *req) static int virtio_blk_handle_write(VirtIOBlockReq *req) { + BlockDriverAIOCB *acb; + if (!req->buffer) { size_t offset = 0; int i; @@ -176,13 +178,19 @@ static int virtio_blk_handle_write(VirtIOBlockReq *req) } } - bdrv_aio_write(req->dev->bs, req->out->sector, req->buffer, req->size / 512, - virtio_blk_rw_complete, req); + acb = bdrv_aio_write(req->dev->bs, req->out->sector, req->buffer, + req->size / 512, virtio_blk_rw_complete, req); + + if (acb == NULL) { + virtio_blk_rw_complete(req, -EIO); + } + return 0; } static int virtio_blk_handle_read(VirtIOBlockReq *req) { + BlockDriverAIOCB *acb; int i; for (i = 0; i < req->elem.in_num - 1; i++) @@ -194,11 +202,16 @@ static int virtio_blk_handle_read(VirtIOBlockReq *req) return -1; } - bdrv_aio_read(req->dev->bs, req->out->sector, + acb = bdrv_aio_read(req->dev->bs, req->out->sector, req->buffer, req->size / 512, virtio_blk_rw_complete, req); + + if (acb == NULL) { + virtio_blk_rw_complete(req, -EIO); + } + return 0; } -- 1.6.5.2