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>
This commit is contained in:
Denys Vlasenko 2014-01-21 13:44:21 +01:00
parent 3b394781b5
commit fa6ab56353

View File

@ -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. */ /* Open the file. Barf if this doesn't work. */
mode = ro ? O_RDONLY : O_RDWR; mode = ro ? O_RDONLY : O_RDWR;
open_ffd:
ffd = open(file, mode); ffd = open(file, mode);
if (ffd < 0) { if (ffd < 0) {
if (mode != O_RDONLY) { if (mode != O_RDONLY) {
mode = O_RDONLY; mode = O_RDONLY;
ffd = open(file, mode); goto open_ffd;
} }
if (ffd < 0)
return -errno; return -errno;
} }
/* Find a loop device. */ /* Find a loop device. */
try = *device ? *device : dev; 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++) { for (i = 0; rc && i < 1048576; i++) {
sprintf(dev, LOOP_FORMAT, 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; goto try_to_open;
} }
/* Ran out of block devices, return failure. */ /* Ran out of block devices, return failure. */
rc = -ENOENT; rc = -1;
break; break;
} }
try_to_open: try_to_open:
@ -131,8 +131,14 @@ int FAST_FUNC set_loop(char **device, const char *file, unsigned long long offse
mode = O_RDONLY; mode = O_RDONLY;
dfd = open(try, mode); 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; goto try_again;
}
rc = ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo); rc = ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo);