Commit 7cc178a6 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

brd: use __register_blkdev to allocate devices on demand

Use the simpler mechanism attached to major_name to allocate a brd device
when a currently unregistered minor is accessed.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 996e509b
...@@ -426,14 +426,15 @@ static void brd_free(struct brd_device *brd) ...@@ -426,14 +426,15 @@ static void brd_free(struct brd_device *brd)
kfree(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; 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) { list_for_each_entry(brd, &brd_devices, brd_list) {
if (brd->brd_number == i) if (brd->brd_number == i)
goto out; goto out_unlock;
} }
brd = brd_alloc(i); brd = brd_alloc(i);
...@@ -442,9 +443,9 @@ static struct brd_device *brd_init_one(int i, bool *new) ...@@ -442,9 +443,9 @@ static struct brd_device *brd_init_one(int i, bool *new)
add_disk(brd->brd_disk); add_disk(brd->brd_disk);
list_add_tail(&brd->brd_list, &brd_devices); list_add_tail(&brd->brd_list, &brd_devices);
} }
*new = true;
out: out_unlock:
return brd; mutex_unlock(&brd_devices_mutex);
} }
static void brd_del_one(struct brd_device *brd) static void brd_del_one(struct brd_device *brd)
...@@ -454,23 +455,6 @@ 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); 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) static inline void brd_check_and_reset_par(void)
{ {
if (unlikely(!max_part)) if (unlikely(!max_part))
...@@ -510,11 +494,12 @@ static int __init brd_init(void) ...@@ -510,11 +494,12 @@ static int __init brd_init(void)
* dynamically. * dynamically.
*/ */
if (register_blkdev(RAMDISK_MAJOR, "ramdisk")) if (__register_blkdev(RAMDISK_MAJOR, "ramdisk", brd_probe))
return -EIO; return -EIO;
brd_check_and_reset_par(); brd_check_and_reset_par();
mutex_lock(&brd_devices_mutex);
for (i = 0; i < rd_nr; i++) { for (i = 0; i < rd_nr; i++) {
brd = brd_alloc(i); brd = brd_alloc(i);
if (!brd) if (!brd)
...@@ -532,9 +517,7 @@ static int __init brd_init(void) ...@@ -532,9 +517,7 @@ static int __init brd_init(void)
brd->brd_disk->queue = brd->brd_queue; brd->brd_disk->queue = brd->brd_queue;
add_disk(brd->brd_disk); add_disk(brd->brd_disk);
} }
mutex_unlock(&brd_devices_mutex);
blk_register_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS,
THIS_MODULE, brd_probe, NULL, NULL);
pr_info("brd: module loaded\n"); pr_info("brd: module loaded\n");
return 0; return 0;
...@@ -544,6 +527,7 @@ static int __init brd_init(void) ...@@ -544,6 +527,7 @@ static int __init brd_init(void)
list_del(&brd->brd_list); list_del(&brd->brd_list);
brd_free(brd); brd_free(brd);
} }
mutex_unlock(&brd_devices_mutex);
unregister_blkdev(RAMDISK_MAJOR, "ramdisk"); unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
pr_info("brd: module NOT loaded !!!\n"); pr_info("brd: module NOT loaded !!!\n");
...@@ -557,7 +541,6 @@ static void __exit brd_exit(void) ...@@ -557,7 +541,6 @@ static void __exit brd_exit(void)
list_for_each_entry_safe(brd, next, &brd_devices, brd_list) list_for_each_entry_safe(brd, next, &brd_devices, brd_list)
brd_del_one(brd); brd_del_one(brd);
blk_unregister_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS);
unregister_blkdev(RAMDISK_MAJOR, "ramdisk"); unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
pr_info("brd: module unloaded\n"); pr_info("brd: module unloaded\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment