Date: Thu, 28 Jan 1999 18:46:44 -0500 (EST) From: Erez Zadok <ezk@cs.columbia.edu> To: freebsd-fs@FreeBSD.ORG Subject: patches to support "ignore" mount flag Message-ID: <199901282346.SAA09690@shekel.mcl.cs.columbia.edu>
next in thread | raw e-mail | index | archive | help
[This was send-pr'ed as well.]
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 than 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.
Finally, amd normally has nothing to report for its own mount point, so
seeing output like:
Filesystem 1K-blocks Used Avail Capacity Mounted on
pid204@ape:/proj 0 0 0 100% /proj
only clutters the rest of the listing. The patch below adds a new flag
MNT_IGNORE to the system, and tells the kernel to report it back to a
statfs() call. Then /bin/df is modified so that by default it does not list
any entries with the MNT_IGNORE flag on, unless df -a is used. This is
comparable behavior to the df program elsewhere: Solaris/SunOS, linux, GNU
df, and more.
With this patch in place, am-utils is able to automatically detect the
existence of the MNT_IGNORE flag during the configure run, and use it at
run-time as it does with other OSs.
Erez.
##############################################################################
Index: src/bin/df/df.1
===================================================================
RCS file: /proj/bank/fist/freebsd/cvsroot/src/bin/df/df.1,v
retrieving revision 1.13
diff -c -r1.13 df.1
*** df.1 1998/05/13 07:56:58 1.13
--- df.1 1999/01/27 19:46:46
***************
*** 40,46 ****
.Nd display free disk space
.Sh SYNOPSIS
.Nm df
! .Op Fl ikn
.Op Fl t Ar type
.Op Ar file | Ar filesystem ...
.Sh DESCRIPTION
--- 40,46 ----
.Nd display free disk space
.Sh SYNOPSIS
.Nm df
! .Op Fl aikn
.Op Fl t Ar type
.Op Ar file | Ar filesystem ...
.Sh DESCRIPTION
***************
*** 59,64 ****
--- 59,67 ----
.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
Index: src/bin/df/df.c
===================================================================
RCS file: /proj/bank/fist/freebsd/cvsroot/src/bin/df/df.c,v
retrieving revision 1.20
diff -c -r1.20 df.c
*** df.c 1998/12/16 05:29:09 1.20
--- df.c 1999/01/27 19:46:37
***************
*** 73,79 ****
int ufs_df __P((char *, int));
void usage __P((void));
! int iflag, nflag;
struct ufs_args mdev;
int
--- 73,79 ----
int ufs_df __P((char *, int));
void usage __P((void));
! int aflag = 0, iflag, nflag;
struct ufs_args mdev;
int
***************
*** 88,95 ****
char *mntpt, *mntpath, **vfslist;
vfslist = NULL;
! while ((ch = getopt(argc, argv, "iknt:")) != -1)
switch (ch) {
case 'i':
iflag = 1;
break;
--- 88,98 ----
char *mntpt, *mntpath, **vfslist;
vfslist = NULL;
! while ((ch = getopt(argc, argv, "aiknt:")) != -1)
switch (ch) {
+ case 'a':
+ aflag = 1;
+ break;
case 'i':
iflag = 1;
break;
***************
*** 129,137 ****
if (width > maxwidth)
maxwidth = width;
}
}
- for (i = 0; i < mntsize; i++)
- prtstat(&mntbuf[i], maxwidth);
exit(rv);
}
--- 132,142 ----
if (width > maxwidth)
maxwidth = width;
}
+ }
+ for (i = 0; i < mntsize; i++) {
+ if (aflag || (mntbuf[i].f_flags & MNT_IGNORE) == 0)
+ prtstat(&mntbuf[i], maxwidth);
}
exit(rv);
}
***************
*** 377,382 ****
usage()
{
(void)fprintf(stderr,
! "usage: df [-ikn] [-t type] [file | filesystem ...]\n");
exit(1);
}
--- 382,387 ----
usage()
{
(void)fprintf(stderr,
! "usage: df [-aikn] [-t type] [file | filesystem ...]\n");
exit(1);
}
Index: src/sys/kern/vfs_syscalls.c
===================================================================
RCS file: /proj/bank/fist/freebsd/cvsroot/src/sys/kern/vfs_syscalls.c,v
retrieving revision 1.112
diff -c -r1.112 vfs_syscalls.c
*** vfs_syscalls.c 1999/01/05 18:49:55 1.112
--- vfs_syscalls.c 1999/01/27 23:17:41
***************
*** 293,303 ****
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_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_NOATIME | MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR);
/*
* Mount the filesystem.
--- 293,303 ----
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_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_IGNORE |
MNT_NOATIME | MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR);
/*
* Mount the filesystem.
Index: src/sys/sys/mount.h
===================================================================
RCS file: /proj/bank/fist/freebsd/cvsroot/src/sys/sys/mount.h,v
retrieving revision 1.73
diff -c -r1.73 mount.h
*** mount.h 1998/11/15 15:12:58 1.73
--- mount.h 1999/01/27 20:17:13
***************
*** 141,146 ****
--- 141,147 ----
#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()
***************
*** 154,160 ****
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_EXPUBLIC */)
/*
* External filesystem command modifier flags.
--- 155,162 ----
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_IGNORE \
/* | MNT_EXPUBLIC */)
/*
* External filesystem command modifier flags.
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-fs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199901282346.SAA09690>
