[PATCH] v9fs: zero copy implementation
[linux-2.6.git] / fs / 9p / 9p.h
1 /*
2  * linux/fs/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 as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to:
22  *  Free Software Foundation
23  *  51 Franklin Street, Fifth Floor
24  *  Boston, MA  02111-1301  USA
25  *
26  */
27
28 /* Message Types */
29 enum {
30         TVERSION = 100,
31         RVERSION,
32         TAUTH = 102,
33         RAUTH,
34         TATTACH = 104,
35         RATTACH,
36         TERROR = 106,
37         RERROR,
38         TFLUSH = 108,
39         RFLUSH,
40         TWALK = 110,
41         RWALK,
42         TOPEN = 112,
43         ROPEN,
44         TCREATE = 114,
45         RCREATE,
46         TREAD = 116,
47         RREAD,
48         TWRITE = 118,
49         RWRITE,
50         TCLUNK = 120,
51         RCLUNK,
52         TREMOVE = 122,
53         RREMOVE,
54         TSTAT = 124,
55         RSTAT,
56         TWSTAT = 126,
57         RWSTAT,
58 };
59
60 /* modes */
61 enum {
62         V9FS_OREAD = 0x00,
63         V9FS_OWRITE = 0x01,
64         V9FS_ORDWR = 0x02,
65         V9FS_OEXEC = 0x03,
66         V9FS_OEXCL = 0x04,
67         V9FS_OTRUNC = 0x10,
68         V9FS_OREXEC = 0x20,
69         V9FS_ORCLOSE = 0x40,
70         V9FS_OAPPEND = 0x80,
71 };
72
73 /* permissions */
74 enum {
75         V9FS_DMDIR = 0x80000000,
76         V9FS_DMAPPEND = 0x40000000,
77         V9FS_DMEXCL = 0x20000000,
78         V9FS_DMMOUNT = 0x10000000,
79         V9FS_DMAUTH = 0x08000000,
80         V9FS_DMTMP = 0x04000000,
81         V9FS_DMSYMLINK = 0x02000000,
82         V9FS_DMLINK = 0x01000000,
83         /* 9P2000.u extensions */
84         V9FS_DMDEVICE = 0x00800000,
85         V9FS_DMNAMEDPIPE = 0x00200000,
86         V9FS_DMSOCKET = 0x00100000,
87         V9FS_DMSETUID = 0x00080000,
88         V9FS_DMSETGID = 0x00040000,
89 };
90
91 /* qid.types */
92 enum {
93         V9FS_QTDIR = 0x80,
94         V9FS_QTAPPEND = 0x40,
95         V9FS_QTEXCL = 0x20,
96         V9FS_QTMOUNT = 0x10,
97         V9FS_QTAUTH = 0x08,
98         V9FS_QTTMP = 0x04,
99         V9FS_QTSYMLINK = 0x02,
100         V9FS_QTLINK = 0x01,
101         V9FS_QTFILE = 0x00,
102 };
103
104 #define V9FS_NOTAG      (u16)(~0)
105 #define V9FS_NOFID      (u32)(~0)
106 #define V9FS_MAXWELEM   16
107
108 /* ample room for Twrite/Rread header (iounit) */
109 #define V9FS_IOHDRSZ    24
110
111 struct v9fs_str {
112         u16 len;
113         char *str;
114 };
115
116 /* qids are the unique ID for a file (like an inode */
117 struct v9fs_qid {
118         u8 type;
119         u32 version;
120         u64 path;
121 };
122
123 /* Plan 9 file metadata (stat) structure */
124 struct v9fs_stat {
125         u16 size;
126         u16 type;
127         u32 dev;
128         struct v9fs_qid qid;
129         u32 mode;
130         u32 atime;
131         u32 mtime;
132         u64 length;
133         struct v9fs_str name;
134         struct v9fs_str uid;
135         struct v9fs_str gid;
136         struct v9fs_str muid;
137         struct v9fs_str extension;      /* 9p2000.u extensions */
138         u32 n_uid;              /* 9p2000.u extensions */
139         u32 n_gid;              /* 9p2000.u extensions */
140         u32 n_muid;             /* 9p2000.u extensions */
141 };
142
143 /* file metadata (stat) structure used to create Twstat message
144    The is similar to v9fs_stat, but the strings don't point to
145    the same memory block and should be freed separately
146 */
147 struct v9fs_wstat {
148         u16 size;
149         u16 type;
150         u32 dev;
151         struct v9fs_qid qid;
152         u32 mode;
153         u32 atime;
154         u32 mtime;
155         u64 length;
156         char *name;
157         char *uid;
158         char *gid;
159         char *muid;
160         char *extension;        /* 9p2000.u extensions */
161         u32 n_uid;              /* 9p2000.u extensions */
162         u32 n_gid;              /* 9p2000.u extensions */
163         u32 n_muid;             /* 9p2000.u extensions */
164 };
165
166 /* Structures for Protocol Operations */
167
168 struct Tversion {
169         u32 msize;
170         struct v9fs_str version;
171 };
172
173 struct Rversion {
174         u32 msize;
175         struct v9fs_str version;
176 };
177
178 struct Tauth {
179         u32 afid;
180         struct v9fs_str uname;
181         struct v9fs_str aname;
182 };
183
184 struct Rauth {
185         struct v9fs_qid qid;
186 };
187
188 struct Rerror {
189         struct v9fs_str error;
190         u32 errno;              /* 9p2000.u extension */
191 };
192
193 struct Tflush {
194         u16 oldtag;
195 };
196
197 struct Rflush {
198 };
199
200 struct Tattach {
201         u32 fid;
202         u32 afid;
203         struct v9fs_str uname;
204         struct v9fs_str aname;
205 };
206
207 struct Rattach {
208         struct v9fs_qid qid;
209 };
210
211 struct Twalk {
212         u32 fid;
213         u32 newfid;
214         u16 nwname;
215         struct v9fs_str wnames[16];
216 };
217
218 struct Rwalk {
219         u16 nwqid;
220         struct v9fs_qid wqids[16];
221 };
222
223 struct Topen {
224         u32 fid;
225         u8 mode;
226 };
227
228 struct Ropen {
229         struct v9fs_qid qid;
230         u32 iounit;
231 };
232
233 struct Tcreate {
234         u32 fid;
235         struct v9fs_str name;
236         u32 perm;
237         u8 mode;
238 };
239
240 struct Rcreate {
241         struct v9fs_qid qid;
242         u32 iounit;
243 };
244
245 struct Tread {
246         u32 fid;
247         u64 offset;
248         u32 count;
249 };
250
251 struct Rread {
252         u32 count;
253         u8 *data;
254 };
255
256 struct Twrite {
257         u32 fid;
258         u64 offset;
259         u32 count;
260         u8 *data;
261 };
262
263 struct Rwrite {
264         u32 count;
265 };
266
267 struct Tclunk {
268         u32 fid;
269 };
270
271 struct Rclunk {
272 };
273
274 struct Tremove {
275         u32 fid;
276 };
277
278 struct Rremove {
279 };
280
281 struct Tstat {
282         u32 fid;
283 };
284
285 struct Rstat {
286         struct v9fs_stat stat;
287 };
288
289 struct Twstat {
290         u32 fid;
291         struct v9fs_stat stat;
292 };
293
294 struct Rwstat {
295 };
296
297 /*
298   * fcall is the primary packet structure
299   *
300   */
301
302 struct v9fs_fcall {
303         u32 size;
304         u8 id;
305         u16 tag;
306         void *sdata;
307
308         union {
309                 struct Tversion tversion;
310                 struct Rversion rversion;
311                 struct Tauth tauth;
312                 struct Rauth rauth;
313                 struct Rerror rerror;
314                 struct Tflush tflush;
315                 struct Rflush rflush;
316                 struct Tattach tattach;
317                 struct Rattach rattach;
318                 struct Twalk twalk;
319                 struct Rwalk rwalk;
320                 struct Topen topen;
321                 struct Ropen ropen;
322                 struct Tcreate tcreate;
323                 struct Rcreate rcreate;
324                 struct Tread tread;
325                 struct Rread rread;
326                 struct Twrite twrite;
327                 struct Rwrite rwrite;
328                 struct Tclunk tclunk;
329                 struct Rclunk rclunk;
330                 struct Tremove tremove;
331                 struct Rremove rremove;
332                 struct Tstat tstat;
333                 struct Rstat rstat;
334                 struct Twstat twstat;
335                 struct Rwstat rwstat;
336         } params;
337 };
338
339 #define PRINT_FCALL_ERROR(s, fcall) dprintk(DEBUG_ERROR, "%s: %.*s\n", s, \
340         fcall?fcall->params.rerror.error.len:0, \
341         fcall?fcall->params.rerror.error.str:"");
342
343 char *v9fs_str_copy(char *buf, int buflen, struct v9fs_str *str);
344 int v9fs_str_compare(char *buf, struct v9fs_str *str);
345
346 int v9fs_t_version(struct v9fs_session_info *v9ses, u32 msize,
347                    char *version, struct v9fs_fcall **rcall);
348
349 int v9fs_t_attach(struct v9fs_session_info *v9ses, char *uname, char *aname,
350                   u32 fid, u32 afid, struct v9fs_fcall **rcall);
351
352 int v9fs_t_clunk(struct v9fs_session_info *v9ses, u32 fid);
353
354 int v9fs_t_flush(struct v9fs_session_info *v9ses, u16 oldtag);
355
356 int v9fs_t_stat(struct v9fs_session_info *v9ses, u32 fid,
357                 struct v9fs_fcall **rcall);
358
359 int v9fs_t_wstat(struct v9fs_session_info *v9ses, u32 fid,
360                  struct v9fs_wstat *wstat, struct v9fs_fcall **rcall);
361
362 int v9fs_t_walk(struct v9fs_session_info *v9ses, u32 fid, u32 newfid,
363                 char *name, struct v9fs_fcall **rcall);
364
365 int v9fs_t_open(struct v9fs_session_info *v9ses, u32 fid, u8 mode,
366                 struct v9fs_fcall **rcall);
367
368 int v9fs_t_remove(struct v9fs_session_info *v9ses, u32 fid,
369                   struct v9fs_fcall **rcall);
370
371 int v9fs_t_create(struct v9fs_session_info *v9ses, u32 fid, char *name,
372                   u32 perm, u8 mode, struct v9fs_fcall **rcall);
373
374 int v9fs_t_read(struct v9fs_session_info *v9ses, u32 fid,
375                 u64 offset, u32 count, struct v9fs_fcall **rcall);
376
377 int v9fs_t_write(struct v9fs_session_info *v9ses, u32 fid, u64 offset,
378                  u32 count, const char __user * data,
379                  struct v9fs_fcall **rcall);