1*9a747e4fSDavid du Colombier /* 2*9a747e4fSDavid du Colombier * Journal Based Flash Entrysystem. 3*9a747e4fSDavid du Colombier */ 4*9a747e4fSDavid du Colombier 5*9a747e4fSDavid du Colombier enum 6*9a747e4fSDavid du Colombier { 7*9a747e4fSDavid du Colombier // sector header 8*9a747e4fSDavid du Colombier MAGSIZE = 4, 9*9a747e4fSDavid du Colombier MAXHDR = MAGSIZE+3+3, 10*9a747e4fSDavid du Colombier 11*9a747e4fSDavid du Colombier MAGIC0 = 'R', 12*9a747e4fSDavid du Colombier MAGIC1 = 'O', 13*9a747e4fSDavid du Colombier MAGIC2 = 'O', 14*9a747e4fSDavid du Colombier FFSVERS = '0', 15*9a747e4fSDavid du Colombier 16*9a747e4fSDavid du Colombier // transactions 17*9a747e4fSDavid du Colombier FT_create = 'G', 18*9a747e4fSDavid du Colombier FT_FCREATE0 = 'C', 19*9a747e4fSDavid du Colombier FT_FCREATE1 = 'E', 20*9a747e4fSDavid du Colombier FT_DCREATE0 = 'D', 21*9a747e4fSDavid du Colombier FT_DCREATE1 = 'F', 22*9a747e4fSDavid du Colombier FT_chmod = 'H', 23*9a747e4fSDavid du Colombier FT_CHMOD0 = 'M', 24*9a747e4fSDavid du Colombier FT_CHMOD1 = 'O', 25*9a747e4fSDavid du Colombier FT_REMOVE = 'R', 26*9a747e4fSDavid du Colombier FT_WRITE = 'W', 27*9a747e4fSDavid du Colombier FT_AWRITE = 'A', 28*9a747e4fSDavid du Colombier FT_trunc = 'I', 29*9a747e4fSDavid du Colombier FT_TRUNC0 = 'T', 30*9a747e4fSDavid du Colombier FT_TRUNC1 = 'V', 31*9a747e4fSDavid du Colombier FT_SUMMARY = 'S', 32*9a747e4fSDavid du Colombier FT_SUMBEG = 'B', 33*9a747e4fSDavid du Colombier FT_SUMEND = 'Z', 34*9a747e4fSDavid du Colombier 35*9a747e4fSDavid du Colombier MAXFSIZE = 1 << 21, 36*9a747e4fSDavid du Colombier MAXNSIZE = 28, 37*9a747e4fSDavid du Colombier 38*9a747e4fSDavid du Colombier Ncreate = 1+1+3*3+MAXNSIZE+1, 39*9a747e4fSDavid du Colombier Nchmod = 1+1+2*3, 40*9a747e4fSDavid du Colombier Nremove = 1+3, 41*9a747e4fSDavid du Colombier Nwrite = 1+4*3, 42*9a747e4fSDavid du Colombier Ntrunc = 1+1+4*3+MAXNSIZE+1, 43*9a747e4fSDavid du Colombier Nsumbeg = 1+3, 44*9a747e4fSDavid du Colombier Nmax = Ncreate, 45*9a747e4fSDavid du Colombier 46*9a747e4fSDavid du Colombier Nsum = 2*(1+3), 47*9a747e4fSDavid du Colombier Nfree = 3, 48*9a747e4fSDavid du Colombier 49*9a747e4fSDavid du Colombier HBITS = 5, 50*9a747e4fSDavid du Colombier HSIZE = 1 << HBITS, 51*9a747e4fSDavid du Colombier HMASK = HSIZE - 1, 52*9a747e4fSDavid du Colombier NOTIME = 0xFFFFFFFF, 53*9a747e4fSDavid du Colombier 54*9a747e4fSDavid du Colombier WRSIZE = 4*1024, 55*9a747e4fSDavid du Colombier }; 56*9a747e4fSDavid du Colombier 57*9a747e4fSDavid du Colombier typedef struct Extent Extent; 58*9a747e4fSDavid du Colombier typedef struct Exts Exts; 59*9a747e4fSDavid du Colombier typedef struct Entry Entry; 60*9a747e4fSDavid du Colombier typedef struct Dirr Dirr; 61*9a747e4fSDavid du Colombier typedef struct Jrec Jrec; 62*9a747e4fSDavid du Colombier typedef struct Renum Renum; 63*9a747e4fSDavid du Colombier 64*9a747e4fSDavid du Colombier struct Extent 65*9a747e4fSDavid du Colombier { 66*9a747e4fSDavid du Colombier int sect; 67*9a747e4fSDavid du Colombier ulong addr; 68*9a747e4fSDavid du Colombier ulong off; 69*9a747e4fSDavid du Colombier ulong size; 70*9a747e4fSDavid du Colombier Extent* next; 71*9a747e4fSDavid du Colombier Extent* prev; 72*9a747e4fSDavid du Colombier }; 73*9a747e4fSDavid du Colombier 74*9a747e4fSDavid du Colombier struct Exts 75*9a747e4fSDavid du Colombier { 76*9a747e4fSDavid du Colombier Extent* head; 77*9a747e4fSDavid du Colombier Extent* tail; 78*9a747e4fSDavid du Colombier }; 79*9a747e4fSDavid du Colombier 80*9a747e4fSDavid du Colombier struct Entry 81*9a747e4fSDavid du Colombier { 82*9a747e4fSDavid du Colombier int ref; 83*9a747e4fSDavid du Colombier char* name; 84*9a747e4fSDavid du Colombier ulong fnum; 85*9a747e4fSDavid du Colombier ulong mode; 86*9a747e4fSDavid du Colombier ulong mnum; 87*9a747e4fSDavid du Colombier ulong mtime; 88*9a747e4fSDavid du Colombier ulong size; 89*9a747e4fSDavid du Colombier 90*9a747e4fSDavid du Colombier union 91*9a747e4fSDavid du Colombier { 92*9a747e4fSDavid du Colombier struct 93*9a747e4fSDavid du Colombier { 94*9a747e4fSDavid du Colombier Entry** htab; 95*9a747e4fSDavid du Colombier Entry* files; 96*9a747e4fSDavid du Colombier Dirr* readers; 97*9a747e4fSDavid du Colombier }; 98*9a747e4fSDavid du Colombier struct 99*9a747e4fSDavid du Colombier { 100*9a747e4fSDavid du Colombier Exts gen[2]; 101*9a747e4fSDavid du Colombier }; 102*9a747e4fSDavid du Colombier }; 103*9a747e4fSDavid du Colombier 104*9a747e4fSDavid du Colombier Entry* parent; 105*9a747e4fSDavid du Colombier Entry* hnext; 106*9a747e4fSDavid du Colombier Entry* hprev; 107*9a747e4fSDavid du Colombier Entry* fnext; 108*9a747e4fSDavid du Colombier Entry* fprev; 109*9a747e4fSDavid du Colombier }; 110*9a747e4fSDavid du Colombier 111*9a747e4fSDavid du Colombier struct Dirr 112*9a747e4fSDavid du Colombier { 113*9a747e4fSDavid du Colombier Entry* dir; 114*9a747e4fSDavid du Colombier Entry* cur; 115*9a747e4fSDavid du Colombier Dirr* next; 116*9a747e4fSDavid du Colombier Dirr* prev; 117*9a747e4fSDavid du Colombier ulong offset; 118*9a747e4fSDavid du Colombier }; 119*9a747e4fSDavid du Colombier 120*9a747e4fSDavid du Colombier struct Jrec 121*9a747e4fSDavid du Colombier { 122*9a747e4fSDavid du Colombier int type; 123*9a747e4fSDavid du Colombier ulong mode; 124*9a747e4fSDavid du Colombier ulong fnum; 125*9a747e4fSDavid du Colombier ulong mnum; 126*9a747e4fSDavid du Colombier ulong tnum; 127*9a747e4fSDavid du Colombier ulong mtime; 128*9a747e4fSDavid du Colombier ulong parent; 129*9a747e4fSDavid du Colombier ulong size; 130*9a747e4fSDavid du Colombier ulong offset; 131*9a747e4fSDavid du Colombier ulong seq; 132*9a747e4fSDavid du Colombier char name[MAXNSIZE+2]; 133*9a747e4fSDavid du Colombier }; 134*9a747e4fSDavid du Colombier 135*9a747e4fSDavid du Colombier struct Renum 136*9a747e4fSDavid du Colombier { 137*9a747e4fSDavid du Colombier int old; 138*9a747e4fSDavid du Colombier int new; 139*9a747e4fSDavid du Colombier }; 140*9a747e4fSDavid du Colombier 141*9a747e4fSDavid du Colombier extern void initdata(char*, int); 142*9a747e4fSDavid du Colombier extern void clearsect(int); 143*9a747e4fSDavid du Colombier extern void readdata(int, void*, ulong, ulong); 144*9a747e4fSDavid du Colombier extern int writedata(int, int, void*, ulong, ulong); 145*9a747e4fSDavid du Colombier extern int getc3(uchar*, ulong*); 146*9a747e4fSDavid du Colombier extern int putc3(uchar*, ulong); 147*9a747e4fSDavid du Colombier extern ulong get4(uchar*); 148*9a747e4fSDavid du Colombier extern void put4(uchar*, ulong); 149*9a747e4fSDavid du Colombier extern int convM2J(Jrec*, uchar*); 150*9a747e4fSDavid du Colombier extern int convJ2M(Jrec*, uchar*); 151*9a747e4fSDavid du Colombier extern void loadfs(int); 152*9a747e4fSDavid du Colombier extern char* need(int bytes); 153*9a747e4fSDavid du Colombier extern void put(Jrec*, int); 154*9a747e4fSDavid du Colombier extern void putw(Jrec*, int, Extent *x, void*); 155*9a747e4fSDavid du Colombier extern int Jconv(Fmt*); 156*9a747e4fSDavid du Colombier extern ulong now(void); 157*9a747e4fSDavid du Colombier extern void serve(char*); 158*9a747e4fSDavid du Colombier 159*9a747e4fSDavid du Colombier #pragma varargck type "J" Jrec* 160*9a747e4fSDavid du Colombier 161*9a747e4fSDavid du Colombier extern void einit(void); 162*9a747e4fSDavid du Colombier extern void edump(void); 163*9a747e4fSDavid du Colombier extern Entry* elookup(ulong); 164*9a747e4fSDavid du Colombier extern Extent* esum(Entry*, int, ulong, int*); 165*9a747e4fSDavid du Colombier extern void edestroy(Entry*); 166*9a747e4fSDavid du Colombier extern Entry* ecreate(Entry*, char*, ulong, ulong, ulong, char**); 167*9a747e4fSDavid du Colombier extern char* eremove(Entry*); 168*9a747e4fSDavid du Colombier extern Entry* ewalk(Entry*, char*, char**); 169*9a747e4fSDavid du Colombier extern void etrunc(Entry*, ulong, ulong); 170*9a747e4fSDavid du Colombier extern ulong echmod(Entry*, ulong, ulong); 171*9a747e4fSDavid du Colombier extern ulong eread(Entry*, int, void*, ulong, ulong); 172*9a747e4fSDavid du Colombier extern void ewrite(Entry*, Extent *, int, ulong); 173*9a747e4fSDavid du Colombier extern Qid eqid(Entry*); 174*9a747e4fSDavid du Colombier extern void estat(Entry*, Dir*, int); 175*9a747e4fSDavid du Colombier extern Dirr* ediropen(Entry*); 176*9a747e4fSDavid du Colombier extern int edirread(Dirr*, char*, long); 177*9a747e4fSDavid du Colombier extern void edirclose(Dirr*); 178*9a747e4fSDavid du Colombier extern void erenum(Renum*); 179*9a747e4fSDavid du Colombier 180*9a747e4fSDavid du Colombier extern char Edirnotempty[]; 181*9a747e4fSDavid du Colombier extern char Eexists[]; 182*9a747e4fSDavid du Colombier extern char Eisdir[]; 183*9a747e4fSDavid du Colombier extern char Enonexist[]; 184*9a747e4fSDavid du Colombier extern char Enotdir[]; 185*9a747e4fSDavid du Colombier extern char Eperm[]; 186*9a747e4fSDavid du Colombier extern char Erofs[]; 187*9a747e4fSDavid du Colombier 188*9a747e4fSDavid du Colombier extern ulong sectsize; 189*9a747e4fSDavid du Colombier extern ulong nsects; 190*9a747e4fSDavid du Colombier extern uchar* sectbuff; 191*9a747e4fSDavid du Colombier extern Entry *root; 192*9a747e4fSDavid du Colombier extern int readonly; 193*9a747e4fSDavid du Colombier extern ulong delta; 194*9a747e4fSDavid du Colombier extern int eparity; 195*9a747e4fSDavid du Colombier extern uchar magic[]; 196*9a747e4fSDavid du Colombier extern ulong used; 197*9a747e4fSDavid du Colombier extern ulong limit; 198*9a747e4fSDavid du Colombier extern ulong maxwrite; 199