]> www.infradead.org Git - nvme.git/commitdiff
block: better split mq vs non-mq code in add_disk_fwnode
authorChristoph Hellwig <hch@lst.de>
Mon, 6 Jan 2025 08:35:08 +0000 (09:35 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 6 Jan 2025 14:37:41 +0000 (07:37 -0700)
Add a big conditional for blk-mq vs not mq at the beginning of
add_disk_fwnode so that elevator_init_mq is only called for blk-mq disks,
and add checks that the right methods or set or not set based on the
queue type.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20250106083531.799976-2-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/genhd.c

index 5da3c9a64e643251fce1944a58f17fcc14238074..befb7a516bcf2cecb9f66dc2c91bc0f14528408f 100644 (file)
@@ -400,21 +400,23 @@ int __must_check add_disk_fwnode(struct device *parent, struct gendisk *disk,
        struct device *ddev = disk_to_dev(disk);
        int ret;
 
-       /* Only makes sense for bio-based to set ->poll_bio */
-       if (queue_is_mq(disk->queue) && disk->fops->poll_bio)
-               return -EINVAL;
-
-       /*
-        * The disk queue should now be all set with enough information about
-        * the device for the elevator code to pick an adequate default
-        * elevator if one is needed, that is, for devices requesting queue
-        * registration.
-        */
-       elevator_init_mq(disk->queue);
+       if (queue_is_mq(disk->queue)) {
+               /*
+                * ->submit_bio and ->poll_bio are bypassed for blk-mq drivers.
+                */
+               if (disk->fops->submit_bio || disk->fops->poll_bio)
+                       return -EINVAL;
 
-       /* Mark bdev as having a submit_bio, if needed */
-       if (disk->fops->submit_bio)
+               /*
+                * Initialize the I/O scheduler code and pick a default one if
+                * needed.
+                */
+               elevator_init_mq(disk->queue);
+       } else {
+               if (!disk->fops->submit_bio)
+                       return -EINVAL;
                bdev_set_flag(disk->part0, BD_HAS_SUBMIT_BIO);
+       }
 
        /*
         * If the driver provides an explicit major number it also must provide