xref: /plan9/sys/src/cmd/aux/flashfs/flashfs.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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