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.
This commit is contained in:
Rob Landley 2006-08-03 17:54:45 +00:00
parent 280a264fb8
commit 7478804b78

View File

@ -13,18 +13,15 @@
#include "busybox.h" #include "busybox.h"
#include <mntent.h> #include <mntent.h>
#include <errno.h>
#include <string.h>
#include <getopt.h> #include <getopt.h>
#define OPTION_STRING "flDnrvad" #define OPTION_STRING "flDnravd"
#define OPT_FORCE 1 #define OPT_FORCE 1
#define OPT_LAZY 2 #define OPT_LAZY 2
#define OPT_DONTFREELOOP 4 #define OPT_DONTFREELOOP 4
#define OPT_NO_MTAB 8 #define OPT_NO_MTAB 8
#define OPT_REMOUNT 16 #define OPT_REMOUNT 16
#define OPT_IGNORED 32 // -v is ignored #define OPT_ALL (ENABLE_FEATURE_UMOUNT_ALL ? 32 : 0)
#define OPT_ALL (ENABLE_FEATURE_UMOUNT_ALL ? 64 : 0)
int umount_main(int argc, char **argv) int umount_main(int argc, char **argv)
{ {
@ -78,8 +75,6 @@ int umount_main(int argc, char **argv)
if (!argc) bb_show_usage(); if (!argc) bb_show_usage();
} }
// Loop through everything we're supposed to umount, and do so. // Loop through everything we're supposed to umount, and do so.
for (;;) { for (;;) {
int curstat; int curstat;
@ -114,19 +109,20 @@ int umount_main(int argc, char **argv)
"%s busy - remounted read-only", m->device); "%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) { 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; status = EXIT_FAILURE;
bb_perror_msg("Couldn't umount %s", path); 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 // Find next matching mtab entry for -a or umount /dev
while (m && (m = m->next)) while (m && (m = m->next))
if ((opt & OPT_ALL) || !strcmp(path,m->device)) if ((opt & OPT_ALL) || !strcmp(path,m->device))