diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2011-07-31 16:08:04 -0400 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2011-07-31 16:08:04 -0400 |
commit | d134b00b9acca3fb054d7c88a5f5d562ecbb42d1 (patch) | |
tree | ccc63647ec8a551289f26866ec86091e44266bad /drivers/block | |
parent | 770fe30a46a12b6fb6b63fbe1737654d28e84844 (diff) |
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: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/Kconfig | 15 | ||||
-rw-r--r-- | drivers/block/loop.c | 27 |
2 files changed, 25 insertions, 17 deletions
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index 717d6e4e18d3..57212c5235e2 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig | |||
@@ -256,6 +256,21 @@ config BLK_DEV_LOOP | |||
256 | 256 | ||
257 | Most users will answer N here. | 257 | Most users will answer N here. |
258 | 258 | ||
259 | config BLK_DEV_LOOP_MIN_COUNT | ||
260 | int "Number of loop devices to pre-create at init time" | ||
261 | depends on BLK_DEV_LOOP | ||
262 | default 8 | ||
263 | help | ||
264 | Static number of loop devices to be unconditionally pre-created | ||
265 | at init time. | ||
266 | |||
267 | This default value can be overwritten on the kernel command | ||
268 | line or with module-parameter loop.max_loop. | ||
269 | |||
270 | The historic default is 8. If a late 2011 version of losetup(8) | ||
271 | is used, it can be set to 0, since needed loop devices can be | ||
272 | dynamically allocated with the /dev/loop-control interface. | ||
273 | |||
259 | config BLK_DEV_CRYPTOLOOP | 274 | config BLK_DEV_CRYPTOLOOP |
260 | tristate "Cryptoloop Support" | 275 | tristate "Cryptoloop Support" |
261 | select CRYPTO | 276 | select CRYPTO |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 5c9edf944879..3defc52f060c 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
@@ -1793,21 +1793,6 @@ static int __init loop_init(void) | |||
1793 | struct loop_device *lo; | 1793 | struct loop_device *lo; |
1794 | int err; | 1794 | int err; |
1795 | 1795 | ||
1796 | /* | ||
1797 | * loop module now has a feature to instantiate underlying device | ||
1798 | * structure on-demand, provided that there is an access dev node. | ||
1799 | * However, this will not work well with user space tool that doesn't | ||
1800 | * know about such "feature". In order to not break any existing | ||
1801 | * tool, we do the following: | ||
1802 | * | ||
1803 | * (1) if max_loop is specified, create that many upfront, and this | ||
1804 | * also becomes a hard limit. | ||
1805 | * (2) if max_loop is not specified, create 8 loop device on module | ||
1806 | * load, user can further extend loop device by create dev node | ||
1807 | * themselves and have kernel automatically instantiate actual | ||
1808 | * device on-demand. | ||
1809 | */ | ||
1810 | |||
1811 | err = misc_register(&loop_misc); | 1796 | err = misc_register(&loop_misc); |
1812 | if (err < 0) | 1797 | if (err < 0) |
1813 | return err; | 1798 | return err; |
@@ -1833,11 +1818,19 @@ static int __init loop_init(void) | |||
1833 | if (max_loop > 1UL << (MINORBITS - part_shift)) | 1818 | if (max_loop > 1UL << (MINORBITS - part_shift)) |
1834 | return -EINVAL; | 1819 | return -EINVAL; |
1835 | 1820 | ||
1821 | /* | ||
1822 | * If max_loop is specified, create that many devices upfront. | ||
1823 | * This also becomes a hard limit. If max_loop is not specified, | ||
1824 | * create CONFIG_BLK_DEV_LOOP_MIN_COUNT loop devices at module | ||
1825 | * init time. Loop devices can be requested on-demand with the | ||
1826 | * /dev/loop-control interface, or be instantiated by accessing | ||
1827 | * a 'dead' device node. | ||
1828 | */ | ||
1836 | if (max_loop) { | 1829 | if (max_loop) { |
1837 | nr = max_loop; | 1830 | nr = max_loop; |
1838 | range = max_loop << part_shift; | 1831 | range = max_loop << part_shift; |
1839 | } else { | 1832 | } else { |
1840 | nr = 8; | 1833 | nr = CONFIG_BLK_DEV_LOOP_MIN_COUNT; |
1841 | range = 1UL << MINORBITS; | 1834 | range = 1UL << MINORBITS; |
1842 | } | 1835 | } |
1843 | 1836 | ||
@@ -1847,7 +1840,7 @@ static int __init loop_init(void) | |||
1847 | blk_register_region(MKDEV(LOOP_MAJOR, 0), range, | 1840 | blk_register_region(MKDEV(LOOP_MAJOR, 0), range, |
1848 | THIS_MODULE, loop_probe, NULL, NULL); | 1841 | THIS_MODULE, loop_probe, NULL, NULL); |
1849 | 1842 | ||
1850 | /* pre-create number devices of devices given by config or max_loop */ | 1843 | /* pre-create number of devices given by config or max_loop */ |
1851 | mutex_lock(&loop_index_mutex); | 1844 | mutex_lock(&loop_index_mutex); |
1852 | for (i = 0; i < nr; i++) | 1845 | for (i = 0; i < nr; i++) |
1853 | loop_add(&lo, i); | 1846 | loop_add(&lo, i); |