[git commit] umount: always use umount2 syscall with specified flags
Denys Vlasenko
vda.linux at googlemail.com
Thu Oct 1 16:50:06 UTC 2015
commit: http://git.busybox.net/busybox/commit/?id=c919d561adaf152d9b8834475539e2366c8aa484
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master
Make umount -f more compatible with util-linux 2.22.2.
Before:
* 'umount -f': calls umount syscall,
if it fails calls umount2 with 'MNT_FORCE'
* 'mount -f -l': calls umount syscall,
if it fails calls umount2 with 'MNT_LAZY'. 'MNT_FORCE' dropped
After:
* 'umount -f': calls umount2 syscall with 'MNT_FORCE'
* 'mount -f -l': calls umount2 syscall with 'MNT_LAZY' and 'MNT_FORCE'
function old new delta
umount 45 - -45
umount_main 610 555 -55
Signed-off-by: Anton Bondarenko <anton.bondarenko at axis.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
util-linux/umount.c | 20 ++++++++++++++++----
1 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/util-linux/umount.c b/util-linux/umount.c
index 4c2e882..c6c7441 100644
--- a/util-linux/umount.c
+++ b/util-linux/umount.c
@@ -81,8 +81,13 @@ int umount_main(int argc UNUSED_PARAM, char **argv)
argv += optind;
// MNT_FORCE and MNT_DETACH (from linux/fs.h) must match
- // OPT_FORCE and OPT_LAZY, otherwise this trick won't work:
- doForce = MAX((opt & OPT_FORCE), (opt & OPT_LAZY));
+ // OPT_FORCE and OPT_LAZY.
+ {
+ typedef char bug[
+ (OPT_FORCE != MNT_FORCE || OPT_LAZY != MNT_DETACH) ? -1 : 1
+ ];
+ }
+ doForce = opt & (OPT_FORCE|OPT_LAZY);
/* Get a list of mount points from mtab. We read them all in now mostly
* for umount -a (so we don't have to worry about the list changing while
@@ -147,11 +152,18 @@ int umount_main(int argc UNUSED_PARAM, char **argv)
// umount the directory even if we were given the block device.
if (m) zapit = m->dir;
+// umount from util-linux 2.22.2 does not do this:
+// umount -f uses umount2(MNT_FORCE) immediately,
+// not trying umount() first.
+// (Strangely, umount -fl ignores -f: it is equivalent to umount -l.
+// We do pass both flags in this case)
+#if 0
// Let's ask the thing nicely to unmount.
curstat = umount(zapit);
- // Force the unmount, if necessary.
+ // Unmount with force and/or lazy flags, if necessary.
if (curstat && doForce)
+#endif
curstat = umount2(zapit, doForce);
// If still can't umount, maybe remount read-only?
@@ -168,7 +180,7 @@ int umount_main(int argc UNUSED_PARAM, char **argv)
bb_error_msg(msg, m->device);
} else {
status = EXIT_FAILURE;
- bb_perror_msg("can't %sumount %s", (doForce ? "forcibly " : ""), zapit);
+ bb_perror_msg("can't unmount %s", zapit);
}
} else {
// De-allocate the loop device. This ioctl should be ignored on
More information about the busybox-cvs
mailing list