13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * fundamental constants 33e12c5d1SDavid du Colombier */ 4*9a747e4fSDavid du Colombier #define NAMELEN 28 /* size of names */ 53e12c5d1SDavid du Colombier #define NDBLOCK 6 /* number of direct blocks in Dentry */ 63e12c5d1SDavid du Colombier #define MAXDAT 8192 /* max allowable data message */ 73e12c5d1SDavid du Colombier #define NTLOCK 200 /* number of active file Tlocks */ 83e12c5d1SDavid du Colombier 93e12c5d1SDavid du Colombier typedef struct Fbuf Fbuf; 103e12c5d1SDavid du Colombier typedef struct Super1 Super1; 113e12c5d1SDavid du Colombier typedef struct Superb Superb; 127dd7cddfSDavid du Colombier // typedef struct Qid Qid; 133e12c5d1SDavid du Colombier typedef struct Dentry Dentry; 143e12c5d1SDavid du Colombier typedef struct Tag Tag; 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier typedef struct Device Device; 17*9a747e4fSDavid du Colombier typedef struct Qid9p1 Qid9p1; 183e12c5d1SDavid du Colombier typedef struct File File; 193e12c5d1SDavid du Colombier typedef struct Filsys Filsys; 203e12c5d1SDavid du Colombier typedef struct Filta Filta; 213e12c5d1SDavid du Colombier typedef struct Filter Filter; 223e12c5d1SDavid du Colombier typedef ulong Float; 233e12c5d1SDavid du Colombier typedef struct Hiob Hiob; 243e12c5d1SDavid du Colombier typedef struct Iobuf Iobuf; 253e12c5d1SDavid du Colombier typedef struct P9call P9call; 263e12c5d1SDavid du Colombier typedef struct Tlock Tlock; 277dd7cddfSDavid du Colombier // typedef struct Tm Tm; 283e12c5d1SDavid du Colombier typedef struct Uid Uid; 293e12c5d1SDavid du Colombier typedef struct Wpath Wpath; 303e12c5d1SDavid du Colombier 313e12c5d1SDavid du Colombier /* 323e12c5d1SDavid du Colombier * DONT TOUCH -- data structures stored on disk 333e12c5d1SDavid du Colombier */ 34*9a747e4fSDavid du Colombier /* DONT TOUCH, this is the disk structure */ 35*9a747e4fSDavid du Colombier struct Qid9p1 36*9a747e4fSDavid du Colombier { 37*9a747e4fSDavid du Colombier long path; 38*9a747e4fSDavid du Colombier long version; 39*9a747e4fSDavid du Colombier }; 403e12c5d1SDavid du Colombier 413e12c5d1SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 423e12c5d1SDavid du Colombier struct Dentry 433e12c5d1SDavid du Colombier { 443e12c5d1SDavid du Colombier char name[NAMELEN]; 453e12c5d1SDavid du Colombier short uid; 463e12c5d1SDavid du Colombier short gid; 473e12c5d1SDavid du Colombier ushort mode; 483e12c5d1SDavid du Colombier #define DALLOC 0x8000 493e12c5d1SDavid du Colombier #define DDIR 0x4000 503e12c5d1SDavid du Colombier #define DAPND 0x2000 513e12c5d1SDavid du Colombier #define DLOCK 0x1000 523e12c5d1SDavid du Colombier #define DREAD 0x4 533e12c5d1SDavid du Colombier #define DWRITE 0x2 543e12c5d1SDavid du Colombier #define DEXEC 0x1 55*9a747e4fSDavid du Colombier Qid9p1 qid; 563e12c5d1SDavid du Colombier long size; 573e12c5d1SDavid du Colombier long dblock[NDBLOCK]; 583e12c5d1SDavid du Colombier long iblock; 593e12c5d1SDavid du Colombier long diblock; 603e12c5d1SDavid du Colombier long atime; 613e12c5d1SDavid du Colombier long mtime; 623e12c5d1SDavid du Colombier }; 633e12c5d1SDavid du Colombier 643e12c5d1SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 653e12c5d1SDavid du Colombier struct Tag 663e12c5d1SDavid du Colombier { 673e12c5d1SDavid du Colombier short pad; 683e12c5d1SDavid du Colombier short tag; 693e12c5d1SDavid du Colombier long path; 703e12c5d1SDavid du Colombier }; 713e12c5d1SDavid du Colombier 723e12c5d1SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 733e12c5d1SDavid du Colombier struct Super1 743e12c5d1SDavid du Colombier { 753e12c5d1SDavid du Colombier long fstart; 763e12c5d1SDavid du Colombier long fsize; 773e12c5d1SDavid du Colombier long tfree; 783e12c5d1SDavid du Colombier long qidgen; /* generator for unique ids */ 79219b2ee8SDavid du Colombier 80219b2ee8SDavid du Colombier long fsok; /* file system ok */ 81219b2ee8SDavid du Colombier 823e12c5d1SDavid du Colombier /* 83219b2ee8SDavid du Colombier * garbage for WWC device 843e12c5d1SDavid du Colombier */ 853e12c5d1SDavid du Colombier long roraddr; /* dump root addr */ 863e12c5d1SDavid du Colombier long last; /* last super block addr */ 873e12c5d1SDavid du Colombier long next; /* next super block addr */ 883e12c5d1SDavid du Colombier }; 893e12c5d1SDavid du Colombier 903e12c5d1SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 913e12c5d1SDavid du Colombier struct Fbuf 923e12c5d1SDavid du Colombier { 933e12c5d1SDavid du Colombier long nfree; 943e12c5d1SDavid du Colombier long free[1]; /* changes based on BUFSIZE */ 953e12c5d1SDavid du Colombier }; 963e12c5d1SDavid du Colombier 973e12c5d1SDavid du Colombier /* DONT TOUCH, this is the disk structure */ 983e12c5d1SDavid du Colombier struct Superb 993e12c5d1SDavid du Colombier { 1003e12c5d1SDavid du Colombier Super1; 1013e12c5d1SDavid du Colombier Fbuf fbuf; 1023e12c5d1SDavid du Colombier }; 1033e12c5d1SDavid du Colombier 1043e12c5d1SDavid du Colombier struct Device 1053e12c5d1SDavid du Colombier { 1063e12c5d1SDavid du Colombier char type; 1073e12c5d1SDavid du Colombier char ctrl; 1083e12c5d1SDavid du Colombier char unit; 1093e12c5d1SDavid du Colombier char part; 1103e12c5d1SDavid du Colombier }; 1113e12c5d1SDavid du Colombier 1123e12c5d1SDavid du Colombier /* 1133e12c5d1SDavid du Colombier * for load stats 1143e12c5d1SDavid du Colombier */ 1153e12c5d1SDavid du Colombier struct Filter 1163e12c5d1SDavid du Colombier { 1173e12c5d1SDavid du Colombier ulong count; /* count and old count kept separate */ 1183e12c5d1SDavid du Colombier ulong oldcount; /* so interrput can read them */ 1193e12c5d1SDavid du Colombier Float filter[3]; /* filters for 1m 10m 100m */ 1203e12c5d1SDavid du Colombier }; 1213e12c5d1SDavid du Colombier 1223e12c5d1SDavid du Colombier struct Filta 1233e12c5d1SDavid du Colombier { 1243e12c5d1SDavid du Colombier Filter* f; 1253e12c5d1SDavid du Colombier int scale; 1263e12c5d1SDavid du Colombier }; 1273e12c5d1SDavid du Colombier 1283e12c5d1SDavid du Colombier /* 1293e12c5d1SDavid du Colombier * array of qids that are locked 1303e12c5d1SDavid du Colombier */ 1313e12c5d1SDavid du Colombier struct Tlock 1323e12c5d1SDavid du Colombier { 1333e12c5d1SDavid du Colombier Device dev; 1343e12c5d1SDavid du Colombier long time; 1353e12c5d1SDavid du Colombier long qpath; 1363e12c5d1SDavid du Colombier File* file; 1373e12c5d1SDavid du Colombier }; 1383e12c5d1SDavid du Colombier 1393e12c5d1SDavid du Colombier struct File 1403e12c5d1SDavid du Colombier { 1413e12c5d1SDavid du Colombier QLock; 1423e12c5d1SDavid du Colombier Qid qid; 1433e12c5d1SDavid du Colombier Wpath* wpath; 1443e12c5d1SDavid du Colombier Chan* cp; /* null means a free slot */ 1453e12c5d1SDavid du Colombier Tlock* tlock; /* if file is locked */ 1463e12c5d1SDavid du Colombier File* next; /* in cp->flist */ 1477dd7cddfSDavid du Colombier File* list; /* in list of free files */ 1483e12c5d1SDavid du Colombier Filsys* fs; 1493e12c5d1SDavid du Colombier long addr; 1503e12c5d1SDavid du Colombier long slot; 1513e12c5d1SDavid du Colombier long lastra; /* read ahead address */ 1523e12c5d1SDavid du Colombier short fid; 1533e12c5d1SDavid du Colombier short uid; 1543e12c5d1SDavid du Colombier char open; 1553e12c5d1SDavid du Colombier #define FREAD 1 1563e12c5d1SDavid du Colombier #define FWRITE 2 1573e12c5d1SDavid du Colombier #define FREMOV 4 158*9a747e4fSDavid du Colombier long doffset; /* directory reading */ 159*9a747e4fSDavid du Colombier ulong dvers; 160*9a747e4fSDavid du Colombier long dslot; 161*9a747e4fSDavid du Colombier 162*9a747e4fSDavid du Colombier /* for network authentication */ 163*9a747e4fSDavid du Colombier int ffd; 164*9a747e4fSDavid du Colombier int authokay; 165*9a747e4fSDavid du Colombier 1663e12c5d1SDavid du Colombier }; 1673e12c5d1SDavid du Colombier 1683e12c5d1SDavid du Colombier struct Filsys 1693e12c5d1SDavid du Colombier { 1707dd7cddfSDavid du Colombier char* name; /* name of filesys */ 1717dd7cddfSDavid du Colombier Device dev; /* device that filesys is on */ 1723e12c5d1SDavid du Colombier int flags; 1733e12c5d1SDavid du Colombier #define FREAM (1<<1) /* mkfs */ 1743e12c5d1SDavid du Colombier #define FRECOVER (1<<2) /* install last dump */ 1753e12c5d1SDavid du Colombier }; 1763e12c5d1SDavid du Colombier 1773e12c5d1SDavid du Colombier struct Hiob 1783e12c5d1SDavid du Colombier { 1793e12c5d1SDavid du Colombier Iobuf* link; 1803e12c5d1SDavid du Colombier Lock; 1813e12c5d1SDavid du Colombier }; 1823e12c5d1SDavid du Colombier 1833e12c5d1SDavid du Colombier struct Iobuf 1843e12c5d1SDavid du Colombier { 1853e12c5d1SDavid du Colombier QLock; 1863e12c5d1SDavid du Colombier Device dev; 1873e12c5d1SDavid du Colombier Iobuf *next; /* for hash */ 1883e12c5d1SDavid du Colombier Iobuf *fore; /* for lru */ 1893e12c5d1SDavid du Colombier Iobuf *back; /* for lru */ 1903e12c5d1SDavid du Colombier char *iobuf; /* only active while locked */ 1913e12c5d1SDavid du Colombier char *xiobuf; /* "real" buffer pointer */ 1923e12c5d1SDavid du Colombier long addr; 1933e12c5d1SDavid du Colombier int flags; 1943e12c5d1SDavid du Colombier }; 1953e12c5d1SDavid du Colombier 1963e12c5d1SDavid du Colombier struct P9call 1973e12c5d1SDavid du Colombier { 1983e12c5d1SDavid du Colombier uchar calln; 1993e12c5d1SDavid du Colombier uchar rxflag; 2003e12c5d1SDavid du Colombier short msize; 2013e12c5d1SDavid du Colombier void (*func)(Chan*, int); 2023e12c5d1SDavid du Colombier }; 2033e12c5d1SDavid du Colombier 2047dd7cddfSDavid du Colombier // struct Tm 2057dd7cddfSDavid du Colombier // { 2067dd7cddfSDavid du Colombier // /* see ctime(3) */ 2077dd7cddfSDavid du Colombier // int sec; 2087dd7cddfSDavid du Colombier // int min; 2097dd7cddfSDavid du Colombier // int hour; 2107dd7cddfSDavid du Colombier // int mday; 2117dd7cddfSDavid du Colombier // int mon; 2127dd7cddfSDavid du Colombier // int year; 2137dd7cddfSDavid du Colombier // int wday; 2147dd7cddfSDavid du Colombier // int yday; 2157dd7cddfSDavid du Colombier // int isdst; 2167dd7cddfSDavid du Colombier // }; 2173e12c5d1SDavid du Colombier 2183e12c5d1SDavid du Colombier struct Uid 2193e12c5d1SDavid du Colombier { 2203e12c5d1SDavid du Colombier short uid; /* user id */ 2213e12c5d1SDavid du Colombier short lead; /* leader of group */ 2223e12c5d1SDavid du Colombier short offset; /* byte offset in uidspace */ 2233e12c5d1SDavid du Colombier }; 2243e12c5d1SDavid du Colombier 2253e12c5d1SDavid du Colombier struct Wpath 2263e12c5d1SDavid du Colombier { 2273e12c5d1SDavid du Colombier Wpath *up; /* pointer upwards in path */ 2287dd7cddfSDavid du Colombier Wpath *list; /* link in free chain */ 229*9a747e4fSDavid du Colombier long addr; /* directory entry addr of parent */ 230*9a747e4fSDavid du Colombier long slot; /* directory entry slot of parent */ 231*9a747e4fSDavid du Colombier long faddr; /* directory entry addr */ 232*9a747e4fSDavid du Colombier long fslot; /* directory entry slot */ 233*9a747e4fSDavid du Colombier Qid qid; /* qid of current */ 2343e12c5d1SDavid du Colombier short refs; /* number of files using this structure */ 2353e12c5d1SDavid du Colombier }; 2363e12c5d1SDavid du Colombier 2373e12c5d1SDavid du Colombier #define MAXFDATA 8192 2383e12c5d1SDavid du Colombier 2393e12c5d1SDavid du Colombier /* 2403e12c5d1SDavid du Colombier * error codes generated from the file server 2413e12c5d1SDavid du Colombier */ 2423e12c5d1SDavid du Colombier enum 2433e12c5d1SDavid du Colombier { 2443e12c5d1SDavid du Colombier Ebadspc = 1, 2453e12c5d1SDavid du Colombier Efid, 246*9a747e4fSDavid du Colombier Efidinuse, 2473e12c5d1SDavid du Colombier Echar, 2483e12c5d1SDavid du Colombier Eopen, 2493e12c5d1SDavid du Colombier Ecount, 2503e12c5d1SDavid du Colombier Ealloc, 2513e12c5d1SDavid du Colombier Eqid, 2523e12c5d1SDavid du Colombier Eauth, 253*9a747e4fSDavid du Colombier Eauthmsg, 2543e12c5d1SDavid du Colombier Eaccess, 2553e12c5d1SDavid du Colombier Eentry, 2563e12c5d1SDavid du Colombier Emode, 2573e12c5d1SDavid du Colombier Edir1, 2583e12c5d1SDavid du Colombier Edir2, 2593e12c5d1SDavid du Colombier Ephase, 2603e12c5d1SDavid du Colombier Eexist, 2613e12c5d1SDavid du Colombier Edot, 2623e12c5d1SDavid du Colombier Eempty, 2633e12c5d1SDavid du Colombier Ebadu, 2643e12c5d1SDavid du Colombier Enotu, 2653e12c5d1SDavid du Colombier Enotg, 2663e12c5d1SDavid du Colombier Ename, 2673e12c5d1SDavid du Colombier Ewalk, 2683e12c5d1SDavid du Colombier Eronly, 2693e12c5d1SDavid du Colombier Efull, 2703e12c5d1SDavid du Colombier Eoffset, 2713e12c5d1SDavid du Colombier Elocked, 2723e12c5d1SDavid du Colombier Ebroken, 273*9a747e4fSDavid du Colombier Etoolong, 274*9a747e4fSDavid du Colombier Ersc, 275*9a747e4fSDavid du Colombier Eqidmode, 276*9a747e4fSDavid du Colombier Econvert, 277*9a747e4fSDavid du Colombier Enotm, 278*9a747e4fSDavid du Colombier Enotd, 279*9a747e4fSDavid du Colombier Enotl, 280*9a747e4fSDavid du Colombier Enotw, 281*9a747e4fSDavid du Colombier Esystem, 2823e12c5d1SDavid du Colombier 2833e12c5d1SDavid du Colombier MAXERR 2843e12c5d1SDavid du Colombier }; 2853e12c5d1SDavid du Colombier 2863e12c5d1SDavid du Colombier /* 2873e12c5d1SDavid du Colombier * devnone block numbers 2883e12c5d1SDavid du Colombier */ 2893e12c5d1SDavid du Colombier enum 2903e12c5d1SDavid du Colombier { 2913e12c5d1SDavid du Colombier Cwio1 = 1, 2923e12c5d1SDavid du Colombier Cwio2, 2933e12c5d1SDavid du Colombier Cwxx1, 2943e12c5d1SDavid du Colombier Cwxx2, 2953e12c5d1SDavid du Colombier Cwxx3, 2963e12c5d1SDavid du Colombier Cwxx4, 2973e12c5d1SDavid du Colombier Cwdump1, 2983e12c5d1SDavid du Colombier Cwdump2, 2993e12c5d1SDavid du Colombier Cuidbuf, 3003e12c5d1SDavid du Colombier }; 3013e12c5d1SDavid du Colombier 3023e12c5d1SDavid du Colombier /* 3033e12c5d1SDavid du Colombier * tags on block 3043e12c5d1SDavid du Colombier */ 3053e12c5d1SDavid du Colombier enum 3063e12c5d1SDavid du Colombier { 3073e12c5d1SDavid du Colombier Tnone = 0, 3083e12c5d1SDavid du Colombier Tsuper, /* the super block */ 3093e12c5d1SDavid du Colombier Tdir, /* directory contents */ 3103e12c5d1SDavid du Colombier Tind1, /* points to blocks */ 3113e12c5d1SDavid du Colombier Tind2, /* points to Tind1 */ 3123e12c5d1SDavid du Colombier Tfile, /* file contents */ 3133e12c5d1SDavid du Colombier Tfree, /* in free list */ 3143e12c5d1SDavid du Colombier Tbuck, /* cache fs bucket */ 3153e12c5d1SDavid du Colombier Tvirgo, /* fake worm virgin bits */ 3163e12c5d1SDavid du Colombier Tcache, /* cw cache things */ 3173e12c5d1SDavid du Colombier MAXTAG 3183e12c5d1SDavid du Colombier }; 3193e12c5d1SDavid du Colombier 3203e12c5d1SDavid du Colombier /* 3213e12c5d1SDavid du Colombier * flags to getbuf 3223e12c5d1SDavid du Colombier */ 3233e12c5d1SDavid du Colombier enum 3243e12c5d1SDavid du Colombier { 3253e12c5d1SDavid du Colombier Bread = (1<<0), /* read the block if miss */ 3263e12c5d1SDavid du Colombier Bprobe = (1<<1), /* return null if miss */ 3273e12c5d1SDavid du Colombier Bmod = (1<<2), /* set modified bit in buffer */ 3283e12c5d1SDavid du Colombier Bimm = (1<<3), /* set immediate bit in buffer */ 3293e12c5d1SDavid du Colombier Bres = (1<<4), /* reserved, never renammed */ 3303e12c5d1SDavid du Colombier }; 3313e12c5d1SDavid du Colombier 3323e12c5d1SDavid du Colombier /* 3333e12c5d1SDavid du Colombier * open modes passed into P9 open/create 3343e12c5d1SDavid du Colombier */ 3353e12c5d1SDavid du Colombier enum 3363e12c5d1SDavid du Colombier { 3373e12c5d1SDavid du Colombier MREAD = 0, 3383e12c5d1SDavid du Colombier MWRITE, 3393e12c5d1SDavid du Colombier MBOTH, 3403e12c5d1SDavid du Colombier MEXEC, 3413e12c5d1SDavid du Colombier MTRUNC = (1<<4), /* truncate on open */ 3423e12c5d1SDavid du Colombier MCEXEC = (1<<5), /* close on exec (host) */ 3433e12c5d1SDavid du Colombier MRCLOSE = (1<<6), /* remove on close */ 3443e12c5d1SDavid du Colombier }; 3453e12c5d1SDavid du Colombier 3463e12c5d1SDavid du Colombier /* 3473e12c5d1SDavid du Colombier * check flags 3483e12c5d1SDavid du Colombier */ 3493e12c5d1SDavid du Colombier enum 3503e12c5d1SDavid du Colombier { 3513e12c5d1SDavid du Colombier Crdall = (1<<0), /* read all files */ 3523e12c5d1SDavid du Colombier Ctag = (1<<1), /* rebuild tags */ 3533e12c5d1SDavid du Colombier Cpfile = (1<<2), /* print files */ 3543e12c5d1SDavid du Colombier Cpdir = (1<<3), /* print directories */ 3553e12c5d1SDavid du Colombier Cfree = (1<<4), /* rebuild free list */ 3563e12c5d1SDavid du Colombier Cream = (1<<6), /* clear all bad tags */ 3573e12c5d1SDavid du Colombier Cbad = (1<<7), /* clear all bad blocks */ 3583e12c5d1SDavid du Colombier Ctouch = (1<<8), /* touch old dir and indir */ 3593e12c5d1SDavid du Colombier Cquiet = (1<<9), /* report just nasty things */ 3603e12c5d1SDavid du Colombier }; 3613e12c5d1SDavid du Colombier 3623e12c5d1SDavid du Colombier /* 3633e12c5d1SDavid du Colombier * buffer size variables 3643e12c5d1SDavid du Colombier */ 3653e12c5d1SDavid du Colombier extern int RBUFSIZE; 3663e12c5d1SDavid du Colombier extern int BUFSIZE; 3673e12c5d1SDavid du Colombier extern int DIRPERBUF; 3683e12c5d1SDavid du Colombier extern int INDPERBUF; 3693e12c5d1SDavid du Colombier extern int INDPERBUF2; 3703e12c5d1SDavid du Colombier extern int FEPERBUF; 371