block: pass a queue_limits argument to blk_alloc_disk
authorChristoph Hellwig <hch@lst.de>
Thu, 15 Feb 2024 07:10:47 +0000 (08:10 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 19 Feb 2024 23:58:23 +0000 (16:58 -0700)
Pass a queue_limits to blk_alloc_disk and apply it if non-NULL.  This
will allow allocating queues with valid queue limits instead of setting
the values one at a time later.

Also change blk_alloc_disk to return an ERR_PTR instead of just NULL
which can't distinguish errors.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Link: https://lore.kernel.org/r/20240215071055.2201424-2-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
18 files changed:
arch/m68k/emu/nfblock.c
arch/xtensa/platforms/iss/simdisk.c
block/genhd.c
drivers/block/brd.c
drivers/block/drbd/drbd_main.c
drivers/block/n64cart.c
drivers/block/null_blk/main.c
drivers/block/pktcdvd.c
drivers/block/ps3vram.c
drivers/block/zram/zram_drv.c
drivers/md/bcache/super.c
drivers/md/dm.c
drivers/md/md.c
drivers/nvdimm/btt.c
drivers/nvdimm/pmem.c
drivers/nvme/host/multipath.c
drivers/s390/block/dcssblk.c
include/linux/blkdev.h

index a708fbd5a844f8a2c6a60cea6eb2e5a126e8dbdb..539ff56b6968d0cb1a22fab2f61f1cc5f8014df4 100644 (file)
@@ -117,9 +117,11 @@ static int __init nfhd_init_one(int id, u32 blocks, u32 bsize)
        dev->bsize = bsize;
        dev->bshift = ffs(bsize) - 10;
 
-       dev->disk = blk_alloc_disk(NUMA_NO_NODE);
-       if (!dev->disk)
+       dev->disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(dev->disk)) {
+               err = PTR_ERR(dev->disk);
                goto free_dev;
+       }
 
        dev->disk->major = major_num;
        dev->disk->first_minor = dev_id * 16;
index 178cf96ca10acb4cd70f8cd052e58503a9ee1494..defc67909a9c745a9794847a3b0bfbeb9ca74536 100644 (file)
@@ -264,16 +264,18 @@ static int __init simdisk_setup(struct simdisk *dev, int which,
                struct proc_dir_entry *procdir)
 {
        char tmp[2] = { '0' + which, 0 };
-       int err = -ENOMEM;
+       int err;
 
        dev->fd = -1;
        dev->filename = NULL;
        spin_lock_init(&dev->lock);
        dev->users = 0;
 
-       dev->gd = blk_alloc_disk(NUMA_NO_NODE);
-       if (!dev->gd)
+       dev->gd = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(dev->gd)) {
+               err = PTR_ERR(dev->gd);
                goto out;
+       }
        dev->gd->major = simdisk_major;
        dev->gd->first_minor = which;
        dev->gd->minors = SIMDISK_MINORS;
index 7a8fd57c51f73c0180f41e784c7425288c1b606d..84c822d989dacad4ba221d4451678ff35a8b0666 100644 (file)
@@ -1391,20 +1391,21 @@ out_free_disk:
        return NULL;
 }
 
-struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass)
+struct gendisk *__blk_alloc_disk(struct queue_limits *lim, int node,
+               struct lock_class_key *lkclass)
 {
-       struct queue_limits lim = { };
+       struct queue_limits default_lim = { };
        struct request_queue *q;
        struct gendisk *disk;
 
-       q = blk_alloc_queue(&lim, node);
+       q = blk_alloc_queue(lim ? lim : &default_lim, node);
        if (IS_ERR(q))
-               return NULL;
+               return ERR_CAST(q);
 
        disk = __alloc_disk_node(q, node, lkclass);
        if (!disk) {
                blk_put_queue(q);
-               return NULL;
+               return ERR_PTR(-ENOMEM);
        }
        set_bit(GD_OWNS_QUEUE, &disk->state);
        return disk;
index 970bd6ff38c491a610f65026817f5c076aed8285..689a3c0c31f8b443605fb81a0e8aae50f91608eb 100644 (file)
@@ -335,10 +335,11 @@ static int brd_alloc(int i)
                debugfs_create_u64(buf, 0444, brd_debugfs_dir,
                                &brd->brd_nr_pages);
 
-       disk = brd->brd_disk = blk_alloc_disk(NUMA_NO_NODE);
-       if (!disk)
+       disk = brd->brd_disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(disk)) {
+               err = PTR_ERR(disk);
                goto out_free_dev;
-
+       }
        disk->major             = RAMDISK_MAJOR;
        disk->first_minor       = i * max_part;
        disk->minors            = max_part;
index 6bc86106c7b2ab5d59b6ab66e452976d235a7d97..cea1e537fd56c1e28136c31ca15d66c440798fca 100644 (file)
@@ -2708,9 +2708,11 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
 
        drbd_init_set_defaults(device);
 
-       disk = blk_alloc_disk(NUMA_NO_NODE);
-       if (!disk)
+       disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(disk)) {
+               err = PTR_ERR(disk);
                goto out_no_disk;
+       }
 
        device->vdisk = disk;
        device->rq_queue = disk->queue;
index d914156db2d8b2d698432001ecc6534f619b7394..c64d7ee7a44db5a54c2ec2fbc6af1e3d36b06940 100644 (file)
@@ -131,9 +131,11 @@ static int __init n64cart_probe(struct platform_device *pdev)
        if (IS_ERR(reg_base))
                return PTR_ERR(reg_base);
 
-       disk = blk_alloc_disk(NUMA_NO_NODE);
-       if (!disk)
+       disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(disk)) {
+               err = PTR_ERR(disk);
                goto out;
+       }
 
        disk->first_minor = 0;
        disk->flags = GENHD_FL_NO_PART;
index eeb895ec6f34aeaeb3aaef7d23dc4a6fbdf62b1a..baf2b228d008011ebf8b188e7d5a73c498ec607f 100644 (file)
@@ -2154,10 +2154,11 @@ static int null_add_dev(struct nullb_device *dev)
                }
                nullb->q = nullb->disk->queue;
        } else if (dev->queue_mode == NULL_Q_BIO) {
-               rv = -ENOMEM;
-               nullb->disk = blk_alloc_disk(nullb->dev->home_node);
-               if (!nullb->disk)
+               nullb->disk = blk_alloc_disk(NULL, nullb->dev->home_node);
+               if (IS_ERR(nullb->disk)) {
+                       rv = PTR_ERR(nullb->disk);
                        goto out_cleanup_queues;
+               }
 
                nullb->q = nullb->disk->queue;
                rv = init_driver_queues(nullb);
index d56d972aadb36fa2a3b85282eef1ea058a9bf73e..abb82926b1c93597b9fef9c75296b258c3cac74c 100644 (file)
@@ -2673,10 +2673,11 @@ static int pkt_setup_dev(dev_t dev, dev_t* pkt_dev)
        pd->write_congestion_on  = write_congestion_on;
        pd->write_congestion_off = write_congestion_off;
 
-       ret = -ENOMEM;
-       disk = blk_alloc_disk(NUMA_NO_NODE);
-       if (!disk)
+       disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(disk)) {
+               ret = PTR_ERR(disk);
                goto out_mem;
+       }
        pd->disk = disk;
        disk->major = pktdev_major;
        disk->first_minor = idx;
index 38d42af01b253517f0a185fe4d582c2006f09a29..bdcf083b45e2349fc9d92854ca3433ddf78fa7fb 100644 (file)
@@ -730,10 +730,10 @@ static int ps3vram_probe(struct ps3_system_bus_device *dev)
 
        ps3vram_proc_init(dev);
 
-       gendisk = blk_alloc_disk(NUMA_NO_NODE);
-       if (!gendisk) {
+       gendisk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(gendisk)) {
                dev_err(&dev->core, "blk_alloc_disk failed\n");
-               error = -ENOMEM;
+               error = PTR_ERR(gendisk);
                goto out_cache_cleanup;
        }
 
index 6772e0c654fa7f885192caa273fc1220e5736682..84982221fc66208259341772136828bb73184142 100644 (file)
@@ -2195,11 +2195,11 @@ static int zram_add(void)
 #endif
 
        /* gendisk structure */
-       zram->disk = blk_alloc_disk(NUMA_NO_NODE);
-       if (!zram->disk) {
+       zram->disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(zram->disk)) {
                pr_err("Error allocating disk structure for device %d\n",
                        device_id);
-               ret = -ENOMEM;
+               ret = PTR_ERR(zram->disk);
                goto out_free_idr;
        }
 
index dc3f50f69714174cd0d649b4d003a9ed5b2d4992..9955ecff383966a3ecc937edc9c4d206f2f44f98 100644 (file)
@@ -935,8 +935,8 @@ static int bcache_device_init(struct bcache_device *d, unsigned int block_size,
                        BIOSET_NEED_BVECS|BIOSET_NEED_RESCUER))
                goto out_ida_remove;
 
-       d->disk = blk_alloc_disk(NUMA_NO_NODE);
-       if (!d->disk)
+       d->disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(d->disk))
                goto out_bioset_exit;
 
        set_capacity(d->disk, sectors);
index 8dcabf84d866e6d2ac863a98790b16b838475d23..b5e6a10b9cfde3f6985b2818c1dc977fbddc371f 100644 (file)
@@ -2098,8 +2098,8 @@ static struct mapped_device *alloc_dev(int minor)
         * established. If request-based table is loaded: blk-mq will
         * override accordingly.
         */
-       md->disk = blk_alloc_disk(md->numa_node_id);
-       if (!md->disk)
+       md->disk = blk_alloc_disk(NULL, md->numa_node_id);
+       if (IS_ERR(md->disk))
                goto bad;
        md->queue = md->disk->queue;
 
index e2a5f513dbb765a859a3ad88f2c4c8dfccd69094..75266c34b1f99b00097ecccf5075f473592a070e 100644 (file)
@@ -5763,10 +5763,11 @@ struct mddev *md_alloc(dev_t dev, char *name)
                 */
                mddev->hold_active = UNTIL_STOP;
 
-       error = -ENOMEM;
-       disk = blk_alloc_disk(NUMA_NO_NODE);
-       if (!disk)
+       disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(disk)) {
+               error = PTR_ERR(disk);
                goto out_free_mddev;
+       }
 
        disk->major = MAJOR(mddev->unit);
        disk->first_minor = unit << shift;
index bb3726b622ad9f0d9bdaeb23c91d7bff1b61d2cb..9a0eae01d5986e798ae26a4ea33105af622a1b3f 100644 (file)
@@ -1496,11 +1496,11 @@ static int btt_blk_init(struct btt *btt)
 {
        struct nd_btt *nd_btt = btt->nd_btt;
        struct nd_namespace_common *ndns = nd_btt->ndns;
-       int rc = -ENOMEM;
+       int rc;
 
-       btt->btt_disk = blk_alloc_disk(NUMA_NO_NODE);
-       if (!btt->btt_disk)
-               return -ENOMEM;
+       btt->btt_disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(btt->btt_disk))
+               return PTR_ERR(btt->btt_disk);
 
        nvdimm_namespace_disk_name(ndns, btt->btt_disk->disk_name);
        btt->btt_disk->first_minor = 0;
index 4e8fdcb3f1c8276ea6e8b5992867cf976449925b..3a5df8d467c507edc0b3ba87fef683fb6142ad83 100644 (file)
@@ -497,9 +497,9 @@ static int pmem_attach_disk(struct device *dev,
                return -EBUSY;
        }
 
-       disk = blk_alloc_disk(nid);
-       if (!disk)
-               return -ENOMEM;
+       disk = blk_alloc_disk(NULL, nid);
+       if (IS_ERR(disk))
+               return PTR_ERR(disk);
        q = disk->queue;
 
        pmem->disk = disk;
index 74de1e64aeead77c604ec31e30bac179a0de245b..dc5d0d0a82d0e26b545dd51778877991d95acbef 100644 (file)
@@ -532,9 +532,9 @@ int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl, struct nvme_ns_head *head)
            !nvme_is_unique_nsid(ctrl, head) || !multipath)
                return 0;
 
-       head->disk = blk_alloc_disk(ctrl->numa_node);
-       if (!head->disk)
-               return -ENOMEM;
+       head->disk = blk_alloc_disk(NULL, ctrl->numa_node);
+       if (IS_ERR(head->disk))
+               return PTR_ERR(head->disk);
        head->disk->fops = &nvme_ns_head_ops;
        head->disk->private_data = head;
        sprintf(head->disk->disk_name, "nvme%dn%d",
index 4b7ecd4fd4319c000d2a4f1101022eafae0f2291..0903b432ea97401e21e66af37dc58c4bbce0bec8 100644 (file)
@@ -629,9 +629,9 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
        dev_info->dev.release = dcssblk_release_segment;
        dev_info->dev.groups = dcssblk_dev_attr_groups;
        INIT_LIST_HEAD(&dev_info->lh);
-       dev_info->gd = blk_alloc_disk(NUMA_NO_NODE);
-       if (dev_info->gd == NULL) {
-               rc = -ENOMEM;
+       dev_info->gd = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       if (IS_ERR(dev_info->gd)) {
+               rc = PTR_ERR(dev_info->gd);
                goto seg_list_del;
        }
        dev_info->gd->major = dcssblk_major;
index 45746ba73670e82e81de32b365ca758c817fde76..a14ea934413850559cb158dff5a27644d3804496 100644 (file)
@@ -766,22 +766,26 @@ static inline u64 sb_bdev_nr_blocks(struct super_block *sb)
 int bdev_disk_changed(struct gendisk *disk, bool invalidate);
 
 void put_disk(struct gendisk *disk);
-struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass);
+struct gendisk *__blk_alloc_disk(struct queue_limits *lim, int node,
+               struct lock_class_key *lkclass);
 
 /**
  * blk_alloc_disk - allocate a gendisk structure
+ * @lim: queue limits to be used for this disk.
  * @node_id: numa node to allocate on
  *
  * Allocate and pre-initialize a gendisk structure for use with BIO based
  * drivers.
  *
+ * Returns an ERR_PTR on error, else the allocated disk.
+ *
  * Context: can sleep
  */
-#define blk_alloc_disk(node_id)                                                \
+#define blk_alloc_disk(lim, node_id)                                   \
 ({                                                                     \
        static struct lock_class_key __key;                             \
                                                                        \
-       __blk_alloc_disk(node_id, &__key);                              \
+       __blk_alloc_disk(lim, node_id, &__key);                         \
 })
 
 int __register_blkdev(unsigned int major, const char *name,