root/include/net/9p/9p.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * include/net/9p/9p.h
   4  *
   5  * 9P protocol definitions.
   6  *
   7  *  Copyright (C) 2005 by Latchesar Ionkov <lucho@ionkov.net>
   8  *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
   9  *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
  10  */
  11 
  12 #ifndef NET_9P_H
  13 #define NET_9P_H
  14 
  15 /**
  16  * enum p9_debug_flags - bits for mount time debug parameter
  17  * @P9_DEBUG_ERROR: more verbose error messages including original error string
  18  * @P9_DEBUG_9P: 9P protocol tracing
  19  * @P9_DEBUG_VFS: VFS API tracing
  20  * @P9_DEBUG_CONV: protocol conversion tracing
  21  * @P9_DEBUG_MUX: trace management of concurrent transactions
  22  * @P9_DEBUG_TRANS: transport tracing
  23  * @P9_DEBUG_SLABS: memory management tracing
  24  * @P9_DEBUG_FCALL: verbose dump of protocol messages
  25  * @P9_DEBUG_FID: fid allocation/deallocation tracking
  26  * @P9_DEBUG_PKT: packet marshalling/unmarshalling
  27  * @P9_DEBUG_FSC: FS-cache tracing
  28  * @P9_DEBUG_VPKT: Verbose packet debugging (full packet dump)
  29  *
  30  * These flags are passed at mount time to turn on various levels of
  31  * verbosity and tracing which will be output to the system logs.
  32  */
  33 
  34 enum p9_debug_flags {
  35         P9_DEBUG_ERROR =        (1<<0),
  36         P9_DEBUG_9P =           (1<<2),
  37         P9_DEBUG_VFS =          (1<<3),
  38         P9_DEBUG_CONV =         (1<<4),
  39         P9_DEBUG_MUX =          (1<<5),
  40         P9_DEBUG_TRANS =        (1<<6),
  41         P9_DEBUG_SLABS =        (1<<7),
  42         P9_DEBUG_FCALL =        (1<<8),
  43         P9_DEBUG_FID =          (1<<9),
  44         P9_DEBUG_PKT =          (1<<10),
  45         P9_DEBUG_FSC =          (1<<11),
  46         P9_DEBUG_VPKT =         (1<<12),
  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 };
 219 
 220 /**
 221  * enum p9_perm_t - 9P permissions
 222  * @P9_DMDIR: mode bit for directories
 223  * @P9_DMAPPEND: mode bit for is append-only
 224  * @P9_DMEXCL: mode bit for excluse use (only one open handle allowed)
 225  * @P9_DMMOUNT: mode bit for mount points
 226  * @P9_DMAUTH: mode bit for authentication file
 227  * @P9_DMTMP: mode bit for non-backed-up files
 228  * @P9_DMSYMLINK: mode bit for symbolic links (9P2000.u)
 229  * @P9_DMLINK: mode bit for hard-link (9P2000.u)
 230  * @P9_DMDEVICE: mode bit for device files (9P2000.u)
 231  * @P9_DMNAMEDPIPE: mode bit for named pipe (9P2000.u)
 232  * @P9_DMSOCKET: mode bit for socket (9P2000.u)
 233  * @P9_DMSETUID: mode bit for setuid (9P2000.u)
 234  * @P9_DMSETGID: mode bit for setgid (9P2000.u)
 235  * @P9_DMSETVTX: mode bit for sticky bit (9P2000.u)
 236  *
 237  * 9P permissions differ slightly from Posix standard modes.
 238  *
 239  * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
 240  */
 241 enum p9_perm_t {
 242         P9_DMDIR = 0x80000000,
 243         P9_DMAPPEND = 0x40000000,
 244         P9_DMEXCL = 0x20000000,
 245         P9_DMMOUNT = 0x10000000,
 246         P9_DMAUTH = 0x08000000,
 247         P9_DMTMP = 0x04000000,
 248 /* 9P2000.u extensions */
 249         P9_DMSYMLINK = 0x02000000,
 250         P9_DMLINK = 0x01000000,
 251         P9_DMDEVICE = 0x00800000,
 252         P9_DMNAMEDPIPE = 0x00200000,
 253         P9_DMSOCKET = 0x00100000,
 254         P9_DMSETUID = 0x00080000,
 255         P9_DMSETGID = 0x00040000,
 256         P9_DMSETVTX = 0x00010000,
 257 };
 258 
 259 /* 9p2000.L open flags */
 260 #define P9_DOTL_RDONLY        00000000
 261 #define P9_DOTL_WRONLY        00000001
 262 #define P9_DOTL_RDWR          00000002
 263 #define P9_DOTL_NOACCESS      00000003
 264 #define P9_DOTL_CREATE        00000100
 265 #define P9_DOTL_EXCL          00000200
 266 #define P9_DOTL_NOCTTY        00000400
 267 #define P9_DOTL_TRUNC         00001000
 268 #define P9_DOTL_APPEND        00002000
 269 #define P9_DOTL_NONBLOCK      00004000
 270 #define P9_DOTL_DSYNC         00010000
 271 #define P9_DOTL_FASYNC        00020000
 272 #define P9_DOTL_DIRECT        00040000
 273 #define P9_DOTL_LARGEFILE     00100000
 274 #define P9_DOTL_DIRECTORY     00200000
 275 #define P9_DOTL_NOFOLLOW      00400000
 276 #define P9_DOTL_NOATIME       01000000
 277 #define P9_DOTL_CLOEXEC       02000000
 278 #define P9_DOTL_SYNC          04000000
 279 
 280 /* 9p2000.L at flags */
 281 #define P9_DOTL_AT_REMOVEDIR            0x200
 282 
 283 /* 9p2000.L lock type */
 284 #define P9_LOCK_TYPE_RDLCK 0
 285 #define P9_LOCK_TYPE_WRLCK 1
 286 #define P9_LOCK_TYPE_UNLCK 2
 287 
 288 /**
 289  * enum p9_qid_t - QID types
 290  * @P9_QTDIR: directory
 291  * @P9_QTAPPEND: append-only
 292  * @P9_QTEXCL: excluse use (only one open handle allowed)
 293  * @P9_QTMOUNT: mount points
 294  * @P9_QTAUTH: authentication file
 295  * @P9_QTTMP: non-backed-up files
 296  * @P9_QTSYMLINK: symbolic links (9P2000.u)
 297  * @P9_QTLINK: hard-link (9P2000.u)
 298  * @P9_QTFILE: normal files
 299  *
 300  * QID types are a subset of permissions - they are primarily
 301  * used to differentiate semantics for a file system entity via
 302  * a jump-table.  Their value is also the most significant 16 bits
 303  * of the permission_t
 304  *
 305  * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
 306  */
 307 enum p9_qid_t {
 308         P9_QTDIR = 0x80,
 309         P9_QTAPPEND = 0x40,
 310         P9_QTEXCL = 0x20,
 311         P9_QTMOUNT = 0x10,
 312         P9_QTAUTH = 0x08,
 313         P9_QTTMP = 0x04,
 314         P9_QTSYMLINK = 0x02,
 315         P9_QTLINK = 0x01,
 316         P9_QTFILE = 0x00,
 317 };
 318 
 319 /* 9P Magic Numbers */
 320 #define P9_NOTAG        (u16)(~0)
 321 #define P9_NOFID        (u32)(~0)
 322 #define P9_MAXWELEM     16
 323 
 324 /* Minimal header size: size[4] type[1] tag[2] */
 325 #define P9_HDRSZ        7
 326 
 327 /* ample room for Twrite/Rread header */
 328 #define P9_IOHDRSZ      24
 329 
 330 /* Room for readdir header */
 331 #define P9_READDIRHDRSZ 24
 332 
 333 /* size of header for zero copy read/write */
 334 #define P9_ZC_HDR_SZ 4096
 335 
 336 /**
 337  * struct p9_qid - file system entity information
 338  * @type: 8-bit type &p9_qid_t
 339  * @version: 16-bit monotonically incrementing version number
 340  * @path: 64-bit per-server-unique ID for a file system element
 341  *
 342  * qids are identifiers used by 9P servers to track file system
 343  * entities.  The type is used to differentiate semantics for operations
 344  * on the entity (ie. read means something different on a directory than
 345  * on a file).  The path provides a server unique index for an entity
 346  * (roughly analogous to an inode number), while the version is updated
 347  * every time a file is modified and can be used to maintain cache
 348  * coherency between clients and serves.
 349  * Servers will often differentiate purely synthetic entities by setting
 350  * their version to 0, signaling that they should never be cached and
 351  * should be accessed synchronously.
 352  *
 353  * See Also://plan9.bell-labs.com/magic/man2html/2/stat
 354  */
 355 
 356 struct p9_qid {
 357         u8 type;
 358         u32 version;
 359         u64 path;
 360 };
 361 
 362 /**
 363  * struct p9_wstat - file system metadata information
 364  * @size: length prefix for this stat structure instance
 365  * @type: the type of the server (equivalent to a major number)
 366  * @dev: the sub-type of the server (equivalent to a minor number)
 367  * @qid: unique id from the server of type &p9_qid
 368  * @mode: Plan 9 format permissions of type &p9_perm_t
 369  * @atime: Last access/read time
 370  * @mtime: Last modify/write time
 371  * @length: file length
 372  * @name: last element of path (aka filename)
 373  * @uid: owner name
 374  * @gid: group owner
 375  * @muid: last modifier
 376  * @extension: area used to encode extended UNIX support
 377  * @n_uid: numeric user id of owner (part of 9p2000.u extension)
 378  * @n_gid: numeric group id (part of 9p2000.u extension)
 379  * @n_muid: numeric user id of laster modifier (part of 9p2000.u extension)
 380  *
 381  * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
 382  */
 383 
 384 struct p9_wstat {
 385         u16 size;
 386         u16 type;
 387         u32 dev;
 388         struct p9_qid qid;
 389         u32 mode;
 390         u32 atime;
 391         u32 mtime;
 392         u64 length;
 393         const char *name;
 394         const char *uid;
 395         const char *gid;
 396         const char *muid;
 397         char *extension;        /* 9p2000.u extensions */
 398         kuid_t n_uid;           /* 9p2000.u extensions */
 399         kgid_t n_gid;           /* 9p2000.u extensions */
 400         kuid_t n_muid;          /* 9p2000.u extensions */
 401 };
 402 
 403 struct p9_stat_dotl {
 404         u64 st_result_mask;
 405         struct p9_qid qid;
 406         u32 st_mode;
 407         kuid_t st_uid;
 408         kgid_t st_gid;
 409         u64 st_nlink;
 410         u64 st_rdev;
 411         u64 st_size;
 412         u64 st_blksize;
 413         u64 st_blocks;
 414         u64 st_atime_sec;
 415         u64 st_atime_nsec;
 416         u64 st_mtime_sec;
 417         u64 st_mtime_nsec;
 418         u64 st_ctime_sec;
 419         u64 st_ctime_nsec;
 420         u64 st_btime_sec;
 421         u64 st_btime_nsec;
 422         u64 st_gen;
 423         u64 st_data_version;
 424 };
 425 
 426 #define P9_STATS_MODE           0x00000001ULL
 427 #define P9_STATS_NLINK          0x00000002ULL
 428 #define P9_STATS_UID            0x00000004ULL
 429 #define P9_STATS_GID            0x00000008ULL
 430 #define P9_STATS_RDEV           0x00000010ULL
 431 #define P9_STATS_ATIME          0x00000020ULL
 432 #define P9_STATS_MTIME          0x00000040ULL
 433 #define P9_STATS_CTIME          0x00000080ULL
 434 #define P9_STATS_INO            0x00000100ULL
 435 #define P9_STATS_SIZE           0x00000200ULL
 436 #define P9_STATS_BLOCKS         0x00000400ULL
 437 
 438 #define P9_STATS_BTIME          0x00000800ULL
 439 #define P9_STATS_GEN            0x00001000ULL
 440 #define P9_STATS_DATA_VERSION   0x00002000ULL
 441 
 442 #define P9_STATS_BASIC          0x000007ffULL /* Mask for fields up to BLOCKS */
 443 #define P9_STATS_ALL            0x00003fffULL /* Mask for All fields above */
 444 
 445 /**
 446  * struct p9_iattr_dotl - P9 inode attribute for setattr
 447  * @valid: bitfield specifying which fields are valid
 448  *         same as in struct iattr
 449  * @mode: File permission bits
 450  * @uid: user id of owner
 451  * @gid: group id
 452  * @size: File size
 453  * @atime_sec: Last access time, seconds
 454  * @atime_nsec: Last access time, nanoseconds
 455  * @mtime_sec: Last modification time, seconds
 456  * @mtime_nsec: Last modification time, nanoseconds
 457  */
 458 
 459 struct p9_iattr_dotl {
 460         u32 valid;
 461         u32 mode;
 462         kuid_t uid;
 463         kgid_t gid;
 464         u64 size;
 465         u64 atime_sec;
 466         u64 atime_nsec;
 467         u64 mtime_sec;
 468         u64 mtime_nsec;
 469 };
 470 
 471 #define P9_LOCK_SUCCESS 0
 472 #define P9_LOCK_BLOCKED 1
 473 #define P9_LOCK_ERROR 2
 474 #define P9_LOCK_GRACE 3
 475 
 476 #define P9_LOCK_FLAGS_BLOCK 1
 477 #define P9_LOCK_FLAGS_RECLAIM 2
 478 
 479 /* struct p9_flock: POSIX lock structure
 480  * @type - type of lock
 481  * @flags - lock flags
 482  * @start - starting offset of the lock
 483  * @length - number of bytes
 484  * @proc_id - process id which wants to take lock
 485  * @client_id - client id
 486  */
 487 
 488 struct p9_flock {
 489         u8 type;
 490         u32 flags;
 491         u64 start;
 492         u64 length;
 493         u32 proc_id;
 494         char *client_id;
 495 };
 496 
 497 /* struct p9_getlock: getlock structure
 498  * @type - type of lock
 499  * @start - starting offset of the lock
 500  * @length - number of bytes
 501  * @proc_id - process id which wants to take lock
 502  * @client_id - client id
 503  */
 504 
 505 struct p9_getlock {
 506         u8 type;
 507         u64 start;
 508         u64 length;
 509         u32 proc_id;
 510         char *client_id;
 511 };
 512 
 513 struct p9_rstatfs {
 514         u32 type;
 515         u32 bsize;
 516         u64 blocks;
 517         u64 bfree;
 518         u64 bavail;
 519         u64 files;
 520         u64 ffree;
 521         u64 fsid;
 522         u32 namelen;
 523 };
 524 
 525 /**
 526  * struct p9_fcall - primary packet structure
 527  * @size: prefixed length of the structure
 528  * @id: protocol operating identifier of type &p9_msg_t
 529  * @tag: transaction id of the request
 530  * @offset: used by marshalling routines to track current position in buffer
 531  * @capacity: used by marshalling routines to track total malloc'd capacity
 532  * @sdata: payload
 533  *
 534  * &p9_fcall represents the structure for all 9P RPC
 535  * transactions.  Requests are packaged into fcalls, and reponses
 536  * must be extracted from them.
 537  *
 538  * See Also: http://plan9.bell-labs.com/magic/man2html/2/fcall
 539  */
 540 
 541 struct p9_fcall {
 542         u32 size;
 543         u8 id;
 544         u16 tag;
 545 
 546         size_t offset;
 547         size_t capacity;
 548 
 549         struct kmem_cache *cache;
 550         u8 *sdata;
 551 };
 552 
 553 int p9_errstr2errno(char *errstr, int len);
 554 
 555 int p9_error_init(void);
 556 int p9_trans_fd_init(void);
 557 void p9_trans_fd_exit(void);
 558 #endif /* NET_9P_H */

/* [<][>][^][v][top][bottom][index][help] */