1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#pragma ident	"%Z%%M%	%I%	%E% SMI"
28
29/*
30 *
31 *			stats_stats.c
32 *
33 * Routines for the `clean interface' to cachefs statistics.
34 */
35
36#include <libintl.h>
37#include <sys/types.h>
38#include <sys/stat.h>
39#include <assert.h>
40#include <sys/fs/cachefs_fs.h>
41#include "stats.h"
42
43static kstat_t *
44stats_read_stat(stats_cookie_t *st)
45{
46	kstat_t *stat;
47
48	assert(stats_good(st));
49	assert(st->st_flags & ST_BOUND);
50
51	if (((stat = kstat_lookup(st->st_kstat_cookie,
52	    "cachefs", st->st_fsid, "stats")) == NULL) ||
53	    (kstat_read(st->st_kstat_cookie, stat, NULL) < 0)) {
54		stats_perror(st, SE_KERNEL,
55		    gettext("Cannot lookup statistics"),
56		    st->st_fsid);
57		goto out;
58	}
59out:
60	return (stat);
61}
62
63u_int
64stats_hits(stats_cookie_t *st)
65{
66	kstat_t *ks;
67	cachefs_stats_t *stats;
68	u_int rc = 0;
69
70	if ((ks = stats_read_stat(st)) != NULL) {
71		stats = (cachefs_stats_t *) ks->ks_data;
72		rc = stats->st_hits;
73	} else {
74		stats_perror(st, SE_KERNEL,
75		    gettext("Cannot read statistics"));
76	}
77
78	return (rc);
79}
80
81u_int
82stats_misses(stats_cookie_t *st)
83{
84	kstat_t *ks;
85	cachefs_stats_t *stats;
86	u_int rc = 0;
87
88	if ((ks = stats_read_stat(st)) != NULL) {
89		stats = (cachefs_stats_t *) ks->ks_data;
90		rc = stats->st_misses;
91	} else {
92		stats_perror(st, SE_KERNEL,
93		    gettext("Cannot read statistics"));
94	}
95
96	return (rc);
97}
98
99u_int
100stats_passes(stats_cookie_t *st)
101{
102	kstat_t *ks;
103	cachefs_stats_t *stats;
104	u_int rc = 0;
105
106	if ((ks = stats_read_stat(st)) != NULL) {
107		stats = (cachefs_stats_t *) ks->ks_data;
108		rc = stats->st_passes;
109	} else {
110		stats_perror(st, SE_KERNEL,
111		    gettext("Cannot read statistics"));
112	}
113
114	return (rc);
115}
116
117u_int
118stats_fails(stats_cookie_t *st)
119{
120	kstat_t *ks;
121	cachefs_stats_t *stats;
122	u_int rc = 0;
123
124	if ((ks = stats_read_stat(st)) != NULL) {
125		stats = (cachefs_stats_t *) ks->ks_data;
126		rc = stats->st_fails;
127	} else {
128		stats_perror(st, SE_KERNEL,
129		    gettext("Cannot read statistics"));
130	}
131
132	return (rc);
133}
134
135u_int
136stats_modifies(stats_cookie_t *st)
137{
138	kstat_t *ks;
139	cachefs_stats_t *stats;
140	u_int rc = 0;
141
142	if ((ks = stats_read_stat(st)) != NULL) {
143		stats = (cachefs_stats_t *) ks->ks_data;
144		rc = stats->st_modifies;
145	} else {
146		stats_perror(st, SE_KERNEL,
147		    gettext("Cannot read statistics"));
148	}
149
150	return (rc);
151}
152
153u_int
154stats_gc_count(stats_cookie_t *st)
155{
156	kstat_t *ks;
157	cachefs_stats_t *stats;
158	u_int rc = 0;
159
160	if ((ks = stats_read_stat(st)) != NULL) {
161		stats = (cachefs_stats_t *) ks->ks_data;
162		rc = stats->st_gc_count;
163	} else {
164		stats_perror(st, SE_KERNEL,
165		    gettext("Cannot read statistics"));
166	}
167
168	return (rc);
169}
170
171time_t
172stats_gc_time(stats_cookie_t *st)
173{
174	kstat_t *ks;
175	cachefs_stats_t *stats;
176	time_t rc = 0;
177
178	if ((ks = stats_read_stat(st)) != NULL) {
179		stats = (cachefs_stats_t *) ks->ks_data;
180		rc = stats->st_gc_time;
181	} else {
182		stats_perror(st, SE_KERNEL,
183		    gettext("Cannot read statistics"));
184	}
185
186	return (rc);
187}
188
189time_t
190stats_gc_before(stats_cookie_t *st)
191{
192	kstat_t *ks;
193	cachefs_stats_t *stats;
194	time_t rc = 0;
195
196	if ((ks = stats_read_stat(st)) != NULL) {
197		stats = (cachefs_stats_t *) ks->ks_data;
198		rc = stats->st_gc_before_atime;
199	} else {
200		stats_perror(st, SE_KERNEL,
201		    gettext("Cannot read statistics"));
202	}
203
204	return (rc);
205}
206
207time_t
208stats_gc_after(stats_cookie_t *st)
209{
210	kstat_t *ks;
211	cachefs_stats_t *stats;
212	time_t rc = 0;
213
214	if ((ks = stats_read_stat(st)) != NULL) {
215		stats = (cachefs_stats_t *) ks->ks_data;
216		rc = stats->st_gc_after_atime;
217	} else {
218		stats_perror(st, SE_KERNEL,
219		    gettext("Cannot read statistics"));
220	}
221
222	return (rc);
223}
224
225int
226stats_zero_stats(stats_cookie_t *st)
227{
228	cachefs_stats_t stats;
229	kstat_t *ks;
230	int rc = 0;
231	void *memset();
232
233	assert(stats_good(st));
234	assert(st->st_flags & ST_BOUND);
235
236	if ((ks = stats_read_stat(st)) == NULL) {
237		rc = -1;
238		goto out;
239	}
240
241	memset(&stats, '\0', sizeof (stats));
242	ks->ks_data = &stats;
243
244	if (kstat_write(st->st_kstat_cookie, ks, NULL) < 0) {
245		stats_perror(st, SE_KERNEL,
246		    gettext("Cannot zero statistics"));
247		rc = -1;
248		goto out;
249	}
250
251out:
252	return (rc);
253}
254