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

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
Loading
Loading
Loading
Loading
+11 −28
Original line number Diff line number Diff line
@@ -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 @@ static int __init brd_init(void)
		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");