| 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 |  | 
|---|