1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 1996-2002 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _CACHEFS_LIB_STATS_H
#define _CACHEFS_LIB_STATS_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <rpc/types.h>
#include <rpc/xdr.h>
#include <sys/fs/cachefs_fs.h>
#include <sys/fs/cachefs_log.h>
#include <kstat.h>
#include <ndbm.h>
#ifndef DEBUG
#define NDEBUG
#endif /* DEBUG */
#define STATS_MAGIC 54545
typedef struct stats_cookie {
int st_magic;
char *st_progname;
uint_t st_flags; /* misc. flags */
int st_fsid; /* id # for kstat `cachefs.#.stat' */
FILE *st_logstream; /* stream for logfile */
XDR st_logxdr;
struct cachefs_log_logfile_header st_loghead;
char st_asciirec[BUFSIZ];
DBM *st_dbm;
char st_dbm_name[MAXPATHLEN];
int st_ws_init;
u_offset_t st_ws_current;
u_offset_t st_ws_high;
int st_ws_expensive;
char st_errorstr[BUFSIZ];
int st_errno;
kstat_ctl_t *st_kstat_cookie;
} stats_cookie_t;
/*
* error types for the API (given by stats_errno())
*/
enum stats_error {
SE_NOERROR, /* placeholder so no errors == 0 */
SE_INVAL, /* invalid use of the API */
SE_NOMEM, /* ran out of memory */
SE_FILE, /* trouble with file i/o */
SE_CORRUPT, /* trouble with a corrupt file */
SE_KERNEL /* trouble coming from communication with the kernel */
};
/*
* flags in cookie->st_flags
*/
#define ST_VALID 0x0001 /* initialized completely */
#define ST_BOUND 0x0002 /* bound to a particular filesystem or cache */
#define ST_ERROR 0x0004 /* an error has occured */
#define ST_LFOPEN 0x0008 /* logstream is open */
#define ST_DBMOPEN 0x0010 /* dbm descriptor is open */
#define ST_WSCOMP 0x0020 /* working set size computed */
/*
* flags for logfile-to-workingset
*/
#define GRI_ADD 0x01 /* we may have added to the alloc map */
#define GRI_TRUNC 0x02 /* we may have truncated the alloc map */
#define GRI_MODIFY 0x04 /* we modified this file */
#define GRI_METADATA 0x08 /* we created metadata */
#define GRI_EXPENSIVE 0x10 /* record indicates `expensive' logging */
/*
* structures for logfile-to-workingset
*/
#define FI_METADATA 0x01 /* this file has metadata */
/*
* len and offset are now u_offset_t in sync with struct cachefs_allocmap in
* file cachefs_fs.h
*/
typedef struct fid_info {
int fi_magic;
uint_t fi_flags;
caddr_t fi_vfsp;
uint_t fi_ent_n;
struct fid_info_allocent {
u_offset_t offset;
u_offset_t len;
} fi_ent[C_MAX_ALLOCINFO_SLOTS];
u_offset_t fi_total;
} fid_info;
#define FI_MAGIC (3748321)
typedef struct mount_info {
int mi_magic;
uint_t mi_mounted:1;
uint_t mi_used:1;
u_offset_t mi_current;
u_offset_t mi_high;
uint_t mi_flags;
uint_t mi_filegrp_size;
char mi_path[2];
} mount_info;
#define MI_MAGIC (837492)
/*
* Define the maximum size of char mi_path[]
*
* The maximum size of mi_path is a path (MAXPATHLEN) and a cacheid
* (C_MAX_MOUNT_FSCDIRNAME) plus terminating nulls (2).
*
* Additional space is allocated to mi_path at runtime using malloc().
*/
#define MI_MAX_MI_PATH (MAXPATHLEN + C_MAX_MOUNT_FSCDIRNAME + 2)
typedef struct filegrp_info {
int fg_magic;
uint_t fg_count; /* high-water known # of attrcache entries */
uint_t fg_bcount; /* # of bits set in fg_bits */
uchar_t fg_bits[DEF_FILEGRP_SIZE / NBBY];
size_t fg_size; /* high-water attrcache size (MAXBSIZE ceiling) */
} fg_info;
#define FG_MAGIC (673492)
/*
* the cachefs stats (stats_*) API.
*/
/* stats_create.c */
stats_cookie_t *stats_create_mountpath(char *, char *);
stats_cookie_t *stats_create_unbound(char *);
cachefs_kstat_key_t *stats_next(stats_cookie_t *);
cachefs_kstat_key_t *stats_getkey(stats_cookie_t *);
void stats_destroy(stats_cookie_t *);
int stats_good(stats_cookie_t *);
char *stats_errorstr(stats_cookie_t *);
int stats_errno(stats_cookie_t *);
int stats_inerror(stats_cookie_t *);
void stats_perror(stats_cookie_t *, int, char *, ...);
/* stats_log.c */
int stats_log_kernel_setname(stats_cookie_t *, char *);
int stats_log_which(stats_cookie_t *, int, int);
char *stats_log_kernel_getname(stats_cookie_t *);
int stats_log_logfile_open(stats_cookie_t *, char *);
void *stats_log_logfile_read(stats_cookie_t *, int *);
char *stats_log_record_toascii(stats_cookie_t *, void *);
uint_t stats_log_get_record_info(stats_cookie_t *,
void *, caddr_t *, cfs_fid_t **, ino64_t *, u_offset_t *, u_offset_t *);
void stats_log_fi_add(stats_cookie_t *, fid_info *, u_offset_t, u_offset_t);
void stats_log_fi_trunc(stats_cookie_t *, fid_info *, u_offset_t, u_offset_t);
struct cachefs_log_logfile_header *stats_log_getheader(stats_cookie_t *);
void stats_log_compute_wssize(stats_cookie_t *);
int stats_log_wssize_init(stats_cookie_t *);
u_offset_t stats_log_wssize_current(stats_cookie_t *);
u_offset_t stats_log_wssize_high(stats_cookie_t *);
int stats_log_wssize_expensive(stats_cookie_t *);
/* stats_stats.c */
uint_t stats_hits(stats_cookie_t *);
uint_t stats_misses(stats_cookie_t *);
uint_t stats_passes(stats_cookie_t *);
uint_t stats_fails(stats_cookie_t *);
uint_t stats_modifies(stats_cookie_t *);
uint_t stats_gc_count(stats_cookie_t *);
time_t stats_gc_time(stats_cookie_t *);
time_t stats_gc_before(stats_cookie_t *);
time_t stats_gc_after(stats_cookie_t *);
int stats_zero_stats(stats_cookie_t *);
/* stats_dbm.c */
void stats_dbm_open(stats_cookie_t *);
void stats_dbm_rm(stats_cookie_t *);
void stats_dbm_close(stats_cookie_t *);
fid_info *stats_dbm_fetch_byfid(stats_cookie_t *, cfs_fid_t *);
void stats_dbm_store_byfid(stats_cookie_t *, cfs_fid_t *, fid_info *);
mount_info *stats_dbm_fetch_byvfsp(stats_cookie_t *, caddr_t);
void stats_dbm_store_byvfsp(stats_cookie_t *, caddr_t, mount_info *);
void stats_dbm_delete_byvfsp(stats_cookie_t *, caddr_t);
size_t stats_dbm_attrcache_addsize(stats_cookie_t *, mount_info *,
ino64_t, uint_t);
datum stats_dbm_firstkey(stats_cookie_t *);
datum stats_dbm_nextkey(stats_cookie_t *);
#ifdef __cplusplus
}
#endif
#endif /* _CACHEFS_LIB_STATS_H */
|