aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--busybox.def.h4
-rw-r--r--docs/busybox.pod38
-rw-r--r--mount.c32
-rw-r--r--umount.c24
-rw-r--r--util-linux/mount.c32
-rw-r--r--util-linux/umount.c24
6 files changed, 104 insertions, 50 deletions
diff --git a/busybox.def.h b/busybox.def.h
index c5b7de900..a2d216ff7 100644
--- a/busybox.def.h
+++ b/busybox.def.h
@@ -181,6 +181,10 @@
// Enable support for a real /etc/mtab file instead of /proc/mounts
//#define BB_FEATURE_MOUNT_MTAB_SUPPORT
//
+// Enable support forced filesystem unmounting
+// (i.e. in case of an unreachable NFS system).
+#define BB_FEATURE_MOUNT_FORCE
+//
// Enable support for mounting remote NFS volumes
//#define BB_FEATURE_NFSMOUNT
//
diff --git a/docs/busybox.pod b/docs/busybox.pod
index ac492ab15..6a18a0499 100644
--- a/docs/busybox.pod
+++ b/docs/busybox.pod
@@ -1111,21 +1111,22 @@ Usage: mount [flags]
Flags:
- -a: Mount all file systems in fstab.
+ -a: Mount all file systems in fstab.
-o option: One of many filesystem options, listed below.
- -r: Mount the filesystem read-only.
- -t filesystem-type: Specify the filesystem type.
- -w: Mount for reading and writing (default).
-
-Options for use with the "B<-o>" flag:
-
- async / sync: Writes are asynchronous / synchronous.
- dev / nodev: Allow use of special device files / disallow them.
- exec / noexec: Allow use of executable files / disallow them.
- loop: Mounts a file via loop device.
- suid / nosuid: Allow set-user-id-root programs / disallow them.
- remount: Re-mount a currently-mounted filesystem, changing its flags.
- ro / rw: Mount for read-only / read-write.
+ -r: Mount the filesystem read-only.
+ -t fs-type: Specify the filesystem type.
+ -w: Mount for reading and writing (default).
+
+Options for use with the "-o" flag:
+
+ async/sync: Writes are asynchronous / synchronous.
+ atime/noatime: Enable / disable updates to inode access times.
+ dev/nodev: Allow use of special device files / disallow them.
+ exec/noexec: Allow use of executable files / disallow them.
+ loop: Mounts a file via loop device.
+ suid/nosuid: Allow set-user-id-root programs / disallow them.
+ remount: Re-mount a currently-mounted filesystem, changing its flags.
+ ro/rw: Mount for read-only / read-write.
There are EVEN MORE flags that are specific to each filesystem.
You'll have to see the written documentation for those.
@@ -1663,9 +1664,10 @@ Usage: umount [flags] filesystem|directory
Flags:
- -a: Unmount all file systems
- -r: Try to remount devices as read-only if mount is busy
- -f: Do not free loop device (if a loop device has been used)
+ -a: Unmount all file systems
+ -r: Try to remount devices as read-only if mount is busy
+ -f: Force filesystem umount (i.e. unreachable NFS server)
+ -l: Do not free loop device (if a loop device has been used)
Example:
@@ -1876,4 +1878,4 @@ Enrique Zanardi <ezanardi@ull.es>
=cut
-# $Id: busybox.pod,v 1.27 2000/05/02 06:40:02 erik Exp $
+# $Id: busybox.pod,v 1.28 2000/05/05 19:49:33 erik Exp $
diff --git a/mount.c b/mount.c
index 456e45235..00a774a53 100644
--- a/mount.c
+++ b/mount.c
@@ -66,26 +66,28 @@ extern const char mtab_file[]; /* Defined in utility.c */
static const char mount_usage[] = "\tmount [flags]\n"
"\tmount [flags] device directory [-o options,more-options]\n"
- "\n" "Flags:\n" "\t-a:\tMount all file systems in fstab.\n"
+ "\n" "Flags:\n"
+ "\t-a:\t\tMount all file systems in fstab.\n"
#ifdef BB_MTAB
- "\t-f:\t\"Fake\" mount. Add entry to mount table but don't mount it.\n"
- "\t-n:\tDon't write a mount table entry.\n"
+ "\t-f:\t\t\"Fake\" mount. Add entry to mount table but don't mount it.\n"
+ "\t-n:\t\tDon't write a mount table entry.\n"
#endif
"\t-o option:\tOne of many filesystem options, listed below.\n"
- "\t-r:\tMount the filesystem read-only.\n"
- "\t-t filesystem-type:\tSpecify the filesystem type.\n"
- "\t-w:\tMount for reading and writing (default).\n"
+ "\t-r:\t\tMount the filesystem read-only.\n"
+ "\t-t fs-type:\tSpecify the filesystem type.\n"
+ "\t-w:\t\tMount for reading and writing (default).\n"
"\n"
"Options for use with the \"-o\" flag:\n"
- "\tasync / sync:\tWrites are asynchronous / synchronous.\n"
- "\tdev / nodev:\tAllow use of special device files / disallow them.\n"
- "\texec / noexec:\tAllow use of executable files / disallow them.\n"
+ "\tasync/sync:\tWrites are asynchronous / synchronous.\n"
+ "\tatime/noatime:\tEnable / disable updates to inode access times.\n"
+ "\tdev/nodev:\tAllow use of special device files / disallow them.\n"
+ "\texec/noexec:\tAllow use of executable files / disallow them.\n"
#if defined BB_FEATURE_MOUNT_LOOP
- "\tloop: Mounts a file via loop device.\n"
+ "\tloop:\t\tMounts a file via loop device.\n"
#endif
- "\tsuid / nosuid:\tAllow set-user-id-root programs / disallow them.\n"
- "\tremount: Re-mount a currently-mounted filesystem, changing its flags.\n"
- "\tro / rw: Mount for read-only / read-write.\n"
+ "\tsuid/nosuid:\tAllow set-user-id-root programs / disallow them.\n"
+ "\tremount:\tRe-mount a currently-mounted filesystem, changing its flags.\n"
+ "\tro/rw:\t\tMount for read-only / read-write.\n"
"There are EVEN MORE flags that are specific to each filesystem.\n"
"You'll have to see the written documentation for those.\n";
@@ -98,10 +100,14 @@ struct mount_options {
static const struct mount_options mount_options[] = {
{"async", ~MS_SYNCHRONOUS, 0},
+ {"atime", ~0, ~MS_NOATIME},
{"defaults", ~0, 0},
{"dev", ~MS_NODEV, 0},
+ {"diratime", ~0, ~MS_NODIRATIME},
{"exec", ~MS_NOEXEC, 0},
+ {"noatime", ~0, MS_NOATIME},
{"nodev", ~0, MS_NODEV},
+ {"nodiratime", ~0, MS_NODIRATIME},
{"noexec", ~0, MS_NOEXEC},
{"nosuid", ~0, MS_NOSUID},
{"remount", ~0, MS_REMOUNT},
diff --git a/umount.c b/umount.c
index ad7de2d20..18a5afe80 100644
--- a/umount.c
+++ b/umount.c
@@ -38,8 +38,11 @@ static const char umount_usage[] =
"\n"
#endif
"\t-r:\tTry to remount devices as read-only if mount is busy\n"
+#if defined BB_FEATURE_MOUNT_FORCE
+ "\t-f:\tForce filesystem umount (i.e. unreachable NFS server)\n"
+#endif
#if defined BB_FEATURE_MOUNT_LOOP
- "\t-f:\tDo not free loop device (if a loop device has been used)\n"
+ "\t-l:\tDo not free loop device (if a loop device has been used)\n"
#endif
;
@@ -53,6 +56,9 @@ static struct _mtab_entry_t *mtab_cache = NULL;
+#if defined BB_FEATURE_MOUNT_FORCE
+static int doForce = FALSE;
+#endif
#if defined BB_FEATURE_MOUNT_LOOP
static int freeLoop = TRUE;
#endif
@@ -176,13 +182,20 @@ static int do_umount(const char *name, int useMtab)
/* this was a loop device, delete it */
del_loop(blockDevice);
#endif
+#if defined BB_FEATURE_MOUNT_FORCE
+ if (status != 0 && doForce == TRUE) {
+ status = umount2(blockDevice, MNT_FORCE);
+ if (status != 0) {
+ fatalError("umount: forced umount of %s failed!\n", blockDevice);
+ }
+ }
+#endif
if (status != 0 && doRemount == TRUE && errno == EBUSY) {
status = mount(blockDevice, name, NULL,
MS_MGC_VAL | MS_REMOUNT | MS_RDONLY, NULL);
if (status == 0) {
fprintf(stderr, "umount: %s busy - remounted read-only\n",
blockDevice);
- /* TODO: update mtab if BB_MTAB is defined */
} else {
fprintf(stderr, "umount: Cannot remount %s read-only\n",
blockDevice);
@@ -240,7 +253,7 @@ extern int umount_main(int argc, char **argv)
umountAll = TRUE;
break;
#if defined BB_FEATURE_MOUNT_LOOP
- case 'f':
+ case 'l':
freeLoop = FALSE;
break;
#endif
@@ -249,6 +262,11 @@ extern int umount_main(int argc, char **argv)
useMtab = FALSE;
break;
#endif
+#ifdef BB_FEATURE_MOUNT_FORCE
+ case 'f':
+ doForce = TRUE;
+ break;
+#endif
case 'r':
doRemount = TRUE;
break;
diff --git a/util-linux/mount.c b/util-linux/mount.c
index 456e45235..00a774a53 100644
--- a/util-linux/mount.c
+++ b/util-linux/mount.c
@@ -66,26 +66,28 @@ extern const char mtab_file[]; /* Defined in utility.c */
static const char mount_usage[] = "\tmount [flags]\n"
"\tmount [flags] device directory [-o options,more-options]\n"
- "\n" "Flags:\n" "\t-a:\tMount all file systems in fstab.\n"
+ "\n" "Flags:\n"
+ "\t-a:\t\tMount all file systems in fstab.\n"
#ifdef BB_MTAB
- "\t-f:\t\"Fake\" mount. Add entry to mount table but don't mount it.\n"
- "\t-n:\tDon't write a mount table entry.\n"
+ "\t-f:\t\t\"Fake\" mount. Add entry to mount table but don't mount it.\n"
+ "\t-n:\t\tDon't write a mount table entry.\n"
#endif
"\t-o option:\tOne of many filesystem options, listed below.\n"
- "\t-r:\tMount the filesystem read-only.\n"
- "\t-t filesystem-type:\tSpecify the filesystem type.\n"
- "\t-w:\tMount for reading and writing (default).\n"
+ "\t-r:\t\tMount the filesystem read-only.\n"
+ "\t-t fs-type:\tSpecify the filesystem type.\n"
+ "\t-w:\t\tMount for reading and writing (default).\n"
"\n"
"Options for use with the \"-o\" flag:\n"
- "\tasync / sync:\tWrites are asynchronous / synchronous.\n"
- "\tdev / nodev:\tAllow use of special device files / disallow them.\n"
- "\texec / noexec:\tAllow use of executable files / disallow them.\n"
+ "\tasync/sync:\tWrites are asynchronous / synchronous.\n"
+ "\tatime/noatime:\tEnable / disable updates to inode access times.\n"
+ "\tdev/nodev:\tAllow use of special device files / disallow them.\n"
+ "\texec/noexec:\tAllow use of executable files / disallow them.\n"
#if defined BB_FEATURE_MOUNT_LOOP
- "\tloop: Mounts a file via loop device.\n"
+ "\tloop:\t\tMounts a file via loop device.\n"
#endif
- "\tsuid / nosuid:\tAllow set-user-id-root programs / disallow them.\n"
- "\tremount: Re-mount a currently-mounted filesystem, changing its flags.\n"
- "\tro / rw: Mount for read-only / read-write.\n"
+ "\tsuid/nosuid:\tAllow set-user-id-root programs / disallow them.\n"
+ "\tremount:\tRe-mount a currently-mounted filesystem, changing its flags.\n"
+ "\tro/rw:\t\tMount for read-only / read-write.\n"
"There are EVEN MORE flags that are specific to each filesystem.\n"
"You'll have to see the written documentation for those.\n";
@@ -98,10 +100,14 @@ struct mount_options {
static const struct mount_options mount_options[] = {
{"async", ~MS_SYNCHRONOUS, 0},
+ {"atime", ~0, ~MS_NOATIME},
{"defaults", ~0, 0},
{"dev", ~MS_NODEV, 0},
+ {"diratime", ~0, ~MS_NODIRATIME},
{"exec", ~MS_NOEXEC, 0},
+ {"noatime", ~0, MS_NOATIME},
{"nodev", ~0, MS_NODEV},
+ {"nodiratime", ~0, MS_NODIRATIME},
{"noexec", ~0, MS_NOEXEC},
{"nosuid", ~0, MS_NOSUID},
{"remount", ~0, MS_REMOUNT},
diff --git a/util-linux/umount.c b/util-linux/umount.c
index ad7de2d20..18a5afe80 100644
--- a/util-linux/umount.c
+++ b/util-linux/umount.c
@@ -38,8 +38,11 @@ static const char umount_usage[] =
"\n"
#endif
"\t-r:\tTry to remount devices as read-only if mount is busy\n"
+#if defined BB_FEATURE_MOUNT_FORCE
+ "\t-f:\tForce filesystem umount (i.e. unreachable NFS server)\n"
+#endif
#if defined BB_FEATURE_MOUNT_LOOP
- "\t-f:\tDo not free loop device (if a loop device has been used)\n"
+ "\t-l:\tDo not free loop device (if a loop device has been used)\n"
#endif
;
@@ -53,6 +56,9 @@ static struct _mtab_entry_t *mtab_cache = NULL;
+#if defined BB_FEATURE_MOUNT_FORCE
+static int doForce = FALSE;
+#endif
#if defined BB_FEATURE_MOUNT_LOOP
static int freeLoop = TRUE;
#endif
@@ -176,13 +182,20 @@ static int do_umount(const char *name, int useMtab)
/* this was a loop device, delete it */
del_loop(blockDevice);
#endif
+#if defined BB_FEATURE_MOUNT_FORCE
+ if (status != 0 && doForce == TRUE) {
+ status = umount2(blockDevice, MNT_FORCE);
+ if (status != 0) {
+ fatalError("umount: forced umount of %s failed!\n", blockDevice);
+ }
+ }
+#endif
if (status != 0 && doRemount == TRUE && errno == EBUSY) {
status = mount(blockDevice, name, NULL,
MS_MGC_VAL | MS_REMOUNT | MS_RDONLY, NULL);
if (status == 0) {
fprintf(stderr, "umount: %s busy - remounted read-only\n",
blockDevice);
- /* TODO: update mtab if BB_MTAB is defined */
} else {
fprintf(stderr, "umount: Cannot remount %s read-only\n",
blockDevice);
@@ -240,7 +253,7 @@ extern int umount_main(int argc, char **argv)
umountAll = TRUE;
break;
#if defined BB_FEATURE_MOUNT_LOOP
- case 'f':
+ case 'l':
freeLoop = FALSE;
break;
#endif
@@ -249,6 +262,11 @@ extern int umount_main(int argc, char **argv)
useMtab = FALSE;
break;
#endif
+#ifdef BB_FEATURE_MOUNT_FORCE
+ case 'f':
+ doForce = TRUE;
+ break;
+#endif
case 'r':
doRemount = TRUE;
break;