1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * 9P protocol definitions. |
4 | * |
5 | * Copyright (C) 2005 by Latchesar Ionkov <lucho@ionkov.net> |
6 | * Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com> |
7 | * Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov> |
8 | */ |
9 | |
10 | #ifndef NET_9P_H |
11 | #define NET_9P_H |
12 | |
13 | /** |
14 | * enum p9_debug_flags - bits for mount time debug parameter |
15 | * @P9_DEBUG_ERROR: more verbose error messages including original error string |
16 | * @P9_DEBUG_9P: 9P protocol tracing |
17 | * @P9_DEBUG_VFS: VFS API tracing |
18 | * @P9_DEBUG_CONV: protocol conversion tracing |
19 | * @P9_DEBUG_MUX: trace management of concurrent transactions |
20 | * @P9_DEBUG_TRANS: transport tracing |
21 | * @P9_DEBUG_SLABS: memory management tracing |
22 | * @P9_DEBUG_FCALL: verbose dump of protocol messages |
23 | * @P9_DEBUG_FID: fid allocation/deallocation tracking |
24 | * @P9_DEBUG_PKT: packet marshalling/unmarshalling |
25 | * @P9_DEBUG_FSC: FS-cache tracing |
26 | * @P9_DEBUG_VPKT: Verbose packet debugging (full packet dump) |
27 | * |
28 | * These flags are passed at mount time to turn on various levels of |
29 | * verbosity and tracing which will be output to the system logs. |
30 | */ |
31 | |
32 | enum p9_debug_flags { |
33 | P9_DEBUG_ERROR = (1<<0), |
34 | P9_DEBUG_9P = (1<<2), |
35 | P9_DEBUG_VFS = (1<<3), |
36 | P9_DEBUG_CONV = (1<<4), |
37 | P9_DEBUG_MUX = (1<<5), |
38 | P9_DEBUG_TRANS = (1<<6), |
39 | P9_DEBUG_SLABS = (1<<7), |
40 | P9_DEBUG_FCALL = (1<<8), |
41 | P9_DEBUG_FID = (1<<9), |
42 | P9_DEBUG_PKT = (1<<10), |
43 | P9_DEBUG_FSC = (1<<11), |
44 | P9_DEBUG_VPKT = (1<<12), |
45 | P9_DEBUG_CACHE = (1<<13), |
46 | P9_DEBUG_MMAP = (1<<14), |
47 | }; |
48 | |
49 | #ifdef CONFIG_NET_9P_DEBUG |
50 | extern unsigned int p9_debug_level; |
51 | __printf(3, 4) |
52 | void _p9_debug(enum p9_debug_flags level, const char *func, |
53 | const char *fmt, ...); |
54 | #define p9_debug(level, fmt, ...) \ |
55 | _p9_debug(level, __func__, fmt, ##__VA_ARGS__) |
56 | #else |
57 | #define p9_debug(level, fmt, ...) \ |
58 | no_printk(fmt, ##__VA_ARGS__) |
59 | #endif |
60 | |
61 | /** |
62 | * enum p9_msg_t - 9P message types |
63 | * @P9_TLERROR: not used |
64 | * @P9_RLERROR: response for any failed request for 9P2000.L |
65 | * @P9_TSTATFS: file system status request |
66 | * @P9_RSTATFS: file system status response |
67 | * @P9_TSYMLINK: make symlink request |
68 | * @P9_RSYMLINK: make symlink response |
69 | * @P9_TMKNOD: create a special file object request |
70 | * @P9_RMKNOD: create a special file object response |
71 | * @P9_TLCREATE: prepare a handle for I/O on an new file for 9P2000.L |
72 | * @P9_RLCREATE: response with file access information for 9P2000.L |
73 | * @P9_TRENAME: rename request |
74 | * @P9_RRENAME: rename response |
75 | * @P9_TMKDIR: create a directory request |
76 | * @P9_RMKDIR: create a directory response |
77 | * @P9_TVERSION: version handshake request |
78 | * @P9_RVERSION: version handshake response |
79 | * @P9_TAUTH: request to establish authentication channel |
80 | * @P9_RAUTH: response with authentication information |
81 | * @P9_TATTACH: establish user access to file service |
82 | * @P9_RATTACH: response with top level handle to file hierarchy |
83 | * @P9_TERROR: not used |
84 | * @P9_RERROR: response for any failed request |
85 | * @P9_TFLUSH: request to abort a previous request |
86 | * @P9_RFLUSH: response when previous request has been cancelled |
87 | * @P9_TWALK: descend a directory hierarchy |
88 | * @P9_RWALK: response with new handle for position within hierarchy |
89 | * @P9_TOPEN: prepare a handle for I/O on an existing file |
90 | * @P9_ROPEN: response with file access information |
91 | * @P9_TCREATE: prepare a handle for I/O on a new file |
92 | * @P9_RCREATE: response with file access information |
93 | * @P9_TREAD: request to transfer data from a file or directory |
94 | * @P9_RREAD: response with data requested |
95 | * @P9_TWRITE: reuqest to transfer data to a file |
96 | * @P9_RWRITE: response with out much data was transferred to file |
97 | * @P9_TCLUNK: forget about a handle to an entity within the file system |
98 | * @P9_RCLUNK: response when server has forgotten about the handle |
99 | * @P9_TREMOVE: request to remove an entity from the hierarchy |
100 | * @P9_RREMOVE: response when server has removed the entity |
101 | * @P9_TSTAT: request file entity attributes |
102 | * @P9_RSTAT: response with file entity attributes |
103 | * @P9_TWSTAT: request to update file entity attributes |
104 | * @P9_RWSTAT: response when file entity attributes are updated |
105 | * |
106 | * There are 14 basic operations in 9P2000, paired as |
107 | * requests and responses. The one special case is ERROR |
108 | * as there is no @P9_TERROR request for clients to transmit to |
109 | * the server, but the server may respond to any other request |
110 | * with an @P9_RERROR. |
111 | * |
112 | * See Also: http://plan9.bell-labs.com/sys/man/5/INDEX.html |
113 | */ |
114 | |
115 | enum p9_msg_t { |
116 | P9_TLERROR = 6, |
117 | P9_RLERROR, |
118 | P9_TSTATFS = 8, |
119 | P9_RSTATFS, |
120 | P9_TLOPEN = 12, |
121 | P9_RLOPEN, |
122 | P9_TLCREATE = 14, |
123 | P9_RLCREATE, |
124 | P9_TSYMLINK = 16, |
125 | P9_RSYMLINK, |
126 | P9_TMKNOD = 18, |
127 | P9_RMKNOD, |
128 | P9_TRENAME = 20, |
129 | P9_RRENAME, |
130 | P9_TREADLINK = 22, |
131 | P9_RREADLINK, |
132 | P9_TGETATTR = 24, |
133 | P9_RGETATTR, |
134 | P9_TSETATTR = 26, |
135 | P9_RSETATTR, |
136 | P9_TXATTRWALK = 30, |
137 | P9_RXATTRWALK, |
138 | P9_TXATTRCREATE = 32, |
139 | P9_RXATTRCREATE, |
140 | P9_TREADDIR = 40, |
141 | P9_RREADDIR, |
142 | P9_TFSYNC = 50, |
143 | P9_RFSYNC, |
144 | P9_TLOCK = 52, |
145 | P9_RLOCK, |
146 | P9_TGETLOCK = 54, |
147 | P9_RGETLOCK, |
148 | P9_TLINK = 70, |
149 | P9_RLINK, |
150 | P9_TMKDIR = 72, |
151 | P9_RMKDIR, |
152 | P9_TRENAMEAT = 74, |
153 | P9_RRENAMEAT, |
154 | P9_TUNLINKAT = 76, |
155 | P9_RUNLINKAT, |
156 | P9_TVERSION = 100, |
157 | P9_RVERSION, |
158 | P9_TAUTH = 102, |
159 | P9_RAUTH, |
160 | P9_TATTACH = 104, |
161 | P9_RATTACH, |
162 | P9_TERROR = 106, |
163 | P9_RERROR, |
164 | P9_TFLUSH = 108, |
165 | P9_RFLUSH, |
166 | P9_TWALK = 110, |
167 | P9_RWALK, |
168 | P9_TOPEN = 112, |
169 | P9_ROPEN, |
170 | P9_TCREATE = 114, |
171 | P9_RCREATE, |
172 | P9_TREAD = 116, |
173 | P9_RREAD, |
174 | P9_TWRITE = 118, |
175 | P9_RWRITE, |
176 | P9_TCLUNK = 120, |
177 | P9_RCLUNK, |
178 | P9_TREMOVE = 122, |
179 | P9_RREMOVE, |
180 | P9_TSTAT = 124, |
181 | P9_RSTAT, |
182 | P9_TWSTAT = 126, |
183 | P9_RWSTAT, |
184 | }; |
185 | |
186 | /** |
187 | * enum p9_open_mode_t - 9P open modes |
188 | * @P9_OREAD: open file for reading only |
189 | * @P9_OWRITE: open file for writing only |
190 | * @P9_ORDWR: open file for reading or writing |
191 | * @P9_OEXEC: open file for execution |
192 | * @P9_OTRUNC: truncate file to zero-length before opening it |
193 | * @P9_OREXEC: close the file when an exec(2) system call is made |
194 | * @P9_ORCLOSE: remove the file when the file is closed |
195 | * @P9_OAPPEND: open the file and seek to the end |
196 | * @P9_OEXCL: only create a file, do not open it |
197 | * |
198 | * 9P open modes differ slightly from Posix standard modes. |
199 | * In particular, there are extra modes which specify different |
200 | * semantic behaviors than may be available on standard Posix |
201 | * systems. For example, @P9_OREXEC and @P9_ORCLOSE are modes that |
202 | * most likely will not be issued from the Linux VFS client, but may |
203 | * be supported by servers. |
204 | * |
205 | * See Also: http://plan9.bell-labs.com/magic/man2html/2/open |
206 | */ |
207 | |
208 | enum p9_open_mode_t { |
209 | P9_OREAD = 0x00, |
210 | P9_OWRITE = 0x01, |
211 | P9_ORDWR = 0x02, |
212 | P9_OEXEC = 0x03, |
213 | P9_OTRUNC = 0x10, |
214 | P9_OREXEC = 0x20, |
215 | P9_ORCLOSE = 0x40, |
216 | P9_OAPPEND = 0x80, |
217 | P9_OEXCL = 0x1000, |
218 | P9L_MODE_MASK = 0x1FFF, /* don't send anything under this to server */ |
219 | P9L_DIRECT = 0x2000, /* cache disabled */ |
220 | P9L_NOWRITECACHE = 0x4000, /* no write caching */ |
221 | P9L_LOOSE = 0x8000, /* loose cache */ |
222 | }; |
223 | |
224 | /** |
225 | * enum p9_perm_t - 9P permissions |
226 | * @P9_DMDIR: mode bit for directories |
227 | * @P9_DMAPPEND: mode bit for is append-only |
228 | * @P9_DMEXCL: mode bit for excluse use (only one open handle allowed) |
229 | * @P9_DMMOUNT: mode bit for mount points |
230 | * @P9_DMAUTH: mode bit for authentication file |
231 | * @P9_DMTMP: mode bit for non-backed-up files |
232 | * @P9_DMSYMLINK: mode bit for symbolic links (9P2000.u) |
233 | * @P9_DMLINK: mode bit for hard-link (9P2000.u) |
234 | * @P9_DMDEVICE: mode bit for device files (9P2000.u) |
235 | * @P9_DMNAMEDPIPE: mode bit for named pipe (9P2000.u) |
236 | * @P9_DMSOCKET: mode bit for socket (9P2000.u) |
237 | * @P9_DMSETUID: mode bit for setuid (9P2000.u) |
238 | * @P9_DMSETGID: mode bit for setgid (9P2000.u) |
239 | * @P9_DMSETVTX: mode bit for sticky bit (9P2000.u) |
240 | * |
241 | * 9P permissions differ slightly from Posix standard modes. |
242 | * |
243 | * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat |
244 | */ |
245 | enum p9_perm_t { |
246 | P9_DMDIR = 0x80000000, |
247 | P9_DMAPPEND = 0x40000000, |
248 | P9_DMEXCL = 0x20000000, |
249 | P9_DMMOUNT = 0x10000000, |
250 | P9_DMAUTH = 0x08000000, |
251 | P9_DMTMP = 0x04000000, |
252 | /* 9P2000.u extensions */ |
253 | P9_DMSYMLINK = 0x02000000, |
254 | P9_DMLINK = 0x01000000, |
255 | P9_DMDEVICE = 0x00800000, |
256 | P9_DMNAMEDPIPE = 0x00200000, |
257 | P9_DMSOCKET = 0x00100000, |
258 | P9_DMSETUID = 0x00080000, |
259 | P9_DMSETGID = 0x00040000, |
260 | P9_DMSETVTX = 0x00010000, |
261 | }; |
262 | |
263 | /* 9p2000.L open flags */ |
264 | #define P9_DOTL_RDONLY 00000000 |
265 | #define P9_DOTL_WRONLY 00000001 |
266 | #define P9_DOTL_RDWR 00000002 |
267 | #define P9_DOTL_NOACCESS 00000003 |
268 | #define P9_DOTL_CREATE 00000100 |
269 | #define P9_DOTL_EXCL 00000200 |
270 | #define P9_DOTL_NOCTTY 00000400 |
271 | #define P9_DOTL_TRUNC 00001000 |
272 | #define P9_DOTL_APPEND 00002000 |
273 | #define P9_DOTL_NONBLOCK 00004000 |
274 | #define P9_DOTL_DSYNC 00010000 |
275 | #define P9_DOTL_FASYNC 00020000 |
276 | #define P9_DOTL_DIRECT 00040000 |
277 | #define P9_DOTL_LARGEFILE 00100000 |
278 | #define P9_DOTL_DIRECTORY 00200000 |
279 | #define P9_DOTL_NOFOLLOW 00400000 |
280 | #define P9_DOTL_NOATIME 01000000 |
281 | #define P9_DOTL_CLOEXEC 02000000 |
282 | #define P9_DOTL_SYNC 04000000 |
283 | |
284 | /* 9p2000.L at flags */ |
285 | #define P9_DOTL_AT_REMOVEDIR 0x200 |
286 | |
287 | /* 9p2000.L lock type */ |
288 | #define P9_LOCK_TYPE_RDLCK 0 |
289 | #define P9_LOCK_TYPE_WRLCK 1 |
290 | #define P9_LOCK_TYPE_UNLCK 2 |
291 | |
292 | /** |
293 | * enum p9_qid_t - QID types |
294 | * @P9_QTDIR: directory |
295 | * @P9_QTAPPEND: append-only |
296 | * @P9_QTEXCL: excluse use (only one open handle allowed) |
297 | * @P9_QTMOUNT: mount points |
298 | * @P9_QTAUTH: authentication file |
299 | * @P9_QTTMP: non-backed-up files |
300 | * @P9_QTSYMLINK: symbolic links (9P2000.u) |
301 | * @P9_QTLINK: hard-link (9P2000.u) |
302 | * @P9_QTFILE: normal files |
303 | * |
304 | * QID types are a subset of permissions - they are primarily |
305 | * used to differentiate semantics for a file system entity via |
306 | * a jump-table. Their value is also the most significant 16 bits |
307 | * of the permission_t |
308 | * |
309 | * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat |
310 | */ |
311 | enum p9_qid_t { |
312 | P9_QTDIR = 0x80, |
313 | P9_QTAPPEND = 0x40, |
314 | P9_QTEXCL = 0x20, |
315 | P9_QTMOUNT = 0x10, |
316 | P9_QTAUTH = 0x08, |
317 | P9_QTTMP = 0x04, |
318 | P9_QTSYMLINK = 0x02, |
319 | P9_QTLINK = 0x01, |
320 | P9_QTFILE = 0x00, |
321 | }; |
322 | |
323 | /* 9P Magic Numbers */ |
324 | #define P9_NOTAG ((u16)(~0)) |
325 | #define P9_NOFID ((u32)(~0)) |
326 | #define P9_MAXWELEM 16 |
327 | |
328 | /* Minimal header size: size[4] type[1] tag[2] */ |
329 | #define P9_HDRSZ 7 |
330 | |
331 | /* ample room for Twrite/Rread header */ |
332 | #define P9_IOHDRSZ 24 |
333 | |
334 | /* Room for readdir header */ |
335 | #define P9_READDIRHDRSZ 24 |
336 | |
337 | /* size of header for zero copy read/write */ |
338 | #define P9_ZC_HDR_SZ 4096 |
339 | |
340 | /* maximum length of an error string */ |
341 | #define P9_ERRMAX 128 |
342 | |
343 | /** |
344 | * struct p9_qid - file system entity information |
345 | * @type: 8-bit type &p9_qid_t |
346 | * @version: 16-bit monotonically incrementing version number |
347 | * @path: 64-bit per-server-unique ID for a file system element |
348 | * |
349 | * qids are identifiers used by 9P servers to track file system |
350 | * entities. The type is used to differentiate semantics for operations |
351 | * on the entity (ie. read means something different on a directory than |
352 | * on a file). The path provides a server unique index for an entity |
353 | * (roughly analogous to an inode number), while the version is updated |
354 | * every time a file is modified and can be used to maintain cache |
355 | * coherency between clients and serves. |
356 | * Servers will often differentiate purely synthetic entities by setting |
357 | * their version to 0, signaling that they should never be cached and |
358 | * should be accessed synchronously. |
359 | * |
360 | * See Also://plan9.bell-labs.com/magic/man2html/2/stat |
361 | */ |
362 | |
363 | struct p9_qid { |
364 | u8 type; |
365 | u32 version; |
366 | u64 path; |
367 | }; |
368 | |
369 | /** |
370 | * struct p9_wstat - file system metadata information |
371 | * @size: length prefix for this stat structure instance |
372 | * @type: the type of the server (equivalent to a major number) |
373 | * @dev: the sub-type of the server (equivalent to a minor number) |
374 | * @qid: unique id from the server of type &p9_qid |
375 | * @mode: Plan 9 format permissions of type &p9_perm_t |
376 | * @atime: Last access/read time |
377 | * @mtime: Last modify/write time |
378 | * @length: file length |
379 | * @name: last element of path (aka filename) |
380 | * @uid: owner name |
381 | * @gid: group owner |
382 | * @muid: last modifier |
383 | * @extension: area used to encode extended UNIX support |
384 | * @n_uid: numeric user id of owner (part of 9p2000.u extension) |
385 | * @n_gid: numeric group id (part of 9p2000.u extension) |
386 | * @n_muid: numeric user id of laster modifier (part of 9p2000.u extension) |
387 | * |
388 | * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat |
389 | */ |
390 | |
391 | struct p9_wstat { |
392 | u16 size; |
393 | u16 type; |
394 | u32 dev; |
395 | struct p9_qid qid; |
396 | u32 mode; |
397 | u32 atime; |
398 | u32 mtime; |
399 | u64 length; |
400 | const char *name; |
401 | const char *uid; |
402 | const char *gid; |
403 | const char *muid; |
404 | char *extension; /* 9p2000.u extensions */ |
405 | kuid_t n_uid; /* 9p2000.u extensions */ |
406 | kgid_t n_gid; /* 9p2000.u extensions */ |
407 | kuid_t n_muid; /* 9p2000.u extensions */ |
408 | }; |
409 | |
410 | struct p9_stat_dotl { |
411 | u64 st_result_mask; |
412 | struct p9_qid qid; |
413 | u32 st_mode; |
414 | kuid_t st_uid; |
415 | kgid_t st_gid; |
416 | u64 st_nlink; |
417 | u64 st_rdev; |
418 | u64 st_size; |
419 | u64 st_blksize; |
420 | u64 st_blocks; |
421 | u64 st_atime_sec; |
422 | u64 st_atime_nsec; |
423 | u64 st_mtime_sec; |
424 | u64 st_mtime_nsec; |
425 | u64 st_ctime_sec; |
426 | u64 st_ctime_nsec; |
427 | u64 st_btime_sec; |
428 | u64 st_btime_nsec; |
429 | u64 st_gen; |
430 | u64 st_data_version; |
431 | }; |
432 | |
433 | #define P9_STATS_MODE 0x00000001ULL |
434 | #define P9_STATS_NLINK 0x00000002ULL |
435 | #define P9_STATS_UID 0x00000004ULL |
436 | #define P9_STATS_GID 0x00000008ULL |
437 | #define P9_STATS_RDEV 0x00000010ULL |
438 | #define P9_STATS_ATIME 0x00000020ULL |
439 | #define P9_STATS_MTIME 0x00000040ULL |
440 | #define P9_STATS_CTIME 0x00000080ULL |
441 | #define P9_STATS_INO 0x00000100ULL |
442 | #define P9_STATS_SIZE 0x00000200ULL |
443 | #define P9_STATS_BLOCKS 0x00000400ULL |
444 | |
445 | #define P9_STATS_BTIME 0x00000800ULL |
446 | #define P9_STATS_GEN 0x00001000ULL |
447 | #define P9_STATS_DATA_VERSION 0x00002000ULL |
448 | |
449 | #define P9_STATS_BASIC 0x000007ffULL /* Mask for fields up to BLOCKS */ |
450 | #define P9_STATS_ALL 0x00003fffULL /* Mask for All fields above */ |
451 | |
452 | /** |
453 | * struct p9_iattr_dotl - P9 inode attribute for setattr |
454 | * @valid: bitfield specifying which fields are valid |
455 | * same as in struct iattr |
456 | * @mode: File permission bits |
457 | * @uid: user id of owner |
458 | * @gid: group id |
459 | * @size: File size |
460 | * @atime_sec: Last access time, seconds |
461 | * @atime_nsec: Last access time, nanoseconds |
462 | * @mtime_sec: Last modification time, seconds |
463 | * @mtime_nsec: Last modification time, nanoseconds |
464 | */ |
465 | |
466 | struct p9_iattr_dotl { |
467 | u32 valid; |
468 | u32 mode; |
469 | kuid_t uid; |
470 | kgid_t gid; |
471 | u64 size; |
472 | u64 atime_sec; |
473 | u64 atime_nsec; |
474 | u64 mtime_sec; |
475 | u64 mtime_nsec; |
476 | }; |
477 | |
478 | #define P9_LOCK_SUCCESS 0 |
479 | #define P9_LOCK_BLOCKED 1 |
480 | #define P9_LOCK_ERROR 2 |
481 | #define P9_LOCK_GRACE 3 |
482 | |
483 | #define P9_LOCK_FLAGS_BLOCK 1 |
484 | #define P9_LOCK_FLAGS_RECLAIM 2 |
485 | |
486 | /* struct p9_flock: POSIX lock structure |
487 | * @type - type of lock |
488 | * @flags - lock flags |
489 | * @start - starting offset of the lock |
490 | * @length - number of bytes |
491 | * @proc_id - process id which wants to take lock |
492 | * @client_id - client id |
493 | */ |
494 | |
495 | struct p9_flock { |
496 | u8 type; |
497 | u32 flags; |
498 | u64 start; |
499 | u64 length; |
500 | u32 proc_id; |
501 | char *client_id; |
502 | }; |
503 | |
504 | /* struct p9_getlock: getlock structure |
505 | * @type - type of lock |
506 | * @start - starting offset of the lock |
507 | * @length - number of bytes |
508 | * @proc_id - process id which wants to take lock |
509 | * @client_id - client id |
510 | */ |
511 | |
512 | struct p9_getlock { |
513 | u8 type; |
514 | u64 start; |
515 | u64 length; |
516 | u32 proc_id; |
517 | char *client_id; |
518 | }; |
519 | |
520 | struct p9_rstatfs { |
521 | u32 type; |
522 | u32 bsize; |
523 | u64 blocks; |
524 | u64 bfree; |
525 | u64 bavail; |
526 | u64 files; |
527 | u64 ffree; |
528 | u64 fsid; |
529 | u32 namelen; |
530 | }; |
531 | |
532 | /** |
533 | * struct p9_fcall - primary packet structure |
534 | * @size: prefixed length of the structure |
535 | * @id: protocol operating identifier of type &p9_msg_t |
536 | * @tag: transaction id of the request |
537 | * @offset: used by marshalling routines to track current position in buffer |
538 | * @capacity: used by marshalling routines to track total malloc'd capacity |
539 | * @sdata: payload |
540 | * @zc: whether zero-copy is used |
541 | * |
542 | * &p9_fcall represents the structure for all 9P RPC |
543 | * transactions. Requests are packaged into fcalls, and reponses |
544 | * must be extracted from them. |
545 | * |
546 | * See Also: http://plan9.bell-labs.com/magic/man2html/2/fcall |
547 | */ |
548 | |
549 | struct p9_fcall { |
550 | u32 size; |
551 | u8 id; |
552 | u16 tag; |
553 | |
554 | size_t offset; |
555 | size_t capacity; |
556 | |
557 | struct kmem_cache *cache; |
558 | u8 *sdata; |
559 | bool zc; |
560 | }; |
561 | |
562 | int p9_errstr2errno(char *errstr, int len); |
563 | |
564 | int p9_error_init(void); |
565 | #endif /* NET_9P_H */ |
566 | |