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:
parent
9b15e50835
commit
6c5f2c6021
@ -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
|
||||||
//
|
//
|
||||||
|
@ -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
24
mount.c
@ -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},
|
||||||
|
24
umount.c
24
umount.c
@ -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;
|
||||||
|
@ -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},
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user