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 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/* Message Types */ 28enum { 29 TVERSION = 100, 30 RVERSION, 31 TAUTH = 102, 32 RAUTH, 33 TATTACH = 104, 34 RATTACH, 35 TERROR = 106, 36 RERROR, 37 TFLUSH = 108, 38 RFLUSH, 39 TWALK = 110, 40 RWALK, 41 TOPEN = 112, 42 ROPEN, 43 TCREATE = 114, 44 RCREATE, 45 TREAD = 116, 46 RREAD, 47 TWRITE = 118, 48 RWRITE, 49 TCLUNK = 120, 50 RCLUNK, 51 TREMOVE = 122, 52 RREMOVE, 53 TSTAT = 124, 54 RSTAT, 55 TWSTAT = 126, 56 RWSTAT, 57}; 58 59/* modes */ 60enum { 61 V9FS_OREAD = 0x00, 62 V9FS_OWRITE = 0x01, 63 V9FS_ORDWR = 0x02, 64 V9FS_OEXEC = 0x03, 65 V9FS_OEXCL = 0x04, 66 V9FS_OTRUNC = 0x10, 67 V9FS_OREXEC = 0x20, 68 V9FS_ORCLOSE = 0x40, 69 V9FS_OAPPEND = 0x80, 70}; 71 72/* permissions */ 73enum { 74 V9FS_DMDIR = 0x80000000, 75 V9FS_DMAPPEND = 0x40000000, 76 V9FS_DMEXCL = 0x20000000, 77 V9FS_DMMOUNT = 0x10000000, 78 V9FS_DMAUTH = 0x08000000, 79 V9FS_DMTMP = 0x04000000, 80 V9FS_DMSYMLINK = 0x02000000, 81 V9FS_DMLINK = 0x01000000, 82 /* 9P2000.u extensions */ 83 V9FS_DMDEVICE = 0x00800000, 84 V9FS_DMNAMEDPIPE = 0x00200000, 85 V9FS_DMSOCKET = 0x00100000, 86 V9FS_DMSETUID = 0x00080000, 87 V9FS_DMSETGID = 0x00040000, 88}; 89 90/* qid.types */ 91enum { 92 V9FS_QTDIR = 0x80, 93 V9FS_QTAPPEND = 0x40, 94 V9FS_QTEXCL = 0x20, 95 V9FS_QTMOUNT = 0x10, 96 V9FS_QTAUTH = 0x08, 97 V9FS_QTTMP = 0x04, 98 V9FS_QTSYMLINK = 0x02, 99 V9FS_QTLINK = 0x01, 100 V9FS_QTFILE = 0x00, 101}; 102 103#define V9FS_NOTAG (u16)(~0) 104#define V9FS_NOFID (u32)(~0) 105#define V9FS_MAXWELEM 16 106 107/* ample room for Twrite/Rread header (iounit) */ 108#define V9FS_IOHDRSZ 24 109 110struct v9fs_str { 111 u16 len; 112 char *str; 113}; 114 115/* qids are the unique ID for a file (like an inode */ 116struct v9fs_qid { 117 u8 type; 118 u32 version; 119 u64 path; 120}; 121 122/* Plan 9 file metadata (stat) structure */ 123struct v9fs_stat { 124 u16 size; 125 u16 type; 126 u32 dev; 127 struct v9fs_qid qid; 128 u32 mode; 129 u32 atime; 130 u32 mtime; 131 u64 length; 132 struct v9fs_str name; 133 struct v9fs_str uid; 134 struct v9fs_str gid; 135 struct v9fs_str muid; 136 struct v9fs_str extension; /* 9p2000.u extensions */ 137 u32 n_uid; /* 9p2000.u extensions */ 138 u32 n_gid; /* 9p2000.u extensions */ 139 u32 n_muid; /* 9p2000.u extensions */ 140}; 141 142/* file metadata (stat) structure used to create Twstat message 143 The is similar to v9fs_stat, but the strings don't point to 144 the same memory block and should be freed separately 145*/ 146struct v9fs_wstat { 147 u16 size; 148 u16 type; 149 u32 dev; 150 struct v9fs_qid qid; 151 u32 mode; 152 u32 atime; 153 u32 mtime; 154 u64 length; 155 char *name; 156 char *uid; 157 char *gid; 158 char *muid; 159 char *extension; /* 9p2000.u extensions */ 160 u32 n_uid; /* 9p2000.u extensions */ 161 u32 n_gid; /* 9p2000.u extensions */ 162 u32 n_muid; /* 9p2000.u extensions */ 163}; 164 165/* Structures for Protocol Operations */ 166 167struct Tversion { 168 u32 msize; 169 struct v9fs_str version; 170}; 171 172struct Rversion { 173 u32 msize; 174 struct v9fs_str version; 175}; 176 177struct Tauth { 178 u32 afid; 179 struct v9fs_str uname; 180 struct v9fs_str aname; 181}; 182 183struct Rauth { 184 struct v9fs_qid qid; 185}; 186 187struct Rerror { 188 struct v9fs_str error; 189 u32 errno; /* 9p2000.u extension */ 190}; 191 192struct Tflush { 193 u16 oldtag; 194}; 195 196struct Rflush { 197}; 198 199struct Tattach { 200 u32 fid; 201 u32 afid; 202 struct v9fs_str uname; 203 struct v9fs_str aname; 204}; 205 206struct Rattach { 207 struct v9fs_qid qid; 208}; 209 210struct Twalk { 211 u32 fid; 212 u32 newfid; 213 u16 nwname; 214 struct v9fs_str wnames[16]; 215}; 216 217struct Rwalk { 218 u16 nwqid; 219 struct v9fs_qid wqids[16]; 220}; 221 222struct Topen { 223 u32 fid; 224 u8 mode; 225}; 226 227struct Ropen { 228 struct v9fs_qid qid; 229 u32 iounit; 230}; 231 232struct Tcreate { 233 u32 fid; 234 struct v9fs_str name; 235 u32 perm; 236 u8 mode; 237 struct v9fs_str extension; 238}; 239 240struct Rcreate { 241 struct v9fs_qid qid; 242 u32 iounit; 243}; 244 245struct Tread { 246 u32 fid; 247 u64 offset; 248 u32 count; 249}; 250 251struct Rread { 252 u32 count; 253 u8 *data; 254}; 255 256struct Twrite { 257 u32 fid; 258 u64 offset; 259 u32 count; 260 u8 *data; 261}; 262 263struct Rwrite { 264 u32 count; 265}; 266 267struct Tclunk { 268 u32 fid; 269}; 270 271struct Rclunk { 272}; 273 274struct Tremove { 275 u32 fid; 276}; 277 278struct Rremove { 279}; 280 281struct Tstat { 282 u32 fid; 283}; 284 285struct Rstat { 286 struct v9fs_stat stat; 287}; 288 289struct Twstat { 290 u32 fid; 291 struct v9fs_stat stat; 292}; 293 294struct Rwstat { 295}; 296 297/* 298 * fcall is the primary packet structure 299 * 300 */ 301 302struct 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 343int v9fs_t_version(struct v9fs_session_info *v9ses, u32 msize, 344 char *version, struct v9fs_fcall **rcall); 345 346int v9fs_t_attach(struct v9fs_session_info *v9ses, char *uname, char *aname, 347 u32 fid, u32 afid, struct v9fs_fcall **rcall); 348 349int v9fs_t_clunk(struct v9fs_session_info *v9ses, u32 fid); 350 351int v9fs_t_stat(struct v9fs_session_info *v9ses, u32 fid, 352 struct v9fs_fcall **rcall); 353 354int v9fs_t_wstat(struct v9fs_session_info *v9ses, u32 fid, 355 struct v9fs_wstat *wstat, struct v9fs_fcall **rcall); 356 357int v9fs_t_walk(struct v9fs_session_info *v9ses, u32 fid, u32 newfid, 358 char *name, struct v9fs_fcall **rcall); 359 360int v9fs_t_open(struct v9fs_session_info *v9ses, u32 fid, u8 mode, 361 struct v9fs_fcall **rcall); 362 363int v9fs_t_remove(struct v9fs_session_info *v9ses, u32 fid, 364 struct v9fs_fcall **rcall); 365 366int v9fs_t_create(struct v9fs_session_info *v9ses, u32 fid, char *name, 367 u32 perm, u8 mode, char *extension, struct v9fs_fcall **rcall); 368 369int v9fs_t_read(struct v9fs_session_info *v9ses, u32 fid, 370 u64 offset, u32 count, struct v9fs_fcall **rcall); 371 372int v9fs_t_write(struct v9fs_session_info *v9ses, u32 fid, u64 offset, 373 u32 count, const char __user * data, 374 struct v9fs_fcall **rcall); 375int v9fs_printfcall(char *, int, struct v9fs_fcall *, int); 376