aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2006-08-03 17:54:45 +0000
committerRob Landley <rob@landley.net>2006-08-03 17:54:45 +0000
commit7478804b783619762a52a740037126ef8711acc2 (patch)
treeb89cfcb288e5ff6deb78c7bbf21a08459850cba2
parent280a264fb893670f00e333dc75c58b6c77970048 (diff)
downloadbusybox-7478804b783619762a52a740037126ef8711acc2.tar.gz
Fix umount so loop device disassociation hopefully doesn't screw up errno on
a failed mount. And while I'm at it, legacy mdev removal was only being done in the _failure_ case? That can't be right. Plus minor header cleanups and an option parsing tweak.
-rw-r--r--util-linux/umount.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/util-linux/umount.c b/util-linux/umount.c
index b74b11027..24c1d03a9 100644
--- a/util-linux/umount.c
+++ b/util-linux/umount.c
@@ -13,18 +13,15 @@
#include "busybox.h"
#include <mntent.h>
-#include <errno.h>
-#include <string.h>
#include <getopt.h>
-#define OPTION_STRING "flDnrvad"
+#define OPTION_STRING "flDnravd"
#define OPT_FORCE 1
#define OPT_LAZY 2
#define OPT_DONTFREELOOP 4
#define OPT_NO_MTAB 8
#define OPT_REMOUNT 16
-#define OPT_IGNORED 32 // -v is ignored
-#define OPT_ALL (ENABLE_FEATURE_UMOUNT_ALL ? 64 : 0)
+#define OPT_ALL (ENABLE_FEATURE_UMOUNT_ALL ? 32 : 0)
int umount_main(int argc, char **argv)
{
@@ -77,8 +74,6 @@ int umount_main(int argc, char **argv)
m = 0;
if (!argc) bb_show_usage();
}
-
-
// Loop through everything we're supposed to umount, and do so.
for (;;) {
@@ -114,19 +109,20 @@ int umount_main(int argc, char **argv)
"%s busy - remounted read-only", m->device);
}
- /* De-allocate the loop device. This ioctl should be ignored on any
- * non-loop block devices. */
- if (ENABLE_FEATURE_MOUNT_LOOP && !(opt & OPT_DONTFREELOOP) && m)
- del_loop(m->device);
-
if (curstat) {
- /* Yes, the ENABLE is redundant here, but the optimizer for ARM
- * can't do simple constant propagation in local variables... */
- if(ENABLE_FEATURE_MTAB_SUPPORT && !(opt & OPT_NO_MTAB) && m)
- erase_mtab(m->dir);
status = EXIT_FAILURE;
bb_perror_msg("Couldn't umount %s", path);
+ } else {
+ /* De-allocate the loop device. This ioctl should be ignored on
+ * any non-loop block devices. */
+ if (ENABLE_FEATURE_MOUNT_LOOP && !(opt & OPT_DONTFREELOOP) && m)
+ del_loop(m->device);
+ if (ENABLE_FEATURE_MTAB_SUPPORT && !(opt & OPT_NO_MTAB) && m)
+ erase_mtab(m->dir);
}
+
+
+
// Find next matching mtab entry for -a or umount /dev
while (m && (m = m->next))
if ((opt & OPT_ALL) || !strcmp(path,m->device))