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: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>pull/712/merge
parent
996e509bbc
commit
7cc178a6b9
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Reference in New Issue