xref: /plan9/sys/src/cmd/cwfs/portdat.h (revision 01a344a29f2ff35133953eaef092a50fc8c3163b)
1*01a344a2SDavid du Colombier /*
2*01a344a2SDavid du Colombier  * fundamental constants and types of the implementation
3*01a344a2SDavid du Colombier  * changing any of these changes the layout on disk
4*01a344a2SDavid du Colombier  */
5*01a344a2SDavid du Colombier enum {
6*01a344a2SDavid du Colombier 	SUPER_ADDR	= 2,		/* block address of superblock */
7*01a344a2SDavid du Colombier 	ROOT_ADDR	= 3,		/* block address of root directory */
8*01a344a2SDavid du Colombier };
9*01a344a2SDavid du Colombier 
10*01a344a2SDavid du Colombier /* more fundamental types */
11*01a344a2SDavid du Colombier typedef vlong Wideoff; /* type to widen Off to for printing; ≥ as wide as Off */
12*01a344a2SDavid du Colombier typedef short	Userid;		/* signed internal representation of user-id */
13*01a344a2SDavid du Colombier typedef long	Timet;		/* in seconds since epoch */
14*01a344a2SDavid du Colombier typedef vlong	Devsize;	/* in bytes */
15*01a344a2SDavid du Colombier 
16*01a344a2SDavid du Colombier 
17*01a344a2SDavid du Colombier /* macros */
18*01a344a2SDavid du Colombier #define NEXT(x, l)	(((x)+1) % (l))
19*01a344a2SDavid du Colombier #define PREV(x, l)	((x) == 0? (l)-1: (x)-1)
20*01a344a2SDavid du Colombier #define	HOWMANY(x, y)	(((x)+((y)-1)) / (y))
21*01a344a2SDavid du Colombier #define ROUNDUP(x, y)	(HOWMANY((x), (y)) * (y))
22*01a344a2SDavid du Colombier 
23*01a344a2SDavid du Colombier #define	TK2MS(t) (((ulong)(t)*1000)/HZ)	/* ticks to ms - beware rounding */
24*01a344a2SDavid du Colombier #define	MS2TK(t) (((ulong)(t)*HZ)/1000)	/* ms to ticks - beware rounding */
25*01a344a2SDavid du Colombier #define	TK2SEC(t) ((t)/HZ)		/* ticks to seconds */
26*01a344a2SDavid du Colombier 
27*01a344a2SDavid du Colombier /* constants that don't affect disk layout */
28*01a344a2SDavid du Colombier enum {
29*01a344a2SDavid du Colombier 	MAXDAT		= 8192,		/* max allowable data message */
30*01a344a2SDavid du Colombier 	MAXMSG		= 128,		/* max protocol message sans data */
31*01a344a2SDavid du Colombier 
32*01a344a2SDavid du Colombier 	MB		= 1024*1024,
33*01a344a2SDavid du Colombier 
34*01a344a2SDavid du Colombier 	HZ		= 1,		/* clock frequency */
35*01a344a2SDavid du Colombier };
36*01a344a2SDavid du Colombier 
37*01a344a2SDavid du Colombier /*
38*01a344a2SDavid du Colombier  * tunable parameters
39*01a344a2SDavid du Colombier  */
40*01a344a2SDavid du Colombier enum {
41*01a344a2SDavid du Colombier 	Maxword		= 256,		/* max bytes per command-line word */
42*01a344a2SDavid du Colombier 	NTLOCK		= 200,		/* number of active file Tlocks */
43*01a344a2SDavid du Colombier };
44*01a344a2SDavid du Colombier 
45*01a344a2SDavid du Colombier typedef struct	Auth	Auth;
46*01a344a2SDavid du Colombier typedef	struct	Bp	Bp;
47*01a344a2SDavid du Colombier typedef	struct	Bucket	Bucket;
48*01a344a2SDavid du Colombier typedef	struct	Cache	Cache;
49*01a344a2SDavid du Colombier typedef	struct	Centry	Centry;
50*01a344a2SDavid du Colombier typedef	struct	Chan	Chan;
51*01a344a2SDavid du Colombier typedef	struct	Command	Command;
52*01a344a2SDavid du Colombier typedef	struct	Conf	Conf;
53*01a344a2SDavid du Colombier typedef	struct	Cons	Cons;
54*01a344a2SDavid du Colombier typedef	struct	Dentry	Dentry;
55*01a344a2SDavid du Colombier typedef struct	Device	Device;
56*01a344a2SDavid du Colombier typedef	struct	Fbuf	Fbuf;
57*01a344a2SDavid du Colombier typedef	struct	File	File;
58*01a344a2SDavid du Colombier typedef	struct	Filsys	Filsys;
59*01a344a2SDavid du Colombier typedef	struct	Filter	Filter;
60*01a344a2SDavid du Colombier typedef	struct	Flag	Flag;
61*01a344a2SDavid du Colombier typedef	struct	Hiob	Hiob;
62*01a344a2SDavid du Colombier typedef	struct	Iobuf	Iobuf;
63*01a344a2SDavid du Colombier typedef	struct	Lock	Lock;
64*01a344a2SDavid du Colombier typedef	struct	Msgbuf	Msgbuf;
65*01a344a2SDavid du Colombier typedef	struct	QLock	QLock;
66*01a344a2SDavid du Colombier typedef struct	Qid9p1	Qid9p1;
67*01a344a2SDavid du Colombier typedef	struct	Queue	Queue;
68*01a344a2SDavid du Colombier typedef	union	Rabuf	Rabuf;
69*01a344a2SDavid du Colombier typedef	struct	Rendez	Rendez;
70*01a344a2SDavid du Colombier typedef	struct	Rtc	Rtc;
71*01a344a2SDavid du Colombier typedef	struct	Startsb	Startsb;
72*01a344a2SDavid du Colombier typedef	struct	Super1	Super1;
73*01a344a2SDavid du Colombier typedef	struct	Superb	Superb;
74*01a344a2SDavid du Colombier typedef	struct	Tag	Tag;
75*01a344a2SDavid du Colombier typedef	struct	Time	Time;
76*01a344a2SDavid du Colombier typedef	struct	Tlock	Tlock;
77*01a344a2SDavid du Colombier typedef	struct	Tm	Tm;
78*01a344a2SDavid du Colombier typedef	struct	Uid	Uid;
79*01a344a2SDavid du Colombier typedef	struct	Wpath	Wpath;
80*01a344a2SDavid du Colombier 
81*01a344a2SDavid du Colombier #pragma incomplete Auth
82*01a344a2SDavid du Colombier 
83*01a344a2SDavid du Colombier struct	Tag
84*01a344a2SDavid du Colombier {
85*01a344a2SDavid du Colombier 	short	pad;		/* make tag end at a long boundary */
86*01a344a2SDavid du Colombier 	short	tag;
87*01a344a2SDavid du Colombier 	Off	path;
88*01a344a2SDavid du Colombier };
89*01a344a2SDavid du Colombier 
90*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */
91*01a344a2SDavid du Colombier struct	Qid9p1
92*01a344a2SDavid du Colombier {
93*01a344a2SDavid du Colombier 	Off	path;			/* was long */
94*01a344a2SDavid du Colombier 	ulong	version;		/* should be Off */
95*01a344a2SDavid du Colombier };
96*01a344a2SDavid du Colombier 
97*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */
98*01a344a2SDavid du Colombier struct	Super1
99*01a344a2SDavid du Colombier {
100*01a344a2SDavid du Colombier 	Off	fstart;
101*01a344a2SDavid du Colombier 	Off	fsize;
102*01a344a2SDavid du Colombier 	Off	tfree;
103*01a344a2SDavid du Colombier 	Off	qidgen;		/* generator for unique ids */
104*01a344a2SDavid du Colombier 	/*
105*01a344a2SDavid du Colombier 	 * Stuff for WWC device
106*01a344a2SDavid du Colombier 	 */
107*01a344a2SDavid du Colombier 	Off	cwraddr;	/* cfs root addr */
108*01a344a2SDavid du Colombier 	Off	roraddr;	/* dump root addr */
109*01a344a2SDavid du Colombier 	Off	last;		/* last super block addr */
110*01a344a2SDavid du Colombier 	Off	next;		/* next super block addr */
111*01a344a2SDavid du Colombier };
112*01a344a2SDavid du Colombier 
113*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */
114*01a344a2SDavid du Colombier struct	Centry
115*01a344a2SDavid du Colombier {
116*01a344a2SDavid du Colombier 	ushort	age;
117*01a344a2SDavid du Colombier 	short	state;
118*01a344a2SDavid du Colombier 	Off	waddr;		/* worm addr */
119*01a344a2SDavid du Colombier };
120*01a344a2SDavid du Colombier 
121*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */
122*01a344a2SDavid du Colombier struct	Dentry
123*01a344a2SDavid du Colombier {
124*01a344a2SDavid du Colombier 	char	name[NAMELEN];
125*01a344a2SDavid du Colombier 	Userid	uid;
126*01a344a2SDavid du Colombier 	Userid	gid;
127*01a344a2SDavid du Colombier 	ushort	mode;
128*01a344a2SDavid du Colombier 		#define	DALLOC	0x8000
129*01a344a2SDavid du Colombier 		#define	DDIR	0x4000
130*01a344a2SDavid du Colombier 		#define	DAPND	0x2000
131*01a344a2SDavid du Colombier 		#define	DLOCK	0x1000
132*01a344a2SDavid du Colombier 		#define	DREAD	0x4
133*01a344a2SDavid du Colombier 		#define	DWRITE	0x2
134*01a344a2SDavid du Colombier 		#define	DEXEC	0x1
135*01a344a2SDavid du Colombier 	Userid	muid;
136*01a344a2SDavid du Colombier 	Qid9p1	qid;
137*01a344a2SDavid du Colombier 	Off	size;
138*01a344a2SDavid du Colombier 	Off	dblock[NDBLOCK];
139*01a344a2SDavid du Colombier 	Off	iblocks[NIBLOCK];
140*01a344a2SDavid du Colombier 	long	atime;
141*01a344a2SDavid du Colombier 	long	mtime;
142*01a344a2SDavid du Colombier };
143*01a344a2SDavid du Colombier 
144*01a344a2SDavid du Colombier /*
145*01a344a2SDavid du Colombier  * derived constants
146*01a344a2SDavid du Colombier  */
147*01a344a2SDavid du Colombier enum {
148*01a344a2SDavid du Colombier 	BUFSIZE		= RBUFSIZE - sizeof(Tag),
149*01a344a2SDavid du Colombier 	DIRPERBUF	= BUFSIZE / sizeof(Dentry),
150*01a344a2SDavid du Colombier 	INDPERBUF	= BUFSIZE / sizeof(Off),
151*01a344a2SDavid du Colombier 	FEPERBUF	= (BUFSIZE-sizeof(Super1)-sizeof(Off)) / sizeof(Off),
152*01a344a2SDavid du Colombier 	SMALLBUF	= MAXMSG,
153*01a344a2SDavid du Colombier 	LARGEBUF	= MAXMSG+MAXDAT+256,
154*01a344a2SDavid du Colombier 	RAGAP		= (300*1024)/BUFSIZE,	/* readahead parameter */
155*01a344a2SDavid du Colombier 	BKPERBLK	= 10,
156*01a344a2SDavid du Colombier 	CEPERBK		= (BUFSIZE - BKPERBLK*sizeof(Off)) /
157*01a344a2SDavid du Colombier 				(sizeof(Centry)*BKPERBLK),
158*01a344a2SDavid du Colombier };
159*01a344a2SDavid du Colombier 
160*01a344a2SDavid du Colombier /*
161*01a344a2SDavid du Colombier  * send/recv queue structure
162*01a344a2SDavid du Colombier  */
163*01a344a2SDavid du Colombier struct	Queue
164*01a344a2SDavid du Colombier {
165*01a344a2SDavid du Colombier 	QLock;			/* to manipulate values */
166*01a344a2SDavid du Colombier 	Rendez	empty;
167*01a344a2SDavid du Colombier 	Rendez	full;
168*01a344a2SDavid du Colombier 
169*01a344a2SDavid du Colombier 	int	waitedfor;	/* flag */
170*01a344a2SDavid du Colombier 	char*	name;		/* for debugging */
171*01a344a2SDavid du Colombier 
172*01a344a2SDavid du Colombier 	int	size;		/* size of queue */
173*01a344a2SDavid du Colombier 	int	loc;		/* circular pointer */
174*01a344a2SDavid du Colombier 	int	count;		/* how many in queue */
175*01a344a2SDavid du Colombier 	void*	args[1];	/* list of saved pointers, [->size] */
176*01a344a2SDavid du Colombier };
177*01a344a2SDavid du Colombier 
178*01a344a2SDavid du Colombier struct	Device
179*01a344a2SDavid du Colombier {
180*01a344a2SDavid du Colombier 	uchar	type;
181*01a344a2SDavid du Colombier 	uchar	init;
182*01a344a2SDavid du Colombier 	Device*	link;			/* link for mcat/mlev/mirror */
183*01a344a2SDavid du Colombier 	Device*	dlink;			/* link all devices */
184*01a344a2SDavid du Colombier 	void*	private;
185*01a344a2SDavid du Colombier 	Devsize	size;
186*01a344a2SDavid du Colombier 	union {
187*01a344a2SDavid du Colombier 		struct {		/* disk, (l)worm in j.j, sides */
188*01a344a2SDavid du Colombier 			int	ctrl;	/* disks only */
189*01a344a2SDavid du Colombier 			int	targ;
190*01a344a2SDavid du Colombier 			int	lun;	/* not implemented in sd(3) */
191*01a344a2SDavid du Colombier 
192*01a344a2SDavid du Colombier 			int	mapped;
193*01a344a2SDavid du Colombier 			char*	file;	/* ordinary file or dir instead */
194*01a344a2SDavid du Colombier 
195*01a344a2SDavid du Colombier 			int	fd;
196*01a344a2SDavid du Colombier 			char*	sddir;	/* /dev/sdXX name, for juke drives */
197*01a344a2SDavid du Colombier 			char*	sddata;	/* /dev/sdXX/data or other file */
198*01a344a2SDavid du Colombier 		} wren;
199*01a344a2SDavid du Colombier 		struct {		/* mcat mlev mirror */
200*01a344a2SDavid du Colombier 			Device*	first;
201*01a344a2SDavid du Colombier 			Device*	last;
202*01a344a2SDavid du Colombier 			int	ndev;
203*01a344a2SDavid du Colombier 		} cat;
204*01a344a2SDavid du Colombier 		struct {		/* cw */
205*01a344a2SDavid du Colombier 			Device*	c;	/* cache device */
206*01a344a2SDavid du Colombier 			Device*	w;	/* worm device */
207*01a344a2SDavid du Colombier 			Device*	ro;	/* dump - readonly */
208*01a344a2SDavid du Colombier 		} cw;
209*01a344a2SDavid du Colombier 		struct {		/* juke */
210*01a344a2SDavid du Colombier 			Device*	j;	/* (robotics, worm drives) - wrens */
211*01a344a2SDavid du Colombier 			Device*	m;	/* (sides) - r or l devices */
212*01a344a2SDavid du Colombier 		} j;
213*01a344a2SDavid du Colombier 		struct {		/* ro */
214*01a344a2SDavid du Colombier 			Device*	parent;
215*01a344a2SDavid du Colombier 		} ro;
216*01a344a2SDavid du Colombier 		struct {		/* fworm */
217*01a344a2SDavid du Colombier 			Device*	fw;
218*01a344a2SDavid du Colombier 		} fw;
219*01a344a2SDavid du Colombier 		struct {		/* part */
220*01a344a2SDavid du Colombier 			Device*	d;
221*01a344a2SDavid du Colombier 			long	base;	/* percentages */
222*01a344a2SDavid du Colombier 			long	size;
223*01a344a2SDavid du Colombier 		} part;
224*01a344a2SDavid du Colombier 		struct {		/* byte-swapped */
225*01a344a2SDavid du Colombier 			Device*	d;
226*01a344a2SDavid du Colombier 		} swab;
227*01a344a2SDavid du Colombier 	};
228*01a344a2SDavid du Colombier };
229*01a344a2SDavid du Colombier 
230*01a344a2SDavid du Colombier typedef struct Sidestarts {
231*01a344a2SDavid du Colombier 	Devsize	sstart;			/* blocks before start of side */
232*01a344a2SDavid du Colombier 	Devsize	s1start;		/* blocks before start of next side */
233*01a344a2SDavid du Colombier } Sidestarts;
234*01a344a2SDavid du Colombier 
235*01a344a2SDavid du Colombier union Rabuf {
236*01a344a2SDavid du Colombier 	struct {
237*01a344a2SDavid du Colombier 		Device*	dev;
238*01a344a2SDavid du Colombier 		Off	addr;
239*01a344a2SDavid du Colombier 	};
240*01a344a2SDavid du Colombier 	Rabuf*	link;
241*01a344a2SDavid du Colombier };
242*01a344a2SDavid du Colombier 
243*01a344a2SDavid du Colombier struct	Hiob
244*01a344a2SDavid du Colombier {
245*01a344a2SDavid du Colombier 	Iobuf*	link;
246*01a344a2SDavid du Colombier 	Lock;
247*01a344a2SDavid du Colombier };
248*01a344a2SDavid du Colombier 
249*01a344a2SDavid du Colombier /* a 9P connection */
250*01a344a2SDavid du Colombier struct	Chan
251*01a344a2SDavid du Colombier {
252*01a344a2SDavid du Colombier 	char	type;			/* major driver type i.e. Dev* */
253*01a344a2SDavid du Colombier 	int	(*protocol)(Msgbuf*);	/* version */
254*01a344a2SDavid du Colombier 	int	msize;			/* version */
255*01a344a2SDavid du Colombier 	char	whochan[50];
256*01a344a2SDavid du Colombier 	char	whoname[NAMELEN];
257*01a344a2SDavid du Colombier 	void	(*whoprint)(Chan*);
258*01a344a2SDavid du Colombier 	ulong	flags;
259*01a344a2SDavid du Colombier 	int	chan;			/* overall channel #, mostly for printing */
260*01a344a2SDavid du Colombier 	int	nmsgs;			/* outstanding messages, set under flock -- for flush */
261*01a344a2SDavid du Colombier 
262*01a344a2SDavid du Colombier 	Timet	whotime;
263*01a344a2SDavid du Colombier 	int	nfile;			/* used by cmd_files */
264*01a344a2SDavid du Colombier 
265*01a344a2SDavid du Colombier 	RWLock	reflock;
266*01a344a2SDavid du Colombier 	Chan*	next;			/* link list of chans */
267*01a344a2SDavid du Colombier 	Queue*	send;
268*01a344a2SDavid du Colombier 	Queue*	reply;
269*01a344a2SDavid du Colombier 
270*01a344a2SDavid du Colombier 	uchar	authinfo[64];
271*01a344a2SDavid du Colombier 
272*01a344a2SDavid du Colombier 	void*	pdata;			/* sometimes is a Netconn* */
273*01a344a2SDavid du Colombier };
274*01a344a2SDavid du Colombier 
275*01a344a2SDavid du Colombier struct	Filsys
276*01a344a2SDavid du Colombier {
277*01a344a2SDavid du Colombier 	char*	name;			/* name of filsys */
278*01a344a2SDavid du Colombier 	char*	conf;			/* symbolic configuration */
279*01a344a2SDavid du Colombier 	Device*	dev;			/* device that filsys is on */
280*01a344a2SDavid du Colombier 	int	flags;
281*01a344a2SDavid du Colombier 		#define	FREAM		(1<<0)	/* mkfs */
282*01a344a2SDavid du Colombier 		#define	FRECOVER	(1<<1)	/* install last dump */
283*01a344a2SDavid du Colombier 		#define	FEDIT		(1<<2)	/* modified */
284*01a344a2SDavid du Colombier };
285*01a344a2SDavid du Colombier 
286*01a344a2SDavid du Colombier struct	Startsb
287*01a344a2SDavid du Colombier {
288*01a344a2SDavid du Colombier 	char*	name;
289*01a344a2SDavid du Colombier 	Off	startsb;
290*01a344a2SDavid du Colombier };
291*01a344a2SDavid du Colombier 
292*01a344a2SDavid du Colombier struct	Time
293*01a344a2SDavid du Colombier {
294*01a344a2SDavid du Colombier 	Timet	lasttoy;
295*01a344a2SDavid du Colombier 	Timet	offset;
296*01a344a2SDavid du Colombier };
297*01a344a2SDavid du Colombier 
298*01a344a2SDavid du Colombier /*
299*01a344a2SDavid du Colombier  * array of qids that are locked
300*01a344a2SDavid du Colombier  */
301*01a344a2SDavid du Colombier struct	Tlock
302*01a344a2SDavid du Colombier {
303*01a344a2SDavid du Colombier 	Device*	dev;
304*01a344a2SDavid du Colombier 	Timet	time;
305*01a344a2SDavid du Colombier 	Off	qpath;
306*01a344a2SDavid du Colombier 	File*	file;
307*01a344a2SDavid du Colombier };
308*01a344a2SDavid du Colombier 
309*01a344a2SDavid du Colombier struct	Cons
310*01a344a2SDavid du Colombier {
311*01a344a2SDavid du Colombier 	ulong	flags;		/* overall flags for all channels */
312*01a344a2SDavid du Colombier 	QLock;			/* generic qlock for mutex */
313*01a344a2SDavid du Colombier 	int	uid;		/* botch -- used to get uid on cons_create */
314*01a344a2SDavid du Colombier 	int	gid;		/* botch -- used to get gid on cons_create */
315*01a344a2SDavid du Colombier 	int	nuid;		/* number of uids */
316*01a344a2SDavid du Colombier 	int	ngid;		/* number of gids */
317*01a344a2SDavid du Colombier 	Off	offset;		/* used to read files, c.f. fchar */
318*01a344a2SDavid du Colombier 	int	chano;		/* generator for channel numbers */
319*01a344a2SDavid du Colombier 	Chan*	chan;		/* console channel */
320*01a344a2SDavid du Colombier 	Filsys*	curfs;		/* current filesystem */
321*01a344a2SDavid du Colombier 
322*01a344a2SDavid du Colombier 	int	profile;	/* are we profiling? */
323*01a344a2SDavid du Colombier 	long*	profbuf;
324*01a344a2SDavid du Colombier 	ulong	minpc;
325*01a344a2SDavid du Colombier 	ulong	maxpc;
326*01a344a2SDavid du Colombier 	ulong	nprofbuf;
327*01a344a2SDavid du Colombier 
328*01a344a2SDavid du Colombier 	long	nlarge;		/* number of large message buffers */
329*01a344a2SDavid du Colombier 	long	nsmall;		/* ... small ... */
330*01a344a2SDavid du Colombier 	long	nwormre;	/* worm read errors */
331*01a344a2SDavid du Colombier 	long	nwormwe;	/* worm write errors */
332*01a344a2SDavid du Colombier 	long	nwormhit;	/* worm read cache hits */
333*01a344a2SDavid du Colombier 	long	nwormmiss;	/* worm read cache non-hits */
334*01a344a2SDavid du Colombier 	int	noage;		/* dont update cache age, dump and check */
335*01a344a2SDavid du Colombier 	long	nwrenre;	/* disk read errors */
336*01a344a2SDavid du Colombier 	long	nwrenwe;	/* disk write errors */
337*01a344a2SDavid du Colombier 	long	nreseq;		/* cache bucket resequence */
338*01a344a2SDavid du Colombier 
339*01a344a2SDavid du Colombier //	Filter	work[3];	/* thruput in messages */
340*01a344a2SDavid du Colombier //	Filter	rate[3];	/* thruput in bytes */
341*01a344a2SDavid du Colombier //	Filter	bhit[3];	/* getbufs that hit */
342*01a344a2SDavid du Colombier //	Filter	bread[3];	/* getbufs that miss and read */
343*01a344a2SDavid du Colombier //	Filter	brahead[3];	/* messages to readahead */
344*01a344a2SDavid du Colombier //	Filter	binit[3];	/* getbufs that miss and dont read */
345*01a344a2SDavid du Colombier };
346*01a344a2SDavid du Colombier 
347*01a344a2SDavid du Colombier struct	File
348*01a344a2SDavid du Colombier {
349*01a344a2SDavid du Colombier 	QLock;
350*01a344a2SDavid du Colombier 	Qid	qid;
351*01a344a2SDavid du Colombier 	Wpath*	wpath;
352*01a344a2SDavid du Colombier 	Chan*	cp;		/* null means a free slot */
353*01a344a2SDavid du Colombier 	Tlock*	tlock;		/* if file is locked */
354*01a344a2SDavid du Colombier 	File*	next;		/* in cp->flist */
355*01a344a2SDavid du Colombier 	Filsys*	fs;
356*01a344a2SDavid du Colombier 	Off	addr;
357*01a344a2SDavid du Colombier 	long	slot;		/* ordinal # of Dentry with a directory block */
358*01a344a2SDavid du Colombier 	Off	lastra;		/* read ahead address */
359*01a344a2SDavid du Colombier 	ulong	fid;
360*01a344a2SDavid du Colombier 	Userid	uid;
361*01a344a2SDavid du Colombier 	Auth	*auth;
362*01a344a2SDavid du Colombier 	char	open;
363*01a344a2SDavid du Colombier 		#define	FREAD	1
364*01a344a2SDavid du Colombier 		#define	FWRITE	2
365*01a344a2SDavid du Colombier 		#define	FREMOV	4
366*01a344a2SDavid du Colombier 
367*01a344a2SDavid du Colombier 	Off	doffset;	/* directory reading */
368*01a344a2SDavid du Colombier 	ulong	dvers;
369*01a344a2SDavid du Colombier 	long	dslot;
370*01a344a2SDavid du Colombier };
371*01a344a2SDavid du Colombier 
372*01a344a2SDavid du Colombier struct	Wpath
373*01a344a2SDavid du Colombier {
374*01a344a2SDavid du Colombier 	Wpath*	up;		/* pointer upwards in path */
375*01a344a2SDavid du Colombier 	Off	addr;		/* directory entry addr */
376*01a344a2SDavid du Colombier 	long	slot;		/* directory entry slot */
377*01a344a2SDavid du Colombier 	short	refs;		/* number of files using this structure */
378*01a344a2SDavid du Colombier };
379*01a344a2SDavid du Colombier 
380*01a344a2SDavid du Colombier struct	Iobuf
381*01a344a2SDavid du Colombier {
382*01a344a2SDavid du Colombier 	QLock;
383*01a344a2SDavid du Colombier 	Device*	dev;
384*01a344a2SDavid du Colombier 	Iobuf*	fore;		/* for lru */
385*01a344a2SDavid du Colombier 	Iobuf*	back;		/* for lru */
386*01a344a2SDavid du Colombier 	char*	iobuf;		/* only active while locked */
387*01a344a2SDavid du Colombier 	char*	xiobuf;		/* "real" buffer pointer */
388*01a344a2SDavid du Colombier 	Off	addr;
389*01a344a2SDavid du Colombier 	int	flags;
390*01a344a2SDavid du Colombier };
391*01a344a2SDavid du Colombier 
392*01a344a2SDavid du Colombier struct	Uid
393*01a344a2SDavid du Colombier {
394*01a344a2SDavid du Colombier 	Userid	uid;		/* user id */
395*01a344a2SDavid du Colombier 	Userid	lead;		/* leader of group */
396*01a344a2SDavid du Colombier 	Userid	*gtab;		/* group table */
397*01a344a2SDavid du Colombier 	int	ngrp;		/* number of group entries */
398*01a344a2SDavid du Colombier 	char	name[NAMELEN];	/* user name */
399*01a344a2SDavid du Colombier };
400*01a344a2SDavid du Colombier 
401*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */
402*01a344a2SDavid du Colombier struct	Fbuf
403*01a344a2SDavid du Colombier {
404*01a344a2SDavid du Colombier 	Off	nfree;
405*01a344a2SDavid du Colombier 	Off	free[FEPERBUF];
406*01a344a2SDavid du Colombier };
407*01a344a2SDavid du Colombier 
408*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */
409*01a344a2SDavid du Colombier struct	Superb
410*01a344a2SDavid du Colombier {
411*01a344a2SDavid du Colombier 	Fbuf	fbuf;
412*01a344a2SDavid du Colombier 	Super1;
413*01a344a2SDavid du Colombier };
414*01a344a2SDavid du Colombier 
415*01a344a2SDavid du Colombier struct	Conf
416*01a344a2SDavid du Colombier {
417*01a344a2SDavid du Colombier 	ulong	nmach;		/* processors */
418*01a344a2SDavid du Colombier 	ulong	mem;		/* total physical bytes of memory */
419*01a344a2SDavid du Colombier 	ulong	nuid;		/* distinct uids */
420*01a344a2SDavid du Colombier 	ulong	nserve;		/* server processes */
421*01a344a2SDavid du Colombier 	ulong	nfile;		/* number of fid -- system wide */
422*01a344a2SDavid du Colombier 	ulong	nwpath;		/* number of active paths, derived from nfile */
423*01a344a2SDavid du Colombier 	ulong	gidspace;	/* space for gid names -- derived from nuid */
424*01a344a2SDavid du Colombier 
425*01a344a2SDavid du Colombier 	ulong	nlgmsg;		/* number of large message buffers */
426*01a344a2SDavid du Colombier 	ulong	nsmmsg;		/* number of small message buffers */
427*01a344a2SDavid du Colombier 
428*01a344a2SDavid du Colombier 	Off	recovcw;	/* recover addresses */
429*01a344a2SDavid du Colombier 	Off	recovro;
430*01a344a2SDavid du Colombier 	Off	firstsb;
431*01a344a2SDavid du Colombier 	Off	recovsb;
432*01a344a2SDavid du Colombier 
433*01a344a2SDavid du Colombier 	ulong	configfirst;	/* configure before starting normal operation */
434*01a344a2SDavid du Colombier 	char	*confdev;
435*01a344a2SDavid du Colombier 	char	*devmap;	/* name of config->file device mapping file */
436*01a344a2SDavid du Colombier 
437*01a344a2SDavid du Colombier 	ulong	nauth;		/* number of Auth structs */
438*01a344a2SDavid du Colombier 	uchar	nodump;		/* no periodic dumps */
439*01a344a2SDavid du Colombier 	uchar	dumpreread;	/* read and compare in dump copy */
440*01a344a2SDavid du Colombier };
441*01a344a2SDavid du Colombier 
442*01a344a2SDavid du Colombier enum {
443*01a344a2SDavid du Colombier 	Mbmagic = 0xb0ffe3,
444*01a344a2SDavid du Colombier };
445*01a344a2SDavid du Colombier 
446*01a344a2SDavid du Colombier /*
447*01a344a2SDavid du Colombier  * message buffers
448*01a344a2SDavid du Colombier  * 2 types, large and small
449*01a344a2SDavid du Colombier  */
450*01a344a2SDavid du Colombier struct	Msgbuf
451*01a344a2SDavid du Colombier {
452*01a344a2SDavid du Colombier 	ulong	magic;
453*01a344a2SDavid du Colombier 	short	count;
454*01a344a2SDavid du Colombier 	short	flags;
455*01a344a2SDavid du Colombier 		#define	LARGE	(1<<0)
456*01a344a2SDavid du Colombier 		#define	FREE	(1<<1)
457*01a344a2SDavid du Colombier 		#define BFREE	(1<<2)
458*01a344a2SDavid du Colombier 		#define BTRACE	(1<<7)
459*01a344a2SDavid du Colombier 	Chan*	chan;		/* file server conn within a net. conn */
460*01a344a2SDavid du Colombier 	Msgbuf*	next;
461*01a344a2SDavid du Colombier 	uintptr	param;		/* misc. use; keep Conn* here */
462*01a344a2SDavid du Colombier 
463*01a344a2SDavid du Colombier 	int	category;
464*01a344a2SDavid du Colombier 	uchar*	data;		/* rp or wp: current processing point */
465*01a344a2SDavid du Colombier 	uchar*	xdata;		/* base of allocation */
466*01a344a2SDavid du Colombier };
467*01a344a2SDavid du Colombier 
468*01a344a2SDavid du Colombier /*
469*01a344a2SDavid du Colombier  * message buffer categories
470*01a344a2SDavid du Colombier  */
471*01a344a2SDavid du Colombier enum
472*01a344a2SDavid du Colombier {
473*01a344a2SDavid du Colombier 	Mxxx		= 0,
474*01a344a2SDavid du Colombier 	Mbeth1,
475*01a344a2SDavid du Colombier 	Mbreply1,
476*01a344a2SDavid du Colombier 	Mbreply2,
477*01a344a2SDavid du Colombier 	Mbreply3,
478*01a344a2SDavid du Colombier 	Mbreply4,
479*01a344a2SDavid du Colombier 	MAXCAT,
480*01a344a2SDavid du Colombier };
481*01a344a2SDavid du Colombier 
482*01a344a2SDavid du Colombier enum { PRINTSIZE = 256 };
483*01a344a2SDavid du Colombier 
484*01a344a2SDavid du Colombier struct
485*01a344a2SDavid du Colombier {
486*01a344a2SDavid du Colombier 	Lock;
487*01a344a2SDavid du Colombier 	int	machs;
488*01a344a2SDavid du Colombier 	int	exiting;
489*01a344a2SDavid du Colombier } active;
490*01a344a2SDavid du Colombier 
491*01a344a2SDavid du Colombier struct	Command
492*01a344a2SDavid du Colombier {
493*01a344a2SDavid du Colombier 	char*	arg0;
494*01a344a2SDavid du Colombier 	char*	help;
495*01a344a2SDavid du Colombier 	void	(*func)(int, char*[]);
496*01a344a2SDavid du Colombier };
497*01a344a2SDavid du Colombier 
498*01a344a2SDavid du Colombier struct	Flag
499*01a344a2SDavid du Colombier {
500*01a344a2SDavid du Colombier 	char*	arg0;
501*01a344a2SDavid du Colombier 	char*	help;
502*01a344a2SDavid du Colombier 	ulong	flag;
503*01a344a2SDavid du Colombier };
504*01a344a2SDavid du Colombier 
505*01a344a2SDavid du Colombier struct	Rtc
506*01a344a2SDavid du Colombier {
507*01a344a2SDavid du Colombier 	int	sec;
508*01a344a2SDavid du Colombier 	int	min;
509*01a344a2SDavid du Colombier 	int	hour;
510*01a344a2SDavid du Colombier 	int	mday;
511*01a344a2SDavid du Colombier 	int	mon;
512*01a344a2SDavid du Colombier 	int	year;
513*01a344a2SDavid du Colombier };
514*01a344a2SDavid du Colombier 
515*01a344a2SDavid du Colombier typedef struct
516*01a344a2SDavid du Colombier {
517*01a344a2SDavid du Colombier 	/* constants during a given truncation */
518*01a344a2SDavid du Colombier 	Dentry	*d;
519*01a344a2SDavid du Colombier 	Iobuf	*p;			/* the block containing *d */
520*01a344a2SDavid du Colombier 	int	uid;
521*01a344a2SDavid du Colombier 	Off	newsize;
522*01a344a2SDavid du Colombier 	Off	lastblk;		/* last data block of file to keep */
523*01a344a2SDavid du Colombier 
524*01a344a2SDavid du Colombier 	/* variables */
525*01a344a2SDavid du Colombier 	Off	relblk;			/* # of current data blk within file */
526*01a344a2SDavid du Colombier 	int	pastlast;		/* have we walked past lastblk? */
527*01a344a2SDavid du Colombier 	int	err;
528*01a344a2SDavid du Colombier } Truncstate;
529*01a344a2SDavid du Colombier 
530*01a344a2SDavid du Colombier /*
531*01a344a2SDavid du Colombier  * cw device
532*01a344a2SDavid du Colombier  */
533*01a344a2SDavid du Colombier 
534*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */
535*01a344a2SDavid du Colombier struct	Cache
536*01a344a2SDavid du Colombier {
537*01a344a2SDavid du Colombier 	Off	maddr;		/* cache map addr */
538*01a344a2SDavid du Colombier 	Off	msize;		/* cache map size in buckets */
539*01a344a2SDavid du Colombier 	Off	caddr;		/* cache addr */
540*01a344a2SDavid du Colombier 	Off	csize;		/* cache size */
541*01a344a2SDavid du Colombier 	Off	fsize;		/* current size of worm */
542*01a344a2SDavid du Colombier 	Off	wsize;		/* max size of the worm */
543*01a344a2SDavid du Colombier 	Off	wmax;		/* highwater write */
544*01a344a2SDavid du Colombier 
545*01a344a2SDavid du Colombier 	Off	sbaddr;		/* super block addr */
546*01a344a2SDavid du Colombier 	Off	cwraddr;	/* cw root addr */
547*01a344a2SDavid du Colombier 	Off	roraddr;	/* dump root addr */
548*01a344a2SDavid du Colombier 
549*01a344a2SDavid du Colombier 	Timet	toytime;	/* somewhere convienent */
550*01a344a2SDavid du Colombier 	Timet	time;
551*01a344a2SDavid du Colombier };
552*01a344a2SDavid du Colombier 
553*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */
554*01a344a2SDavid du Colombier struct	Bucket
555*01a344a2SDavid du Colombier {
556*01a344a2SDavid du Colombier 	long	agegen;		/* generator for ages in this bkt */
557*01a344a2SDavid du Colombier 	Centry	entry[CEPERBK];
558*01a344a2SDavid du Colombier };
559*01a344a2SDavid du Colombier 
560*01a344a2SDavid du Colombier /* DONT TOUCH, this is in disk structures */
561*01a344a2SDavid du Colombier enum { Labmagic = 0xfeedfacedeadbeefULL, };
562*01a344a2SDavid du Colombier 
563*01a344a2SDavid du Colombier /* DONT TOUCH, this is the disk structure */
564*01a344a2SDavid du Colombier typedef struct Label Label;
565*01a344a2SDavid du Colombier struct Label			/* label block on Devlworms, in last block */
566*01a344a2SDavid du Colombier {
567*01a344a2SDavid du Colombier 	uvlong	magic;
568*01a344a2SDavid du Colombier 	ushort	ord;		/* side number within Juke */
569*01a344a2SDavid du Colombier 	char	service[64];	/* documentation only */
570*01a344a2SDavid du Colombier };
571*01a344a2SDavid du Colombier 
572*01a344a2SDavid du Colombier typedef struct Map Map;
573*01a344a2SDavid du Colombier struct Map {
574*01a344a2SDavid du Colombier 	char	*from;
575*01a344a2SDavid du Colombier 	Device	*fdev;
576*01a344a2SDavid du Colombier 	char	*to;
577*01a344a2SDavid du Colombier 	Device	*tdev;
578*01a344a2SDavid du Colombier 	Map	*next;
579*01a344a2SDavid du Colombier };
580*01a344a2SDavid du Colombier 
581*01a344a2SDavid du Colombier /*
582*01a344a2SDavid du Colombier  * scsi i/o
583*01a344a2SDavid du Colombier  */
584*01a344a2SDavid du Colombier enum
585*01a344a2SDavid du Colombier {
586*01a344a2SDavid du Colombier 	SCSIread = 0,
587*01a344a2SDavid du Colombier 	SCSIwrite = 1,
588*01a344a2SDavid du Colombier };
589*01a344a2SDavid du Colombier 
590*01a344a2SDavid du Colombier /*
591*01a344a2SDavid du Colombier  * Process states
592*01a344a2SDavid du Colombier  */
593*01a344a2SDavid du Colombier enum
594*01a344a2SDavid du Colombier {
595*01a344a2SDavid du Colombier 	Dead = 0,
596*01a344a2SDavid du Colombier 	Moribund,
597*01a344a2SDavid du Colombier 	Zombie,
598*01a344a2SDavid du Colombier 	Ready,
599*01a344a2SDavid du Colombier 	Scheding,
600*01a344a2SDavid du Colombier 	Running,
601*01a344a2SDavid du Colombier 	Queueing,
602*01a344a2SDavid du Colombier 	Sending,
603*01a344a2SDavid du Colombier 	Recving,
604*01a344a2SDavid du Colombier 	MMUing,
605*01a344a2SDavid du Colombier 	Exiting,
606*01a344a2SDavid du Colombier 	Inwait,
607*01a344a2SDavid du Colombier 	Wakeme,
608*01a344a2SDavid du Colombier 	Broken,
609*01a344a2SDavid du Colombier };
610*01a344a2SDavid du Colombier 
611*01a344a2SDavid du Colombier /*
612*01a344a2SDavid du Colombier  * devnone block numbers
613*01a344a2SDavid du Colombier  */
614*01a344a2SDavid du Colombier enum
615*01a344a2SDavid du Colombier {
616*01a344a2SDavid du Colombier 	Cwio1	= 1,
617*01a344a2SDavid du Colombier 	Cwio2,
618*01a344a2SDavid du Colombier 	Cwxx1,
619*01a344a2SDavid du Colombier 	Cwxx2,
620*01a344a2SDavid du Colombier 	Cwxx3,
621*01a344a2SDavid du Colombier 	Cwxx4,
622*01a344a2SDavid du Colombier 	Cwdump1,
623*01a344a2SDavid du Colombier 	Cwdump2,
624*01a344a2SDavid du Colombier 	Cuidbuf,
625*01a344a2SDavid du Colombier 	Cckbuf,
626*01a344a2SDavid du Colombier };
627*01a344a2SDavid du Colombier 
628*01a344a2SDavid du Colombier /*
629*01a344a2SDavid du Colombier  * error codes generated from the file server
630*01a344a2SDavid du Colombier  */
631*01a344a2SDavid du Colombier enum
632*01a344a2SDavid du Colombier {
633*01a344a2SDavid du Colombier 	Ebadspc = 1,
634*01a344a2SDavid du Colombier 	Efid,
635*01a344a2SDavid du Colombier 	Echar,
636*01a344a2SDavid du Colombier 	Eopen,
637*01a344a2SDavid du Colombier 	Ecount,
638*01a344a2SDavid du Colombier 	Ealloc,
639*01a344a2SDavid du Colombier 	Eqid,
640*01a344a2SDavid du Colombier 	Eaccess,
641*01a344a2SDavid du Colombier 	Eentry,
642*01a344a2SDavid du Colombier 	Emode,
643*01a344a2SDavid du Colombier 	Edir1,
644*01a344a2SDavid du Colombier 	Edir2,
645*01a344a2SDavid du Colombier 	Ephase,
646*01a344a2SDavid du Colombier 	Eexist,
647*01a344a2SDavid du Colombier 	Edot,
648*01a344a2SDavid du Colombier 	Eempty,
649*01a344a2SDavid du Colombier 	Ebadu,
650*01a344a2SDavid du Colombier 	Enoattach,
651*01a344a2SDavid du Colombier 	Ewstatb,
652*01a344a2SDavid du Colombier 	Ewstatd,
653*01a344a2SDavid du Colombier 	Ewstatg,
654*01a344a2SDavid du Colombier 	Ewstatl,
655*01a344a2SDavid du Colombier 	Ewstatm,
656*01a344a2SDavid du Colombier 	Ewstato,
657*01a344a2SDavid du Colombier 	Ewstatp,
658*01a344a2SDavid du Colombier 	Ewstatq,
659*01a344a2SDavid du Colombier 	Ewstatu,
660*01a344a2SDavid du Colombier 	Ewstatv,
661*01a344a2SDavid du Colombier 	Ename,
662*01a344a2SDavid du Colombier 	Ewalk,
663*01a344a2SDavid du Colombier 	Eronly,
664*01a344a2SDavid du Colombier 	Efull,
665*01a344a2SDavid du Colombier 	Eoffset,
666*01a344a2SDavid du Colombier 	Elocked,
667*01a344a2SDavid du Colombier 	Ebroken,
668*01a344a2SDavid du Colombier 	Eauth,
669*01a344a2SDavid du Colombier 	Eauth2,
670*01a344a2SDavid du Colombier 	Efidinuse,
671*01a344a2SDavid du Colombier 	Etoolong,
672*01a344a2SDavid du Colombier 	Econvert,
673*01a344a2SDavid du Colombier 	Eversion,
674*01a344a2SDavid du Colombier 	Eauthdisabled,
675*01a344a2SDavid du Colombier 	Eauthnone,
676*01a344a2SDavid du Colombier 	Eauthfile,
677*01a344a2SDavid du Colombier 	Eedge,
678*01a344a2SDavid du Colombier 	MAXERR
679*01a344a2SDavid du Colombier };
680*01a344a2SDavid du Colombier 
681*01a344a2SDavid du Colombier /*
682*01a344a2SDavid du Colombier  * device types
683*01a344a2SDavid du Colombier  */
684*01a344a2SDavid du Colombier enum
685*01a344a2SDavid du Colombier {
686*01a344a2SDavid du Colombier 	Devnone	= 0,
687*01a344a2SDavid du Colombier 	Devcon,			/* console */
688*01a344a2SDavid du Colombier 	Devwren,		/* disk drive */
689*01a344a2SDavid du Colombier 	Devworm,		/* scsi optical drive */
690*01a344a2SDavid du Colombier 	Devlworm,		/* scsi optical drive (labeled) */
691*01a344a2SDavid du Colombier 	Devfworm,		/* fake read-only device */
692*01a344a2SDavid du Colombier 	Devjuke,		/* scsi jukebox */
693*01a344a2SDavid du Colombier 	Devcw,			/* cache with worm */
694*01a344a2SDavid du Colombier 	Devro,			/* readonly worm */
695*01a344a2SDavid du Colombier 	Devmcat,		/* multiple cat devices */
696*01a344a2SDavid du Colombier 	Devmlev,		/* multiple interleave devices */
697*01a344a2SDavid du Colombier 	Devnet,			/* network connection */
698*01a344a2SDavid du Colombier 	Devpart,		/* partition */
699*01a344a2SDavid du Colombier 	Devfloppy,		/* floppy drive */
700*01a344a2SDavid du Colombier 	Devswab,		/* swab data between mem and device */
701*01a344a2SDavid du Colombier 	Devmirr,		/* mirror devices */
702*01a344a2SDavid du Colombier 	MAXDEV
703*01a344a2SDavid du Colombier };
704*01a344a2SDavid du Colombier 
705*01a344a2SDavid du Colombier /*
706*01a344a2SDavid du Colombier  * tags on block
707*01a344a2SDavid du Colombier  */
708*01a344a2SDavid du Colombier /* DONT TOUCH, this is in disk structures */
709*01a344a2SDavid du Colombier /* also, the order from Tdir to Tmaxind is exploited in indirck() & isdirty() */
710*01a344a2SDavid du Colombier enum
711*01a344a2SDavid du Colombier {
712*01a344a2SDavid du Colombier 	Tnone		= 0,
713*01a344a2SDavid du Colombier 	Tsuper,			/* the super block */
714*01a344a2SDavid du Colombier #ifdef COMPAT32
715*01a344a2SDavid du Colombier 	Tdir,			/* directory contents */
716*01a344a2SDavid du Colombier 	Tind1,			/* points to blocks */
717*01a344a2SDavid du Colombier 	Tind2,			/* points to Tind1 */
718*01a344a2SDavid du Colombier #else
719*01a344a2SDavid du Colombier 	Tdirold,
720*01a344a2SDavid du Colombier 	Tind1old,
721*01a344a2SDavid du Colombier 	Tind2old,
722*01a344a2SDavid du Colombier #endif
723*01a344a2SDavid du Colombier 	Tfile,			/* file contents; also defined in disk.h */
724*01a344a2SDavid du Colombier 	Tfree,			/* in free list */
725*01a344a2SDavid du Colombier 	Tbuck,			/* cache fs bucket */
726*01a344a2SDavid du Colombier 	Tvirgo,			/* fake worm virgin bits */
727*01a344a2SDavid du Colombier 	Tcache,			/* cw cache things */
728*01a344a2SDavid du Colombier 	Tconfig,		/* configuration block */
729*01a344a2SDavid du Colombier #ifndef COMPAT32
730*01a344a2SDavid du Colombier 	/* Tdir & indirect blocks are last, to allow for greater depth */
731*01a344a2SDavid du Colombier 	Tdir,			/* directory contents */
732*01a344a2SDavid du Colombier 	Tind1,			/* points to blocks */
733*01a344a2SDavid du Colombier 	Tind2,			/* points to Tind1 */
734*01a344a2SDavid du Colombier 	Tind3,			/* points to Tind2 */
735*01a344a2SDavid du Colombier 	Tind4,			/* points to Tind3 */
736*01a344a2SDavid du Colombier 	Maxtind,
737*01a344a2SDavid du Colombier #endif
738*01a344a2SDavid du Colombier 	/* gap for more indirect block depth in future */
739*01a344a2SDavid du Colombier 	Tlabel = 32,		/* Devlworm label in last block */
740*01a344a2SDavid du Colombier 	MAXTAG,
741*01a344a2SDavid du Colombier 
742*01a344a2SDavid du Colombier #ifdef COMPAT32
743*01a344a2SDavid du Colombier 	Tmaxind = Tind2,
744*01a344a2SDavid du Colombier #else
745*01a344a2SDavid du Colombier 	Tmaxind = Maxtind - 1,
746*01a344a2SDavid du Colombier #endif
747*01a344a2SDavid du Colombier };
748*01a344a2SDavid du Colombier 
749*01a344a2SDavid du Colombier /*
750*01a344a2SDavid du Colombier  * flags to getbuf
751*01a344a2SDavid du Colombier  */
752*01a344a2SDavid du Colombier enum
753*01a344a2SDavid du Colombier {
754*01a344a2SDavid du Colombier 	Brd	= (1<<0),	/* read the block if miss */
755*01a344a2SDavid du Colombier 	Bprobe	= (1<<1),	/* return null if miss */
756*01a344a2SDavid du Colombier 	Bmod	= (1<<2),	/* buffer is dirty, needs writing */
757*01a344a2SDavid du Colombier 	Bimm	= (1<<3),	/* write immediately on putbuf */
758*01a344a2SDavid du Colombier 	Bres	= (1<<4),	/* reserved, never renamed */
759*01a344a2SDavid du Colombier };
760*01a344a2SDavid du Colombier 
761*01a344a2SDavid du Colombier Conf	conf;
762*01a344a2SDavid du Colombier Cons	cons;
763*01a344a2SDavid du Colombier 
764*01a344a2SDavid du Colombier #pragma	varargck	type	"Z"	Device*
765*01a344a2SDavid du Colombier #pragma	varargck	type	"T"	Timet
766*01a344a2SDavid du Colombier #pragma	varargck	type	"I"	uchar*
767*01a344a2SDavid du Colombier #pragma	varargck	type	"E"	uchar*
768*01a344a2SDavid du Colombier #pragma	varargck	type	"G"	int
769*01a344a2SDavid du Colombier 
770*01a344a2SDavid du Colombier extern char	*annstrs[];
771*01a344a2SDavid du Colombier extern Biobuf	bin;
772*01a344a2SDavid du Colombier extern Map	*devmap;
773*01a344a2SDavid du Colombier extern int	(*fsprotocol[])(Msgbuf*);
774