diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2014-01-21 13:44:21 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2014-01-21 13:44:21 +0100 |
commit | fa6ab56353e84057bf1b2f740bc1e1a99af686ce (patch) | |
tree | a3230ebf679913d457c2b09a1fc1c114124381b3 | |
parent | 3b394781b5b9301fc489d9bfff6fbefb4db190f3 (diff) | |
download | busybox-fa6ab56353e84057bf1b2f740bc1e1a99af686ce.tar.gz |
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>
-rw-r--r-- | libbb/loop.c | 18 |
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); |