1*01a344a2SDavid du Colombier /* 2*01a344a2SDavid du Colombier * fundamental constants and types of the implementation 3*01a344a2SDavid du Colombier * changing any of these changes the layout on disk 4*01a344a2SDavid du Colombier */ 5*01a344a2SDavid du Colombier enum { 6*01a344a2SDavid du Colombier SUPER_ADDR = 2, /* block address of superblock */ 7*01a344a2SDavid du Colombier ROOT_ADDR = 3, /* block address of root directory */ 8*01a344a2SDavid du Colombier }; 9*01a344a2SDavid du Colombier 10*01a344a2SDavid du Colombier /* more fundamental types */ 11*01a344a2SDavid du Colombier typedef vlong Wideoff; /* type to widen Off to for printing; ≥ as wide as Off */ 12*01a344a2SDavid du Colombier typedef short Userid; /* signed internal representation of user-id */ 13*01a344a2SDavid du Colombier typedef long Timet; /* in seconds since epoch */ 14*01a344a2SDavid du Colombier typedef vlong Devsize; /* in bytes */ 15*01a344a2SDavid du Colombier 16*01a344a2SDavid du Colombier 17*01a344a2SDavid du Colombier /* macros */ 18*01a344a2SDavid du Colombier #define NEXT(x, l) (((x)+1) % (l)) 19*01a344a2SDavid du Colombier #define PREV(x, l) ((x) == 0? (l)-1: (x)-1) 20*01a344a2SDavid du Colombier #define HOWMANY(x, y) (((x)+((y)-1)) / (y)) 21*01a344a2SDavid du Colombier #define ROUNDUP(x, y) (HOWMANY((x), (y)) * (y)) 22*01a344a2SDavid du Colombier 23*01a344a2SDavid du Colombier #define TK2MS(t) (((ulong)(t)*1000)/HZ) /* ticks to ms - beware rounding */ 24*01a344a2SDavid du Colombier #define MS2TK(t) (((ulong)(t)*HZ)/1000) /* ms to ticks - beware rounding */ 25*01a344a2SDavid du Colombier #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ 26*01a344a2SDavid du Colombier 27*01a344a2SDavid du Colombier /* constants that don't affect disk layout */ 28*01a344a2SDavid du Colombier enum { 29*01a344a2SDavid du Colombier MAXDAT = 8192, /* max allowable data message */ 30*01a344a2SDavid du Colombier MAXMSG = 128, /* max protocol message sans data */ 31*01a344a2SDavid du Colombier 32*01a344a2SDavid du Colombier MB = 1024*1024, 33*01a344a2SDavid du Colombier 34*01a344a2SDavid du Colombier HZ = 1, /* clock frequency */ 35*01a344a2SDavid du Colombier }; 36*01a344a2SDavid du Colombier 37*01a344a2SDavid du Colombier /* 38*01a344a2SDavid du Colombier * tunable parameters 39*01a344a2SDavid du Colombier */ 40*01a344a2SDavid du Colombier enum { 41*01a344a2SDavid du Colombier Maxword = 256, /* max bytes per command-line word */ 42*01a344a2SDavid du Colombier NTLOCK = 200, /* number of active file Tlocks */ 43*01a344a2SDavid du Colombier }; 44*01a344a2SDavid du Colombier 45*01a344a2SDavid du Colombier typedef struct Auth Auth; 46*01a344a2SDavid du Colombier typedef struct Bp Bp; 47*01a344a2SDavid du Colombier typedef struct Bucket Bucket; 48*01a344a2SDavid du Colombier typedef struct Cache Cache; 49*01a344a2SDavid du Colombier typedef struct Centry Centry; 50*01a344a2SDavid du Colombier typedef struct Chan Chan; 51*01a344a2SDavid du Colombier typedef struct Command Command; 52*01a344a2SDavid du Colombier typedef struct Conf Conf; 53*01a344a2SDavid du Colombier typedef struct Cons Cons; 54*01a344a2SDavid du Colombier typedef struct Dentry Dentry; 55*01a344a2SDavid du Colombier typedef struct Device Device; 56*01a344a2SDavid du Colombier typedef struct Fbuf Fbuf; 57*01a344a2SDavid du Colombier typedef struct File File; 58*01a344a2SDavid du Colombier typedef struct Filsys Filsys; 59*01a344a2SDavid du Colombier typedef struct Filter Filter; 60*01a344a2SDavid du Colombier typedef struct Flag Flag; 61*01a344a2SDavid du Colombier typedef struct Hiob Hiob; 62*01a344a2SDavid du Colombier typedef struct Iobuf Iobuf; 63*01a344a2SDavid du Colombier typedef struct Lock Lock; 64*01a344a2SDavid du Colombier typedef struct Msgbuf Msgbuf; 65*01a344a2SDavid du Colombier typedef struct QLock QLock; 66*01a344a2SDavid du Colombier typedef struct Qid9p1 Qid9p1; 67*01a344a2SDavid du Colombier typedef struct Queue Queue; 68*01a344a2SDavid du Colombier typedef union Rabuf Rabuf; 69*01a344a2SDavid du Colombier typedef struct Rendez Rendez; 70*01a344a2SDavid du Colombier typedef struct Rtc Rtc; 71*01a344a2SDavid du Colombier typedef struct Startsb Startsb; 72*01a344a2SDavid du Colombier typedef struct Super1 Super1; 73*01a344a2SDavid du Colombier typedef struct Superb Superb; 74*01a344a2SDavid du Colombier typedef struct Tag Tag; 75*01a344a2SDavid du Colombier typedef struct Time Time; 76*01a344a2SDavid du Colombier typedef struct Tlock Tlock; 77*01a344a2SDavid du Colombier typedef struct Tm Tm; 78*01a344a2SDavid du Colombier typedef struct Uid Uid; 79*01a344a2SDavid du Colombier typedef struct Wpath Wpath; 80*01a344a2SDavid du Colombier 81*01a344a2SDavid du Colombier #pragma incomplete Auth 82*01a344a2SDavid du Colombier 83*01a344a2SDavid du Colombier struct Tag 84*01a344a2SDavid du Colombier { 85*01a344a2SDavid du Colombier short pad; /* make tag end at a long boundary */ 86*01a344a2SDavid du Colombier short tag; 87*01a344a2SDavid du Colombier Off path; 88*01a344a2SDavid du Colombier }; 89*01a344a2SDavid du Colombier 90*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 91*01a344a2SDavid du Colombier struct Qid9p1 92*01a344a2SDavid du Colombier { 93*01a344a2SDavid du Colombier Off path; /* was long */ 94*01a344a2SDavid du Colombier ulong version; /* should be Off */ 95*01a344a2SDavid du Colombier }; 96*01a344a2SDavid du Colombier 97*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 98*01a344a2SDavid du Colombier struct Super1 99*01a344a2SDavid du Colombier { 100*01a344a2SDavid du Colombier Off fstart; 101*01a344a2SDavid du Colombier Off fsize; 102*01a344a2SDavid du Colombier Off tfree; 103*01a344a2SDavid du Colombier Off qidgen; /* generator for unique ids */ 104*01a344a2SDavid du Colombier /* 105*01a344a2SDavid du Colombier * Stuff for WWC device 106*01a344a2SDavid du Colombier */ 107*01a344a2SDavid du Colombier Off cwraddr; /* cfs root addr */ 108*01a344a2SDavid du Colombier Off roraddr; /* dump root addr */ 109*01a344a2SDavid du Colombier Off last; /* last super block addr */ 110*01a344a2SDavid du Colombier Off next; /* next super block addr */ 111*01a344a2SDavid du Colombier }; 112*01a344a2SDavid du Colombier 113*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 114*01a344a2SDavid du Colombier struct Centry 115*01a344a2SDavid du Colombier { 116*01a344a2SDavid du Colombier ushort age; 117*01a344a2SDavid du Colombier short state; 118*01a344a2SDavid du Colombier Off waddr; /* worm addr */ 119*01a344a2SDavid du Colombier }; 120*01a344a2SDavid du Colombier 121*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 122*01a344a2SDavid du Colombier struct Dentry 123*01a344a2SDavid du Colombier { 124*01a344a2SDavid du Colombier char name[NAMELEN]; 125*01a344a2SDavid du Colombier Userid uid; 126*01a344a2SDavid du Colombier Userid gid; 127*01a344a2SDavid du Colombier ushort mode; 128*01a344a2SDavid du Colombier #define DALLOC 0x8000 129*01a344a2SDavid du Colombier #define DDIR 0x4000 130*01a344a2SDavid du Colombier #define DAPND 0x2000 131*01a344a2SDavid du Colombier #define DLOCK 0x1000 132*01a344a2SDavid du Colombier #define DREAD 0x4 133*01a344a2SDavid du Colombier #define DWRITE 0x2 134*01a344a2SDavid du Colombier #define DEXEC 0x1 135*01a344a2SDavid du Colombier Userid muid; 136*01a344a2SDavid du Colombier Qid9p1 qid; 137*01a344a2SDavid du Colombier Off size; 138*01a344a2SDavid du Colombier Off dblock[NDBLOCK]; 139*01a344a2SDavid du Colombier Off iblocks[NIBLOCK]; 140*01a344a2SDavid du Colombier long atime; 141*01a344a2SDavid du Colombier long mtime; 142*01a344a2SDavid du Colombier }; 143*01a344a2SDavid du Colombier 144*01a344a2SDavid du Colombier /* 145*01a344a2SDavid du Colombier * derived constants 146*01a344a2SDavid du Colombier */ 147*01a344a2SDavid du Colombier enum { 148*01a344a2SDavid du Colombier BUFSIZE = RBUFSIZE - sizeof(Tag), 149*01a344a2SDavid du Colombier DIRPERBUF = BUFSIZE / sizeof(Dentry), 150*01a344a2SDavid du Colombier INDPERBUF = BUFSIZE / sizeof(Off), 151*01a344a2SDavid du Colombier FEPERBUF = (BUFSIZE-sizeof(Super1)-sizeof(Off)) / sizeof(Off), 152*01a344a2SDavid du Colombier SMALLBUF = MAXMSG, 153*01a344a2SDavid du Colombier LARGEBUF = MAXMSG+MAXDAT+256, 154*01a344a2SDavid du Colombier RAGAP = (300*1024)/BUFSIZE, /* readahead parameter */ 155*01a344a2SDavid du Colombier BKPERBLK = 10, 156*01a344a2SDavid du Colombier CEPERBK = (BUFSIZE - BKPERBLK*sizeof(Off)) / 157*01a344a2SDavid du Colombier (sizeof(Centry)*BKPERBLK), 158*01a344a2SDavid du Colombier }; 159*01a344a2SDavid du Colombier 160*01a344a2SDavid du Colombier /* 161*01a344a2SDavid du Colombier * send/recv queue structure 162*01a344a2SDavid du Colombier */ 163*01a344a2SDavid du Colombier struct Queue 164*01a344a2SDavid du Colombier { 165*01a344a2SDavid du Colombier QLock; /* to manipulate values */ 166*01a344a2SDavid du Colombier Rendez empty; 167*01a344a2SDavid du Colombier Rendez full; 168*01a344a2SDavid du Colombier 169*01a344a2SDavid du Colombier int waitedfor; /* flag */ 170*01a344a2SDavid du Colombier char* name; /* for debugging */ 171*01a344a2SDavid du Colombier 172*01a344a2SDavid du Colombier int size; /* size of queue */ 173*01a344a2SDavid du Colombier int loc; /* circular pointer */ 174*01a344a2SDavid du Colombier int count; /* how many in queue */ 175*01a344a2SDavid du Colombier void* args[1]; /* list of saved pointers, [->size] */ 176*01a344a2SDavid du Colombier }; 177*01a344a2SDavid du Colombier 178*01a344a2SDavid du Colombier struct Device 179*01a344a2SDavid du Colombier { 180*01a344a2SDavid du Colombier uchar type; 181*01a344a2SDavid du Colombier uchar init; 182*01a344a2SDavid du Colombier Device* link; /* link for mcat/mlev/mirror */ 183*01a344a2SDavid du Colombier Device* dlink; /* link all devices */ 184*01a344a2SDavid du Colombier void* private; 185*01a344a2SDavid du Colombier Devsize size; 186*01a344a2SDavid du Colombier union { 187*01a344a2SDavid du Colombier struct { /* disk, (l)worm in j.j, sides */ 188*01a344a2SDavid du Colombier int ctrl; /* disks only */ 189*01a344a2SDavid du Colombier int targ; 190*01a344a2SDavid du Colombier int lun; /* not implemented in sd(3) */ 191*01a344a2SDavid du Colombier 192*01a344a2SDavid du Colombier int mapped; 193*01a344a2SDavid du Colombier char* file; /* ordinary file or dir instead */ 194*01a344a2SDavid du Colombier 195*01a344a2SDavid du Colombier int fd; 196*01a344a2SDavid du Colombier char* sddir; /* /dev/sdXX name, for juke drives */ 197*01a344a2SDavid du Colombier char* sddata; /* /dev/sdXX/data or other file */ 198*01a344a2SDavid du Colombier } wren; 199*01a344a2SDavid du Colombier struct { /* mcat mlev mirror */ 200*01a344a2SDavid du Colombier Device* first; 201*01a344a2SDavid du Colombier Device* last; 202*01a344a2SDavid du Colombier int ndev; 203*01a344a2SDavid du Colombier } cat; 204*01a344a2SDavid du Colombier struct { /* cw */ 205*01a344a2SDavid du Colombier Device* c; /* cache device */ 206*01a344a2SDavid du Colombier Device* w; /* worm device */ 207*01a344a2SDavid du Colombier Device* ro; /* dump - readonly */ 208*01a344a2SDavid du Colombier } cw; 209*01a344a2SDavid du Colombier struct { /* juke */ 210*01a344a2SDavid du Colombier Device* j; /* (robotics, worm drives) - wrens */ 211*01a344a2SDavid du Colombier Device* m; /* (sides) - r or l devices */ 212*01a344a2SDavid du Colombier } j; 213*01a344a2SDavid du Colombier struct { /* ro */ 214*01a344a2SDavid du Colombier Device* parent; 215*01a344a2SDavid du Colombier } ro; 216*01a344a2SDavid du Colombier struct { /* fworm */ 217*01a344a2SDavid du Colombier Device* fw; 218*01a344a2SDavid du Colombier } fw; 219*01a344a2SDavid du Colombier struct { /* part */ 220*01a344a2SDavid du Colombier Device* d; 221*01a344a2SDavid du Colombier long base; /* percentages */ 222*01a344a2SDavid du Colombier long size; 223*01a344a2SDavid du Colombier } part; 224*01a344a2SDavid du Colombier struct { /* byte-swapped */ 225*01a344a2SDavid du Colombier Device* d; 226*01a344a2SDavid du Colombier } swab; 227*01a344a2SDavid du Colombier }; 228*01a344a2SDavid du Colombier }; 229*01a344a2SDavid du Colombier 230*01a344a2SDavid du Colombier typedef struct Sidestarts { 231*01a344a2SDavid du Colombier Devsize sstart; /* blocks before start of side */ 232*01a344a2SDavid du Colombier Devsize s1start; /* blocks before start of next side */ 233*01a344a2SDavid du Colombier } Sidestarts; 234*01a344a2SDavid du Colombier 235*01a344a2SDavid du Colombier union Rabuf { 236*01a344a2SDavid du Colombier struct { 237*01a344a2SDavid du Colombier Device* dev; 238*01a344a2SDavid du Colombier Off addr; 239*01a344a2SDavid du Colombier }; 240*01a344a2SDavid du Colombier Rabuf* link; 241*01a344a2SDavid du Colombier }; 242*01a344a2SDavid du Colombier 243*01a344a2SDavid du Colombier struct Hiob 244*01a344a2SDavid du Colombier { 245*01a344a2SDavid du Colombier Iobuf* link; 246*01a344a2SDavid du Colombier Lock; 247*01a344a2SDavid du Colombier }; 248*01a344a2SDavid du Colombier 249*01a344a2SDavid du Colombier /* a 9P connection */ 250*01a344a2SDavid du Colombier struct Chan 251*01a344a2SDavid du Colombier { 252*01a344a2SDavid du Colombier char type; /* major driver type i.e. Dev* */ 253*01a344a2SDavid du Colombier int (*protocol)(Msgbuf*); /* version */ 254*01a344a2SDavid du Colombier int msize; /* version */ 255*01a344a2SDavid du Colombier char whochan[50]; 256*01a344a2SDavid du Colombier char whoname[NAMELEN]; 257*01a344a2SDavid du Colombier void (*whoprint)(Chan*); 258*01a344a2SDavid du Colombier ulong flags; 259*01a344a2SDavid du Colombier int chan; /* overall channel #, mostly for printing */ 260*01a344a2SDavid du Colombier int nmsgs; /* outstanding messages, set under flock -- for flush */ 261*01a344a2SDavid du Colombier 262*01a344a2SDavid du Colombier Timet whotime; 263*01a344a2SDavid du Colombier int nfile; /* used by cmd_files */ 264*01a344a2SDavid du Colombier 265*01a344a2SDavid du Colombier RWLock reflock; 266*01a344a2SDavid du Colombier Chan* next; /* link list of chans */ 267*01a344a2SDavid du Colombier Queue* send; 268*01a344a2SDavid du Colombier Queue* reply; 269*01a344a2SDavid du Colombier 270*01a344a2SDavid du Colombier uchar authinfo[64]; 271*01a344a2SDavid du Colombier 272*01a344a2SDavid du Colombier void* pdata; /* sometimes is a Netconn* */ 273*01a344a2SDavid du Colombier }; 274*01a344a2SDavid du Colombier 275*01a344a2SDavid du Colombier struct Filsys 276*01a344a2SDavid du Colombier { 277*01a344a2SDavid du Colombier char* name; /* name of filsys */ 278*01a344a2SDavid du Colombier char* conf; /* symbolic configuration */ 279*01a344a2SDavid du Colombier Device* dev; /* device that filsys is on */ 280*01a344a2SDavid du Colombier int flags; 281*01a344a2SDavid du Colombier #define FREAM (1<<0) /* mkfs */ 282*01a344a2SDavid du Colombier #define FRECOVER (1<<1) /* install last dump */ 283*01a344a2SDavid du Colombier #define FEDIT (1<<2) /* modified */ 284*01a344a2SDavid du Colombier }; 285*01a344a2SDavid du Colombier 286*01a344a2SDavid du Colombier struct Startsb 287*01a344a2SDavid du Colombier { 288*01a344a2SDavid du Colombier char* name; 289*01a344a2SDavid du Colombier Off startsb; 290*01a344a2SDavid du Colombier }; 291*01a344a2SDavid du Colombier 292*01a344a2SDavid du Colombier struct Time 293*01a344a2SDavid du Colombier { 294*01a344a2SDavid du Colombier Timet lasttoy; 295*01a344a2SDavid du Colombier Timet offset; 296*01a344a2SDavid du Colombier }; 297*01a344a2SDavid du Colombier 298*01a344a2SDavid du Colombier /* 299*01a344a2SDavid du Colombier * array of qids that are locked 300*01a344a2SDavid du Colombier */ 301*01a344a2SDavid du Colombier struct Tlock 302*01a344a2SDavid du Colombier { 303*01a344a2SDavid du Colombier Device* dev; 304*01a344a2SDavid du Colombier Timet time; 305*01a344a2SDavid du Colombier Off qpath; 306*01a344a2SDavid du Colombier File* file; 307*01a344a2SDavid du Colombier }; 308*01a344a2SDavid du Colombier 309*01a344a2SDavid du Colombier struct Cons 310*01a344a2SDavid du Colombier { 311*01a344a2SDavid du Colombier ulong flags; /* overall flags for all channels */ 312*01a344a2SDavid du Colombier QLock; /* generic qlock for mutex */ 313*01a344a2SDavid du Colombier int uid; /* botch -- used to get uid on cons_create */ 314*01a344a2SDavid du Colombier int gid; /* botch -- used to get gid on cons_create */ 315*01a344a2SDavid du Colombier int nuid; /* number of uids */ 316*01a344a2SDavid du Colombier int ngid; /* number of gids */ 317*01a344a2SDavid du Colombier Off offset; /* used to read files, c.f. fchar */ 318*01a344a2SDavid du Colombier int chano; /* generator for channel numbers */ 319*01a344a2SDavid du Colombier Chan* chan; /* console channel */ 320*01a344a2SDavid du Colombier Filsys* curfs; /* current filesystem */ 321*01a344a2SDavid du Colombier 322*01a344a2SDavid du Colombier int profile; /* are we profiling? */ 323*01a344a2SDavid du Colombier long* profbuf; 324*01a344a2SDavid du Colombier ulong minpc; 325*01a344a2SDavid du Colombier ulong maxpc; 326*01a344a2SDavid du Colombier ulong nprofbuf; 327*01a344a2SDavid du Colombier 328*01a344a2SDavid du Colombier long nlarge; /* number of large message buffers */ 329*01a344a2SDavid du Colombier long nsmall; /* ... small ... */ 330*01a344a2SDavid du Colombier long nwormre; /* worm read errors */ 331*01a344a2SDavid du Colombier long nwormwe; /* worm write errors */ 332*01a344a2SDavid du Colombier long nwormhit; /* worm read cache hits */ 333*01a344a2SDavid du Colombier long nwormmiss; /* worm read cache non-hits */ 334*01a344a2SDavid du Colombier int noage; /* dont update cache age, dump and check */ 335*01a344a2SDavid du Colombier long nwrenre; /* disk read errors */ 336*01a344a2SDavid du Colombier long nwrenwe; /* disk write errors */ 337*01a344a2SDavid du Colombier long nreseq; /* cache bucket resequence */ 338*01a344a2SDavid du Colombier 339*01a344a2SDavid du Colombier // Filter work[3]; /* thruput in messages */ 340*01a344a2SDavid du Colombier // Filter rate[3]; /* thruput in bytes */ 341*01a344a2SDavid du Colombier // Filter bhit[3]; /* getbufs that hit */ 342*01a344a2SDavid du Colombier // Filter bread[3]; /* getbufs that miss and read */ 343*01a344a2SDavid du Colombier // Filter brahead[3]; /* messages to readahead */ 344*01a344a2SDavid du Colombier // Filter binit[3]; /* getbufs that miss and dont read */ 345*01a344a2SDavid du Colombier }; 346*01a344a2SDavid du Colombier 347*01a344a2SDavid du Colombier struct File 348*01a344a2SDavid du Colombier { 349*01a344a2SDavid du Colombier QLock; 350*01a344a2SDavid du Colombier Qid qid; 351*01a344a2SDavid du Colombier Wpath* wpath; 352*01a344a2SDavid du Colombier Chan* cp; /* null means a free slot */ 353*01a344a2SDavid du Colombier Tlock* tlock; /* if file is locked */ 354*01a344a2SDavid du Colombier File* next; /* in cp->flist */ 355*01a344a2SDavid du Colombier Filsys* fs; 356*01a344a2SDavid du Colombier Off addr; 357*01a344a2SDavid du Colombier long slot; /* ordinal # of Dentry with a directory block */ 358*01a344a2SDavid du Colombier Off lastra; /* read ahead address */ 359*01a344a2SDavid du Colombier ulong fid; 360*01a344a2SDavid du Colombier Userid uid; 361*01a344a2SDavid du Colombier Auth *auth; 362*01a344a2SDavid du Colombier char open; 363*01a344a2SDavid du Colombier #define FREAD 1 364*01a344a2SDavid du Colombier #define FWRITE 2 365*01a344a2SDavid du Colombier #define FREMOV 4 366*01a344a2SDavid du Colombier 367*01a344a2SDavid du Colombier Off doffset; /* directory reading */ 368*01a344a2SDavid du Colombier ulong dvers; 369*01a344a2SDavid du Colombier long dslot; 370*01a344a2SDavid du Colombier }; 371*01a344a2SDavid du Colombier 372*01a344a2SDavid du Colombier struct Wpath 373*01a344a2SDavid du Colombier { 374*01a344a2SDavid du Colombier Wpath* up; /* pointer upwards in path */ 375*01a344a2SDavid du Colombier Off addr; /* directory entry addr */ 376*01a344a2SDavid du Colombier long slot; /* directory entry slot */ 377*01a344a2SDavid du Colombier short refs; /* number of files using this structure */ 378*01a344a2SDavid du Colombier }; 379*01a344a2SDavid du Colombier 380*01a344a2SDavid du Colombier struct Iobuf 381*01a344a2SDavid du Colombier { 382*01a344a2SDavid du Colombier QLock; 383*01a344a2SDavid du Colombier Device* dev; 384*01a344a2SDavid du Colombier Iobuf* fore; /* for lru */ 385*01a344a2SDavid du Colombier Iobuf* back; /* for lru */ 386*01a344a2SDavid du Colombier char* iobuf; /* only active while locked */ 387*01a344a2SDavid du Colombier char* xiobuf; /* "real" buffer pointer */ 388*01a344a2SDavid du Colombier Off addr; 389*01a344a2SDavid du Colombier int flags; 390*01a344a2SDavid du Colombier }; 391*01a344a2SDavid du Colombier 392*01a344a2SDavid du Colombier struct Uid 393*01a344a2SDavid du Colombier { 394*01a344a2SDavid du Colombier Userid uid; /* user id */ 395*01a344a2SDavid du Colombier Userid lead; /* leader of group */ 396*01a344a2SDavid du Colombier Userid *gtab; /* group table */ 397*01a344a2SDavid du Colombier int ngrp; /* number of group entries */ 398*01a344a2SDavid du Colombier char name[NAMELEN]; /* user name */ 399*01a344a2SDavid du Colombier }; 400*01a344a2SDavid du Colombier 401*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 402*01a344a2SDavid du Colombier struct Fbuf 403*01a344a2SDavid du Colombier { 404*01a344a2SDavid du Colombier Off nfree; 405*01a344a2SDavid du Colombier Off free[FEPERBUF]; 406*01a344a2SDavid du Colombier }; 407*01a344a2SDavid du Colombier 408*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 409*01a344a2SDavid du Colombier struct Superb 410*01a344a2SDavid du Colombier { 411*01a344a2SDavid du Colombier Fbuf fbuf; 412*01a344a2SDavid du Colombier Super1; 413*01a344a2SDavid du Colombier }; 414*01a344a2SDavid du Colombier 415*01a344a2SDavid du Colombier struct Conf 416*01a344a2SDavid du Colombier { 417*01a344a2SDavid du Colombier ulong nmach; /* processors */ 418*01a344a2SDavid du Colombier ulong mem; /* total physical bytes of memory */ 419*01a344a2SDavid du Colombier ulong nuid; /* distinct uids */ 420*01a344a2SDavid du Colombier ulong nserve; /* server processes */ 421*01a344a2SDavid du Colombier ulong nfile; /* number of fid -- system wide */ 422*01a344a2SDavid du Colombier ulong nwpath; /* number of active paths, derived from nfile */ 423*01a344a2SDavid du Colombier ulong gidspace; /* space for gid names -- derived from nuid */ 424*01a344a2SDavid du Colombier 425*01a344a2SDavid du Colombier ulong nlgmsg; /* number of large message buffers */ 426*01a344a2SDavid du Colombier ulong nsmmsg; /* number of small message buffers */ 427*01a344a2SDavid du Colombier 428*01a344a2SDavid du Colombier Off recovcw; /* recover addresses */ 429*01a344a2SDavid du Colombier Off recovro; 430*01a344a2SDavid du Colombier Off firstsb; 431*01a344a2SDavid du Colombier Off recovsb; 432*01a344a2SDavid du Colombier 433*01a344a2SDavid du Colombier ulong configfirst; /* configure before starting normal operation */ 434*01a344a2SDavid du Colombier char *confdev; 435*01a344a2SDavid du Colombier char *devmap; /* name of config->file device mapping file */ 436*01a344a2SDavid du Colombier 437*01a344a2SDavid du Colombier ulong nauth; /* number of Auth structs */ 438*01a344a2SDavid du Colombier uchar nodump; /* no periodic dumps */ 439*01a344a2SDavid du Colombier uchar dumpreread; /* read and compare in dump copy */ 440*01a344a2SDavid du Colombier }; 441*01a344a2SDavid du Colombier 442*01a344a2SDavid du Colombier enum { 443*01a344a2SDavid du Colombier Mbmagic = 0xb0ffe3, 444*01a344a2SDavid du Colombier }; 445*01a344a2SDavid du Colombier 446*01a344a2SDavid du Colombier /* 447*01a344a2SDavid du Colombier * message buffers 448*01a344a2SDavid du Colombier * 2 types, large and small 449*01a344a2SDavid du Colombier */ 450*01a344a2SDavid du Colombier struct Msgbuf 451*01a344a2SDavid du Colombier { 452*01a344a2SDavid du Colombier ulong magic; 453*01a344a2SDavid du Colombier short count; 454*01a344a2SDavid du Colombier short flags; 455*01a344a2SDavid du Colombier #define LARGE (1<<0) 456*01a344a2SDavid du Colombier #define FREE (1<<1) 457*01a344a2SDavid du Colombier #define BFREE (1<<2) 458*01a344a2SDavid du Colombier #define BTRACE (1<<7) 459*01a344a2SDavid du Colombier Chan* chan; /* file server conn within a net. conn */ 460*01a344a2SDavid du Colombier Msgbuf* next; 461*01a344a2SDavid du Colombier uintptr param; /* misc. use; keep Conn* here */ 462*01a344a2SDavid du Colombier 463*01a344a2SDavid du Colombier int category; 464*01a344a2SDavid du Colombier uchar* data; /* rp or wp: current processing point */ 465*01a344a2SDavid du Colombier uchar* xdata; /* base of allocation */ 466*01a344a2SDavid du Colombier }; 467*01a344a2SDavid du Colombier 468*01a344a2SDavid du Colombier /* 469*01a344a2SDavid du Colombier * message buffer categories 470*01a344a2SDavid du Colombier */ 471*01a344a2SDavid du Colombier enum 472*01a344a2SDavid du Colombier { 473*01a344a2SDavid du Colombier Mxxx = 0, 474*01a344a2SDavid du Colombier Mbeth1, 475*01a344a2SDavid du Colombier Mbreply1, 476*01a344a2SDavid du Colombier Mbreply2, 477*01a344a2SDavid du Colombier Mbreply3, 478*01a344a2SDavid du Colombier Mbreply4, 479*01a344a2SDavid du Colombier MAXCAT, 480*01a344a2SDavid du Colombier }; 481*01a344a2SDavid du Colombier 482*01a344a2SDavid du Colombier enum { PRINTSIZE = 256 }; 483*01a344a2SDavid du Colombier 484*01a344a2SDavid du Colombier struct 485*01a344a2SDavid du Colombier { 486*01a344a2SDavid du Colombier Lock; 487*01a344a2SDavid du Colombier int machs; 488*01a344a2SDavid du Colombier int exiting; 489*01a344a2SDavid du Colombier } active; 490*01a344a2SDavid du Colombier 491*01a344a2SDavid du Colombier struct Command 492*01a344a2SDavid du Colombier { 493*01a344a2SDavid du Colombier char* arg0; 494*01a344a2SDavid du Colombier char* help; 495*01a344a2SDavid du Colombier void (*func)(int, char*[]); 496*01a344a2SDavid du Colombier }; 497*01a344a2SDavid du Colombier 498*01a344a2SDavid du Colombier struct Flag 499*01a344a2SDavid du Colombier { 500*01a344a2SDavid du Colombier char* arg0; 501*01a344a2SDavid du Colombier char* help; 502*01a344a2SDavid du Colombier ulong flag; 503*01a344a2SDavid du Colombier }; 504*01a344a2SDavid du Colombier 505*01a344a2SDavid du Colombier struct Rtc 506*01a344a2SDavid du Colombier { 507*01a344a2SDavid du Colombier int sec; 508*01a344a2SDavid du Colombier int min; 509*01a344a2SDavid du Colombier int hour; 510*01a344a2SDavid du Colombier int mday; 511*01a344a2SDavid du Colombier int mon; 512*01a344a2SDavid du Colombier int year; 513*01a344a2SDavid du Colombier }; 514*01a344a2SDavid du Colombier 515*01a344a2SDavid du Colombier typedef struct 516*01a344a2SDavid du Colombier { 517*01a344a2SDavid du Colombier /* constants during a given truncation */ 518*01a344a2SDavid du Colombier Dentry *d; 519*01a344a2SDavid du Colombier Iobuf *p; /* the block containing *d */ 520*01a344a2SDavid du Colombier int uid; 521*01a344a2SDavid du Colombier Off newsize; 522*01a344a2SDavid du Colombier Off lastblk; /* last data block of file to keep */ 523*01a344a2SDavid du Colombier 524*01a344a2SDavid du Colombier /* variables */ 525*01a344a2SDavid du Colombier Off relblk; /* # of current data blk within file */ 526*01a344a2SDavid du Colombier int pastlast; /* have we walked past lastblk? */ 527*01a344a2SDavid du Colombier int err; 528*01a344a2SDavid du Colombier } Truncstate; 529*01a344a2SDavid du Colombier 530*01a344a2SDavid du Colombier /* 531*01a344a2SDavid du Colombier * cw device 532*01a344a2SDavid du Colombier */ 533*01a344a2SDavid du Colombier 534*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 535*01a344a2SDavid du Colombier struct Cache 536*01a344a2SDavid du Colombier { 537*01a344a2SDavid du Colombier Off maddr; /* cache map addr */ 538*01a344a2SDavid du Colombier Off msize; /* cache map size in buckets */ 539*01a344a2SDavid du Colombier Off caddr; /* cache addr */ 540*01a344a2SDavid du Colombier Off csize; /* cache size */ 541*01a344a2SDavid du Colombier Off fsize; /* current size of worm */ 542*01a344a2SDavid du Colombier Off wsize; /* max size of the worm */ 543*01a344a2SDavid du Colombier Off wmax; /* highwater write */ 544*01a344a2SDavid du Colombier 545*01a344a2SDavid du Colombier Off sbaddr; /* super block addr */ 546*01a344a2SDavid du Colombier Off cwraddr; /* cw root addr */ 547*01a344a2SDavid du Colombier Off roraddr; /* dump root addr */ 548*01a344a2SDavid du Colombier 549*01a344a2SDavid du Colombier Timet toytime; /* somewhere convienent */ 550*01a344a2SDavid du Colombier Timet time; 551*01a344a2SDavid du Colombier }; 552*01a344a2SDavid du Colombier 553*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 554*01a344a2SDavid du Colombier struct Bucket 555*01a344a2SDavid du Colombier { 556*01a344a2SDavid du Colombier long agegen; /* generator for ages in this bkt */ 557*01a344a2SDavid du Colombier Centry entry[CEPERBK]; 558*01a344a2SDavid du Colombier }; 559*01a344a2SDavid du Colombier 560*01a344a2SDavid du Colombier /* DONT TOUCH, this is in disk structures */ 561*01a344a2SDavid du Colombier enum { Labmagic = 0xfeedfacedeadbeefULL, }; 562*01a344a2SDavid du Colombier 563*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 564*01a344a2SDavid du Colombier typedef struct Label Label; 565*01a344a2SDavid du Colombier struct Label /* label block on Devlworms, in last block */ 566*01a344a2SDavid du Colombier { 567*01a344a2SDavid du Colombier uvlong magic; 568*01a344a2SDavid du Colombier ushort ord; /* side number within Juke */ 569*01a344a2SDavid du Colombier char service[64]; /* documentation only */ 570*01a344a2SDavid du Colombier }; 571*01a344a2SDavid du Colombier 572*01a344a2SDavid du Colombier typedef struct Map Map; 573*01a344a2SDavid du Colombier struct Map { 574*01a344a2SDavid du Colombier char *from; 575*01a344a2SDavid du Colombier Device *fdev; 576*01a344a2SDavid du Colombier char *to; 577*01a344a2SDavid du Colombier Device *tdev; 578*01a344a2SDavid du Colombier Map *next; 579*01a344a2SDavid du Colombier }; 580*01a344a2SDavid du Colombier 581*01a344a2SDavid du Colombier /* 582*01a344a2SDavid du Colombier * scsi i/o 583*01a344a2SDavid du Colombier */ 584*01a344a2SDavid du Colombier enum 585*01a344a2SDavid du Colombier { 586*01a344a2SDavid du Colombier SCSIread = 0, 587*01a344a2SDavid du Colombier SCSIwrite = 1, 588*01a344a2SDavid du Colombier }; 589*01a344a2SDavid du Colombier 590*01a344a2SDavid du Colombier /* 591*01a344a2SDavid du Colombier * Process states 592*01a344a2SDavid du Colombier */ 593*01a344a2SDavid du Colombier enum 594*01a344a2SDavid du Colombier { 595*01a344a2SDavid du Colombier Dead = 0, 596*01a344a2SDavid du Colombier Moribund, 597*01a344a2SDavid du Colombier Zombie, 598*01a344a2SDavid du Colombier Ready, 599*01a344a2SDavid du Colombier Scheding, 600*01a344a2SDavid du Colombier Running, 601*01a344a2SDavid du Colombier Queueing, 602*01a344a2SDavid du Colombier Sending, 603*01a344a2SDavid du Colombier Recving, 604*01a344a2SDavid du Colombier MMUing, 605*01a344a2SDavid du Colombier Exiting, 606*01a344a2SDavid du Colombier Inwait, 607*01a344a2SDavid du Colombier Wakeme, 608*01a344a2SDavid du Colombier Broken, 609*01a344a2SDavid du Colombier }; 610*01a344a2SDavid du Colombier 611*01a344a2SDavid du Colombier /* 612*01a344a2SDavid du Colombier * devnone block numbers 613*01a344a2SDavid du Colombier */ 614*01a344a2SDavid du Colombier enum 615*01a344a2SDavid du Colombier { 616*01a344a2SDavid du Colombier Cwio1 = 1, 617*01a344a2SDavid du Colombier Cwio2, 618*01a344a2SDavid du Colombier Cwxx1, 619*01a344a2SDavid du Colombier Cwxx2, 620*01a344a2SDavid du Colombier Cwxx3, 621*01a344a2SDavid du Colombier Cwxx4, 622*01a344a2SDavid du Colombier Cwdump1, 623*01a344a2SDavid du Colombier Cwdump2, 624*01a344a2SDavid du Colombier Cuidbuf, 625*01a344a2SDavid du Colombier Cckbuf, 626*01a344a2SDavid du Colombier }; 627*01a344a2SDavid du Colombier 628*01a344a2SDavid du Colombier /* 629*01a344a2SDavid du Colombier * error codes generated from the file server 630*01a344a2SDavid du Colombier */ 631*01a344a2SDavid du Colombier enum 632*01a344a2SDavid du Colombier { 633*01a344a2SDavid du Colombier Ebadspc = 1, 634*01a344a2SDavid du Colombier Efid, 635*01a344a2SDavid du Colombier Echar, 636*01a344a2SDavid du Colombier Eopen, 637*01a344a2SDavid du Colombier Ecount, 638*01a344a2SDavid du Colombier Ealloc, 639*01a344a2SDavid du Colombier Eqid, 640*01a344a2SDavid du Colombier Eaccess, 641*01a344a2SDavid du Colombier Eentry, 642*01a344a2SDavid du Colombier Emode, 643*01a344a2SDavid du Colombier Edir1, 644*01a344a2SDavid du Colombier Edir2, 645*01a344a2SDavid du Colombier Ephase, 646*01a344a2SDavid du Colombier Eexist, 647*01a344a2SDavid du Colombier Edot, 648*01a344a2SDavid du Colombier Eempty, 649*01a344a2SDavid du Colombier Ebadu, 650*01a344a2SDavid du Colombier Enoattach, 651*01a344a2SDavid du Colombier Ewstatb, 652*01a344a2SDavid du Colombier Ewstatd, 653*01a344a2SDavid du Colombier Ewstatg, 654*01a344a2SDavid du Colombier Ewstatl, 655*01a344a2SDavid du Colombier Ewstatm, 656*01a344a2SDavid du Colombier Ewstato, 657*01a344a2SDavid du Colombier Ewstatp, 658*01a344a2SDavid du Colombier Ewstatq, 659*01a344a2SDavid du Colombier Ewstatu, 660*01a344a2SDavid du Colombier Ewstatv, 661*01a344a2SDavid du Colombier Ename, 662*01a344a2SDavid du Colombier Ewalk, 663*01a344a2SDavid du Colombier Eronly, 664*01a344a2SDavid du Colombier Efull, 665*01a344a2SDavid du Colombier Eoffset, 666*01a344a2SDavid du Colombier Elocked, 667*01a344a2SDavid du Colombier Ebroken, 668*01a344a2SDavid du Colombier Eauth, 669*01a344a2SDavid du Colombier Eauth2, 670*01a344a2SDavid du Colombier Efidinuse, 671*01a344a2SDavid du Colombier Etoolong, 672*01a344a2SDavid du Colombier Econvert, 673*01a344a2SDavid du Colombier Eversion, 674*01a344a2SDavid du Colombier Eauthdisabled, 675*01a344a2SDavid du Colombier Eauthnone, 676*01a344a2SDavid du Colombier Eauthfile, 677*01a344a2SDavid du Colombier Eedge, 678*01a344a2SDavid du Colombier MAXERR 679*01a344a2SDavid du Colombier }; 680*01a344a2SDavid du Colombier 681*01a344a2SDavid du Colombier /* 682*01a344a2SDavid du Colombier * device types 683*01a344a2SDavid du Colombier */ 684*01a344a2SDavid du Colombier enum 685*01a344a2SDavid du Colombier { 686*01a344a2SDavid du Colombier Devnone = 0, 687*01a344a2SDavid du Colombier Devcon, /* console */ 688*01a344a2SDavid du Colombier Devwren, /* disk drive */ 689*01a344a2SDavid du Colombier Devworm, /* scsi optical drive */ 690*01a344a2SDavid du Colombier Devlworm, /* scsi optical drive (labeled) */ 691*01a344a2SDavid du Colombier Devfworm, /* fake read-only device */ 692*01a344a2SDavid du Colombier Devjuke, /* scsi jukebox */ 693*01a344a2SDavid du Colombier Devcw, /* cache with worm */ 694*01a344a2SDavid du Colombier Devro, /* readonly worm */ 695*01a344a2SDavid du Colombier Devmcat, /* multiple cat devices */ 696*01a344a2SDavid du Colombier Devmlev, /* multiple interleave devices */ 697*01a344a2SDavid du Colombier Devnet, /* network connection */ 698*01a344a2SDavid du Colombier Devpart, /* partition */ 699*01a344a2SDavid du Colombier Devfloppy, /* floppy drive */ 700*01a344a2SDavid du Colombier Devswab, /* swab data between mem and device */ 701*01a344a2SDavid du Colombier Devmirr, /* mirror devices */ 702*01a344a2SDavid du Colombier MAXDEV 703*01a344a2SDavid du Colombier }; 704*01a344a2SDavid du Colombier 705*01a344a2SDavid du Colombier /* 706*01a344a2SDavid du Colombier * tags on block 707*01a344a2SDavid du Colombier */ 708*01a344a2SDavid du Colombier /* DONT TOUCH, this is in disk structures */ 709*01a344a2SDavid du Colombier /* also, the order from Tdir to Tmaxind is exploited in indirck() & isdirty() */ 710*01a344a2SDavid du Colombier enum 711*01a344a2SDavid du Colombier { 712*01a344a2SDavid du Colombier Tnone = 0, 713*01a344a2SDavid du Colombier Tsuper, /* the super block */ 714*01a344a2SDavid du Colombier #ifdef COMPAT32 715*01a344a2SDavid du Colombier Tdir, /* directory contents */ 716*01a344a2SDavid du Colombier Tind1, /* points to blocks */ 717*01a344a2SDavid du Colombier Tind2, /* points to Tind1 */ 718*01a344a2SDavid du Colombier #else 719*01a344a2SDavid du Colombier Tdirold, 720*01a344a2SDavid du Colombier Tind1old, 721*01a344a2SDavid du Colombier Tind2old, 722*01a344a2SDavid du Colombier #endif 723*01a344a2SDavid du Colombier Tfile, /* file contents; also defined in disk.h */ 724*01a344a2SDavid du Colombier Tfree, /* in free list */ 725*01a344a2SDavid du Colombier Tbuck, /* cache fs bucket */ 726*01a344a2SDavid du Colombier Tvirgo, /* fake worm virgin bits */ 727*01a344a2SDavid du Colombier Tcache, /* cw cache things */ 728*01a344a2SDavid du Colombier Tconfig, /* configuration block */ 729*01a344a2SDavid du Colombier #ifndef COMPAT32 730*01a344a2SDavid du Colombier /* Tdir & indirect blocks are last, to allow for greater depth */ 731*01a344a2SDavid du Colombier Tdir, /* directory contents */ 732*01a344a2SDavid du Colombier Tind1, /* points to blocks */ 733*01a344a2SDavid du Colombier Tind2, /* points to Tind1 */ 734*01a344a2SDavid du Colombier Tind3, /* points to Tind2 */ 735*01a344a2SDavid du Colombier Tind4, /* points to Tind3 */ 736*01a344a2SDavid du Colombier Maxtind, 737*01a344a2SDavid du Colombier #endif 738*01a344a2SDavid du Colombier /* gap for more indirect block depth in future */ 739*01a344a2SDavid du Colombier Tlabel = 32, /* Devlworm label in last block */ 740*01a344a2SDavid du Colombier MAXTAG, 741*01a344a2SDavid du Colombier 742*01a344a2SDavid du Colombier #ifdef COMPAT32 743*01a344a2SDavid du Colombier Tmaxind = Tind2, 744*01a344a2SDavid du Colombier #else 745*01a344a2SDavid du Colombier Tmaxind = Maxtind - 1, 746*01a344a2SDavid du Colombier #endif 747*01a344a2SDavid du Colombier }; 748*01a344a2SDavid du Colombier 749*01a344a2SDavid du Colombier /* 750*01a344a2SDavid du Colombier * flags to getbuf 751*01a344a2SDavid du Colombier */ 752*01a344a2SDavid du Colombier enum 753*01a344a2SDavid du Colombier { 754*01a344a2SDavid du Colombier Brd = (1<<0), /* read the block if miss */ 755*01a344a2SDavid du Colombier Bprobe = (1<<1), /* return null if miss */ 756*01a344a2SDavid du Colombier Bmod = (1<<2), /* buffer is dirty, needs writing */ 757*01a344a2SDavid du Colombier Bimm = (1<<3), /* write immediately on putbuf */ 758*01a344a2SDavid du Colombier Bres = (1<<4), /* reserved, never renamed */ 759*01a344a2SDavid du Colombier }; 760*01a344a2SDavid du Colombier 761*01a344a2SDavid du Colombier Conf conf; 762*01a344a2SDavid du Colombier Cons cons; 763*01a344a2SDavid du Colombier 764*01a344a2SDavid du Colombier #pragma varargck type "Z" Device* 765*01a344a2SDavid du Colombier #pragma varargck type "T" Timet 766*01a344a2SDavid du Colombier #pragma varargck type "I" uchar* 767*01a344a2SDavid du Colombier #pragma varargck type "E" uchar* 768*01a344a2SDavid du Colombier #pragma varargck type "G" int 769*01a344a2SDavid du Colombier 770*01a344a2SDavid du Colombier extern char *annstrs[]; 771*01a344a2SDavid du Colombier extern Biobuf bin; 772*01a344a2SDavid du Colombier extern Map *devmap; 773*01a344a2SDavid du Colombier extern int (*fsprotocol[])(Msgbuf*); 774