diff -ru /usr/src/sys/arch/i386/conf/GENERIC /usr/src/sys/arch/i386/conf/GENERIC --- /usr/src/sys/arch/i386/conf/GENERIC Sun Oct 9 07:41:10 2005 +++ /usr/src/sys/arch/i386/conf/GENERIC Wed Oct 19 21:29:03 2005 @@ -613,3 +613,4 @@ # mouse & keyboard multiplexor pseudo-devices pseudo-device wsmux 2 pseudo-device crypto 1 +options UFS_STATS diff -ru /usr/src/sys/ufs/ffs/ffs_extern.h /usr/src/sys/ufs/ffs/ffs_extern.h --- /usr/src/sys/ufs/ffs/ffs_extern.h Tue Jul 13 16:04:29 2004 +++ /usr/src/sys/ufs/ffs/ffs_extern.h Wed Oct 19 21:22:12 2005 @@ -51,8 +51,37 @@ #define FFS_DIRHASH_DIRSIZE 17 /* min directory size, in bytes */ #define FFS_DIRHASH_MAXMEM 18 /* max kvm to use, in bytes */ #define FFS_DIRHASH_MEM 19 /* current mem usage, in bytes */ -#define FFS_MAXID 20 /* number of valid ffs ids */ + +#ifdef UFS_STATS +#define FFS_UFSSTATS_FSYNC 20 +#define FFS_UFSSTATS_CREATE 21 +#define FFS_UFSSTATS_MKNOD 22 +#define FFS_UFSSTATS_OPEN 23 +#define FFS_UFSSTATS_CLOSE 24 +#define FFS_UFSSTATS_ACCESS 25 +#define FFS_UFSSTATS_GETATTR 26 +#define FFS_UFSSTATS_SETATTR 27 +#define FFS_UFSSTATS_CHMOD 28 +#define FFS_UFSSTATS_CHOWN 29 +#define FFS_UFSSTATS_REMOVE 30 +#define FFS_UFSSTATS_LINK 31 +#define FFS_UFSSTATS_RENAME 32 +#define FFS_UFSSTATS_MKDIR 33 +#define FFS_UFSSTATS_RMDIR 34 +#define FFS_UFSSTATS_SYMLINK 35 +#define FFS_UFSSTATS_READDIR 36 +#define FFS_UFSSTATS_READLINK 37 +#define FFS_UFSSTATS_LOCKINODE 38 +#define FFS_UFSSTATS_UNLOCKINODE 39 +#define FFS_UFSSTATS_STRATEGY 40 +#define FFS_UFSSTATS_MAKEINODE 41 +#define FFS_MAXID 42 /* number of valid ffs ids */ +#else +#define FFS_MAXID 20 /* number of valid ffs ids */ +#endif + +#ifdef UFS_STATS #define FFS_NAMES { \ { 0, 0 }, \ { "doclusterread", CTLTYPE_INT }, \ @@ -74,7 +103,53 @@ { "dirhash_dirsize", CTLTYPE_INT }, \ { "dirhash_maxmem", CTLTYPE_INT }, \ { "dirhash_mem", CTLTYPE_INT }, \ + { "ufsstats_fsync", CTLTYPE_INT }, \ + { "ufsstats_create", CTLTYPE_INT }, \ + { "ufsstats_mknod", CTLTYPE_INT }, \ + { "ufsstats_open", CTLTYPE_INT }, \ + { "ufsstats_close", CTLTYPE_INT }, \ + { "ufsstats_access", CTLTYPE_INT }, \ + { "ufsstats_getattr", CTLTYPE_INT }, \ + { "ufsstats_setattr", CTLTYPE_INT }, \ + { "ufsstats_chmod", CTLTYPE_INT }, \ + { "ufsstats_chown", CTLTYPE_INT }, \ + { "ufsstats_remove", CTLTYPE_INT }, \ + { "ufsstats_link", CTLTYPE_INT }, \ + { "ufsstats_rename", CTLTYPE_INT }, \ + { "ufsstats_mkdir", CTLTYPE_INT }, \ + { "ufsstats_rmdir", CTLTYPE_INT }, \ + { "ufsstats_symlink", CTLTYPE_INT }, \ + { "ufsstats_readdir", CTLTYPE_INT }, \ + { "ufsstats_readlink", CTLTYPE_INT }, \ + { "ufsstats_lockinode", CTLTYPE_INT }, \ + { "ufsstats_unlockinode", CTLTYPE_INT }, \ + { "ufsstats_strategy", CTLTYPE_INT }, \ + { "ufsstats_makeinode", CTLTYPE_INT }, \ } +#else +#define FFS_NAMES { \ + { 0, 0 }, \ + { "doclusterread", CTLTYPE_INT }, \ + { "doclusterwrite", CTLTYPE_INT }, \ + { "doreallocblks", CTLTYPE_INT }, \ + { "doasyncfree", CTLTYPE_INT }, \ + { "max_softdeps", CTLTYPE_INT }, \ + { "sd_tickdelay", CTLTYPE_INT }, \ + { "sd_worklist_push", CTLTYPE_INT }, \ + { "sd_blk_limit_push", CTLTYPE_INT }, \ + { "sd_ino_limit_push", CTLTYPE_INT }, \ + { "sd_blk_limit_hit", CTLTYPE_INT }, \ + { "sd_ino_limit_hit", CTLTYPE_INT }, \ + { "sd_sync_limit_hit", CTLTYPE_INT }, \ + { "sd_indir_blk_ptrs", CTLTYPE_INT }, \ + { "sd_inode_bitmap", CTLTYPE_INT }, \ + { "sd_direct_blk_ptrs", CTLTYPE_INT }, \ + { "sd_dir_entry", CTLTYPE_INT }, \ + { "dirhash_dirsize", CTLTYPE_INT }, \ + { "dirhash_maxmem", CTLTYPE_INT }, \ + { "dirhash_mem", CTLTYPE_INT }, \ +} +#endif struct buf; diff -ru /usr/src/sys/ufs/ffs/ffs_vfsops.c /usr/src/sys/ufs/ffs/ffs_vfsops.c --- /usr/src/sys/ufs/ffs/ffs_vfsops.c Thu Sep 29 19:42:34 2005 +++ /usr/src/sys/ufs/ffs/ffs_vfsops.c Wed Oct 19 22:17:59 2005 @@ -64,6 +64,10 @@ #include #include +#ifdef UFS_STATS +#include +#endif + int ffs_sbupdate(struct ufsmount *, int); int ffs_reload_vnode(struct vnode *, void *); int ffs_sync_vnode(struct vnode *, void *); @@ -1427,6 +1431,53 @@ case FFS_DIRHASH_MEM: return (sysctl_rdint(oldp, oldlenp, newp, ufs_dirhashmem)); #endif +#ifdef UFS_STATS + case FFS_UFSSTATS_FSYNC: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_fsync)); + case FFS_UFSSTATS_CREATE: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_create)); + case FFS_UFSSTATS_MKNOD: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_mknod)); + case FFS_UFSSTATS_OPEN: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_open)); + case FFS_UFSSTATS_CLOSE: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_close)); + case FFS_UFSSTATS_ACCESS: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_access)); + case FFS_UFSSTATS_GETATTR: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_getattr)); + case FFS_UFSSTATS_SETATTR: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_setattr)); + case FFS_UFSSTATS_CHMOD: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_chmod)); + case FFS_UFSSTATS_CHOWN: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_chown)); + case FFS_UFSSTATS_REMOVE: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_remove)); + case FFS_UFSSTATS_LINK: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_link)); + case FFS_UFSSTATS_RENAME: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_rename)); + case FFS_UFSSTATS_MKDIR: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_mkdir)); + case FFS_UFSSTATS_RMDIR: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_rmdir)); + case FFS_UFSSTATS_SYMLINK: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_symlink)); + case FFS_UFSSTATS_READDIR: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_readdir)); + case FFS_UFSSTATS_READLINK: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_readlink)); + case FFS_UFSSTATS_LOCKINODE: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_lockinode)); + case FFS_UFSSTATS_UNLOCKINODE: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_unlockinode)); + case FFS_UFSSTATS_STRATEGY: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_strategy)); + case FFS_UFSSTATS_MAKEINODE: + return (sysctl_int(oldp, oldlenp, newp, newlen, &ufsstats_makeinode)); +#endif + default: return (EOPNOTSUPP); diff -ru /usr/src/sys/ufs/ffs/ffs_vnops.c /usr/src/sys/ufs/ffs/ffs_vnops.c --- /usr/src/sys/ufs/ffs/ffs_vnops.c Sun Jul 3 19:38:04 2005 +++ /usr/src/sys/ufs/ffs/ffs_vnops.c Wed Oct 19 17:42:16 2005 @@ -61,6 +61,7 @@ #include #include + /* Global vfs data structures for ufs. */ int (**ffs_vnodeop_p)(void *); struct vnodeopv_entry_desc ffs_vnodeop_entries[] = { @@ -152,6 +153,32 @@ { &ffs_fifoop_p, ffs_fifoop_entries }; #endif /* FIFO */ +#ifdef UFS_STATS +extern int ufsstats_fsync; +extern int ufsstats_create; +extern int ufsstats_mknod; +extern int ufsstats_open; +extern int ufsstats_close; +extern int ufsstats_access; +extern int ufsstats_getattr; +extern int ufsstats_setattr; +extern int ufsstats_chmod; +extern int ufsstats_chown; +extern int ufsstats_remove; +extern int ufsstats_link; +extern int ufsstats_rename; +extern int ufsstats_mkdir; +extern int ufsstats_rmdir; +extern int ufsstats_symlink; +extern int ufsstats_readdir; +extern int ufsstats_readlink; +extern int ufsstats_lockinode; +extern int ufsstats_unlockinode; +extern int ufsstats_strategy; +extern int ufsstats_makeinode; +#endif + + /* * Enabling cluster read/write operations. */ @@ -182,6 +209,11 @@ vp->v_specmountpoint != NULL && (vp->v_specmountpoint->mnt_flag & MNT_SOFTDEP)) softdep_fsync_mountdev(vp); + +#ifdef UFS_STATS + ufsstats_fsync++; +#endif + /* * Flush all dirty buffers associated with a vnode. diff -ru /usr/src/sys/ufs/ufs/ufs_vnops.c /usr/src/sys/ufs/ufs/ufs_vnops.c --- /usr/src/sys/ufs/ufs/ufs_vnops.c Sun Jul 24 01:42:42 2005 +++ /usr/src/sys/ufs/ufs/ufs_vnops.c Wed Oct 19 17:41:33 2005 @@ -71,6 +71,8 @@ #endif #include + + static int ufs_chmod(struct vnode *, int, struct ucred *, struct proc *); static int ufs_chown(struct vnode *, uid_t, gid_t, struct ucred *, struct proc *); int filt_ufsread(struct knote *kn, long hint); @@ -110,6 +112,31 @@ 0, DIRBLKSIZ - 12, 2, ".." }; +#ifdef UFS_STATS +extern int ufsstats_fsync; +extern int ufsstats_create; +extern int ufsstats_mknod; +extern int ufsstats_open; +extern int ufsstats_close; +extern int ufsstats_access; +extern int ufsstats_getattr; +extern int ufsstats_setattr; +extern int ufsstats_chmod; +extern int ufsstats_chown; +extern int ufsstats_remove; +extern int ufsstats_link; +extern int ufsstats_rename; +extern int ufsstats_mkdir; +extern int ufsstats_rmdir; +extern int ufsstats_symlink; +extern int ufsstats_readdir; +extern int ufsstats_readlink; +extern int ufsstats_lockinode; +extern int ufsstats_unlockinode; +extern int ufsstats_strategy; +extern int ufsstats_makeinode; +#endif + /* * Create a regular file */ @@ -125,6 +152,11 @@ } */ *ap = v; int error; +#ifdef UFS_STATS + ufsstats_create++; +#endif + + error = ufs_makeinode(MAKEIMODE(ap->a_vap->va_type, ap->a_vap->va_mode), ap->a_dvp, ap->a_vpp, ap->a_cnp); @@ -153,6 +185,10 @@ struct inode *ip; int error; +#ifdef UFS_STATS + ufsstats_mknod++; +#endif + if ((error = ufs_makeinode(MAKEIMODE(vap->va_type, vap->va_mode), ap->a_dvp, vpp, ap->a_cnp)) != 0) @@ -196,7 +232,11 @@ struct proc *a_p; } */ *ap = v; struct inode *ip = VTOI(ap->a_vp); +#ifdef UFS_STATS + ufsstats_open++; +#endif + /* * Files marked append-only must be opened for appending. */ @@ -228,7 +268,11 @@ } */ *ap = v; struct vnode *vp = ap->a_vp; struct inode *ip = VTOI(vp); +#ifdef UFS_STATS + ufsstats_close++; +#endif + simple_lock(&vp->v_interlock); if (vp->v_usecount > 1) { struct timeval tv; @@ -254,6 +298,11 @@ struct inode *ip = VTOI(vp); mode_t mode = ap->a_mode; +#ifdef UFS_STATS + ufsstats_access++; +#endif + + /* * Disallow write attempts on read-only file systems; * unless the file is a socket, fifo, or a block or @@ -306,6 +355,10 @@ struct vattr *vap = ap->a_vap; struct timeval tv; +#ifdef UFS_STATS + ufsstats_getattr++; +#endif + getmicrotime(&tv); ITIMES(ip, &tv, &tv); /* @@ -362,6 +415,10 @@ long hint = NOTE_ATTRIB; u_quad_t oldsize; +#ifdef UFS_STATS + ufsstats_setattr++; +#endif + /* * Check for unsettable attributes. */ @@ -468,6 +525,10 @@ struct inode *ip = VTOI(vp); int error; +#ifdef UFS_STATS + ufsstats_chmod++; +#endif + if (cred->cr_uid != ip->i_ffs_uid && (error = suser_ucred(cred))) return (error); @@ -504,6 +565,10 @@ daddr_t change; enum ufs_quota_flags quota_flags = 0; +#ifdef UFS_STATS + ufsstats_chown++; +#endif + if (uid == (uid_t)VNOVAL) uid = ip->i_ffs_uid; if (gid == (gid_t)VNOVAL) @@ -648,6 +713,10 @@ struct vnode *dvp = ap->a_dvp; int error; +#ifdef UFS_STATS + ufsstats_remove++; +#endif + ip = VTOI(vp); if (vp->v_type == VDIR || (ip->i_ffs_flags & (IMMUTABLE | APPEND)) || (VTOI(dvp)->i_ffs_flags & APPEND)) { @@ -686,6 +755,11 @@ struct direct newdir; int error; +#ifdef UFS_STATS + ufsstats_link++; +#endif + + #ifdef DIAGNOSTIC if ((cnp->cn_flags & HASBUF) == 0) panic("ufs_link: no name"); @@ -790,6 +864,10 @@ int doingdirectory = 0, oldparent = 0, newparent = 0; int error = 0; +#ifdef UFS_STATS + ufsstats_rename++; +#endif + #ifdef DIAGNOSTIC if ((tcnp->cn_flags & HASBUF) == 0 || (fcnp->cn_flags & HASBUF) == 0) @@ -1206,6 +1284,10 @@ struct dirtemplate dirtemplate, *dtp; int error, dmode, blkoff; +#ifdef UFS_STATS + ufsstats_mkdir++; +#endif + #ifdef DIAGNOSTIC if ((cnp->cn_flags & HASBUF) == 0) panic("ufs_mkdir: no name"); @@ -1357,6 +1439,11 @@ struct inode *ip, *dp; int error; +#ifdef UFS_STATS + ufsstats_rmdir++; +#endif + + ip = VTOI(vp); dp = VTOI(dvp); /* @@ -1463,6 +1550,10 @@ struct inode *ip; int len, error; +#ifdef UFS_STATS + ufsstats_symlink++; +#endif + error = ufs_makeinode(IFLNK | ap->a_vap->va_mode, ap->a_dvp, vpp, ap->a_cnp); if (error) @@ -1508,6 +1599,10 @@ int error; size_t count, lost; off_t off = uio->uio_offset; + +#ifdef UFS_STATS + ufsstats_readdir++; +#endif count = uio->uio_resid; /* Make sure we don't return partial entries. */ @@ -1617,6 +1712,11 @@ struct inode *ip = VTOI(vp); int isize; +#ifdef UFS_STATS + ufsstats_readlink++; +#endif + + isize = ip->i_ffs_size; if (isize < vp->v_mount->mnt_maxsymlinklen || (vp->v_mount->mnt_maxsymlinklen == 0 && ip->i_ffs_blocks == 0)) { @@ -1640,6 +1740,11 @@ } */ *ap = v; struct vnode *vp = ap->a_vp; +#ifdef UFS_STATS + ufsstats_lockinode++; +#endif + + return (lockmgr(&VTOI(vp)->i_lock, ap->a_flags, &vp->v_interlock, ap->a_p)); } @@ -1658,6 +1763,10 @@ } */ *ap = v; struct vnode *vp = ap->a_vp; +#ifdef UFS_STATS + ufsstats_unlockinode++; +#endif + return (lockmgr(&VTOI(vp)->i_lock, ap->a_flags | LK_RELEASE, &vp->v_interlock, ap->a_p)); } @@ -1693,6 +1802,11 @@ int error; int s; +#ifdef UFS_STATS + ufsstats_strategy++; +#endif + + ip = VTOI(vp); if (vp->v_type == VBLK || vp->v_type == VCHR) panic("ufs_strategy: spec"); @@ -2039,6 +2153,11 @@ struct direct newdir; struct vnode *tvp; int error; + +#ifdef UFS_STATS + ufsstats_makeinode++; +#endif + pdir = VTOI(dvp); #ifdef DIAGNOSTIC diff -ru /usr/src/sys/ufs/ufs/ufsstats.h /usr/src/sys/ufs/ufs/ufsstats.h --- /usr/src/sys/ufs/ufs/ufsstats.h Wed Oct 19 22:36:47 2005 +++ /usr/src/sys/ufs/ufs/ufsstats.h Wed Oct 19 17:40:26 2005 @@ -0,0 +1,58 @@ +/*- + * Copyright (c) 1989, 1993, 1995 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#ifndef _UFS_UFS_UFSSTATS_H_ +#define _UFS_UFS_UFSSTATS_H_ + +int ufsstats_fsync = 0; +int ufsstats_create = 0; +int ufsstats_mknod = 0; +int ufsstats_open = 0; +int ufsstats_close = 0; +int ufsstats_access = 0; +int ufsstats_getattr = 0; +int ufsstats_setattr = 0; +int ufsstats_chmod = 0; +int ufsstats_chown = 0; +int ufsstats_remove = 0; +int ufsstats_link = 0; +int ufsstats_rename = 0; +int ufsstats_mkdir = 0; +int ufsstats_rmdir = 0; +int ufsstats_symlink = 0; +int ufsstats_readdir = 0; +int ufsstats_readlink = 0; +int ufsstats_lockinode = 0; +int ufsstats_unlockinode = 0; +int ufsstats_strategy = 0; +int ufsstats_makeinode = 0; + +#endif + # diff -ru /usr/src/sbin/sysctl/Makefile /usr/src/sbin/sysctl/Makefile --- /usr/src/sbin/sysctl/Makefile Wed Oct 19 22:46:19 2005 +++ /usr/src/sbin/sysctl/Makefile Wed Oct 19 22:46:12 2005 @@ -3,7 +3,7 @@ PROG= sysctl MAN= sysctl.8 -CPPFLAGS+= -DINET6 +CPPFLAGS+= -DINET6 -DUFS_STATS afterinstall: (cd ${DESTDIR}/usr/sbin; ln -sf ../../sbin/sysctl .) #