brd: use __register_blkdev to allocate devices on demand
authorChristoph Hellwig <hch@lst.de>
Thu, 29 Oct 2020 14:58:32 +0000 (15:58 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 16 Nov 2020 15:14:30 +0000 (08:14 -0700)
Use the simpler mechanism attached to major_name to allocate a brd device
when a currently unregistered minor is accessed.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/brd.c

index cc49a92..c43a6ab 100644 (file)
@@ -426,14 +426,15 @@ static void brd_free(struct brd_device *brd)
        kfree(brd);
 }
 
-static struct brd_device *brd_init_one(int i, bool *new)
+static void brd_probe(dev_t dev)
 {
        struct brd_device *brd;
+       int i = MINOR(dev) / max_part;
 
-       *new = false;
+       mutex_lock(&brd_devices_mutex);
        list_for_each_entry(brd, &brd_devices, brd_list) {
                if (brd->brd_number == i)
-                       goto out;
+                       goto out_unlock;
        }
 
        brd = brd_alloc(i);
@@ -442,9 +443,9 @@ static struct brd_device *brd_init_one(int i, bool *new)
                add_disk(brd->brd_disk);
                list_add_tail(&brd->brd_list, &brd_devices);
        }
-       *new = true;
-out:
-       return brd;
+
+out_unlock:
+       mutex_unlock(&brd_devices_mutex);
 }
 
 static void brd_del_one(struct brd_device *brd)
@@ -454,23 +455,6 @@ static void brd_del_one(struct brd_device *brd)
        brd_free(brd);
 }
 
-static struct kobject *brd_probe(dev_t dev, int *part, void *data)
-{
-       struct brd_device *brd;
-       struct kobject *kobj;
-       bool new;
-
-       mutex_lock(&brd_devices_mutex);
-       brd = brd_init_one(MINOR(dev) / max_part, &new);
-       kobj = brd ? get_disk_and_module(brd->brd_disk) : NULL;
-       mutex_unlock(&brd_devices_mutex);
-
-       if (new)
-               *part = 0;
-
-       return kobj;
-}
-
 static inline void brd_check_and_reset_par(void)
 {
        if (unlikely(!max_part))
@@ -510,11 +494,12 @@ static int __init brd_init(void)
         *      dynamically.
         */
 
-       if (register_blkdev(RAMDISK_MAJOR, "ramdisk"))
+       if (__register_blkdev(RAMDISK_MAJOR, "ramdisk", brd_probe))
                return -EIO;
 
        brd_check_and_reset_par();
 
+       mutex_lock(&brd_devices_mutex);
        for (i = 0; i < rd_nr; i++) {
                brd = brd_alloc(i);
                if (!brd)
@@ -532,9 +517,7 @@ static int __init brd_init(void)
                brd->brd_disk->queue = brd->brd_queue;
                add_disk(brd->brd_disk);
        }
-
-       blk_register_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS,
-                                 THIS_MODULE, brd_probe, NULL, NULL);
+       mutex_unlock(&brd_devices_mutex);
 
        pr_info("brd: module loaded\n");
        return 0;
@@ -544,6 +527,7 @@ out_free:
                list_del(&brd->brd_list);
                brd_free(brd);
        }
+       mutex_unlock(&brd_devices_mutex);
        unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
        pr_info("brd: module NOT loaded !!!\n");
@@ -557,7 +541,6 @@ static void __exit brd_exit(void)
        list_for_each_entry_safe(brd, next, &brd_devices, brd_list)
                brd_del_one(brd);
 
-       blk_unregister_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS);
        unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
        pr_info("brd: module unloaded\n");