1/*
2 * coda_statis.h
3 *
4 * CODA operation statistics
5 *
6 * (c) March, 1998
7 * by Michihiro Kuramochi, Zhenyu Xia and Zhanyong Wan
8 * zhanyong.wan@yale.edu
9 *
10 */
11
12#ifndef _CODA_PROC_H
13#define _CODA_PROC_H
14
15void coda_sysctl_init(void);
16void coda_sysctl_clean(void);
17void coda_upcall_stats(int opcode, unsigned long jiffies);
18
19#include <linux/sysctl.h>
20#include <linux/coda_fs_i.h>
21#include <linux/coda.h>
22
23/* these four files are presented to show the result of the statistics:
24 *
25 *	/proc/fs/coda/vfs_stats
26 *		      upcall_stats
27 *		      permission_stats
28 *		      cache_inv_stats
29 *
30 * these four files are presented to reset the statistics to 0:
31 *
32 *	/proc/sys/coda/vfs_stats
33 *		       upcall_stats
34 *		       permission_stats
35 *		       cache_inv_stats
36 */
37
38/* VFS operation statistics */
39struct coda_vfs_stats
40{
41	/* file operations */
42	int open;
43	int flush;
44	int release;
45	int fsync;
46
47	/* dir operations */
48	int readdir;
49
50	/* inode operations */
51	int create;
52	int lookup;
53	int link;
54	int unlink;
55	int symlink;
56	int mkdir;
57	int rmdir;
58	int rename;
59	int permission;
60
61	/* symlink operatoins*/
62	int follow_link;
63	int readlink;
64};
65
66struct coda_upcall_stats_entry
67{
68  int count;
69  unsigned long time_sum;
70  unsigned long time_squared_sum;
71};
72
73
74
75/* cache hits for permissions statistics */
76struct coda_permission_stats
77{
78	int count;
79	int hit_count;
80};
81
82/* cache invalidation statistics */
83struct coda_cache_inv_stats
84{
85	int flush;
86	int purge_user;
87	int zap_dir;
88	int zap_file;
89	int zap_vnode;
90	int purge_fid;
91	int replace;
92};
93
94/* these global variables hold the actual statistics data */
95extern struct coda_vfs_stats		coda_vfs_stat;
96extern struct coda_permission_stats	coda_permission_stat;
97extern struct coda_cache_inv_stats	coda_cache_inv_stat;
98extern int				coda_upcall_timestamping;
99
100/* reset statistics to 0 */
101void reset_coda_vfs_stats( void );
102void reset_coda_upcall_stats( void );
103void reset_coda_permission_stats( void );
104void reset_coda_cache_inv_stats( void );
105
106/* some utitlities to make it easier for you to do statistics for time */
107void do_time_stats( struct coda_upcall_stats_entry * pentry,
108		    unsigned long jiffy );
109/*
110double get_time_average( const struct coda_upcall_stats_entry * pentry );
111double get_time_std_deviation( const struct coda_upcall_stats_entry * pentry );
112*/
113unsigned long get_time_average( const struct coda_upcall_stats_entry * pentry );
114unsigned long get_time_std_deviation( const struct coda_upcall_stats_entry * pentry );
115
116/* like coda_dointvec, these functions are to be registered in the ctl_table
117 * data structure for /proc/sys/... files
118 */
119int do_reset_coda_vfs_stats( ctl_table * table, int write, struct file * filp,
120			     void * buffer, size_t * lenp );
121int do_reset_coda_upcall_stats( ctl_table * table, int write,
122				struct file * filp, void * buffer,
123				size_t * lenp );
124int do_reset_coda_permission_stats( ctl_table * table, int write,
125				    struct file * filp, void * buffer,
126				    size_t * lenp );
127int do_reset_coda_cache_inv_stats( ctl_table * table, int write,
128				   struct file * filp, void * buffer,
129				   size_t * lenp );
130
131/* these functions are called to form the content of /proc/fs/coda/... files */
132int coda_vfs_stats_get_info( char * buffer, char ** start, off_t offset,
133			     int length);
134int coda_upcall_stats_get_info( char * buffer, char ** start, off_t offset,
135				int length);
136int coda_permission_stats_get_info( char * buffer, char ** start, off_t offset,
137				    int length);
138int coda_cache_inv_stats_get_info( char * buffer, char ** start, off_t offset,
139				   int length);
140
141
142#endif /* _CODA_PROC_H */
143