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 = ∈ 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; }; }