1 /*-
2 * Copyright (c) 1982, 1986, 1989, 1993
3 * The Regents of the University of California. All rights reserved.
4 * (c) UNIX System Laboratories, Inc.
5 * All or some portions of this file are derived from material licensed
6 * to the University of California by American Telephone and Telegraph
7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8 * the permission of UNIX System Laboratories, Inc.
9 *
10 * %sccs.include.redist.c%
11 *
12 * from: @(#)kern_acct.c 8.8 (Berkeley) 5/14/95
13 */
14
15 #include <sys/param.h>
16 #include <sys/proc.h>
17 #include <sys/mount.h>
18 #include <sys/vnode.h>
19 #include <sys/file.h>
20 #include <sys/syslog.h>
21 #include <sys/kernel.h>
22
23 acct(a1, a2, a3)
24 struct proc *a1;
25 struct acct_args /* {
26 syscallarg(char *) path;
27 } */ *a2;
28 int *a3;
29 {
30 /*
31 * Body deleted.
32 */
33 return (ENOSYS);
34 }
35
36 acct_process(a1)
37 struct proc *a1;
38 {
39
40 /*
41 * Body deleted.
42 */
43 return;
44 }
45
46 /*
47 * Periodically check the file system to see if accounting
48 * should be turned on or off. Beware the case where the vnode
49 * has been vgone()'d out from underneath us, e.g. when the file
50 * system containing the accounting file has been forcibly unmounted.
51 */
52
53 /*
54 * Values associated with enabling and disabling accounting
55 */
56 int acctsuspend = 2; /* stop accounting when < 2% free space left */
57 int acctresume = 4; /* resume when free space risen to > 4% */
58 int acctchkfreq = 15; /* frequency (in seconds) to check space */
59
60 /*
61 * SHOULD REPLACE THIS WITH A DRIVER THAT CAN BE READ TO SIMPLIFY.
62 */
63 struct vnode *acctp;
64 struct vnode *savacctp;
65
66 /* ARGSUSED */
67 void
acctwatch(a)68 acctwatch(a)
69 void *a;
70 {
71 struct statfs sb;
72
73 if (savacctp) {
74 if (savacctp->v_type == VBAD) {
75 (void) vn_close(savacctp, FWRITE, NOCRED, NULL);
76 savacctp = NULL;
77 return;
78 }
79 (void)VFS_STATFS(savacctp->v_mount, &sb, (struct proc *)0);
80 if (sb.f_bavail > acctresume * sb.f_blocks / 100) {
81 acctp = savacctp;
82 savacctp = NULL;
83 log(LOG_NOTICE, "Accounting resumed\n");
84 }
85 } else {
86 if (acctp == NULL)
87 return;
88 if (acctp->v_type == VBAD) {
89 (void) vn_close(acctp, FWRITE, NOCRED, NULL);
90 acctp = NULL;
91 return;
92 }
93 (void)VFS_STATFS(acctp->v_mount, &sb, (struct proc *)0);
94 if (sb.f_bavail <= acctsuspend * sb.f_blocks / 100) {
95 savacctp = acctp;
96 acctp = NULL;
97 log(LOG_NOTICE, "Accounting suspended\n");
98 }
99 }
100 timeout(acctwatch, NULL, acctchkfreq * hz);
101 }
102