Thread (6 messages) 6 messages, 3 authors, 2020-07-15

Re: [PATCH] virtio-blk: check host supplied logical block size

From: "Michael S. Tsirkin" <mst@redhat.com>
Date: 2020-07-15 11:53:17
Also in: linux-block, lkml

On Wed, Jul 15, 2020 at 01:19:55PM +0300, Maxim Levitsky wrote:
On Wed, 2020-07-15 at 06:06 -0400, Michael S. Tsirkin wrote:
quoted
On Wed, Jul 15, 2020 at 12:55:18PM +0300, Maxim Levitsky wrote:
quoted
Linux kernel only supports logical block sizes which are power of
two,
at least 512 bytes and no more that PAGE_SIZE.

Check this instead of crashing later on.

Note that there is no need to check physical block size since it is
only a hint, and virtio-blk already only supports power of two
values.

Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1664619

Signed-off-by: Maxim Levitsky <redacted>
---
 drivers/block/virtio_blk.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 980df853ee497..36dda31cc4e96 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -681,6 +681,12 @@ static const struct blk_mq_ops virtio_mq_ops =
{
 static unsigned int virtblk_queue_depth;
 module_param_named(queue_depth, virtblk_queue_depth, uint, 0444);
 
+
+static bool virtblk_valid_block_size(unsigned int blksize)
+{
+	return blksize >= 512 && blksize <= PAGE_SIZE &&
is_power_of_2(blksize);
+}
+
Is this a blk core assumption? in that case, does not this belong
in blk core?
It is a blk core assumption. 
I had checked other drivers and these that have variable block size all
check this manually like that.

I don't mind fixing all of them but I am a bit afraid to create
too much mess.
You don't have to, start by adding this in blk core and using in virtio.
Patches to update all drivers can then come separately.
quoted
quoted
 static int virtblk_probe(struct virtio_device *vdev)
 {
 	struct virtio_blk *vblk;
@@ -809,9 +815,16 @@ static int virtblk_probe(struct virtio_device
*vdev)
 	err = virtio_cread_feature(vdev, VIRTIO_BLK_F_BLK_SIZE,
 				   struct virtio_blk_config, blk_size,
 				   &blk_size);
-	if (!err)
+	if (!err) {
+		if (!virtblk_valid_block_size(blk_size)) {
+			dev_err(&vdev->dev,
+				"%s failure: unsupported logical block
size %d\n",
+				__func__, blk_size);
+			err = -EINVAL;
+			goto out_cleanup_queue;
+		}
 		blk_queue_logical_block_size(q, blk_size);
-	else
+	} else
 		blk_size = queue_logical_block_size(q);
 
 	/* Use topology information if available */
OK so if we are doing this pls add {} around  blk_size =
queue_logical_block_size(q);
too.
Will do.
quoted
quoted
@@ -872,6 +885,9 @@ static int virtblk_probe(struct virtio_device
*vdev)
 	device_add_disk(&vdev->dev, vblk->disk, virtblk_attr_groups);
 	return 0;
 
+out_cleanup_queue:
+	blk_cleanup_queue(vblk->disk->queue);
+	vblk->disk->queue = NULL;
 out_free_tags:
 	blk_mq_free_tag_set(&vblk->tag_set);
 out_put_disk:
-- 
2.26.2

Best regards,
	Maxim Levitsky
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help