aboutsummaryrefslogtreecommitdiff
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
parent3b394781b5b9301fc489d9bfff6fbefb4db190f3 (diff)
downloadbusybox-w32-fa6ab56353e84057bf1b2f740bc1e1a99af686ce.tar.gz
busybox-w32-fa6ab56353e84057bf1b2f740bc1e1a99af686ce.tar.bz2
busybox-w32-fa6ab56353e84057bf1b2f740bc1e1a99af686ce.zip
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.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
94 94
95 /* Open the file. Barf if this doesn't work. */ 95 /* Open the file. Barf if this doesn't work. */
96 mode = ro ? O_RDONLY : O_RDWR; 96 mode = ro ? O_RDONLY : O_RDWR;
97 open_ffd:
97 ffd = open(file, mode); 98 ffd = open(file, mode);
98 if (ffd < 0) { 99 if (ffd < 0) {
99 if (mode != O_RDONLY) { 100 if (mode != O_RDONLY) {
100 mode = O_RDONLY; 101 mode = O_RDONLY;
101 ffd = open(file, mode); 102 goto open_ffd;
102 } 103 }
103 if (ffd < 0) 104 return -errno;
104 return -errno;
105 } 105 }
106 106
107 /* Find a loop device. */ 107 /* Find a loop device. */
108 try = *device ? *device : dev; 108 try = *device ? *device : dev;
109 /* 1048575 is a max possible minor number in Linux circa 2010 */ 109 /* 1048575 (0xfffff) is a max possible minor number in Linux circa 2010 */
110 for (i = 0; rc && i < 1048576; i++) { 110 for (i = 0; rc && i < 1048576; i++) {
111 sprintf(dev, LOOP_FORMAT, i); 111 sprintf(dev, LOOP_FORMAT, i);
112 112
@@ -121,7 +121,7 @@ int FAST_FUNC set_loop(char **device, const char *file, unsigned long long offse
121 goto try_to_open; 121 goto try_to_open;
122 } 122 }
123 /* Ran out of block devices, return failure. */ 123 /* Ran out of block devices, return failure. */
124 rc = -ENOENT; 124 rc = -1;
125 break; 125 break;
126 } 126 }
127 try_to_open: 127 try_to_open:
@@ -131,8 +131,14 @@ int FAST_FUNC set_loop(char **device, const char *file, unsigned long long offse
131 mode = O_RDONLY; 131 mode = O_RDONLY;
132 dfd = open(try, mode); 132 dfd = open(try, mode);
133 } 133 }
134 if (dfd < 0) 134 if (dfd < 0) {
135 if (errno == ENXIO) {
136 /* Happens if loop module is not loaded */
137 rc = -1;
138 break;
139 }
135 goto try_again; 140 goto try_again;
141 }
136 142
137 rc = ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo); 143 rc = ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo);
138 144