Cull large amounts of dead code (deprecated since 1997)

Sponsored by:	DARPA, NAI Labs
This commit is contained in:
Dag-Erling Smørgrav 2002-05-23 14:53:04 +00:00
parent c9624363a8
commit 0cbfd1a525
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=97173
2 changed files with 6 additions and 586 deletions

View file

@ -32,7 +32,7 @@
.\" @(#)pstat.8 8.5 (Berkeley) 5/13/94
.\" $FreeBSD$
.\"
.Dd May 13, 1994
.Dd May 23, 2002
.Dt PSTAT 8
.Os
.Sh NAME
@ -41,7 +41,7 @@
.Nd display system data structures
.Sh SYNOPSIS
.Nm
.Op Fl Tfiknstv
.Op Fl Tfknst
.Op Fl M Ar core
.Op Fl N Ar system
.Pp
@ -225,139 +225,6 @@ or
for
PPPDISC.
.El
.It Fl v
(This option is no longer supported.)
.Pp
Print the active vnodes. Each group of vnodes corresponding
to a particular filesystem is preceded by a two line header. The
first line consists of the following:
.Bd -ragged -offset indent
.No *** MOUNT Em fstype from
on
.Em on fsflags
.Ed
.Pp
where
.Em fstype
is one of
.Em ufs , nfs , or pc ;
.Em from
is the filesystem is mounted from;
.Em on
is the directory
the filesystem is mounted on; and
.Em fsflags
is a list
of optional flags applied to the mount (see
.Xr mount 8 ) .
The second line is a header for the individual fields,
the first part of which are fixed, and the second part are filesystem
type specific. The headers common to all vnodes are:
.Bl -tag -width indent
.It ADDR
Location of this vnode.
.It TYP
File type.
.It VFLAG
A list of letters representing vnode flags:
.Pp
.Bl -tag -width indent -compact
.It R
.Dv VROOT
.It T
.Dv VTEXT
.It S
.Dv VSYSTEM
.It t
.Dv VISTTY
.It L
.Dv VXLOCK
.It W
.Dv VXWANT
.It B
.Dv VBWAIT
.It V
.Dv VOBJBUF
.It C
.Dv VCOPYONWRITE
.It a
.Dv VAGE
.It l
.Dv VOLOCK
.It w
.Dv VOWANT
.It D
.Dv VDOOMED
.It F
.Dv VFREE
.It O
.Dv VONWORKLST
.It M
.Dv VMOUNT
.El
.It USE
The number of references to this vnode.
.It HOLD
The number of I/O buffers held by this vnode.
.It FILEID
The vnode fileid.
In the case of
.Em ufs
this is the inode number.
.It IFLAG
Miscellaneous filesystem specific state variables encoded thus:
.Bl -tag -width indent
.It "For ufs:"
.Pp
.Bl -tag -width indent -compact
.It L
locked
.It U
update time
.Pq Xr fs 5
must be corrected
.It A
access time must be corrected
.It C
changed time must be corrected
.It U
modification time most be corrected
.It M
contains modifications
.It R
has a rename in progress
.It H
inode is on hash list
.It L
modified, but don't write key
.El
.It "For nfs:"
.Bl -tag -width indent -compact
.Pp
.It W
waiting for I/O buffer flush to complete
.It P
I/O buffers being flushed
.It M
locally modified data exists
.It E
an earlier write failed
.It A
special file accessed
.It U
special file updated
.It C
special file times changed
.El
.El
.It SIZ/RDEV
Number of bytes in an ordinary file, or
major and minor device of special file.
.El
.It Fl i
Same as
.Fl v ,
present for backwards-compatibility.
.It Fl M
Extract values associated with the name list from the specified core
instead of the default

View file

@ -47,22 +47,11 @@ static const char rcsid[] =
#include <sys/param.h>
#include <sys/time.h>
#include <sys/vnode.h>
#include <sys/ucred.h>
#define _KERNEL
#include <sys/file.h>
#include <ufs/ufs/quota.h>
#include <ufs/ufs/inode.h>
#include <sys/mount.h>
#include <sys/uio.h>
#include <sys/namei.h>
#include <fs/unionfs/union.h>
#undef _KERNEL
#include <sys/stat.h>
#include <nfs/rpcv2.h>
#include <nfs/nfsproto.h>
#include <nfsclient/nfs.h>
#include <nfsclient/nfsnode.h>
#include <sys/ioctl.h>
#include <sys/ioctl_compat.h> /* XXX NTTYDISC is too well hidden */
#include <sys/tty.h>
@ -136,43 +125,6 @@ static kvm_t *kd;
static char *usagestr;
static struct {
int m_flag;
const char *m_name;
} mnt_flags[] = {
{ MNT_RDONLY, "rdonly" },
{ MNT_SYNCHRONOUS, "sync" },
{ MNT_NOEXEC, "noexec" },
{ MNT_NOSUID, "nosuid" },
{ MNT_NODEV, "nodev" },
{ MNT_UNION, "union" },
{ MNT_ASYNC, "async" },
{ MNT_SUIDDIR, "suiddir" },
{ MNT_SOFTDEP, "softdep" },
{ MNT_NOSYMFOLLOW, "nosymfollow" },
{ MNT_NOATIME, "noatime" },
{ MNT_NOCLUSTERR, "noclusterread" },
{ MNT_NOCLUSTERW, "noclusterwrite" },
{ MNT_EXRDONLY, "exrdonly" },
{ MNT_EXPORTED, "exported" },
{ MNT_DEFEXPORTED, "defexported" },
{ MNT_EXPORTANON, "exportanon" },
{ MNT_EXKERB, "exkerb" },
{ MNT_EXPUBLIC, "public" },
{ MNT_LOCAL, "local" },
{ MNT_QUOTA, "quota" },
{ MNT_ROOTFS, "rootfs" },
{ MNT_USER, "user" },
{ MNT_IGNORE, "ignore" },
{ MNT_UPDATE, "update" },
{ MNT_DELEXPORT, "delexport" },
{ MNT_RELOAD, "reload" },
{ MNT_FORCE, "force" },
{ MNT_SNAPSHOT, "snapshot" },
{ 0 }
};
#define SVAR(var) __STRING(var) /* to force expansion */
#define KGET(idx, var) \
KGET1(idx, &var, sizeof(var), SVAR(var))
@ -195,33 +147,20 @@ static struct {
static void filemode(void);
static int getfiles(char **, int *);
static struct mount *getmnt(struct mount *);
static struct e_vnode *kinfo_vnodes(int *);
static struct e_vnode *loadvnodes(int *);
static void mount_print(struct mount *);
static void nfs_header(void);
static int nfs_print(struct vnode *);
static void swapmode(void);
static void ttymode(void);
static void ttyprt(struct tty *, int);
static void ttytype(struct tty *, char *, int, int, int);
static void ufs_header(void);
static int ufs_print(struct vnode *);
static void union_header(void);
static int union_print(struct vnode *);
static void usage(void);
static void vnode_header(void);
static void vnode_print(struct vnode *, struct vnode *);
static void vnodemode(void);
int
main(int argc, char *argv[])
{
int ch, i, quit, ret;
int fileflag, ttyflag, vnodeflag;
int fileflag, ttyflag;
char buf[_POSIX2_LINE_MAX],*opts;
fileflag = swapflag = ttyflag = vnodeflag = 0;
fileflag = swapflag = ttyflag = 0;
/* We will behave like good old swapinfo if thus invoked */
opts = strrchr(argv[0],'/');
@ -234,7 +173,7 @@ main(int argc, char *argv[])
opts = "kM:N:";
usagestr = "swapinfo [-k] [-M core] [-N system]";
} else {
opts = "TM:N:fiknstv";
opts = "TM:N:fknst";
usagestr = "pstat [-Tfknstv] [-M core] [-N system]";
}
@ -264,13 +203,6 @@ main(int argc, char *argv[])
case 't':
ttyflag = 1;
break;
case 'v':
case 'i': /* Backward compatibility. */
errx(1, "vnode mode not supported");
#if 0
vnodeflag = 1;
break;
#endif
default:
usage();
}
@ -298,12 +230,10 @@ main(int argc, char *argv[])
if (quit)
exit(1);
}
if (!(fileflag | vnodeflag | ttyflag | swapflag | totalflag))
if (!(fileflag | ttyflag | swapflag | totalflag))
usage();
if (fileflag || totalflag)
filemode();
if (vnodeflag)
vnodemode();
if (ttyflag)
ttymode();
if (swapflag || totalflag)
@ -318,383 +248,6 @@ usage(void)
exit (1);
}
struct e_vnode {
struct vnode *avnode;
struct vnode vnode;
};
static void
vnodemode(void)
{
struct e_vnode *e_vnodebase, *endvnode, *evp;
struct vnode *vp;
struct mount *maddr, *mp;
int numvnodes;
e_vnodebase = loadvnodes(&numvnodes);
if (totalflag) {
(void)printf("%7d vnodes\n", numvnodes);
return;
}
endvnode = e_vnodebase + numvnodes;
(void)printf("%d active vnodes\n", numvnodes);
#define ST mp->mnt_stat
maddr = NULL;
for (evp = e_vnodebase; evp < endvnode; evp++) {
vp = &evp->vnode;
if (vp->v_mount != maddr) {
/*
* New filesystem
*/
if ((mp = getmnt(vp->v_mount)) == NULL)
continue;
maddr = vp->v_mount;
mount_print(mp);
vnode_header();
if (!strcmp(ST.f_fstypename, "ufs"))
ufs_header();
else if (!strcmp(ST.f_fstypename, "nfs"))
nfs_header();
else if (!strcmp(ST.f_fstypename, "union"))
union_header();
(void)printf("\n");
}
vnode_print(evp->avnode, vp);
if (!strcmp(ST.f_fstypename, "ufs"))
ufs_print(vp);
else if (!strcmp(ST.f_fstypename, "nfs"))
nfs_print(vp);
else if (!strcmp(ST.f_fstypename, "union"))
union_print(vp);
(void)printf("\n");
}
free(e_vnodebase);
}
static void
vnode_header(void)
{
(void)printf("ADDR TYP VFLAG USE HOLD");
}
static void
vnode_print(struct vnode *avnode, struct vnode *vp)
{
char *type, flags[16];
char *fp = flags;
int flag;
/*
* set type
*/
switch (vp->v_type) {
case VNON:
type = "non"; break;
case VREG:
type = "reg"; break;
case VDIR:
type = "dir"; break;
case VBLK:
type = "blk"; break;
case VCHR:
type = "chr"; break;
case VLNK:
type = "lnk"; break;
case VSOCK:
type = "soc"; break;
case VFIFO:
type = "fif"; break;
case VBAD:
type = "bad"; break;
default:
type = "unk"; break;
}
/*
* gather flags
*/
flag = vp->v_flag;
if (flag & VROOT)
*fp++ = 'R';
if (flag & VTEXT)
*fp++ = 'T';
if (flag & VSYSTEM)
*fp++ = 'S';
if (flag & VISTTY)
*fp++ = 't';
if (flag & VXLOCK)
*fp++ = 'L';
if (flag & VXWANT)
*fp++ = 'W';
if (flag & VBWAIT)
*fp++ = 'B';
if (flag & VOBJBUF)
*fp++ = 'V';
if (flag & VCOPYONWRITE)
*fp++ = 'C';
if (flag & VAGE)
*fp++ = 'a';
if (flag & VOLOCK)
*fp++ = 'l';
if (flag & VOWANT)
*fp++ = 'w';
if (flag & VDOOMED)
*fp++ = 'D';
if (flag & VFREE)
*fp++ = 'F';
if (flag & VONWORKLST)
*fp++ = 'O';
if (flag & VMOUNT)
*fp++ = 'M';
if (flag == 0)
*fp++ = '-';
*fp = '\0';
(void)printf("%8lx %s %5s %4d %4d",
(u_long)(void *)avnode, type, flags, vp->v_usecount, vp->v_holdcnt);
}
static void
ufs_header(void)
{
(void)printf(" FILEID IFLAG RDEV|SZ");
}
static int
ufs_print(struct vnode *vp)
{
int flag;
struct inode inode, *ip = &inode;
char flagbuf[16], *flags = flagbuf;
char *name;
mode_t type;
KGETRET(VTOI(vp), &inode, sizeof(struct inode), "vnode's inode");
flag = ip->i_flag;
if (flag & IN_ACCESS)
*flags++ = 'A';
if (flag & IN_CHANGE)
*flags++ = 'C';
if (flag & IN_UPDATE)
*flags++ = 'U';
if (flag & IN_MODIFIED)
*flags++ = 'M';
if (flag & IN_RENAME)
*flags++ = 'R';
if (flag & IN_HASHED)
*flags++ = 'H';
if (flag & IN_LAZYMOD)
*flags++ = 'L';
if (flag == 0)
*flags++ = '-';
*flags = '\0';
(void)printf(" %6d %5s", ip->i_number, flagbuf);
type = ip->i_mode & S_IFMT;
if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode))
if (usenumflag || ((name = devname(ip->i_rdev, type)) == NULL))
(void)printf(" %2d,%-2d",
major(ip->i_rdev), minor(ip->i_rdev));
else
(void)printf(" %7s", name);
else
(void)printf(" %7qd", ip->i_size);
return (0);
}
static void
nfs_header(void)
{
(void)printf(" FILEID NFLAG RDEV|SZ");
}
static int
nfs_print(struct vnode *vp)
{
struct nfsnode nfsnode, *np = &nfsnode;
char flagbuf[16], *flags = flagbuf;
int flag;
char *name;
mode_t type;
KGETRET(VTONFS(vp), &nfsnode, sizeof(nfsnode), "vnode's nfsnode");
flag = np->n_flag;
if (flag & NFLUSHWANT)
*flags++ = 'W';
if (flag & NFLUSHINPROG)
*flags++ = 'P';
if (flag & NMODIFIED)
*flags++ = 'M';
if (flag & NWRITEERR)
*flags++ = 'E';
if (flag & NACC)
*flags++ = 'A';
if (flag & NUPD)
*flags++ = 'U';
if (flag & NCHG)
*flags++ = 'C';
if (flag == 0)
*flags++ = '-';
*flags = '\0';
#define VT np->n_vattr
(void)printf(" %6ld %5s", VT.va_fileid, flagbuf);
type = VT.va_mode & S_IFMT;
if (S_ISCHR(VT.va_mode) || S_ISBLK(VT.va_mode))
if (usenumflag || ((name = devname(VT.va_rdev, type)) == NULL))
(void)printf(" %2d,%-2d",
major(VT.va_rdev), minor(VT.va_rdev));
else
(void)printf(" %7s", name);
else
(void)printf(" %7qd", np->n_size);
return (0);
}
static void
union_header(void)
{
(void)printf(" UPPER LOWER");
}
static int
union_print(struct vnode *vp)
{
struct union_node unode, *up = &unode;
KGETRET(VTOUNION(vp), &unode, sizeof(unode), "vnode's unode");
(void)printf(" %8lx %8lx", (u_long)(void *)up->un_uppervp,
(u_long)(void *)up->un_lowervp);
return (0);
}
/*
* Given a pointer to a mount structure in kernel space,
* read it in and return a usable pointer to it.
*/
static struct mount *
getmnt(struct mount *maddr)
{
static struct mtab {
struct mtab *next;
struct mount *maddr;
struct mount mount;
} *mhead = NULL;
struct mtab *mt;
for (mt = mhead; mt != NULL; mt = mt->next)
if (maddr == mt->maddr)
return (&mt->mount);
if ((mt = malloc(sizeof(struct mtab))) == NULL)
errx(1, "malloc");
KGETRET(maddr, &mt->mount, sizeof(struct mount), "mount table");
mt->maddr = maddr;
mt->next = mhead;
mhead = mt;
return (&mt->mount);
}
static void
mount_print(struct mount *mp)
{
int flags;
#define ST mp->mnt_stat
(void)printf("*** MOUNT %s %s on %s", ST.f_fstypename,
ST.f_mntfromname, ST.f_mntonname);
if ((flags = mp->mnt_flag)) {
int i;
const char *sep = " (";
for (i = 0; mnt_flags[i].m_flag; i++) {
if (flags & mnt_flags[i].m_flag) {
(void)printf("%s%s", sep, mnt_flags[i].m_name);
flags &= ~mnt_flags[i].m_flag;
sep = ",";
}
}
if (flags)
(void)printf("%sunknown_flags:%x", sep, flags);
(void)printf(")");
}
(void)printf("\n");
#undef ST
}
static struct e_vnode *
loadvnodes(int *avnodes)
{
int mib[2];
size_t copysize;
struct e_vnode *vnodebase;
if (memf != NULL) {
/*
* do it by hand
*/
return (kinfo_vnodes(avnodes));
}
mib[0] = CTL_KERN;
mib[1] = KERN_VNODE;
if (sysctl(mib, 2, NULL, &copysize, NULL, 0) == -1)
err(1, "sysctl: KERN_VNODE");
if ((vnodebase = malloc(copysize)) == NULL)
errx(1, "malloc");
if (sysctl(mib, 2, vnodebase, &copysize, NULL, 0) == -1)
err(1, "sysctl: KERN_VNODE");
if (copysize % sizeof(struct e_vnode))
errx(1, "vnode size mismatch");
*avnodes = copysize / sizeof(struct e_vnode);
return (vnodebase);
}
/*
* simulate what a running kernel does in in kinfo_vnode
*/
static struct e_vnode *
kinfo_vnodes(int *avnodes)
{
struct mntlist mountlist;
struct mount *mp, mount, *mp_next;
struct vnode *vp, vnode, *vp_next;
char *vbuf, *evbuf, *bp;
int num, numvnodes;
#define VPTRSZ sizeof(struct vnode *)
#define VNODESZ sizeof(struct vnode)
KGET(V_NUMV, numvnodes);
if ((vbuf = malloc((numvnodes + 20) * (VPTRSZ + VNODESZ))) == NULL)
errx(1, "malloc");
bp = vbuf;
evbuf = vbuf + (numvnodes + 20) * (VPTRSZ + VNODESZ);
KGET(V_MOUNTLIST, mountlist);
for (num = 0, mp = TAILQ_FIRST(&mountlist); ; mp = mp_next) {
KGET2(mp, &mount, sizeof(mount), "mount entry");
mp_next = TAILQ_NEXT(&mount, mnt_list);
for (vp = TAILQ_FIRST(&mount.mnt_nvnodelist);
vp != NULL; vp = vp_next) {
KGET2(vp, &vnode, sizeof(vnode), "vnode");
vp_next = TAILQ_NEXT(&vnode, v_nmntvnodes);
if ((bp + VPTRSZ + VNODESZ) > evbuf)
/* XXX - should realloc */
errx(1, "no more room for vnodes");
memmove(bp, &vp, VPTRSZ);
bp += VPTRSZ;
memmove(bp, &vnode, VNODESZ);
bp += VNODESZ;
num++;
}
if (mp == TAILQ_LAST(&mountlist, mntlist))
break;
}
*avnodes = num;
return ((struct e_vnode *)vbuf);
}
static const char hdr[] =
" LINE RAW CAN OUT IHIWT ILOWT OHWT LWT COL STATE SESS PGID DISC\n";
int ttyspace = 128;