165791Smckusick /*- 265791Smckusick * Copyright (c) 1982, 1986, 1989, 1993 365791Smckusick * The Regents of the University of California. All rights reserved. 465791Smckusick * (c) UNIX System Laboratories, Inc. 565791Smckusick * All or some portions of this file are derived from material licensed 665791Smckusick * to the University of California by American Telephone and Telegraph 765791Smckusick * Co. or Unix System Laboratories, Inc. and are reproduced herein with 865791Smckusick * the permission of UNIX System Laboratories, Inc. 949676Smckusick * 1049676Smckusick * %sccs.include.redist.c% 1149676Smckusick * 12*67360Smckusick * from: @(#)kern_acct.c 8.4 (Berkeley) 6/2/94 1349676Smckusick */ 1449676Smckusick 1565791Smckusick #include <sys/param.h> 1665791Smckusick #include <sys/proc.h> 1765791Smckusick #include <sys/mount.h> 1865791Smckusick #include <sys/vnode.h> 1965791Smckusick #include <sys/file.h> 2065791Smckusick #include <sys/syslog.h> 2165791Smckusick #include <sys/kernel.h> 2249676Smckusick 2365791Smckusick struct acct_args { 2465791Smckusick char *fname; 2565791Smckusick }; 2665791Smckusick acct(a1, a2, a3) 2765791Smckusick struct proc *a1; 2865791Smckusick struct acct_args *a2; 2965791Smckusick int *a3; 3065791Smckusick { 3165791Smckusick /* 3265791Smckusick * Body deleted. 3365791Smckusick */ 3465791Smckusick return (ENOSYS); 3565791Smckusick } 3649676Smckusick 3765791Smckusick acct_process(a1) 3865791Smckusick struct proc *a1; 3949676Smckusick { 4049676Smckusick 4149676Smckusick /* 4249676Smckusick * Body deleted. 4349676Smckusick */ 4465791Smckusick return; 4549676Smckusick } 4649676Smckusick 4749676Smckusick /* 4849676Smckusick * Periodically check the file system to see if accounting 49*67360Smckusick * should be turned on or off. Beware the case where the vnode 50*67360Smckusick * has been vgone()'d out from underneath us, e.g. when the file 51*67360Smckusick * system containing the accounting file has been forcibly unmounted. 5249676Smckusick */ 5365791Smckusick 5465791Smckusick /* 5565791Smckusick * Values associated with enabling and disabling accounting 5665791Smckusick */ 5765791Smckusick int acctsuspend = 2; /* stop accounting when < 2% free space left */ 5865791Smckusick int acctresume = 4; /* resume when free space risen to > 4% */ 5965791Smckusick int acctchkfreq = 15; /* frequency (in seconds) to check space */ 6065791Smckusick 6165791Smckusick /* 6265791Smckusick * SHOULD REPLACE THIS WITH A DRIVER THAT CAN BE READ TO SIMPLIFY. 6365791Smckusick */ 6465791Smckusick struct vnode *acctp; 6565791Smckusick struct vnode *savacctp; 6665791Smckusick 6765791Smckusick /* ARGSUSED */ 6865791Smckusick void 6965791Smckusick acctwatch(a) 7065791Smckusick void *a; 7149676Smckusick { 7249676Smckusick struct statfs sb; 7349676Smckusick 7449676Smckusick if (savacctp) { 75*67360Smckusick if (savacctp->v_type == VBAD) { 76*67360Smckusick (void) vn_close(savacctp, FWRITE, NOCRED, NULL); 77*67360Smckusick savacctp = NULL; 78*67360Smckusick return; 79*67360Smckusick } 8049676Smckusick (void)VFS_STATFS(savacctp->v_mount, &sb, (struct proc *)0); 8149676Smckusick if (sb.f_bavail > acctresume * sb.f_blocks / 100) { 8249676Smckusick acctp = savacctp; 8349676Smckusick savacctp = NULL; 8449676Smckusick log(LOG_NOTICE, "Accounting resumed\n"); 8565791Smckusick } 8665791Smckusick } else { 8765791Smckusick if (acctp == NULL) 8849676Smckusick return; 89*67360Smckusick if (acctp->v_type == VBAD) { 90*67360Smckusick (void) vn_close(acctp, FWRITE, NOCRED, NULL); 91*67360Smckusick acctp = NULL; 92*67360Smckusick return; 93*67360Smckusick } 9465791Smckusick (void)VFS_STATFS(acctp->v_mount, &sb, (struct proc *)0); 9565791Smckusick if (sb.f_bavail <= acctsuspend * sb.f_blocks / 100) { 9665791Smckusick savacctp = acctp; 9765791Smckusick acctp = NULL; 9865791Smckusick log(LOG_NOTICE, "Accounting suspended\n"); 9949676Smckusick } 10049676Smckusick } 10165791Smckusick timeout(acctwatch, NULL, acctchkfreq * hz); 10249676Smckusick } 103