virtio-blk: handle NULL returns from bdrv_aio_{read, write}
PATCH 1/1 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 <[email protected]>
hw/virtio-blk.c +14 -4
@@ -254,14 +254,24 @@ static void virtio_blk_handle_scsi(VirtIstatic 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)