xref: /plan9-contrib/sys/src/cmd/fscfs/dat.h (revision 4366bb713c6d061e46ce8907c3b6797dc3f83d93)
1*4366bb71SDavid du Colombier /*
2*4366bb71SDavid du Colombier  * fscfs
3*4366bb71SDavid du Colombier  */
4*4366bb71SDavid du Colombier 
5*4366bb71SDavid du Colombier typedef struct Attach Attach;
6*4366bb71SDavid du Colombier typedef struct Auth Auth;
7*4366bb71SDavid du Colombier typedef struct Data Data;
8*4366bb71SDavid du Colombier typedef struct Dref Dref;
9*4366bb71SDavid du Colombier typedef struct Fid Fid;
10*4366bb71SDavid du Colombier typedef struct File File;
11*4366bb71SDavid du Colombier typedef struct Host Host;
12*4366bb71SDavid du Colombier typedef struct Path Path;
13*4366bb71SDavid du Colombier typedef struct P9fs P9fs;
14*4366bb71SDavid du Colombier typedef struct Req Req;
15*4366bb71SDavid du Colombier typedef struct SFid SFid;
16*4366bb71SDavid du Colombier typedef struct String String;
17*4366bb71SDavid du Colombier 
18*4366bb71SDavid du Colombier #pragma incomplete P9fs
19*4366bb71SDavid du Colombier 
20*4366bb71SDavid du Colombier typedef u32int Tag;
21*4366bb71SDavid du Colombier 
22*4366bb71SDavid du Colombier struct String
23*4366bb71SDavid du Colombier {
24*4366bb71SDavid du Colombier 	Ref;
25*4366bb71SDavid du Colombier 	int	len;
26*4366bb71SDavid du Colombier 	char*	s;
27*4366bb71SDavid du Colombier 	String*	next;	/* hash chain */
28*4366bb71SDavid du Colombier };
29*4366bb71SDavid du Colombier 
30*4366bb71SDavid du Colombier struct Dref
31*4366bb71SDavid du Colombier {
32*4366bb71SDavid du Colombier 	int	inuse;	/* reference count locally */
33*4366bb71SDavid du Colombier 	int	faruse;	/* remote references */
34*4366bb71SDavid du Colombier 	Tag	tag;	/* remote object tag */
35*4366bb71SDavid du Colombier 	Host*	loc;	/* location of object (nil if here) */
36*4366bb71SDavid du Colombier 	Host*	src;	/* source of object reference (nil if here) */
37*4366bb71SDavid du Colombier 	int	depth;	/* 0 if here or loc == src */
38*4366bb71SDavid du Colombier 	int	weight;	/* proxy weight */
39*4366bb71SDavid du Colombier };
40*4366bb71SDavid du Colombier 
41*4366bb71SDavid du Colombier enum{
42*4366bb71SDavid du Colombier 	FidHash=	1<<8,
43*4366bb71SDavid du Colombier };
44*4366bb71SDavid du Colombier 
45*4366bb71SDavid du Colombier struct Attach
46*4366bb71SDavid du Colombier {
47*4366bb71SDavid du Colombier 	/* parameters and result of a Tattach */
48*4366bb71SDavid du Colombier 	u32int	fid;
49*4366bb71SDavid du Colombier 	char*	uname;
50*4366bb71SDavid du Colombier 	char*	aname;
51*4366bb71SDavid du Colombier 	Path*	root;	/* qid from attach is root->qid, root->sfid is server fid */
52*4366bb71SDavid du Colombier 	Attach*	next;
53*4366bb71SDavid du Colombier };
54*4366bb71SDavid du Colombier 
55*4366bb71SDavid du Colombier struct Auth
56*4366bb71SDavid du Colombier {
57*4366bb71SDavid du Colombier 	/* could probably use a Ref */
58*4366bb71SDavid du Colombier 	SFid*	afid;
59*4366bb71SDavid du Colombier 	char*	uname;
60*4366bb71SDavid du Colombier 	char*	aname;
61*4366bb71SDavid du Colombier 	char*	error;
62*4366bb71SDavid du Colombier 	Auth*	next;
63*4366bb71SDavid du Colombier 	int	active;	/* active until attached, with or without success */
64*4366bb71SDavid du Colombier 	Req*	pending;	/* later Auth requests with same parameters, and flush requests */
65*4366bb71SDavid du Colombier };
66*4366bb71SDavid du Colombier 
67*4366bb71SDavid du Colombier struct Host
68*4366bb71SDavid du Colombier {
69*4366bb71SDavid du Colombier 	Ref;
70*4366bb71SDavid du Colombier 
71*4366bb71SDavid du Colombier 	QLock;
72*4366bb71SDavid du Colombier 	int	fd;	/* link to host */
73*4366bb71SDavid du Colombier 	char*	name;	/* symbolic name (mainly for diagnostics) */
74*4366bb71SDavid du Colombier 	Fid*	fids[FidHash];	/* fids active for this host */
75*4366bb71SDavid du Colombier 	/* might need per-host auth/attach fid/afid for authentication? */
76*4366bb71SDavid du Colombier 	/* implies separation of fid spaces, and thus separate Fids but not Files and Paths */
77*4366bb71SDavid du Colombier };
78*4366bb71SDavid du Colombier 
79*4366bb71SDavid du Colombier struct Path
80*4366bb71SDavid du Colombier {
81*4366bb71SDavid du Colombier 	Ref;
82*4366bb71SDavid du Colombier 	char*	name;
83*4366bb71SDavid du Colombier 	Qid	qid;
84*4366bb71SDavid du Colombier 	Path*	parent;
85*4366bb71SDavid du Colombier 	Path*	child;
86*4366bb71SDavid du Colombier 	Path*	next;	/* sibling */
87*4366bb71SDavid du Colombier 	uint	nxtime;	/* zero (if exists) or last time we checked */
88*4366bb71SDavid du Colombier 	char*	inval;	/* walk error if invalid */
89*4366bb71SDavid du Colombier 	File*	file;		/* file data, if open */
90*4366bb71SDavid du Colombier 	SFid*	sfid;	/* walked to this fid on server */
91*4366bb71SDavid du Colombier };
92*4366bb71SDavid du Colombier 
93*4366bb71SDavid du Colombier struct Data
94*4366bb71SDavid du Colombier {
95*4366bb71SDavid du Colombier 	/* cached portion of a file */
96*4366bb71SDavid du Colombier 	uint	min;		/* offsets */
97*4366bb71SDavid du Colombier 	uint	max;
98*4366bb71SDavid du Colombier 	uint	size;			/* size of buffer (power of 2) */
99*4366bb71SDavid du Colombier 	uchar*	base;
100*4366bb71SDavid du Colombier 
101*4366bb71SDavid du Colombier 	/* LRU stuff */
102*4366bb71SDavid du Colombier 	Data*	forw;
103*4366bb71SDavid du Colombier 	Data*	back;
104*4366bb71SDavid du Colombier 	File*	owner;
105*4366bb71SDavid du Colombier 	uint	n;		/* index in owner's cache */
106*4366bb71SDavid du Colombier };
107*4366bb71SDavid du Colombier 
108*4366bb71SDavid du Colombier struct SFid
109*4366bb71SDavid du Colombier {
110*4366bb71SDavid du Colombier 	Ref;			/* by client fids */
111*4366bb71SDavid du Colombier 	u32int	fid;	/* fid on server */
112*4366bb71SDavid du Colombier 	SFid*	next;	/* on free or LRU list */
113*4366bb71SDavid du Colombier };
114*4366bb71SDavid du Colombier 
115*4366bb71SDavid du Colombier struct Fid
116*4366bb71SDavid du Colombier {
117*4366bb71SDavid du Colombier 	u32int	fid;		/* fid on Host */
118*4366bb71SDavid du Colombier 	Qid	qid;
119*4366bb71SDavid du Colombier 	Path*	path;		/* shared data about file */
120*4366bb71SDavid du Colombier 	SFid*	opened;	/* server fid once opened */
121*4366bb71SDavid du Colombier 	uint	mode;	/* open mode (OREAD, OWRITE, ORDWR) */
122*4366bb71SDavid du Colombier 	Fid*	next;	/* in fid hash list */
123*4366bb71SDavid du Colombier };
124*4366bb71SDavid du Colombier 
125*4366bb71SDavid du Colombier struct File
126*4366bb71SDavid du Colombier {
127*4366bb71SDavid du Colombier 	Ref;
128*4366bb71SDavid du Colombier 
129*4366bb71SDavid du Colombier 	SFid*	open[3];	/* cached sfids: OREAD, OWRITE, ORDWR */
130*4366bb71SDavid du Colombier 
131*4366bb71SDavid du Colombier 	/* data from Dir */
132*4366bb71SDavid du Colombier 	uint	mode;	/* permissions */
133*4366bb71SDavid du Colombier 	uint	atime;	/* last read time */
134*4366bb71SDavid du Colombier 	uint	mtime;	/* last write time */
135*4366bb71SDavid du Colombier 	u64int	length;	/* file length from stat or 0 => use clength */
136*4366bb71SDavid du Colombier 	String*	uid;	/* owner name */
137*4366bb71SDavid du Colombier 	String*	gid;	/* group name */
138*4366bb71SDavid du Colombier 	String*	muid;	/* last modifier name */
139*4366bb71SDavid du Colombier 
140*4366bb71SDavid du Colombier 	Qid	qid;
141*4366bb71SDavid du Colombier 	u32int	iounit;
142*4366bb71SDavid du Colombier 	u64int	clength;	/* known length in cache */
143*4366bb71SDavid du Colombier 	uint	ndata;	/* size of cache array */
144*4366bb71SDavid du Colombier 	Data**	cached;
145*4366bb71SDavid du Colombier 
146*4366bb71SDavid du Colombier 	/* Dref for local and remote references */
147*4366bb71SDavid du Colombier 	/* possibly put expired ones on LRU? */
148*4366bb71SDavid du Colombier 	File*	next;
149*4366bb71SDavid du Colombier };
150*4366bb71SDavid du Colombier 
151*4366bb71SDavid du Colombier struct Req
152*4366bb71SDavid du Colombier {
153*4366bb71SDavid du Colombier 	u32int	tag;
154*4366bb71SDavid du Colombier 	Fcall	t;
155*4366bb71SDavid du Colombier 	SFid*	fid;	/* also afid in Tauth */
156*4366bb71SDavid du Colombier 	SFid*	newfid;	/* also afid in Tattach */
157*4366bb71SDavid du Colombier 	Fcall	r;
158*4366bb71SDavid du Colombier 	uchar*	buf;
159*4366bb71SDavid du Colombier 	uint	msize;
160*4366bb71SDavid du Colombier 	Req*	flush;
161*4366bb71SDavid du Colombier 	Req*	next;	/* in tag list, or flush list of another Req */
162*4366bb71SDavid du Colombier };
163