Commit 8410d38c authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

loop: 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 7cc178a6
Loading
Loading
Loading
Loading
+8 −22
Original line number Diff line number Diff line
@@ -2235,24 +2235,18 @@ static int loop_lookup(struct loop_device **l, int i)
	return ret;
}

static struct kobject *loop_probe(dev_t dev, int *part, void *data)
static void loop_probe(dev_t dev)
{
	int idx = MINOR(dev) >> part_shift;
	struct loop_device *lo;
	struct kobject *kobj;
	int err;

	if (max_loop && idx >= max_loop)
		return;

	mutex_lock(&loop_ctl_mutex);
	err = loop_lookup(&lo, MINOR(dev) >> part_shift);
	if (err < 0)
		err = loop_add(&lo, MINOR(dev) >> part_shift);
	if (err < 0)
		kobj = NULL;
	else
		kobj = get_disk_and_module(lo->lo_disk);
	if (loop_lookup(&lo, idx) < 0)
		loop_add(&lo, idx);
	mutex_unlock(&loop_ctl_mutex);

	*part = 0;
	return kobj;
}

static long loop_control_ioctl(struct file *file, unsigned int cmd,
@@ -2372,14 +2366,11 @@ static int __init loop_init(void)
		goto err_out;


	if (register_blkdev(LOOP_MAJOR, "loop")) {
	if (__register_blkdev(LOOP_MAJOR, "loop", loop_probe)) {
		err = -EIO;
		goto misc_out;
	}

	blk_register_region(MKDEV(LOOP_MAJOR, 0), range,
				  THIS_MODULE, loop_probe, NULL, NULL);

	/* pre-create number of devices given by config or max_loop */
	mutex_lock(&loop_ctl_mutex);
	for (i = 0; i < nr; i++)
@@ -2405,16 +2396,11 @@ static int loop_exit_cb(int id, void *ptr, void *data)

static void __exit loop_exit(void)
{
	unsigned long range;

	range = max_loop ? max_loop << part_shift : 1UL << MINORBITS;

	mutex_lock(&loop_ctl_mutex);

	idr_for_each(&loop_index_idr, &loop_exit_cb, NULL);
	idr_destroy(&loop_index_idr);

	blk_unregister_region(MKDEV(LOOP_MAJOR, 0), range);
	unregister_blkdev(LOOP_MAJOR, "loop");

	misc_deregister(&loop_misc);