]> git.itanic.dy.fi Git - linux-stable/commitdiff
virtio_blk: cleanup zoned device probing
authorChristoph Hellwig <hch@lst.de>
Sun, 17 Dec 2023 16:53:55 +0000 (17:53 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 20 Dec 2023 03:17:43 +0000 (20:17 -0700)
Move reading and checking the zoned model from virtblk_probe_zoned_device
into the caller, leaving only the code to perform the actual setup for
host managed zoned devices in virtblk_probe_zoned_device.

This allows to share the model reading and sharing between builds with
and without CONFIG_BLK_DEV_ZONED, and improve it for the
!CONFIG_BLK_DEV_ZONED case.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20231217165359.604246-2-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/virtio_blk.c

index d53d6aa8ee69a4e38dc2a627bc6095b30028c82b..aeead732a24dc9bb6c4b7cea3ceef1448fad672f 100644 (file)
@@ -748,22 +748,6 @@ static int virtblk_probe_zoned_device(struct virtio_device *vdev,
                                       struct request_queue *q)
 {
        u32 v, wg;
-       u8 model;
-
-       virtio_cread(vdev, struct virtio_blk_config,
-                    zoned.model, &model);
-
-       switch (model) {
-       case VIRTIO_BLK_Z_NONE:
-       case VIRTIO_BLK_Z_HA:
-               /* Present the host-aware device as non-zoned */
-               return 0;
-       case VIRTIO_BLK_Z_HM:
-               break;
-       default:
-               dev_err(&vdev->dev, "unsupported zone model %d\n", model);
-               return -EINVAL;
-       }
 
        dev_dbg(&vdev->dev, "probing host-managed zoned device\n");
 
@@ -846,16 +830,9 @@ static inline void virtblk_revalidate_zones(struct virtio_blk *vblk)
 static inline int virtblk_probe_zoned_device(struct virtio_device *vdev,
                        struct virtio_blk *vblk, struct request_queue *q)
 {
-       u8 model;
-
-       virtio_cread(vdev, struct virtio_blk_config, zoned.model, &model);
-       if (model == VIRTIO_BLK_Z_HM) {
-               dev_err(&vdev->dev,
-                       "virtio_blk: zoned devices are not supported");
-               return -EOPNOTSUPP;
-       }
-
-       return 0;
+       dev_err(&vdev->dev,
+               "virtio_blk: zoned devices are not supported");
+       return -EOPNOTSUPP;
 }
 #endif /* CONFIG_BLK_DEV_ZONED */
 
@@ -1570,9 +1547,26 @@ static int virtblk_probe(struct virtio_device *vdev)
         * placed after the virtio_device_ready() call above.
         */
        if (virtio_has_feature(vdev, VIRTIO_BLK_F_ZONED)) {
-               err = virtblk_probe_zoned_device(vdev, vblk, q);
-               if (err)
+               u8 model;
+
+               virtio_cread(vdev, struct virtio_blk_config, zoned.model,
+                               &model);
+               switch (model) {
+               case VIRTIO_BLK_Z_NONE:
+               case VIRTIO_BLK_Z_HA:
+                       /* Present the host-aware device as non-zoned */
+                       break;
+               case VIRTIO_BLK_Z_HM:
+                       err = virtblk_probe_zoned_device(vdev, vblk, q);
+                       if (err)
+                               goto out_cleanup_disk;
+                       break;
+               default:
+                       dev_err(&vdev->dev, "unsupported zone model %d\n",
+                               model);
+                       err = -EINVAL;
                        goto out_cleanup_disk;
+               }
        }
 
        err = device_add_disk(&vdev->dev, vblk->disk, virtblk_attr_groups);