4 * This file contains functions 9P2000 functions
6 * Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
7 * Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
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
27 #include <linux/config.h>
28 #include <linux/module.h>
29 #include <linux/errno.h>
31 #include <linux/idr.h>
39 * v9fs_t_version - negotiate protocol parameters with sever
40 * @v9ses: 9P2000 session information
41 * @msize: requested max size packet
42 * @version: requested version.extension string
43 * @fcall: pointer to response fcall pointer
48 v9fs_t_version(struct v9fs_session_info
*v9ses
, u32 msize
,
49 char *version
, struct v9fs_fcall
**fcall
)
51 struct v9fs_fcall msg
;
53 dprintk(DEBUG_9P
, "msize: %d version: %s\n", msize
, version
);
55 msg
.params
.tversion
.msize
= msize
;
56 msg
.params
.tversion
.version
= version
;
58 return v9fs_mux_rpc(v9ses
, &msg
, fcall
);
62 * v9fs_t_attach - mount the server
63 * @v9ses: 9P2000 session information
64 * @uname: user name doing the attach
65 * @aname: remote name being attached to
66 * @fid: mount fid to attatch to root node
67 * @afid: authentication fid (in this case result key)
68 * @fcall: pointer to response fcall pointer
73 v9fs_t_attach(struct v9fs_session_info
*v9ses
, char *uname
, char *aname
,
74 u32 fid
, u32 afid
, struct v9fs_fcall
**fcall
)
76 struct v9fs_fcall msg
;
78 dprintk(DEBUG_9P
, "uname '%s' aname '%s' fid %d afid %d\n", uname
,
81 msg
.params
.tattach
.fid
= fid
;
82 msg
.params
.tattach
.afid
= afid
;
83 msg
.params
.tattach
.uname
= uname
;
84 msg
.params
.tattach
.aname
= aname
;
86 return v9fs_mux_rpc(v9ses
, &msg
, fcall
);
90 * v9fs_t_clunk - release a fid (finish a transaction)
91 * @v9ses: 9P2000 session information
92 * @fid: fid to release
93 * @fcall: pointer to response fcall pointer
98 v9fs_t_clunk(struct v9fs_session_info
*v9ses
, u32 fid
,
99 struct v9fs_fcall
**fcall
)
101 struct v9fs_fcall msg
;
103 dprintk(DEBUG_9P
, "fid %d\n", fid
);
105 msg
.params
.tclunk
.fid
= fid
;
107 return v9fs_mux_rpc(v9ses
, &msg
, fcall
);
111 * v9fs_v9fs_t_flush - flush a pending transaction
112 * @v9ses: 9P2000 session information
113 * @tag: tid to release
117 int v9fs_t_flush(struct v9fs_session_info
*v9ses
, u16 tag
)
119 struct v9fs_fcall msg
;
121 dprintk(DEBUG_9P
, "oldtag %d\n", tag
);
123 msg
.params
.tflush
.oldtag
= tag
;
124 return v9fs_mux_rpc(v9ses
, &msg
, NULL
);
128 * v9fs_t_stat - read a file's meta-data
129 * @v9ses: 9P2000 session information
130 * @fid: fid pointing to file or directory to get info about
131 * @fcall: pointer to response fcall
136 v9fs_t_stat(struct v9fs_session_info
*v9ses
, u32 fid
, struct v9fs_fcall
**fcall
)
138 struct v9fs_fcall msg
;
140 dprintk(DEBUG_9P
, "fid %d\n", fid
);
145 msg
.params
.tstat
.fid
= fid
;
146 return v9fs_mux_rpc(v9ses
, &msg
, fcall
);
150 * v9fs_t_wstat - write a file's meta-data
151 * @v9ses: 9P2000 session information
152 * @fid: fid pointing to file or directory to write info about
154 * @fcall: pointer to response fcall
159 v9fs_t_wstat(struct v9fs_session_info
*v9ses
, u32 fid
,
160 struct v9fs_stat
*stat
, struct v9fs_fcall
**fcall
)
162 struct v9fs_fcall msg
;
164 dprintk(DEBUG_9P
, "fid %d length %d\n", fid
, (int)stat
->length
);
166 msg
.params
.twstat
.fid
= fid
;
167 msg
.params
.twstat
.stat
= stat
;
169 return v9fs_mux_rpc(v9ses
, &msg
, fcall
);
173 * v9fs_t_walk - walk a fid to a new file or directory
174 * @v9ses: 9P2000 session information
176 * @newfid: new fid (for clone operations)
177 * @name: path to walk fid to
178 * @fcall: pointer to response fcall
182 /* TODO: support multiple walk */
185 v9fs_t_walk(struct v9fs_session_info
*v9ses
, u32 fid
, u32 newfid
,
186 char *name
, struct v9fs_fcall
**fcall
)
188 struct v9fs_fcall msg
;
190 dprintk(DEBUG_9P
, "fid %d newfid %d wname '%s'\n", fid
, newfid
, name
);
192 msg
.params
.twalk
.fid
= fid
;
193 msg
.params
.twalk
.newfid
= newfid
;
196 msg
.params
.twalk
.nwname
= 1;
197 msg
.params
.twalk
.wnames
= &name
;
199 msg
.params
.twalk
.nwname
= 0;
202 return v9fs_mux_rpc(v9ses
, &msg
, fcall
);
206 * v9fs_t_open - open a file
208 * @v9ses - 9P2000 session information
210 * @mode - mode to open file (R, RW, etc)
211 * @fcall - pointer to response fcall
216 v9fs_t_open(struct v9fs_session_info
*v9ses
, u32 fid
, u8 mode
,
217 struct v9fs_fcall
**fcall
)
219 struct v9fs_fcall msg
;
222 dprintk(DEBUG_9P
, "fid %d mode %d\n", fid
, mode
);
224 msg
.params
.topen
.fid
= fid
;
225 msg
.params
.topen
.mode
= mode
;
227 errorno
= v9fs_mux_rpc(v9ses
, &msg
, fcall
);
233 * v9fs_t_remove - remove a file or directory
234 * @v9ses: 9P2000 session information
235 * @fid: fid to remove
236 * @fcall: pointer to response fcall
241 v9fs_t_remove(struct v9fs_session_info
*v9ses
, u32 fid
,
242 struct v9fs_fcall
**fcall
)
244 struct v9fs_fcall msg
;
246 dprintk(DEBUG_9P
, "fid %d\n", fid
);
248 msg
.params
.tremove
.fid
= fid
;
249 return v9fs_mux_rpc(v9ses
, &msg
, fcall
);
253 * v9fs_t_create - create a file or directory
254 * @v9ses: 9P2000 session information
255 * @fid: fid to create
256 * @name: name of the file or directory to create
257 * @perm: permissions to create with
258 * @mode: mode to open file (R, RW, etc)
259 * @fcall: pointer to response fcall
264 v9fs_t_create(struct v9fs_session_info
*v9ses
, u32 fid
, char *name
,
265 u32 perm
, u8 mode
, struct v9fs_fcall
**fcall
)
267 struct v9fs_fcall msg
;
269 dprintk(DEBUG_9P
, "fid %d name '%s' perm %x mode %d\n",
270 fid
, name
, perm
, mode
);
273 msg
.params
.tcreate
.fid
= fid
;
274 msg
.params
.tcreate
.name
= name
;
275 msg
.params
.tcreate
.perm
= perm
;
276 msg
.params
.tcreate
.mode
= mode
;
278 return v9fs_mux_rpc(v9ses
, &msg
, fcall
);
282 * v9fs_t_read - read data
283 * @v9ses: 9P2000 session information
284 * @fid: fid to read from
285 * @offset: offset to start read at
286 * @count: how many bytes to read
287 * @fcall: pointer to response fcall (with data)
292 v9fs_t_read(struct v9fs_session_info
*v9ses
, u32 fid
, u64 offset
,
293 u32 count
, struct v9fs_fcall
**fcall
)
295 struct v9fs_fcall msg
;
296 struct v9fs_fcall
*rc
= NULL
;
299 dprintk(DEBUG_9P
, "fid %d offset 0x%lx count 0x%x\n", fid
,
300 (long unsigned int)offset
, count
);
302 msg
.params
.tread
.fid
= fid
;
303 msg
.params
.tread
.offset
= offset
;
304 msg
.params
.tread
.count
= count
;
305 errorno
= v9fs_mux_rpc(v9ses
, &msg
, &rc
);
308 errorno
= rc
->params
.rread
.count
;
309 dump_data(rc
->params
.rread
.data
, rc
->params
.rread
.count
);
321 * v9fs_t_write - write data
322 * @v9ses: 9P2000 session information
323 * @fid: fid to write to
324 * @offset: offset to start write at
325 * @count: how many bytes to write
326 * @fcall: pointer to response fcall
331 v9fs_t_write(struct v9fs_session_info
*v9ses
, u32 fid
,
332 u64 offset
, u32 count
, void *data
, struct v9fs_fcall
**fcall
)
334 struct v9fs_fcall msg
;
335 struct v9fs_fcall
*rc
= NULL
;
338 dprintk(DEBUG_9P
, "fid %d offset 0x%llx count 0x%x\n", fid
,
339 (unsigned long long)offset
, count
);
340 dump_data(data
, count
);
343 msg
.params
.twrite
.fid
= fid
;
344 msg
.params
.twrite
.offset
= offset
;
345 msg
.params
.twrite
.count
= count
;
346 msg
.params
.twrite
.data
= data
;
348 errorno
= v9fs_mux_rpc(v9ses
, &msg
, &rc
);
351 errorno
= rc
->params
.rwrite
.count
;