13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * statfs.h - definitions for statistic gathering file server 33e12c5d1SDavid du Colombier */ 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier #define DEBUGFILE "iostats.out" 63e12c5d1SDavid du Colombier #define DONESTR "done" 79a747e4fSDavid du Colombier #define DEBUG if(!dbg){}else fprint 83e12c5d1SDavid du Colombier #define MAXPROC 16 93e12c5d1SDavid du Colombier #define FHASHSIZE 64 103e12c5d1SDavid du Colombier #define fidhash(s) fhash[s%FHASHSIZE] 113e12c5d1SDavid du Colombier 129a747e4fSDavid du Colombier enum{ 139a747e4fSDavid du Colombier Maxfdata = 8192, /* max size of data in 9P message */ 149a747e4fSDavid du Colombier Maxrpc = 20000,/* number of RPCs we'll log */ 159a747e4fSDavid du Colombier }; 169a747e4fSDavid du Colombier 173e12c5d1SDavid du Colombier typedef struct Fsrpc Fsrpc; 183e12c5d1SDavid du Colombier typedef struct Fid Fid; 193e12c5d1SDavid du Colombier typedef struct File File; 203e12c5d1SDavid du Colombier typedef struct Proc Proc; 213e12c5d1SDavid du Colombier typedef struct Stats Stats; 223e12c5d1SDavid du Colombier typedef struct Rpc Rpc; 233e12c5d1SDavid du Colombier typedef struct Frec Frec; 243e12c5d1SDavid du Colombier 253e12c5d1SDavid du Colombier struct Frec 263e12c5d1SDavid du Colombier { 273e12c5d1SDavid du Colombier Frec *next; 283e12c5d1SDavid du Colombier char *op; 293e12c5d1SDavid du Colombier ulong nread; 303e12c5d1SDavid du Colombier ulong nwrite; 313e12c5d1SDavid du Colombier ulong bread; 323e12c5d1SDavid du Colombier ulong bwrite; 333e12c5d1SDavid du Colombier ulong opens; 343e12c5d1SDavid du Colombier }; 353e12c5d1SDavid du Colombier 363e12c5d1SDavid du Colombier struct Rpc 373e12c5d1SDavid du Colombier { 383e12c5d1SDavid du Colombier char *name; 393e12c5d1SDavid du Colombier ulong count; 40ab3dc52fSDavid du Colombier vlong time; 41ab3dc52fSDavid du Colombier vlong lo; 42ab3dc52fSDavid du Colombier vlong hi; 433e12c5d1SDavid du Colombier ulong bin; 443e12c5d1SDavid du Colombier ulong bout; 453e12c5d1SDavid du Colombier }; 463e12c5d1SDavid du Colombier 473e12c5d1SDavid du Colombier struct Stats 483e12c5d1SDavid du Colombier { 493e12c5d1SDavid du Colombier ulong totread; 503e12c5d1SDavid du Colombier ulong totwrite; 513e12c5d1SDavid du Colombier ulong nrpc; 523e12c5d1SDavid du Colombier ulong nproto; 539a747e4fSDavid du Colombier Rpc rpc[Maxrpc]; 543e12c5d1SDavid du Colombier }; 553e12c5d1SDavid du Colombier 563e12c5d1SDavid du Colombier struct Fsrpc 573e12c5d1SDavid du Colombier { 583e12c5d1SDavid du Colombier int busy; /* Work buffer has pending rpc to service */ 5974f16c81SDavid du Colombier uintptr pid; /* Pid of slave process executing the rpc */ 603e12c5d1SDavid du Colombier int canint; /* Interrupt gate */ 613e12c5d1SDavid du Colombier int flushtag; /* Tag on which to reply to flush */ 623e12c5d1SDavid du Colombier Fcall work; /* Plan 9 incoming Fcall */ 639a747e4fSDavid du Colombier uchar buf[IOHDRSZ+Maxfdata]; /* Data buffer */ 643e12c5d1SDavid du Colombier }; 653e12c5d1SDavid du Colombier 663e12c5d1SDavid du Colombier struct Fid 673e12c5d1SDavid du Colombier { 683e12c5d1SDavid du Colombier int fid; /* system fd for i/o */ 693e12c5d1SDavid du Colombier File *f; /* File attached to this fid */ 703e12c5d1SDavid du Colombier int mode; 713e12c5d1SDavid du Colombier int nr; /* fid number */ 723e12c5d1SDavid du Colombier Fid *next; /* hash link */ 733e12c5d1SDavid du Colombier ulong nread; 743e12c5d1SDavid du Colombier ulong nwrite; 753e12c5d1SDavid du Colombier ulong bread; 763e12c5d1SDavid du Colombier ulong bwrite; 779a747e4fSDavid du Colombier vlong offset; /* for directories */ 783e12c5d1SDavid du Colombier }; 793e12c5d1SDavid du Colombier 803e12c5d1SDavid du Colombier struct File 813e12c5d1SDavid du Colombier { 829a747e4fSDavid du Colombier char *name; 833e12c5d1SDavid du Colombier Qid qid; 847dd7cddfSDavid du Colombier int inval; 853e12c5d1SDavid du Colombier File *parent; 863e12c5d1SDavid du Colombier File *child; 873e12c5d1SDavid du Colombier File *childlist; 883e12c5d1SDavid du Colombier }; 893e12c5d1SDavid du Colombier 903e12c5d1SDavid du Colombier struct Proc 913e12c5d1SDavid du Colombier { 9274f16c81SDavid du Colombier uintptr pid; 933e12c5d1SDavid du Colombier int busy; 943e12c5d1SDavid du Colombier Proc *next; 953e12c5d1SDavid du Colombier }; 963e12c5d1SDavid du Colombier 973e12c5d1SDavid du Colombier enum 983e12c5d1SDavid du Colombier { 99*3421e8c4SDavid du Colombier Nr_workbufs = 40, 1003e12c5d1SDavid du Colombier Dsegpad = 8192, 1013e12c5d1SDavid du Colombier Fidchunk = 1000, 1023e12c5d1SDavid du Colombier }; 1033e12c5d1SDavid du Colombier 1043e12c5d1SDavid du Colombier Extern Fsrpc *Workq; 1053e12c5d1SDavid du Colombier Extern int dbg; 1063e12c5d1SDavid du Colombier Extern File *root; 1073e12c5d1SDavid du Colombier Extern Fid **fhash; 1083e12c5d1SDavid du Colombier Extern Fid *fidfree; 1093e12c5d1SDavid du Colombier Extern int qid; 1103e12c5d1SDavid du Colombier Extern Proc *Proclist; 1113e12c5d1SDavid du Colombier Extern int done; 1123e12c5d1SDavid du Colombier Extern Stats *stats; 1133e12c5d1SDavid du Colombier Extern Frec *frhead; 1143e12c5d1SDavid du Colombier Extern Frec *frtail; 1159a747e4fSDavid du Colombier Extern int myiounit; 1163e12c5d1SDavid du Colombier 1173e12c5d1SDavid du Colombier /* File system protocol service procedures */ 1183e12c5d1SDavid du Colombier void Xcreate(Fsrpc*), Xclunk(Fsrpc*); 1199a747e4fSDavid du Colombier void Xversion(Fsrpc*), Xauth(Fsrpc*), Xflush(Fsrpc*); 1209a747e4fSDavid du Colombier void Xattach(Fsrpc*), Xwalk(Fsrpc*), Xauth(Fsrpc*); 1219a747e4fSDavid du Colombier void Xremove(Fsrpc*), Xstat(Fsrpc*), Xwstat(Fsrpc*); 1223e12c5d1SDavid du Colombier void slave(Fsrpc*); 1233e12c5d1SDavid du Colombier 1243e12c5d1SDavid du Colombier void reply(Fcall*, Fcall*, char*); 1253e12c5d1SDavid du Colombier Fid *getfid(int); 1263e12c5d1SDavid du Colombier int freefid(int); 1273e12c5d1SDavid du Colombier Fid *newfid(int); 1283e12c5d1SDavid du Colombier Fsrpc *getsbuf(void); 1293e12c5d1SDavid du Colombier void initroot(void); 1303e12c5d1SDavid du Colombier void fatal(char*); 1313e12c5d1SDavid du Colombier void makepath(char*, File*, char*); 1323e12c5d1SDavid du Colombier File *file(File*, char*); 1333e12c5d1SDavid du Colombier void slaveopen(Fsrpc*); 1343e12c5d1SDavid du Colombier void slaveread(Fsrpc*); 1353e12c5d1SDavid du Colombier void slavewrite(Fsrpc*); 1363e12c5d1SDavid du Colombier void blockingslave(void); 1373e12c5d1SDavid du Colombier void reopen(Fid *f); 1383e12c5d1SDavid du Colombier void noteproc(int, char*); 1393e12c5d1SDavid du Colombier void flushaction(void*, char*); 1403e12c5d1SDavid du Colombier void catcher(void*, char*); 1413e12c5d1SDavid du Colombier ulong msec(void); 1423e12c5d1SDavid du Colombier void fidreport(Fid*); 143