Add support for "noatime" and "nodiratime" mount flags to mount.

Change umount "-f" to mean force, and actually use umount2.
Change umount "-l" to mean "Do not free loop device".
Updates docs accordingly.
 -Erik
This commit is contained in:
Erik Andersen 2000-05-05 19:49:33 +00:00
parent 9b15e50835
commit 6c5f2c6021
6 changed files with 102 additions and 48 deletions

View File

@ -181,6 +181,10 @@
// Enable support for a real /etc/mtab file instead of /proc/mounts // Enable support for a real /etc/mtab file instead of /proc/mounts
//#define BB_FEATURE_MOUNT_MTAB_SUPPORT //#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 // Enable support for mounting remote NFS volumes
//#define BB_FEATURE_NFSMOUNT //#define BB_FEATURE_NFSMOUNT
// //

View File

@ -1114,12 +1114,13 @@ Flags:
-a: Mount all file systems in fstab. -a: Mount all file systems in fstab.
-o option: One of many filesystem options, listed below. -o option: One of many filesystem options, listed below.
-r: Mount the filesystem read-only. -r: Mount the filesystem read-only.
-t filesystem-type: Specify the filesystem type. -t fs-type: Specify the filesystem type.
-w: Mount for reading and writing (default). -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. 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. dev/nodev: Allow use of special device files / disallow them.
exec/noexec: Allow use of executable files / disallow them. exec/noexec: Allow use of executable files / disallow them.
loop: Mounts a file via loop device. loop: Mounts a file via loop device.
@ -1665,7 +1666,8 @@ Flags:
-a: Unmount all file systems -a: Unmount all file systems
-r: Try to remount devices as read-only if mount is busy -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) -f: Force filesystem umount (i.e. unreachable NFS server)
-l: Do not free loop device (if a loop device has been used)
Example: Example:
@ -1876,4 +1878,4 @@ Enrique Zanardi <ezanardi@ull.es>
=cut =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 $

24
mount.c
View File

@ -66,26 +66,28 @@ extern const char mtab_file[]; /* Defined in utility.c */
static const char mount_usage[] = "\tmount [flags]\n" static const char mount_usage[] = "\tmount [flags]\n"
"\tmount [flags] device directory [-o options,more-options]\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 #ifdef BB_MTAB
"\t-f:\t\"Fake\" mount. Add entry to mount table but don't mount it.\n" "\t-f:\t\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-n:\t\tDon't write a mount table entry.\n"
#endif #endif
"\t-o option:\tOne of many filesystem options, listed below.\n" "\t-o option:\tOne of many filesystem options, listed below.\n"
"\t-r:\tMount the filesystem read-only.\n" "\t-r:\t\tMount the filesystem read-only.\n"
"\t-t filesystem-type:\tSpecify the filesystem type.\n" "\t-t fs-type:\tSpecify the filesystem type.\n"
"\t-w:\tMount for reading and writing (default).\n" "\t-w:\t\tMount for reading and writing (default).\n"
"\n" "\n"
"Options for use with the \"-o\" flag:\n" "Options for use with the \"-o\" flag:\n"
"\tasync/sync:\tWrites are asynchronous / synchronous.\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" "\tdev/nodev:\tAllow use of special device files / disallow them.\n"
"\texec/noexec:\tAllow use of executable files / disallow them.\n" "\texec/noexec:\tAllow use of executable files / disallow them.\n"
#if defined BB_FEATURE_MOUNT_LOOP #if defined BB_FEATURE_MOUNT_LOOP
"\tloop: Mounts a file via loop device.\n" "\tloop:\t\tMounts a file via loop device.\n"
#endif #endif
"\tsuid/nosuid:\tAllow set-user-id-root programs / disallow them.\n" "\tsuid/nosuid:\tAllow set-user-id-root programs / disallow them.\n"
"\tremount: Re-mount a currently-mounted filesystem, changing its flags.\n" "\tremount:\tRe-mount a currently-mounted filesystem, changing its flags.\n"
"\tro / rw: Mount for read-only / read-write.\n" "\tro/rw:\t\tMount for read-only / read-write.\n"
"There are EVEN MORE flags that are specific to each filesystem.\n" "There are EVEN MORE flags that are specific to each filesystem.\n"
"You'll have to see the written documentation for those.\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[] = { static const struct mount_options mount_options[] = {
{"async", ~MS_SYNCHRONOUS, 0}, {"async", ~MS_SYNCHRONOUS, 0},
{"atime", ~0, ~MS_NOATIME},
{"defaults", ~0, 0}, {"defaults", ~0, 0},
{"dev", ~MS_NODEV, 0}, {"dev", ~MS_NODEV, 0},
{"diratime", ~0, ~MS_NODIRATIME},
{"exec", ~MS_NOEXEC, 0}, {"exec", ~MS_NOEXEC, 0},
{"noatime", ~0, MS_NOATIME},
{"nodev", ~0, MS_NODEV}, {"nodev", ~0, MS_NODEV},
{"nodiratime", ~0, MS_NODIRATIME},
{"noexec", ~0, MS_NOEXEC}, {"noexec", ~0, MS_NOEXEC},
{"nosuid", ~0, MS_NOSUID}, {"nosuid", ~0, MS_NOSUID},
{"remount", ~0, MS_REMOUNT}, {"remount", ~0, MS_REMOUNT},

View File

@ -38,8 +38,11 @@ static const char umount_usage[] =
"\n" "\n"
#endif #endif
"\t-r:\tTry to remount devices as read-only if mount is busy\n" "\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 #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 #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 #if defined BB_FEATURE_MOUNT_LOOP
static int freeLoop = TRUE; static int freeLoop = TRUE;
#endif #endif
@ -175,6 +181,14 @@ static int do_umount(const char *name, int useMtab)
if (freeLoop == TRUE && blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9)) if (freeLoop == TRUE && blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9))
/* this was a loop device, delete it */ /* this was a loop device, delete it */
del_loop(blockDevice); 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 #endif
if (status != 0 && doRemount == TRUE && errno == EBUSY) { if (status != 0 && doRemount == TRUE && errno == EBUSY) {
status = mount(blockDevice, name, NULL, status = mount(blockDevice, name, NULL,
@ -182,7 +196,6 @@ static int do_umount(const char *name, int useMtab)
if (status == 0) { if (status == 0) {
fprintf(stderr, "umount: %s busy - remounted read-only\n", fprintf(stderr, "umount: %s busy - remounted read-only\n",
blockDevice); blockDevice);
/* TODO: update mtab if BB_MTAB is defined */
} else { } else {
fprintf(stderr, "umount: Cannot remount %s read-only\n", fprintf(stderr, "umount: Cannot remount %s read-only\n",
blockDevice); blockDevice);
@ -240,7 +253,7 @@ extern int umount_main(int argc, char **argv)
umountAll = TRUE; umountAll = TRUE;
break; break;
#if defined BB_FEATURE_MOUNT_LOOP #if defined BB_FEATURE_MOUNT_LOOP
case 'f': case 'l':
freeLoop = FALSE; freeLoop = FALSE;
break; break;
#endif #endif
@ -248,6 +261,11 @@ extern int umount_main(int argc, char **argv)
case 'n': case 'n':
useMtab = FALSE; useMtab = FALSE;
break; break;
#endif
#ifdef BB_FEATURE_MOUNT_FORCE
case 'f':
doForce = TRUE;
break;
#endif #endif
case 'r': case 'r':
doRemount = TRUE; doRemount = TRUE;

View File

@ -66,26 +66,28 @@ extern const char mtab_file[]; /* Defined in utility.c */
static const char mount_usage[] = "\tmount [flags]\n" static const char mount_usage[] = "\tmount [flags]\n"
"\tmount [flags] device directory [-o options,more-options]\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 #ifdef BB_MTAB
"\t-f:\t\"Fake\" mount. Add entry to mount table but don't mount it.\n" "\t-f:\t\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-n:\t\tDon't write a mount table entry.\n"
#endif #endif
"\t-o option:\tOne of many filesystem options, listed below.\n" "\t-o option:\tOne of many filesystem options, listed below.\n"
"\t-r:\tMount the filesystem read-only.\n" "\t-r:\t\tMount the filesystem read-only.\n"
"\t-t filesystem-type:\tSpecify the filesystem type.\n" "\t-t fs-type:\tSpecify the filesystem type.\n"
"\t-w:\tMount for reading and writing (default).\n" "\t-w:\t\tMount for reading and writing (default).\n"
"\n" "\n"
"Options for use with the \"-o\" flag:\n" "Options for use with the \"-o\" flag:\n"
"\tasync/sync:\tWrites are asynchronous / synchronous.\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" "\tdev/nodev:\tAllow use of special device files / disallow them.\n"
"\texec/noexec:\tAllow use of executable files / disallow them.\n" "\texec/noexec:\tAllow use of executable files / disallow them.\n"
#if defined BB_FEATURE_MOUNT_LOOP #if defined BB_FEATURE_MOUNT_LOOP
"\tloop: Mounts a file via loop device.\n" "\tloop:\t\tMounts a file via loop device.\n"
#endif #endif
"\tsuid/nosuid:\tAllow set-user-id-root programs / disallow them.\n" "\tsuid/nosuid:\tAllow set-user-id-root programs / disallow them.\n"
"\tremount: Re-mount a currently-mounted filesystem, changing its flags.\n" "\tremount:\tRe-mount a currently-mounted filesystem, changing its flags.\n"
"\tro / rw: Mount for read-only / read-write.\n" "\tro/rw:\t\tMount for read-only / read-write.\n"
"There are EVEN MORE flags that are specific to each filesystem.\n" "There are EVEN MORE flags that are specific to each filesystem.\n"
"You'll have to see the written documentation for those.\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[] = { static const struct mount_options mount_options[] = {
{"async", ~MS_SYNCHRONOUS, 0}, {"async", ~MS_SYNCHRONOUS, 0},
{"atime", ~0, ~MS_NOATIME},
{"defaults", ~0, 0}, {"defaults", ~0, 0},
{"dev", ~MS_NODEV, 0}, {"dev", ~MS_NODEV, 0},
{"diratime", ~0, ~MS_NODIRATIME},
{"exec", ~MS_NOEXEC, 0}, {"exec", ~MS_NOEXEC, 0},
{"noatime", ~0, MS_NOATIME},
{"nodev", ~0, MS_NODEV}, {"nodev", ~0, MS_NODEV},
{"nodiratime", ~0, MS_NODIRATIME},
{"noexec", ~0, MS_NOEXEC}, {"noexec", ~0, MS_NOEXEC},
{"nosuid", ~0, MS_NOSUID}, {"nosuid", ~0, MS_NOSUID},
{"remount", ~0, MS_REMOUNT}, {"remount", ~0, MS_REMOUNT},

View File

@ -38,8 +38,11 @@ static const char umount_usage[] =
"\n" "\n"
#endif #endif
"\t-r:\tTry to remount devices as read-only if mount is busy\n" "\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 #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 #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 #if defined BB_FEATURE_MOUNT_LOOP
static int freeLoop = TRUE; static int freeLoop = TRUE;
#endif #endif
@ -175,6 +181,14 @@ static int do_umount(const char *name, int useMtab)
if (freeLoop == TRUE && blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9)) if (freeLoop == TRUE && blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9))
/* this was a loop device, delete it */ /* this was a loop device, delete it */
del_loop(blockDevice); 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 #endif
if (status != 0 && doRemount == TRUE && errno == EBUSY) { if (status != 0 && doRemount == TRUE && errno == EBUSY) {
status = mount(blockDevice, name, NULL, status = mount(blockDevice, name, NULL,
@ -182,7 +196,6 @@ static int do_umount(const char *name, int useMtab)
if (status == 0) { if (status == 0) {
fprintf(stderr, "umount: %s busy - remounted read-only\n", fprintf(stderr, "umount: %s busy - remounted read-only\n",
blockDevice); blockDevice);
/* TODO: update mtab if BB_MTAB is defined */
} else { } else {
fprintf(stderr, "umount: Cannot remount %s read-only\n", fprintf(stderr, "umount: Cannot remount %s read-only\n",
blockDevice); blockDevice);
@ -240,7 +253,7 @@ extern int umount_main(int argc, char **argv)
umountAll = TRUE; umountAll = TRUE;
break; break;
#if defined BB_FEATURE_MOUNT_LOOP #if defined BB_FEATURE_MOUNT_LOOP
case 'f': case 'l':
freeLoop = FALSE; freeLoop = FALSE;
break; break;
#endif #endif
@ -248,6 +261,11 @@ extern int umount_main(int argc, char **argv)
case 'n': case 'n':
useMtab = FALSE; useMtab = FALSE;
break; break;
#endif
#ifdef BB_FEATURE_MOUNT_FORCE
case 'f':
doForce = TRUE;
break;
#endif #endif
case 'r': case 'r':
doRemount = TRUE; doRemount = TRUE;