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