flashfs.h 3.3 KB

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