diff options
-rw-r--r-- | util-linux/mount.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/util-linux/mount.c b/util-linux/mount.c index c5aec74fa..5ddf54cb1 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c | |||
@@ -201,6 +201,7 @@ static int mount_it_now(struct mntent *mp, int vfsflags) | |||
201 | char *filteropts = 0; | 201 | char *filteropts = 0; |
202 | 202 | ||
203 | parse_mount_options(mp->mnt_opts, &filteropts); | 203 | parse_mount_options(mp->mnt_opts, &filteropts); |
204 | |||
204 | // Mount, with fallback to read-only if necessary. | 205 | // Mount, with fallback to read-only if necessary. |
205 | 206 | ||
206 | for(;;) { | 207 | for(;;) { |
@@ -261,13 +262,17 @@ static int mount_it_now(struct mntent *mp, int vfsflags) | |||
261 | 262 | ||
262 | static int singlemount(struct mntent *mp) | 263 | static int singlemount(struct mntent *mp) |
263 | { | 264 | { |
264 | int rc = 0, vfsflags; | 265 | int rc = 1, vfsflags; |
265 | char *loopFile = 0; | 266 | char *loopFile = 0; |
266 | llist_t *fl = 0; | 267 | llist_t *fl = 0; |
267 | struct stat st; | 268 | struct stat st; |
268 | 269 | ||
269 | vfsflags = parse_mount_options(mp->mnt_opts, 0); | 270 | vfsflags = parse_mount_options(mp->mnt_opts, 0); |
270 | 271 | ||
272 | // Treat fstype "auto" as unspecified. | ||
273 | |||
274 | if (mp->mnt_type && !strcmp(mp->mnt_type,"auto")) mp->mnt_type = 0; | ||
275 | |||
271 | // Might this be an NFS filesystem? | 276 | // Might this be an NFS filesystem? |
272 | 277 | ||
273 | if (ENABLE_FEATURE_MOUNT_NFS && | 278 | if (ENABLE_FEATURE_MOUNT_NFS && |
@@ -294,7 +299,7 @@ static int singlemount(struct mntent *mp) | |||
294 | // Do we need to allocate a loopback device for it? | 299 | // Do we need to allocate a loopback device for it? |
295 | 300 | ||
296 | if (ENABLE_FEATURE_MOUNT_LOOP && S_ISREG(st.st_mode)) { | 301 | if (ENABLE_FEATURE_MOUNT_LOOP && S_ISREG(st.st_mode)) { |
297 | loopFile = mp->mnt_fsname; | 302 | loopFile = bb_simplify_path(mp->mnt_fsname); |
298 | mp->mnt_fsname = 0; | 303 | mp->mnt_fsname = 0; |
299 | switch(set_loop(&(mp->mnt_fsname), loopFile, 0)) { | 304 | switch(set_loop(&(mp->mnt_fsname), loopFile, 0)) { |
300 | case 0: | 305 | case 0: |
@@ -306,7 +311,7 @@ static int singlemount(struct mntent *mp) | |||
306 | : "Couldn't setup loop device"); | 311 | : "Couldn't setup loop device"); |
307 | return errno; | 312 | return errno; |
308 | } | 313 | } |
309 | 314 | ||
310 | // Autodetect bind mounts | 315 | // Autodetect bind mounts |
311 | 316 | ||
312 | } else if (S_ISDIR(st.st_mode) && !mp->mnt_type) vfsflags |= MS_BIND; | 317 | } else if (S_ISDIR(st.st_mode) && !mp->mnt_type) vfsflags |= MS_BIND; |
@@ -320,18 +325,34 @@ static int singlemount(struct mntent *mp) | |||
320 | 325 | ||
321 | // Loop through filesystem types until mount succeeds or we run out | 326 | // Loop through filesystem types until mount succeeds or we run out |
322 | 327 | ||
323 | else for (fl = fslist; fl; fl = fl->link) { | 328 | else { |
324 | mp->mnt_type = fl->data; | 329 | |
330 | /* Initialize list of block backed filesystems. This has to be | ||
331 | * done here so that during "mount -a", mounts after /proc shows up | ||
332 | * can autodetect. */ | ||
333 | |||
334 | if (!fslist) { | ||
335 | fslist = get_block_backed_filesystems(); | ||
336 | if (ENABLE_FEATURE_CLEAN_UP && fslist) | ||
337 | atexit(delete_block_backed_filesystems); | ||
338 | } | ||
339 | |||
340 | for (fl = fslist; fl; fl = fl->link) { | ||
341 | mp->mnt_type = fl->data; | ||
325 | 342 | ||
326 | if (!(rc = mount_it_now(mp,vfsflags))) break; | 343 | if (!(rc = mount_it_now(mp,vfsflags))) break; |
327 | 344 | ||
328 | mp->mnt_type = 0; | 345 | mp->mnt_type = 0; |
346 | } | ||
329 | } | 347 | } |
330 | 348 | ||
331 | // Mount failed. Clean up | 349 | // Mount failed. Clean up |
332 | if (rc && loopFile) { | 350 | if (rc && loopFile) { |
333 | del_loop(mp->mnt_fsname); | 351 | del_loop(mp->mnt_fsname); |
334 | if(ENABLE_FEATURE_CLEAN_UP) free(loopFile); | 352 | if(ENABLE_FEATURE_CLEAN_UP) { |
353 | free(loopFile); | ||
354 | free(mp->mnt_fsname); | ||
355 | } | ||
335 | } | 356 | } |
336 | return rc; | 357 | return rc; |
337 | } | 358 | } |
@@ -389,10 +410,6 @@ int mount_main(int argc, char **argv) | |||
389 | } | 410 | } |
390 | } | 411 | } |
391 | 412 | ||
392 | // Ignore type "auto". | ||
393 | |||
394 | if (fstype && !strcmp(fstype, "auto")) fstype = NULL; | ||
395 | |||
396 | // Three or more non-option arguments? Die with a usage message. | 413 | // Three or more non-option arguments? Die with a usage message. |
397 | 414 | ||
398 | if (optind-argc>2) bb_show_usage(); | 415 | if (optind-argc>2) bb_show_usage(); |
@@ -421,11 +438,6 @@ int mount_main(int argc, char **argv) | |||
421 | } | 438 | } |
422 | } | 439 | } |
423 | 440 | ||
424 | /* Initialize list of block backed filesystems */ | ||
425 | |||
426 | fslist = get_block_backed_filesystems(); | ||
427 | if (ENABLE_FEATURE_CLEAN_UP) atexit(delete_block_backed_filesystems); | ||
428 | |||
429 | // When we have two arguments, the second is the directory and we can | 441 | // When we have two arguments, the second is the directory and we can |
430 | // skip looking at fstab entirely. We can always abspath() the directory | 442 | // skip looking at fstab entirely. We can always abspath() the directory |
431 | // argument when we get it. | 443 | // argument when we get it. |
@@ -483,7 +495,7 @@ int mount_main(int argc, char **argv) | |||
483 | } | 495 | } |
484 | break; | 496 | break; |
485 | } | 497 | } |
486 | 498 | ||
487 | /* If we're trying to mount something specific and this isn't it, | 499 | /* If we're trying to mount something specific and this isn't it, |
488 | * skip it. Note we must match both the exact text in fstab (ala | 500 | * skip it. Note we must match both the exact text in fstab (ala |
489 | * "proc") or a full path from root */ | 501 | * "proc") or a full path from root */ |