diff options
author | Christoph Hellwig <hch@lst.de> | 2009-08-13 16:49:56 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-08-27 20:30:23 -0500 |
commit | 87b245db05aac9bcdb70a4f0af0fc5f353c5a9f8 (patch) | |
tree | 276c407258d25658da8d2ee2290a1b716825d3a7 | |
parent | 5c6c3a6c54b23caa84fb4e046e85a461612279bb (diff) |
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 <hch@lst.de>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | hw/virtio-blk.c | 18 |
1 files 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) |