diff --git a/drivers/virtio-blk.cc b/drivers/virtio-blk.cc
index 6e1ccb18cfbfedfd79c9c590114e559147a7a70b..280a51915261342652c2209ae3511ced7b8c02dd 100644
--- a/drivers/virtio-blk.cc
+++ b/drivers/virtio-blk.cc
@@ -86,7 +86,7 @@ struct driver virtio_blk_driver = {
 };
 
     virtio_blk::virtio_blk(unsigned dev_idx)
-        : virtio_driver(VIRTIO_BLK_DEVICE_ID, dev_idx)
+        : virtio_driver(VIRTIO_BLK_DEVICE_ID, dev_idx), _ro(false)
     {
         std::stringstream ss;
         ss << "virtio-blk" << dev_idx;
@@ -155,6 +155,10 @@ struct driver virtio_blk_driver = {
         }
         if (_dev->get_guest_feature_bit(VIRTIO_BLK_F_CONFIG_WCE))
             virtio_i(fmt("The write cache enable of the device is %d") % (u32)_config.wce);
+        if (_dev->get_guest_feature_bit(VIRTIO_BLK_F_RO)) {
+            set_readonly();
+            virtio_i(fmt("Device is read only"));
+        }
 
         return true;
     }
@@ -233,6 +237,10 @@ struct driver virtio_blk_driver = {
             buf_count = &in;
             break;
         case BIO_WRITE:
+            if (is_readonly()) {
+                virtio_e("Error: block device is read only");
+                return EROFS;
+            }
             type = VIRTIO_BLK_T_OUT;
             buf_count = &out;
             break;
diff --git a/drivers/virtio-blk.hh b/drivers/virtio-blk.hh
index e444bfe7913f880440fb4ee6ae2fa8b77efe12a4..1ab92dd601892db103d6c449ebab54a474566903 100644
--- a/drivers/virtio-blk.hh
+++ b/drivers/virtio-blk.hh
@@ -165,6 +165,9 @@ namespace virtio {
         void response_worker();
         int size();
 
+        void set_readonly() {_ro = true;}
+        bool is_readonly() {return _ro;}
+
     private:
 
         std::string _driver_name;
@@ -173,6 +176,7 @@ namespace virtio {
         //maintains the virtio instance number for multiple drives
         static int _instance;
         int _id;
+        bool _ro;
     };
 
 }