mount: add an optional capability to create new /dev/loopN as needed
authorLauri Kasanen <curaga@operamail.com>
Wed, 14 Apr 2010 19:31:26 +0000 (12:31 -0700)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 14 Apr 2010 19:31:26 +0000 (12:31 -0700)
Signed-off-by: Lauri Kasanen <curaga@operamail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libbb/loop.c
scripts/defconfig
util-linux/Config.in

index abf05dc4f0113f5dad372c2a75d6ac9a85c3158a..204fcc982bc94c197ad4619acd8d533d6053e40d 100644 (file)
@@ -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) {
index d13f5b1b4a72c36d6eebe46ca71c25ff0dfee1b4..0a748febc88c39c488039d50863917ca80e1b8dc 100644 (file)
@@ -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
 
 #
index acd74a2c6c967730baee4a526f4788fabda9a2c3..a59cc1ddf4bd7eabd06297654c3f7910f6cb5885 100644 (file)
@@ -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