summaryrefslogtreecommitdiff
path: root/sys/src/cmd/iostats/statfs.h
blob: 6d82f1938c8826deeabbd705fe029f95afd9a6be (plain)
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
/*
 * statfs.h - definitions for statistic gathering file server
 */

#define DEBUGFILE	"iostats.out"
#define DONESTR		"done"
#define DEBUG		if(!dbg){}else fprint
#define MAXPROC		16
#define FHASHSIZE	64
#define fidhash(s)	fhash[s%FHASHSIZE]

enum{
	Maxfdata	= 8192,	/* max size of data in 9P message */
	Maxrpc		= 20000,/* number of RPCs we'll log */
};

typedef struct Fsrpc Fsrpc;
typedef struct Fid Fid;
typedef struct File File;
typedef struct Proc Proc;
typedef struct Stats Stats;
typedef struct Rpc Rpc;
typedef struct Frec Frec;

struct Frec
{
	Frec	*next;
	char	*op;
	ulong	nread;
	ulong	nwrite;
	ulong	bread;
	ulong	bwrite;
	ulong	opens;
};

struct Rpc
{
	char	*name;
	ulong	count;
	vlong	time;
	vlong	lo;
	vlong	hi;
	ulong	bin;
	ulong	bout;
};

struct Stats
{
	ulong	totread;
	ulong	totwrite;
	ulong	nrpc;
	ulong	nproto;
	Rpc	rpc[Maxrpc];
};

struct Fsrpc
{
	int	busy;			/* Work buffer has pending rpc to service */
	uintptr	pid;			/* Pid of slave process executing the rpc */
	int	canint;			/* Interrupt gate */
	int	flushtag;		/* Tag on which to reply to flush */
	Fcall	work;			/* Plan 9 incoming Fcall */
	uchar	buf[IOHDRSZ+Maxfdata];	/* Data buffer */
};

struct Fid
{
	int	fid;			/* system fd for i/o */
	File	*f;			/* File attached to this fid */
	int	mode;
	int	nr;			/* fid number */
	Fid	*next;			/* hash link */
	ulong	nread;
	ulong	nwrite;
	ulong	bread;
	ulong	bwrite;
	vlong	offset;			/* for directories */
};

struct File
{
	char	*name;
	Qid	qid;
	int	inval;
	File	*parent;
	File	*child;
	File	*childlist;
};

struct Proc
{
	uintptr	pid;
	int	busy;
	Proc	*next;
};

enum
{
	Nr_workbufs 	= 40,
	Dsegpad		= 8192,
	Fidchunk	= 1000,
};

Extern Fsrpc	*Workq;
Extern int  	dbg;
Extern File	*root;
Extern Fid	**fhash;
Extern Fid	*fidfree;
Extern int	qid;
Extern Proc	*Proclist;
Extern int	done;
Extern Stats	*stats;
Extern Frec	*frhead;
Extern Frec	*frtail;
Extern int	myiounit;

/* File system protocol service procedures */
void Xcreate(Fsrpc*), Xclunk(Fsrpc*); 
void Xversion(Fsrpc*), Xauth(Fsrpc*), Xflush(Fsrpc*); 
void Xattach(Fsrpc*), Xwalk(Fsrpc*), Xauth(Fsrpc*);
void Xremove(Fsrpc*), Xstat(Fsrpc*), Xwstat(Fsrpc*);
void slave(Fsrpc*);

void	reply(Fcall*, Fcall*, char*);
Fid 	*getfid(int);
int	freefid(int);
Fid	*newfid(int);
Fsrpc	*getsbuf(void);
void	initroot(void);
void	fatal(char*);
void	makepath(char*, File*, char*);
File	*file(File*, char*);
void	slaveopen(Fsrpc*);
void	slaveread(Fsrpc*);
void	slavewrite(Fsrpc*);
void	blockingslave(void);
void	reopen(Fid *f);
void	noteproc(int, char*);
void	flushaction(void*, char*);
void	catcher(void*, char*);
ulong	msec(void);
void	fidreport(Fid*);