diff --git a/Changelog b/Changelog index 5678f60c2..c6493f8a3 100644 --- a/Changelog +++ b/Changelog @@ -45,6 +45,8 @@ * Fixed a bug where "sed 's/foo/bar/g'" (i.e. a script w/o a "-e") * ps now supports BB_FEATURE_AUTOWIDTH, and can adjust its width to match the terminal (defaults to width=79 when this is off). + * Fixed mount'ing loop devices when the filesystem type was not + specified. It used to revert to non-loop after the first try. -Erik Andersen diff --git a/mount.c b/mount.c index c29be5106..336cff7d2 100644 --- a/mount.c +++ b/mount.c @@ -142,7 +142,6 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, fprintf(stderr, "WARNING: loop device is read-only\n"); flags &= ~MS_RDONLY; } - use_loop = FALSE; } #endif status = @@ -415,10 +414,10 @@ extern int mount_main(int argc, char **argv) case 'a': all = TRUE; break; -#ifdef BB_MTAB case 'f': fakeIt = TRUE; break; +#ifdef BB_MTAB case 'n': useMtab = FALSE; break; diff --git a/umount.c b/umount.c index 0f087e197..b0f393cca 100644 --- a/umount.c +++ b/umount.c @@ -41,6 +41,9 @@ static const char umount_usage[] = #ifdef BB_FEATURE_REMOUNT "\t-r:\tTry to remount devices as read-only if mount is busy\n" #endif +#if defined BB_FEATURE_MOUNT_LOOP + "\t-f:\tDo not free loop device (if a loop device has been used)\n" +#endif ; struct _mtab_entry_t { @@ -53,9 +56,14 @@ static struct _mtab_entry_t *mtab_cache = NULL; +#if defined BB_FEATURE_MOUNT_LOOP +static int freeLoop = TRUE; +#endif static int useMtab = TRUE; static int umountAll = FALSE; +#if defined BB_FEATURE_REMOUNT static int doRemount = FALSE; +#endif extern const char mtab_file[]; /* Defined in utility.c */ @@ -167,7 +175,7 @@ static int do_umount(const char *name, int useMtab) status = umount(name); #if defined BB_FEATURE_MOUNT_LOOP - if (blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9)) + if (freeLoop == TRUE && blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9)) /* this was a loop device, delete it */ del_loop(blockDevice); #endif @@ -236,6 +244,11 @@ extern int umount_main(int argc, char **argv) case 'a': umountAll = TRUE; break; +#if defined BB_FEATURE_MOUNT_LOOP + case 'f': + freeLoop = FALSE; + break; +#endif #ifdef BB_MTAB case 'n': useMtab = FALSE; diff --git a/util-linux/mount.c b/util-linux/mount.c index c29be5106..336cff7d2 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c @@ -142,7 +142,6 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, fprintf(stderr, "WARNING: loop device is read-only\n"); flags &= ~MS_RDONLY; } - use_loop = FALSE; } #endif status = @@ -415,10 +414,10 @@ extern int mount_main(int argc, char **argv) case 'a': all = TRUE; break; -#ifdef BB_MTAB case 'f': fakeIt = TRUE; break; +#ifdef BB_MTAB case 'n': useMtab = FALSE; break; diff --git a/util-linux/umount.c b/util-linux/umount.c index 0f087e197..b0f393cca 100644 --- a/util-linux/umount.c +++ b/util-linux/umount.c @@ -41,6 +41,9 @@ static const char umount_usage[] = #ifdef BB_FEATURE_REMOUNT "\t-r:\tTry to remount devices as read-only if mount is busy\n" #endif +#if defined BB_FEATURE_MOUNT_LOOP + "\t-f:\tDo not free loop device (if a loop device has been used)\n" +#endif ; struct _mtab_entry_t { @@ -53,9 +56,14 @@ static struct _mtab_entry_t *mtab_cache = NULL; +#if defined BB_FEATURE_MOUNT_LOOP +static int freeLoop = TRUE; +#endif static int useMtab = TRUE; static int umountAll = FALSE; +#if defined BB_FEATURE_REMOUNT static int doRemount = FALSE; +#endif extern const char mtab_file[]; /* Defined in utility.c */ @@ -167,7 +175,7 @@ static int do_umount(const char *name, int useMtab) status = umount(name); #if defined BB_FEATURE_MOUNT_LOOP - if (blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9)) + if (freeLoop == TRUE && blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9)) /* this was a loop device, delete it */ del_loop(blockDevice); #endif @@ -236,6 +244,11 @@ extern int umount_main(int argc, char **argv) case 'a': umountAll = TRUE; break; +#if defined BB_FEATURE_MOUNT_LOOP + case 'f': + freeLoop = FALSE; + break; +#endif #ifdef BB_MTAB case 'n': useMtab = FALSE;