Commit d134b00b authored by Kay Sievers's avatar Kay Sievers Committed by Jens Axboe

loop: add BLK_DEV_LOOP_MIN_COUNT=%i to allow distros 0 pre-allocated loop devices

Instead of unconditionally creating a fixed number of dead loop
devices which need to be investigated by storage handling services,
even when they are never used, we allow distros start with 0
loop devices and have losetup(8) and similar switch to the dynamic
/dev/loop-control interface instead of searching /dev/loop%i for free
devices.
Signed-off-by: default avatarKay Sievers <kay.sievers@vrfy.org>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 770fe30a
...@@ -1340,9 +1340,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -1340,9 +1340,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
it is equivalent to "nosmp", which also disables it is equivalent to "nosmp", which also disables
the IO APIC. the IO APIC.
max_loop= [LOOP] Maximum number of loopback devices that can max_loop= [LOOP] The number of loop block devices that get
be mounted (loop.max_loop) unconditionally pre-created at init time. The default
Format: <1-256> number is configured by BLK_DEV_LOOP_MIN_COUNT. Instead
of statically allocating a predefined number, loop
devices can be requested on-demand with the
/dev/loop-control interface.
mcatest= [IA-64] mcatest= [IA-64]
......
...@@ -256,6 +256,21 @@ config BLK_DEV_LOOP ...@@ -256,6 +256,21 @@ config BLK_DEV_LOOP
Most users will answer N here. Most users will answer N here.
config BLK_DEV_LOOP_MIN_COUNT
int "Number of loop devices to pre-create at init time"
depends on BLK_DEV_LOOP
default 8
help
Static number of loop devices to be unconditionally pre-created
at init time.
This default value can be overwritten on the kernel command
line or with module-parameter loop.max_loop.
The historic default is 8. If a late 2011 version of losetup(8)
is used, it can be set to 0, since needed loop devices can be
dynamically allocated with the /dev/loop-control interface.
config BLK_DEV_CRYPTOLOOP config BLK_DEV_CRYPTOLOOP
tristate "Cryptoloop Support" tristate "Cryptoloop Support"
select CRYPTO select CRYPTO
......
...@@ -1793,21 +1793,6 @@ static int __init loop_init(void) ...@@ -1793,21 +1793,6 @@ static int __init loop_init(void)
struct loop_device *lo; struct loop_device *lo;
int err; int err;
/*
* loop module now has a feature to instantiate underlying device
* structure on-demand, provided that there is an access dev node.
* However, this will not work well with user space tool that doesn't
* know about such "feature". In order to not break any existing
* tool, we do the following:
*
* (1) if max_loop is specified, create that many upfront, and this
* also becomes a hard limit.
* (2) if max_loop is not specified, create 8 loop device on module
* load, user can further extend loop device by create dev node
* themselves and have kernel automatically instantiate actual
* device on-demand.
*/
err = misc_register(&loop_misc); err = misc_register(&loop_misc);
if (err < 0) if (err < 0)
return err; return err;
...@@ -1833,11 +1818,19 @@ static int __init loop_init(void) ...@@ -1833,11 +1818,19 @@ static int __init loop_init(void)
if (max_loop > 1UL << (MINORBITS - part_shift)) if (max_loop > 1UL << (MINORBITS - part_shift))
return -EINVAL; return -EINVAL;
/*
* If max_loop is specified, create that many devices upfront.
* This also becomes a hard limit. If max_loop is not specified,
* create CONFIG_BLK_DEV_LOOP_MIN_COUNT loop devices at module
* init time. Loop devices can be requested on-demand with the
* /dev/loop-control interface, or be instantiated by accessing
* a 'dead' device node.
*/
if (max_loop) { if (max_loop) {
nr = max_loop; nr = max_loop;
range = max_loop << part_shift; range = max_loop << part_shift;
} else { } else {
nr = 8; nr = CONFIG_BLK_DEV_LOOP_MIN_COUNT;
range = 1UL << MINORBITS; range = 1UL << MINORBITS;
} }
...@@ -1847,7 +1840,7 @@ static int __init loop_init(void) ...@@ -1847,7 +1840,7 @@ static int __init loop_init(void)
blk_register_region(MKDEV(LOOP_MAJOR, 0), range, blk_register_region(MKDEV(LOOP_MAJOR, 0), range,
THIS_MODULE, loop_probe, NULL, NULL); THIS_MODULE, loop_probe, NULL, NULL);
/* pre-create number devices of devices given by config or max_loop */ /* pre-create number of devices given by config or max_loop */
mutex_lock(&loop_index_mutex); mutex_lock(&loop_index_mutex);
for (i = 0; i < nr; i++) for (i = 0; i < nr; i++)
loop_add(&lo, i); loop_add(&lo, i);
......
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