Add support for "noatime" and "nodiratime" mount flags to mount.
authorErik Andersen <andersen@codepoet.org>
Fri, 5 May 2000 19:49:33 +0000 (19:49 -0000)
committerErik Andersen <andersen@codepoet.org>
Fri, 5 May 2000 19:49:33 +0000 (19:49 -0000)
Change umount "-f" to mean force, and actually use umount2.
Change umount "-l" to mean "Do not free loop device".
Updates docs accordingly.
 -Erik

busybox.def.h
docs/busybox.pod
mount.c
umount.c
util-linux/mount.c
util-linux/umount.c

index c5b7de9..a2d216f 100644 (file)
 // 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
 //
index ac492ab..6a18a04 100644 (file)
@@ -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 456e452..00a774a 100644 (file)
--- 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},
index ad7de2d..18a5afe 100644 (file)
--- 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;
index 456e452..00a774a 100644 (file)
@@ -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},
index ad7de2d..18a5afe 100644 (file)
@@ -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;