virtio-blk: add VIRTIO_BLK_F_RO feature

When feature VIRTIO_BLK_F_RO is set, virtio-blk only support read
operation.

Signed-off-by: wangyongrong <wangyongrong@xiaomi.com>
This commit is contained in:
wangyongrong
2024-06-03 15:28:18 +08:00
committed by Xiang Xiao
parent 7ec167392c
commit ef58c71582
+8 -1
View File
@@ -43,6 +43,7 @@
/* Block feature bits */
#define VIRTIO_BLK_F_RO 5 /* Disk is read-only */
#define VIRTIO_BLK_F_FLUSH 9 /* Cache flush command support */
/* Block request type */
@@ -360,6 +361,11 @@ static ssize_t virtio_blk_write(FAR struct inode *inode,
DEBUGASSERT(inode->i_private);
priv = inode->i_private;
if (virtio_has_feature(priv->vdev, VIRTIO_BLK_F_RO))
{
return -EPERM;
}
return virtio_blk_rdwr(priv, (FAR void *)buffer, startsector, nsectors,
true);
}
@@ -521,7 +527,8 @@ static int virtio_blk_init(FAR struct virtio_blk_priv_s *priv,
/* Initialize the virtio device */
virtio_set_status(vdev, VIRTIO_CONFIG_STATUS_DRIVER);
virtio_negotiate_features(vdev, 1UL << VIRTIO_BLK_F_FLUSH);
virtio_negotiate_features(vdev, (1UL << VIRTIO_BLK_F_RO) |
(1UL << VIRTIO_BLK_F_FLUSH));
virtio_set_status(vdev, VIRTIO_CONFIG_FEATURES_OK);
vqname[0] = "virtio_blk_vq";