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