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*);
|