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