diff options
Diffstat (limited to 'util-linux')
| -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 */ |
