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). + -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 "B<-o>" flag: +Options for use with the "-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. + 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 =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 @@ -175,6 +181,14 @@ static int do_umount(const char *name, int useMtab) if (freeLoop == TRUE && blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9)) /* 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, @@ -182,7 +196,6 @@ static int do_umount(const char *name, int useMtab) 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 @@ -248,6 +261,11 @@ extern int umount_main(int argc, char **argv) case 'n': useMtab = FALSE; break; +#endif +#ifdef BB_FEATURE_MOUNT_FORCE + case 'f': + doForce = TRUE; + break; #endif case 'r': doRemount = TRUE; 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 @@ -175,6 +181,14 @@ static int do_umount(const char *name, int useMtab) if (freeLoop == TRUE && blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9)) /* 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, @@ -182,7 +196,6 @@ static int do_umount(const char *name, int useMtab) 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 @@ -248,6 +261,11 @@ extern int umount_main(int argc, char **argv) case 'n': useMtab = FALSE; break; +#endif +#ifdef BB_FEATURE_MOUNT_FORCE + case 'f': + doForce = TRUE; + break; #endif case 'r': doRemount = TRUE;