Most modern OSs have the ability to flag certain mounts as ones to

be ignored by default by the df(1) program.  This is used mostly to
avoid stat()-ing entries that do not represent "real" disk mount
points (such as those made by an automounter such as amd.)  It is
also useful not to have to stat() these entries because it takes
longer to report them that for other file systems, being that these
mount points are served by a user-level file server and resulting in
several context switches.  Worse, if the automounter is down
unexpectedly, a causal df(1) will hang in an interruptible way.

PR:		kern/9764
Submitted by:	Erez Zadok <ezk@cs.columbia.edu>
This commit is contained in:
Julian Elischer 1999-11-01 04:57:43 +00:00
parent a8ae1d2ba8
commit 5b42dac8ec
5 changed files with 21 additions and 11 deletions

View File

@ -40,7 +40,7 @@
.Nd display free disk space
.Sh SYNOPSIS
.Nm df
.Op Fl ikn
.Op Fl aikn
.Op Fl t Ar type
.Op Ar file | Ar filesystem ...
.Sh DESCRIPTION
@ -59,6 +59,9 @@ option below).
.Pp
The following options are available:
.Bl -tag -width Ds
.It Fl a
Show all mount points, including those that were mounted with the MNT_IGNORE
flag.
.It Fl i
Include statistics on the number of free inodes.
.It Fl k

View File

@ -73,7 +73,7 @@ void prtstat __P((struct statfs *, int));
int ufs_df __P((char *, int));
void usage __P((void));
int iflag, nflag;
int aflag = 0, iflag, nflag;
struct ufs_args mdev;
int
@ -88,8 +88,11 @@ main(argc, argv)
char *mntpt, *mntpath, **vfslist;
vfslist = NULL;
while ((ch = getopt(argc, argv, "iknt:")) != -1)
while ((ch = getopt(argc, argv, "aiknt:")) != -1)
switch (ch) {
case 'a':
aflag = 1;
break;
case 'i':
iflag = 1;
break;
@ -130,8 +133,10 @@ main(argc, argv)
maxwidth = width;
}
}
for (i = 0; i < mntsize; i++)
prtstat(&mntbuf[i], maxwidth);
for (i = 0; i < mntsize; i++) {
if (aflag || (mntbuf[i].f_flags & MNT_IGNORE) == 0)
prtstat(&mntbuf[i], maxwidth);
}
exit(rv);
}
@ -377,6 +382,6 @@ void
usage()
{
(void)fprintf(stderr,
"usage: df [-ikn] [-t type] [file | filesystem ...]\n");
"usage: df [-aikn] [-t type] [file | filesystem ...]\n");
exit(1);
}

View File

@ -289,11 +289,11 @@ mount(p, uap)
mp->mnt_kern_flag |= MNTK_WANTRDWR;
mp->mnt_flag &=~ (MNT_NOSUID | MNT_NOEXEC | MNT_NODEV |
MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_NOATIME |
MNT_NOSYMFOLLOW |
MNT_NOSYMFOLLOW | MNT_IGNORE |
MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR);
mp->mnt_flag |= SCARG(uap, flags) & (MNT_NOSUID | MNT_NOEXEC |
MNT_NODEV | MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_FORCE |
MNT_NOSYMFOLLOW |
MNT_NOSYMFOLLOW | MNT_IGNORE |
MNT_NOATIME | MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR);
/*
* Mount the filesystem.

View File

@ -289,11 +289,11 @@ mount(p, uap)
mp->mnt_kern_flag |= MNTK_WANTRDWR;
mp->mnt_flag &=~ (MNT_NOSUID | MNT_NOEXEC | MNT_NODEV |
MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_NOATIME |
MNT_NOSYMFOLLOW |
MNT_NOSYMFOLLOW | MNT_IGNORE |
MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR);
mp->mnt_flag |= SCARG(uap, flags) & (MNT_NOSUID | MNT_NOEXEC |
MNT_NODEV | MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_FORCE |
MNT_NOSYMFOLLOW |
MNT_NOSYMFOLLOW | MNT_IGNORE |
MNT_NOATIME | MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR);
/*
* Mount the filesystem.

View File

@ -149,6 +149,7 @@ struct mount {
#define MNT_QUOTA 0x00002000 /* quotas are enabled on filesystem */
#define MNT_ROOTFS 0x00004000 /* identifies the root filesystem */
#define MNT_USER 0x00008000 /* mounted by a user */
#define MNT_IGNORE 0x00800000 /* do not show entry in df */
/*
* Mask of flags that are visible to statfs()
@ -162,7 +163,8 @@ struct mount {
MNT_DEFEXPORTED | MNT_EXPORTANON| MNT_EXKERB | \
MNT_LOCAL | MNT_USER | MNT_QUOTA | \
MNT_ROOTFS | MNT_NOATIME | MNT_NOCLUSTERR| \
MNT_NOCLUSTERW | MNT_SUIDDIR | MNT_SOFTDEP \
MNT_NOCLUSTERW | MNT_SUIDDIR | MNT_SOFTDEP | \
MNT_IGNORE \
/* | MNT_EXPUBLIC */)
/*
* External filesystem command modifier flags.