summaryrefslogtreecommitdiffhomepage
path: root/libbb/loop.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2014-01-21 13:44:21 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2014-01-21 13:44:21 +0100
commitfa6ab56353e84057bf1b2f740bc1e1a99af686ce (patch)
treea3230ebf679913d457c2b09a1fc1c114124381b3 /libbb/loop.c
parent3b394781b5b9301fc489d9bfff6fbefb4db190f3 (diff)
libbb: if opening /dev/loopN returns ENXIO, don't try N++.
function old new delta set_loop 639 635 -4 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb/loop.c')
-rw-r--r--libbb/loop.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/libbb/loop.c b/libbb/loop.c
index 823fba079..c96c5e070 100644
--- a/libbb/loop.c
+++ b/libbb/loop.c
@@ -94,19 +94,19 @@ int FAST_FUNC set_loop(char **device, const char *file, unsigned long long offse
/* Open the file. Barf if this doesn't work. */
mode = ro ? O_RDONLY : O_RDWR;
+ open_ffd:
ffd = open(file, mode);
if (ffd < 0) {
if (mode != O_RDONLY) {
mode = O_RDONLY;
- ffd = open(file, mode);
+ goto open_ffd;
}
- if (ffd < 0)
- return -errno;
+ return -errno;
}
/* Find a loop device. */
try = *device ? *device : dev;
- /* 1048575 is a max possible minor number in Linux circa 2010 */
+ /* 1048575 (0xfffff) is a max possible minor number in Linux circa 2010 */
for (i = 0; rc && i < 1048576; i++) {
sprintf(dev, LOOP_FORMAT, i);
@@ -121,7 +121,7 @@ int FAST_FUNC set_loop(char **device, const char *file, unsigned long long offse
goto try_to_open;
}
/* Ran out of block devices, return failure. */
- rc = -ENOENT;
+ rc = -1;
break;
}
try_to_open:
@@ -131,8 +131,14 @@ int FAST_FUNC set_loop(char **device, const char *file, unsigned long long offse
mode = O_RDONLY;
dfd = open(try, mode);
}
- if (dfd < 0)
+ if (dfd < 0) {
+ if (errno == ENXIO) {
+ /* Happens if loop module is not loaded */
+ rc = -1;
+ break;
+ }
goto try_again;
+ }
rc = ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo);