diff options
author | Lauri Kasanen | 2010-04-14 12:31:26 -0700 |
---|---|---|
committer | Denys Vlasenko | 2010-04-14 12:31:26 -0700 |
commit | 375a8ef5ea38ea10134c125c75a12bbf9d5ba7bd (patch) | |
tree | 1bd21b3e2ed9e15f92e5d0bdb03b276cac6f7a74 | |
parent | 0ecc11659285337c0430f1b7004eb3b2901a93d3 (diff) | |
download | busybox-375a8ef5ea38ea10134c125c75a12bbf9d5ba7bd.zip busybox-375a8ef5ea38ea10134c125c75a12bbf9d5ba7bd.tar.gz |
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>
-rw-r--r-- | libbb/loop.c | 14 | ||||
-rw-r--r-- | scripts/defconfig | 1 | ||||
-rw-r--r-- | util-linux/Config.in | 12 |
3 files changed, 25 insertions, 2 deletions
diff --git a/libbb/loop.c b/libbb/loop.c index abf05dc..204fcc9 100644 --- a/libbb/loop.c +++ b/libbb/loop.c @@ -104,14 +104,24 @@ int FAST_FUNC set_loop(char **device, const char *file, unsigned long long offse /* Find a loop device. */ try = *device ? *device : dev; - for (i = 0; rc; i++) { + for (i = 0; rc && i < 256; 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 (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; break; } + try_to_open: /* Open the sucker and check its loopiness. */ dfd = open(try, mode); if (dfd < 0 && errno == EROFS) { diff --git a/scripts/defconfig b/scripts/defconfig index d13f5b1..0a748fe 100644 --- a/scripts/defconfig +++ b/scripts/defconfig @@ -574,6 +574,7 @@ CONFIG_FEATURE_UMOUNT_ALL=y # Common options for mount/umount # CONFIG_FEATURE_MOUNT_LOOP=y +# CONFIG_FEATURE_MOUNT_LOOP_CREATE is not set # CONFIG_FEATURE_MTAB_SUPPORT is not set # diff --git a/util-linux/Config.in b/util-linux/Config.in index acd74a2..a59cc1d 100644 --- a/util-linux/Config.in +++ b/util-linux/Config.in @@ -901,6 +901,18 @@ config FEATURE_MOUNT_LOOP specify an offset or cryptographic options to the loopback device. (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 bool "Support for the old /etc/mtab file" default n |