mirror of
https://github.com/qemu/qemu.git
synced 2024-11-25 20:03:37 +08:00
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>
This commit is contained in:
parent
5c6c3a6c54
commit
87b245db05
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user