From 87b245db05aac9bcdb70a4f0af0fc5f353c5a9f8 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Thu, 13 Aug 2009 16:49:56 +0200 Subject: [PATCH] virtio-blk: handle NULL returns from bdrv_aio_{read, write} The bdrv_aio_{read,write} routines can return a NULL pointer when the I/O submission fails. Currently we ignore this and will wait forever for an I/O completion and leading to a hang of the guest. I can easily reproduce this using the native Linux AIO patch, but it's also possible using normal pthreads-based AIO. Signed-off-by: Christoph Hellwig Signed-off-by: Anthony Liguori --- hw/virtio-blk.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index c278d2ef0a..c1602460ba 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -254,14 +254,24 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *req) static void virtio_blk_handle_write(VirtIOBlockReq *req) { - bdrv_aio_writev(req->dev->bs, req->out->sector, &req->qiov, - req->qiov.size / 512, virtio_blk_rw_complete, req); + BlockDriverAIOCB *acb; + + acb = bdrv_aio_writev(req->dev->bs, req->out->sector, &req->qiov, + req->qiov.size / 512, virtio_blk_rw_complete, req); + if (!acb) { + virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR); + } } static void virtio_blk_handle_read(VirtIOBlockReq *req) { - bdrv_aio_readv(req->dev->bs, req->out->sector, &req->qiov, - req->qiov.size / 512, virtio_blk_rw_complete, req); + BlockDriverAIOCB *acb; + + acb = bdrv_aio_readv(req->dev->bs, req->out->sector, &req->qiov, + req->qiov.size / 512, virtio_blk_rw_complete, req); + if (!acb) { + virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR); + } } static void virtio_blk_handle_output(VirtIODevice *vdev, VirtQueue *vq)