From ad8890a711b4058319f7fa12dab99bda881f7e4b Mon Sep 17 00:00:00 2001 From: Dor Laor <dor@cloudius-systems.com> Date: Fri, 22 Feb 2013 00:22:22 +0200 Subject: [PATCH] Handles aspects of RO disk - fail writes on all paths and call biodone when appropriate --- drivers/virtio-blk.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/virtio-blk.cc b/drivers/virtio-blk.cc index 5f3363a11..84e405781 100644 --- a/drivers/virtio-blk.cc +++ b/drivers/virtio-blk.cc @@ -63,6 +63,7 @@ virtio_blk_write(struct device *dev, struct uio *uio, int ioflags) struct virtio_blk_priv *prv = reinterpret_cast<struct virtio_blk_priv*>(dev->private_data); + if (prv->drv->is_readonly()) return EROFS; if (uio->uio_offset + uio->uio_resid > prv->drv->size()) return EIO; @@ -191,10 +192,7 @@ struct driver virtio_blk_driver = { virtio_d(fmt("\t value = %d len=%d") % (int)(*buf) % ii->_len); } - if (req->bio != nullptr) { - biodone(req->bio); - req->bio = nullptr; - } + biodone(req->bio); delete req; } @@ -208,7 +206,6 @@ struct driver virtio_blk_driver = { if (req_header) delete reinterpret_cast<virtio_blk_outhdr*>(req_header); if (payload) delete payload; if (status) delete status; - if (bio) delete bio; } int virtio_blk::size() { @@ -239,6 +236,8 @@ struct driver virtio_blk_driver = { case BIO_WRITE: if (is_readonly()) { virtio_e("Error: block device is read only"); + bio->bio_flags |= BIO_ERROR | BIO_DONE; + biodone(bio); return EROFS; } type = VIRTIO_BLK_T_OUT; -- GitLab