block: pass a request_queue to __blk_alloc_disk
authorChristoph Hellwig <hch@lst.de>
Mon, 16 Aug 2021 13:19:08 +0000 (15:19 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 23 Aug 2021 18:54:30 +0000 (12:54 -0600)
Pass in a request_queue and assign disk->queue in __blk_alloc_disk to
ensure struct gendisk always has a valid ->queue pointer.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20210816131910.615153-8-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq.c
block/genhd.c
drivers/s390/block/dasd_genhd.c
drivers/scsi/sd.c
drivers/scsi/sr.c
include/linux/genhd.h

index 8ac30c3..2ca7e7c 100644 (file)
@@ -3143,12 +3143,11 @@ struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, void *queuedata,
        if (IS_ERR(q))
                return ERR_CAST(q);
 
-       disk = __alloc_disk_node(set->numa_node, lkclass);
+       disk = __alloc_disk_node(q, set->numa_node, lkclass);
        if (!disk) {
                blk_cleanup_queue(q);
                return ERR_PTR(-ENOMEM);
        }
-       disk->queue = q;
        return disk;
 }
 EXPORT_SYMBOL(__blk_mq_alloc_disk);
index caeda72..f18122e 100644 (file)
@@ -1254,7 +1254,8 @@ dev_t blk_lookup_devt(const char *name, int partno)
        return devt;
 }
 
-struct gendisk *__alloc_disk_node(int node_id, struct lock_class_key *lkclass)
+struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
+               struct lock_class_key *lkclass)
 {
        struct gendisk *disk;
 
@@ -1281,6 +1282,7 @@ struct gendisk *__alloc_disk_node(int node_id, struct lock_class_key *lkclass)
        disk_to_dev(disk)->type = &disk_type;
        device_initialize(disk_to_dev(disk));
        inc_diskseq(disk);
+       disk->queue = q;
        lockdep_init_map(&disk->lockdep_map, "(bio completion)", lkclass, 0);
 #ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
        INIT_LIST_HEAD(&disk->slave_bdevs);
@@ -1307,12 +1309,11 @@ struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass)
        if (!q)
                return NULL;
 
-       disk = __alloc_disk_node(node, lkclass);
+       disk = __alloc_disk_node(q, node, lkclass);
        if (!disk) {
                blk_cleanup_queue(q);
                return NULL;
        }
-       disk->queue = q;
        return disk;
 }
 EXPORT_SYMBOL(__blk_alloc_disk);
index 6e44515..fa966e0 100644 (file)
@@ -40,7 +40,8 @@ int dasd_gendisk_alloc(struct dasd_block *block)
        if (base->devindex >= DASD_PER_MAJOR)
                return -EBUSY;
 
-       gdp = __alloc_disk_node(NUMA_NO_NODE, &dasd_bio_compl_lkclass);
+       gdp = __alloc_disk_node(block->request_queue, NUMA_NO_NODE,
+                               &dasd_bio_compl_lkclass);
        if (!gdp)
                return -ENOMEM;
 
@@ -76,7 +77,6 @@ int dasd_gendisk_alloc(struct dasd_block *block)
            test_bit(DASD_FLAG_DEVICE_RO, &base->flags))
                set_disk_ro(gdp, 1);
        dasd_add_link_to_gendisk(gdp, base);
-       gdp->queue = block->request_queue;
        block->gdp = gdp;
        set_capacity(block->gdp, 0);
        device_add_disk(&base->cdev->dev, block->gdp, NULL);
index 1c6b8f0..610ebba 100644 (file)
@@ -3409,7 +3409,8 @@ static int sd_probe(struct device *dev)
        if (!sdkp)
                goto out;
 
-       gd = __alloc_disk_node(NUMA_NO_NODE, &sd_bio_compl_lkclass);
+       gd = __alloc_disk_node(sdp->request_queue, NUMA_NO_NODE,
+                              &sd_bio_compl_lkclass);
        if (!gd)
                goto out_free;
 
@@ -3459,7 +3460,6 @@ static int sd_probe(struct device *dev)
 
        gd->fops = &sd_fops;
        gd->private_data = &sdkp->driver;
-       gd->queue = sdkp->device->request_queue;
 
        /* defaults, until the device tells us otherwise */
        sdp->sector_size = 512;
index 2c45b41..a0df27d 100644 (file)
@@ -714,7 +714,8 @@ static int sr_probe(struct device *dev)
 
        kref_init(&cd->kref);
 
-       disk = __alloc_disk_node(NUMA_NO_NODE, &sr_bio_compl_lkclass);
+       disk = __alloc_disk_node(sdev->request_queue, NUMA_NO_NODE,
+                                &sr_bio_compl_lkclass);
        if (!disk)
                goto fail_free;
        mutex_init(&cd->lock);
@@ -765,7 +766,6 @@ static int sr_probe(struct device *dev)
 
        set_capacity(disk, cd->capacity);
        disk->private_data = &cd->driver;
-       disk->queue = sdev->request_queue;
 
        if (register_cdrom(disk, &cd->cdi))
                goto fail_minor;
index d20f101..13e90e6 100644 (file)
@@ -259,7 +259,8 @@ static inline sector_t get_capacity(struct gendisk *disk)
 int bdev_disk_changed(struct gendisk *disk, bool invalidate);
 void blk_drop_partitions(struct gendisk *disk);
 
-struct gendisk *__alloc_disk_node(int node_id, struct lock_class_key *lkclass);
+struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
+               struct lock_class_key *lkclass);
 extern void put_disk(struct gendisk *disk);
 struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass);