mount: add an optional capability to create new /dev/loopN as needed

Signed-off-by: Lauri Kasanen <curaga@operamail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Lauri Kasanen 2010-04-14 12:31:26 -07:00 committed by Denys Vlasenko
parent 0ecc116592
commit 375a8ef5ea
3 changed files with 25 additions and 2 deletions

View File

@ -104,14 +104,24 @@ int FAST_FUNC set_loop(char **device, const char *file, unsigned long long offse
/* Find a loop device. */ /* Find a loop device. */
try = *device ? *device : dev; try = *device ? *device : dev;
for (i = 0; rc; i++) { for (i = 0; rc && i < 256; i++) {
sprintf(dev, LOOP_FORMAT, i); sprintf(dev, LOOP_FORMAT, i);
/* Ran out of block devices, return failure. */ IF_FEATURE_MOUNT_LOOP_CREATE(errno = 0;)
if (stat(try, &statbuf) != 0 || !S_ISBLK(statbuf.st_mode)) { if (stat(try, &statbuf) != 0 || !S_ISBLK(statbuf.st_mode)) {
if (ENABLE_FEATURE_MOUNT_LOOP_CREATE
&& errno == ENOENT
&& try == dev
) {
/* Node doesn't exist, try to create it. */
if (mknod(dev, S_IFBLK|0644, makedev(7, i)) == 0)
goto try_to_open;
}
/* Ran out of block devices, return failure. */
rc = -ENOENT; rc = -ENOENT;
break; break;
} }
try_to_open:
/* Open the sucker and check its loopiness. */ /* Open the sucker and check its loopiness. */
dfd = open(try, mode); dfd = open(try, mode);
if (dfd < 0 && errno == EROFS) { if (dfd < 0 && errno == EROFS) {

View File

@ -574,6 +574,7 @@ CONFIG_FEATURE_UMOUNT_ALL=y
# Common options for mount/umount # Common options for mount/umount
# #
CONFIG_FEATURE_MOUNT_LOOP=y CONFIG_FEATURE_MOUNT_LOOP=y
# CONFIG_FEATURE_MOUNT_LOOP_CREATE is not set
# CONFIG_FEATURE_MTAB_SUPPORT is not set # CONFIG_FEATURE_MTAB_SUPPORT is not set
# #

View File

@ -901,6 +901,18 @@ config FEATURE_MOUNT_LOOP
specify an offset or cryptographic options to the loopback device. specify an offset or cryptographic options to the loopback device.
(If you don't want umount to free the loop device, use "umount -D".) (If you don't want umount to free the loop device, use "umount -D".)
config FEATURE_MOUNT_LOOP_CREATE
bool "Create new loopback devices if needed"
default n
depends on FEATURE_MOUNT_LOOP
help
Linux kernels >= 2.6.24 support unlimited loopback devices. They are
allocated for use when trying to use a loop device. The loop device
must however exist.
This feature lets mount to try to create next /dev/loopN device
if it does not find a free one.
config FEATURE_MTAB_SUPPORT config FEATURE_MTAB_SUPPORT
bool "Support for the old /etc/mtab file" bool "Support for the old /etc/mtab file"
default n default n