4 * 9P protocol definitions.
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>
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.
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.
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
30 #ifdef CONFIG_NET_9P_DEBUG
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)
41 extern unsigned int p9_debug_level;
43 #define P9_DPRINTK(level, format, arg...) \
45 if ((p9_debug_level & level) == level) \
46 printk(KERN_NOTICE "-- %s (%d): " \
47 format , __FUNCTION__, task_pid_nr(current) , ## arg); \
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:"");
55 #define P9_DPRINTK(level, format, arg...) do { } while (0)
56 #define PRINT_FCALL_ERROR(s, fcall) do { } while (0)
59 #define P9_EPRINTK(level, format, arg...) \
61 printk(level "9p: %s (%d): " \
62 format , __FUNCTION__, task_pid_nr(current), ## arg); \
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,
142 #define P9_NOTAG (u16)(~0)
143 #define P9_NOFID (u32)(~0)
144 #define P9_MAXWELEM 16
146 /* ample room for Twrite/Rread header */
147 #define P9_IOHDRSZ 24
154 /* qids are the unique ID for a file (like an inode */
161 /* Plan 9 file metadata (stat) structure */
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 */
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
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 */
204 /* Structures for Protocol Operations */
207 struct p9_str version;
212 struct p9_str version;
219 u32 n_uname; /* 9P2000.u extensions */
228 u32 errno; /* 9p2000.u extension */
243 u32 n_uname; /* 9P2000.u extensions */
254 struct p9_str wnames[16];
259 struct p9_qid wqids[16];
277 struct p9_str extension;
338 * fcall is the primary packet structure
349 struct p9_tversion tversion;
350 struct p9_rversion rversion;
351 struct p9_tauth tauth;
352 struct p9_rauth rauth;
353 struct p9_rerror rerror;
354 struct p9_tflush tflush;
355 struct p9_rflush rflush;
356 struct p9_tattach tattach;
357 struct p9_rattach rattach;
358 struct p9_twalk twalk;
359 struct p9_rwalk rwalk;
360 struct p9_topen topen;
361 struct p9_ropen ropen;
362 struct p9_tcreate tcreate;
363 struct p9_rcreate rcreate;
364 struct p9_tread tread;
365 struct p9_rread rread;
366 struct p9_twrite twrite;
367 struct p9_rwrite rwrite;
368 struct p9_tclunk tclunk;
369 struct p9_rclunk rclunk;
370 struct p9_tremove tremove;
371 struct p9_rremove rremove;
372 struct p9_tstat tstat;
373 struct p9_rstat rstat;
374 struct p9_twstat twstat;
375 struct p9_rwstat rwstat;
381 int p9_deserialize_stat(void *buf, u32 buflen, struct p9_stat *stat,
383 int p9_deserialize_fcall(void *buf, u32 buflen, struct p9_fcall *fc, int dotu);
384 void p9_set_tag(struct p9_fcall *fc, u16 tag);
385 struct p9_fcall *p9_create_tversion(u32 msize, char *version);
386 struct p9_fcall *p9_create_tattach(u32 fid, u32 afid, char *uname,
387 char *aname, u32 n_uname, int dotu);
388 struct p9_fcall *p9_create_tauth(u32 afid, char *uname, char *aname,
389 u32 n_uname, int dotu);
390 struct p9_fcall *p9_create_tflush(u16 oldtag);
391 struct p9_fcall *p9_create_twalk(u32 fid, u32 newfid, u16 nwname,
393 struct p9_fcall *p9_create_topen(u32 fid, u8 mode);
394 struct p9_fcall *p9_create_tcreate(u32 fid, char *name, u32 perm, u8 mode,
395 char *extension, int dotu);
396 struct p9_fcall *p9_create_tread(u32 fid, u64 offset, u32 count);
397 struct p9_fcall *p9_create_twrite(u32 fid, u64 offset, u32 count,
399 struct p9_fcall *p9_create_twrite_u(u32 fid, u64 offset, u32 count,
400 const char __user *data);
401 struct p9_fcall *p9_create_tclunk(u32 fid);
402 struct p9_fcall *p9_create_tremove(u32 fid);
403 struct p9_fcall *p9_create_tstat(u32 fid);
404 struct p9_fcall *p9_create_twstat(u32 fid, struct p9_wstat *wstat,
407 int p9_printfcall(char *buf, int buflen, struct p9_fcall *fc, int dotu);
408 int p9_errstr2errno(char *errstr, int len);
410 struct p9_idpool *p9_idpool_create(void);
411 void p9_idpool_destroy(struct p9_idpool *);
412 int p9_idpool_get(struct p9_idpool *p);
413 void p9_idpool_put(int id, struct p9_idpool *p);
414 int p9_idpool_check(int id, struct p9_idpool *p);
416 int p9_error_init(void);
417 int p9_errstr2errno(char *, int);
418 #endif /* NET_9P_H */