diff options
author | Latchesar Ionkov <lucho@ionkov.net> | 2007-07-10 18:57:28 -0400 |
---|---|---|
committer | Eric Van Hensbergen <ericvh@ericvh-desktop.austin.ibm.com> | 2007-07-14 16:13:40 -0400 |
commit | bd238fb431f31989898423c8b6496bc8c4204a86 (patch) | |
tree | f85a536383cbf360125ecb0592f6c515e0ecf0ff /include/net/9p/9p.h | |
parent | 8d9107e8c50e1c4ff43c91c8841805833f3ecfb9 (diff) |
9p: Reorganization of 9p file system code
This patchset moves non-filesystem interfaces of v9fs from fs/9p to net/9p.
It moves the transport, packet marshalling and connection layers to net/9p
leaving only the VFS related files in fs/9p. This work is being done in
preparation for in-kernel 9p servers as well as alternate 9p clients (other
than VFS).
Signed-off-by: Latchesar Ionkov <lucho@ionkov.net>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Diffstat (limited to 'include/net/9p/9p.h')
-rw-r--r-- | include/net/9p/9p.h | 417 |
1 files changed, 417 insertions, 0 deletions
diff --git a/include/net/9p/9p.h b/include/net/9p/9p.h new file mode 100644 index 000000000000..88884d39f28f --- /dev/null +++ b/include/net/9p/9p.h | |||
@@ -0,0 +1,417 @@ | |||
1 | /* | ||
2 | * include/net/9p/9p.h | ||
3 | * | ||
4 | * 9P protocol definitions. | ||
5 | * | ||
6 | * Copyright (C) 2005 by Latchesar Ionkov <lucho@ionkov.net> | ||
7 | * Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com> | ||
8 | * Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 | ||
12 | * as published by the Free Software Foundation. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to: | ||
21 | * Free Software Foundation | ||
22 | * 51 Franklin Street, Fifth Floor | ||
23 | * Boston, MA 02111-1301 USA | ||
24 | * | ||
25 | */ | ||
26 | |||
27 | #ifndef NET_9P_H | ||
28 | #define NET_9P_H | ||
29 | |||
30 | #ifdef CONFIG_NET_9P_DEBUG | ||
31 | |||
32 | #define P9_DEBUG_ERROR (1<<0) | ||
33 | #define P9_DEBUG_9P (1<<2) | ||
34 | #define P9_DEBUG_VFS (1<<3) | ||
35 | #define P9_DEBUG_CONV (1<<4) | ||
36 | #define P9_DEBUG_MUX (1<<5) | ||
37 | #define P9_DEBUG_TRANS (1<<6) | ||
38 | #define P9_DEBUG_SLABS (1<<7) | ||
39 | #define P9_DEBUG_FCALL (1<<8) | ||
40 | |||
41 | extern unsigned int p9_debug_level; | ||
42 | |||
43 | #define P9_DPRINTK(level, format, arg...) \ | ||
44 | do { \ | ||
45 | if ((p9_debug_level & level) == level) \ | ||
46 | printk(KERN_NOTICE "-- %s (%d): " \ | ||
47 | format , __FUNCTION__, current->pid , ## arg); \ | ||
48 | } while (0) | ||
49 | |||
50 | #define PRINT_FCALL_ERROR(s, fcall) P9_DPRINTK(P9_DEBUG_ERROR, \ | ||
51 | "%s: %.*s\n", s, fcall?fcall->params.rerror.error.len:0, \ | ||
52 | fcall?fcall->params.rerror.error.str:""); | ||
53 | |||
54 | #else | ||
55 | #define P9_DPRINTK(level, format, arg...) do { } while (0) | ||
56 | #define PRINT_FCALL_ERROR(s, fcall) do { } while (0) | ||
57 | #endif | ||
58 | |||
59 | #define P9_EPRINTK(level, format, arg...) \ | ||
60 | do { \ | ||
61 | printk(level "9p: %s (%d): " \ | ||
62 | format , __FUNCTION__, current->pid , ## arg); \ | ||
63 | } while (0) | ||
64 | |||
65 | |||
66 | /* Message Types */ | ||
67 | enum { | ||
68 | P9_TVERSION = 100, | ||
69 | P9_RVERSION, | ||
70 | P9_TAUTH = 102, | ||
71 | P9_RAUTH, | ||
72 | P9_TATTACH = 104, | ||
73 | P9_RATTACH, | ||
74 | P9_TERROR = 106, | ||
75 | P9_RERROR, | ||
76 | P9_TFLUSH = 108, | ||
77 | P9_RFLUSH, | ||
78 | P9_TWALK = 110, | ||
79 | P9_RWALK, | ||
80 | P9_TOPEN = 112, | ||
81 | P9_ROPEN, | ||
82 | P9_TCREATE = 114, | ||
83 | P9_RCREATE, | ||
84 | P9_TREAD = 116, | ||
85 | P9_RREAD, | ||
86 | P9_TWRITE = 118, | ||
87 | P9_RWRITE, | ||
88 | P9_TCLUNK = 120, | ||
89 | P9_RCLUNK, | ||
90 | P9_TREMOVE = 122, | ||
91 | P9_RREMOVE, | ||
92 | P9_TSTAT = 124, | ||
93 | P9_RSTAT, | ||
94 | P9_TWSTAT = 126, | ||
95 | P9_RWSTAT, | ||
96 | }; | ||
97 | |||
98 | /* open modes */ | ||
99 | enum { | ||
100 | P9_OREAD = 0x00, | ||
101 | P9_OWRITE = 0x01, | ||
102 | P9_ORDWR = 0x02, | ||
103 | P9_OEXEC = 0x03, | ||
104 | P9_OEXCL = 0x04, | ||
105 | P9_OTRUNC = 0x10, | ||
106 | P9_OREXEC = 0x20, | ||
107 | P9_ORCLOSE = 0x40, | ||
108 | P9_OAPPEND = 0x80, | ||
109 | }; | ||
110 | |||
111 | /* permissions */ | ||
112 | enum { | ||
113 | P9_DMDIR = 0x80000000, | ||
114 | P9_DMAPPEND = 0x40000000, | ||
115 | P9_DMEXCL = 0x20000000, | ||
116 | P9_DMMOUNT = 0x10000000, | ||
117 | P9_DMAUTH = 0x08000000, | ||
118 | P9_DMTMP = 0x04000000, | ||
119 | P9_DMSYMLINK = 0x02000000, | ||
120 | P9_DMLINK = 0x01000000, | ||
121 | /* 9P2000.u extensions */ | ||
122 | P9_DMDEVICE = 0x00800000, | ||
123 | P9_DMNAMEDPIPE = 0x00200000, | ||
124 | P9_DMSOCKET = 0x00100000, | ||
125 | P9_DMSETUID = 0x00080000, | ||
126 | P9_DMSETGID = 0x00040000, | ||
127 | }; | ||
128 | |||
129 | /* qid.types */ | ||
130 | enum { | ||
131 | P9_QTDIR = 0x80, | ||
132 | P9_QTAPPEND = 0x40, | ||
133 | P9_QTEXCL = 0x20, | ||
134 | P9_QTMOUNT = 0x10, | ||
135 | P9_QTAUTH = 0x08, | ||
136 | P9_QTTMP = 0x04, | ||
137 | P9_QTSYMLINK = 0x02, | ||
138 | P9_QTLINK = 0x01, | ||
139 | P9_QTFILE = 0x00, | ||
140 | }; | ||
141 | |||
142 | #define P9_NOTAG (u16)(~0) | ||
143 | #define P9_NOFID (u32)(~0) | ||
144 | #define P9_MAXWELEM 16 | ||
145 | |||
146 | /* ample room for Twrite/Rread header */ | ||
147 | #define P9_IOHDRSZ 24 | ||
148 | |||
149 | struct p9_str { | ||
150 | u16 len; | ||
151 | char *str; | ||
152 | }; | ||
153 | |||
154 | /* qids are the unique ID for a file (like an inode */ | ||
155 | struct p9_qid { | ||
156 | u8 type; | ||
157 | u32 version; | ||
158 | u64 path; | ||
159 | }; | ||
160 | |||
161 | /* Plan 9 file metadata (stat) structure */ | ||
162 | struct p9_stat { | ||
163 | u16 size; | ||
164 | u16 type; | ||
165 | u32 dev; | ||
166 | struct p9_qid qid; | ||
167 | u32 mode; | ||
168 | u32 atime; | ||
169 | u32 mtime; | ||
170 | u64 length; | ||
171 | struct p9_str name; | ||
172 | struct p9_str uid; | ||
173 | struct p9_str gid; | ||
174 | struct p9_str muid; | ||
175 | struct p9_str extension; /* 9p2000.u extensions */ | ||
176 | u32 n_uid; /* 9p2000.u extensions */ | ||
177 | u32 n_gid; /* 9p2000.u extensions */ | ||
178 | u32 n_muid; /* 9p2000.u extensions */ | ||
179 | }; | ||
180 | |||
181 | /* file metadata (stat) structure used to create Twstat message | ||
182 | The is similar to p9_stat, but the strings don't point to | ||
183 | the same memory block and should be freed separately | ||
184 | */ | ||
185 | struct p9_wstat { | ||
186 | u16 size; | ||
187 | u16 type; | ||
188 | u32 dev; | ||
189 | struct p9_qid qid; | ||
190 | u32 mode; | ||
191 | u32 atime; | ||
192 | u32 mtime; | ||
193 | u64 length; | ||
194 | char *name; | ||
195 | char *uid; | ||
196 | char *gid; | ||
197 | char *muid; | ||
198 | char *extension; /* 9p2000.u extensions */ | ||
199 | u32 n_uid; /* 9p2000.u extensions */ | ||
200 | u32 n_gid; /* 9p2000.u extensions */ | ||
201 | u32 n_muid; /* 9p2000.u extensions */ | ||
202 | }; | ||
203 | |||
204 | /* Structures for Protocol Operations */ | ||
205 | struct p9_tversion { | ||
206 | u32 msize; | ||
207 | struct p9_str version; | ||
208 | }; | ||
209 | |||
210 | struct p9_rversion { | ||
211 | u32 msize; | ||
212 | struct p9_str version; | ||
213 | }; | ||
214 | |||
215 | struct p9_tauth { | ||
216 | u32 afid; | ||
217 | struct p9_str uname; | ||
218 | struct p9_str aname; | ||
219 | }; | ||
220 | |||
221 | struct p9_rauth { | ||
222 | struct p9_qid qid; | ||
223 | }; | ||
224 | |||
225 | struct p9_rerror { | ||
226 | struct p9_str error; | ||
227 | u32 errno; /* 9p2000.u extension */ | ||
228 | }; | ||
229 | |||
230 | struct p9_tflush { | ||
231 | u16 oldtag; | ||
232 | }; | ||
233 | |||
234 | struct p9_rflush { | ||
235 | }; | ||
236 | |||
237 | struct p9_tattach { | ||
238 | u32 fid; | ||
239 | u32 afid; | ||
240 | struct p9_str uname; | ||
241 | struct p9_str aname; | ||
242 | }; | ||
243 | |||
244 | struct p9_rattach { | ||
245 | struct p9_qid qid; | ||
246 | }; | ||
247 | |||
248 | struct p9_twalk { | ||
249 | u32 fid; | ||
250 | u32 newfid; | ||
251 | u16 nwname; | ||
252 | struct p9_str wnames[16]; | ||
253 | }; | ||
254 | |||
255 | struct p9_rwalk { | ||
256 | u16 nwqid; | ||
257 | struct p9_qid wqids[16]; | ||
258 | }; | ||
259 | |||
260 | struct p9_topen { | ||
261 | u32 fid; | ||
262 | u8 mode; | ||
263 | }; | ||
264 | |||
265 | struct p9_ropen { | ||
266 | struct p9_qid qid; | ||
267 | u32 iounit; | ||
268 | }; | ||
269 | |||
270 | struct p9_tcreate { | ||
271 | u32 fid; | ||
272 | struct p9_str name; | ||
273 | u32 perm; | ||
274 | u8 mode; | ||
275 | struct p9_str extension; | ||
276 | }; | ||
277 | |||
278 | struct p9_rcreate { | ||
279 | struct p9_qid qid; | ||
280 | u32 iounit; | ||
281 | }; | ||
282 | |||
283 | struct p9_tread { | ||
284 | u32 fid; | ||
285 | u64 offset; | ||
286 | u32 count; | ||
287 | }; | ||
288 | |||
289 | struct p9_rread { | ||
290 | u32 count; | ||
291 | u8 *data; | ||
292 | }; | ||
293 | |||
294 | struct p9_twrite { | ||
295 | u32 fid; | ||
296 | u64 offset; | ||
297 | u32 count; | ||
298 | u8 *data; | ||
299 | }; | ||
300 | |||
301 | struct p9_rwrite { | ||
302 | u32 count; | ||
303 | }; | ||
304 | |||
305 | struct p9_tclunk { | ||
306 | u32 fid; | ||
307 | }; | ||
308 | |||
309 | struct p9_rclunk { | ||
310 | }; | ||
311 | |||
312 | struct p9_tremove { | ||
313 | u32 fid; | ||
314 | }; | ||
315 | |||
316 | struct p9_rremove { | ||
317 | }; | ||
318 | |||
319 | struct p9_tstat { | ||
320 | u32 fid; | ||
321 | }; | ||
322 | |||
323 | struct p9_rstat { | ||
324 | struct p9_stat stat; | ||
325 | }; | ||
326 | |||
327 | struct p9_twstat { | ||
328 | u32 fid; | ||
329 | struct p9_stat stat; | ||
330 | }; | ||
331 | |||
332 | struct p9_rwstat { | ||
333 | }; | ||
334 | |||
335 | /* | ||
336 | * fcall is the primary packet structure | ||
337 | * | ||
338 | */ | ||
339 | |||
340 | struct p9_fcall { | ||
341 | u32 size; | ||
342 | u8 id; | ||
343 | u16 tag; | ||
344 | void *sdata; | ||
345 | |||
346 | union { | ||
347 | struct p9_tversion tversion; | ||
348 | struct p9_rversion rversion; | ||
349 | struct p9_tauth tauth; | ||
350 | struct p9_rauth rauth; | ||
351 | struct p9_rerror rerror; | ||
352 | struct p9_tflush tflush; | ||
353 | struct p9_rflush rflush; | ||
354 | struct p9_tattach tattach; | ||
355 | struct p9_rattach rattach; | ||
356 | struct p9_twalk twalk; | ||
357 | struct p9_rwalk rwalk; | ||
358 | struct p9_topen topen; | ||
359 | struct p9_ropen ropen; | ||
360 | struct p9_tcreate tcreate; | ||
361 | struct p9_rcreate rcreate; | ||
362 | struct p9_tread tread; | ||
363 | struct p9_rread rread; | ||
364 | struct p9_twrite twrite; | ||
365 | struct p9_rwrite rwrite; | ||
366 | struct p9_tclunk tclunk; | ||
367 | struct p9_rclunk rclunk; | ||
368 | struct p9_tremove tremove; | ||
369 | struct p9_rremove rremove; | ||
370 | struct p9_tstat tstat; | ||
371 | struct p9_rstat rstat; | ||
372 | struct p9_twstat twstat; | ||
373 | struct p9_rwstat rwstat; | ||
374 | } params; | ||
375 | }; | ||
376 | |||
377 | struct p9_idpool; | ||
378 | |||
379 | int p9_deserialize_stat(void *buf, u32 buflen, struct p9_stat *stat, | ||
380 | int dotu); | ||
381 | int p9_deserialize_fcall(void *buf, u32 buflen, struct p9_fcall *fc, int dotu); | ||
382 | void p9_set_tag(struct p9_fcall *fc, u16 tag); | ||
383 | struct p9_fcall *p9_create_tversion(u32 msize, char *version); | ||
384 | struct p9_fcall *p9_create_tattach(u32 fid, u32 afid, char *uname, | ||
385 | char *aname); | ||
386 | struct p9_fcall *p9_create_tauth(u32 afid, char *uname, char *aname); | ||
387 | struct p9_fcall *p9_create_tflush(u16 oldtag); | ||
388 | struct p9_fcall *p9_create_twalk(u32 fid, u32 newfid, u16 nwname, | ||
389 | char **wnames); | ||
390 | struct p9_fcall *p9_create_topen(u32 fid, u8 mode); | ||
391 | struct p9_fcall *p9_create_tcreate(u32 fid, char *name, u32 perm, u8 mode, | ||
392 | char *extension, int dotu); | ||
393 | struct p9_fcall *p9_create_tread(u32 fid, u64 offset, u32 count); | ||
394 | struct p9_fcall *p9_create_twrite(u32 fid, u64 offset, u32 count, | ||
395 | const char *data); | ||
396 | struct p9_fcall *p9_create_twrite_u(u32 fid, u64 offset, u32 count, | ||
397 | const char __user *data); | ||
398 | struct p9_fcall *p9_create_tclunk(u32 fid); | ||
399 | struct p9_fcall *p9_create_tremove(u32 fid); | ||
400 | struct p9_fcall *p9_create_tstat(u32 fid); | ||
401 | struct p9_fcall *p9_create_twstat(u32 fid, struct p9_wstat *wstat, | ||
402 | int dotu); | ||
403 | |||
404 | int p9_printfcall(char *buf, int buflen, struct p9_fcall *fc, int dotu); | ||
405 | int p9_errstr2errno(char *errstr, int len); | ||
406 | |||
407 | struct p9_idpool *p9_idpool_create(void); | ||
408 | void p9_idpool_destroy(struct p9_idpool *); | ||
409 | int p9_idpool_get(struct p9_idpool *p); | ||
410 | void p9_idpool_put(int id, struct p9_idpool *p); | ||
411 | int p9_idpool_check(int id, struct p9_idpool *p); | ||
412 | |||
413 | int p9_error_init(void); | ||
414 | int p9_errstr2errno(char *, int); | ||
415 | int __init p9_sysctl_register(void); | ||
416 | void __exit p9_sysctl_unregister(void); | ||
417 | #endif /* NET_9P_H */ | ||