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