cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

9p.h (15580B)


      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
     32enum 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};
     46
     47#ifdef CONFIG_NET_9P_DEBUG
     48extern unsigned int p9_debug_level;
     49__printf(3, 4)
     50void _p9_debug(enum p9_debug_flags level, const char *func,
     51	       const char *fmt, ...);
     52#define p9_debug(level, fmt, ...)			\
     53	_p9_debug(level, __func__, fmt, ##__VA_ARGS__)
     54#else
     55#define p9_debug(level, fmt, ...)			\
     56	no_printk(fmt, ##__VA_ARGS__)
     57#endif
     58
     59/**
     60 * enum p9_msg_t - 9P message types
     61 * @P9_TLERROR: not used
     62 * @P9_RLERROR: response for any failed request for 9P2000.L
     63 * @P9_TSTATFS: file system status request
     64 * @P9_RSTATFS: file system status response
     65 * @P9_TSYMLINK: make symlink request
     66 * @P9_RSYMLINK: make symlink response
     67 * @P9_TMKNOD: create a special file object request
     68 * @P9_RMKNOD: create a special file object response
     69 * @P9_TLCREATE: prepare a handle for I/O on an new file for 9P2000.L
     70 * @P9_RLCREATE: response with file access information for 9P2000.L
     71 * @P9_TRENAME: rename request
     72 * @P9_RRENAME: rename response
     73 * @P9_TMKDIR: create a directory request
     74 * @P9_RMKDIR: create a directory response
     75 * @P9_TVERSION: version handshake request
     76 * @P9_RVERSION: version handshake response
     77 * @P9_TAUTH: request to establish authentication channel
     78 * @P9_RAUTH: response with authentication information
     79 * @P9_TATTACH: establish user access to file service
     80 * @P9_RATTACH: response with top level handle to file hierarchy
     81 * @P9_TERROR: not used
     82 * @P9_RERROR: response for any failed request
     83 * @P9_TFLUSH: request to abort a previous request
     84 * @P9_RFLUSH: response when previous request has been cancelled
     85 * @P9_TWALK: descend a directory hierarchy
     86 * @P9_RWALK: response with new handle for position within hierarchy
     87 * @P9_TOPEN: prepare a handle for I/O on an existing file
     88 * @P9_ROPEN: response with file access information
     89 * @P9_TCREATE: prepare a handle for I/O on a new file
     90 * @P9_RCREATE: response with file access information
     91 * @P9_TREAD: request to transfer data from a file or directory
     92 * @P9_RREAD: response with data requested
     93 * @P9_TWRITE: reuqest to transfer data to a file
     94 * @P9_RWRITE: response with out much data was transferred to file
     95 * @P9_TCLUNK: forget about a handle to an entity within the file system
     96 * @P9_RCLUNK: response when server has forgotten about the handle
     97 * @P9_TREMOVE: request to remove an entity from the hierarchy
     98 * @P9_RREMOVE: response when server has removed the entity
     99 * @P9_TSTAT: request file entity attributes
    100 * @P9_RSTAT: response with file entity attributes
    101 * @P9_TWSTAT: request to update file entity attributes
    102 * @P9_RWSTAT: response when file entity attributes are updated
    103 *
    104 * There are 14 basic operations in 9P2000, paired as
    105 * requests and responses.  The one special case is ERROR
    106 * as there is no @P9_TERROR request for clients to transmit to
    107 * the server, but the server may respond to any other request
    108 * with an @P9_RERROR.
    109 *
    110 * See Also: http://plan9.bell-labs.com/sys/man/5/INDEX.html
    111 */
    112
    113enum p9_msg_t {
    114	P9_TLERROR = 6,
    115	P9_RLERROR,
    116	P9_TSTATFS = 8,
    117	P9_RSTATFS,
    118	P9_TLOPEN = 12,
    119	P9_RLOPEN,
    120	P9_TLCREATE = 14,
    121	P9_RLCREATE,
    122	P9_TSYMLINK = 16,
    123	P9_RSYMLINK,
    124	P9_TMKNOD = 18,
    125	P9_RMKNOD,
    126	P9_TRENAME = 20,
    127	P9_RRENAME,
    128	P9_TREADLINK = 22,
    129	P9_RREADLINK,
    130	P9_TGETATTR = 24,
    131	P9_RGETATTR,
    132	P9_TSETATTR = 26,
    133	P9_RSETATTR,
    134	P9_TXATTRWALK = 30,
    135	P9_RXATTRWALK,
    136	P9_TXATTRCREATE = 32,
    137	P9_RXATTRCREATE,
    138	P9_TREADDIR = 40,
    139	P9_RREADDIR,
    140	P9_TFSYNC = 50,
    141	P9_RFSYNC,
    142	P9_TLOCK = 52,
    143	P9_RLOCK,
    144	P9_TGETLOCK = 54,
    145	P9_RGETLOCK,
    146	P9_TLINK = 70,
    147	P9_RLINK,
    148	P9_TMKDIR = 72,
    149	P9_RMKDIR,
    150	P9_TRENAMEAT = 74,
    151	P9_RRENAMEAT,
    152	P9_TUNLINKAT = 76,
    153	P9_RUNLINKAT,
    154	P9_TVERSION = 100,
    155	P9_RVERSION,
    156	P9_TAUTH = 102,
    157	P9_RAUTH,
    158	P9_TATTACH = 104,
    159	P9_RATTACH,
    160	P9_TERROR = 106,
    161	P9_RERROR,
    162	P9_TFLUSH = 108,
    163	P9_RFLUSH,
    164	P9_TWALK = 110,
    165	P9_RWALK,
    166	P9_TOPEN = 112,
    167	P9_ROPEN,
    168	P9_TCREATE = 114,
    169	P9_RCREATE,
    170	P9_TREAD = 116,
    171	P9_RREAD,
    172	P9_TWRITE = 118,
    173	P9_RWRITE,
    174	P9_TCLUNK = 120,
    175	P9_RCLUNK,
    176	P9_TREMOVE = 122,
    177	P9_RREMOVE,
    178	P9_TSTAT = 124,
    179	P9_RSTAT,
    180	P9_TWSTAT = 126,
    181	P9_RWSTAT,
    182};
    183
    184/**
    185 * enum p9_open_mode_t - 9P open modes
    186 * @P9_OREAD: open file for reading only
    187 * @P9_OWRITE: open file for writing only
    188 * @P9_ORDWR: open file for reading or writing
    189 * @P9_OEXEC: open file for execution
    190 * @P9_OTRUNC: truncate file to zero-length before opening it
    191 * @P9_OREXEC: close the file when an exec(2) system call is made
    192 * @P9_ORCLOSE: remove the file when the file is closed
    193 * @P9_OAPPEND: open the file and seek to the end
    194 * @P9_OEXCL: only create a file, do not open it
    195 *
    196 * 9P open modes differ slightly from Posix standard modes.
    197 * In particular, there are extra modes which specify different
    198 * semantic behaviors than may be available on standard Posix
    199 * systems.  For example, @P9_OREXEC and @P9_ORCLOSE are modes that
    200 * most likely will not be issued from the Linux VFS client, but may
    201 * be supported by servers.
    202 *
    203 * See Also: http://plan9.bell-labs.com/magic/man2html/2/open
    204 */
    205
    206enum p9_open_mode_t {
    207	P9_OREAD = 0x00,
    208	P9_OWRITE = 0x01,
    209	P9_ORDWR = 0x02,
    210	P9_OEXEC = 0x03,
    211	P9_OTRUNC = 0x10,
    212	P9_OREXEC = 0x20,
    213	P9_ORCLOSE = 0x40,
    214	P9_OAPPEND = 0x80,
    215	P9_OEXCL = 0x1000,
    216};
    217
    218/**
    219 * enum p9_perm_t - 9P permissions
    220 * @P9_DMDIR: mode bit for directories
    221 * @P9_DMAPPEND: mode bit for is append-only
    222 * @P9_DMEXCL: mode bit for excluse use (only one open handle allowed)
    223 * @P9_DMMOUNT: mode bit for mount points
    224 * @P9_DMAUTH: mode bit for authentication file
    225 * @P9_DMTMP: mode bit for non-backed-up files
    226 * @P9_DMSYMLINK: mode bit for symbolic links (9P2000.u)
    227 * @P9_DMLINK: mode bit for hard-link (9P2000.u)
    228 * @P9_DMDEVICE: mode bit for device files (9P2000.u)
    229 * @P9_DMNAMEDPIPE: mode bit for named pipe (9P2000.u)
    230 * @P9_DMSOCKET: mode bit for socket (9P2000.u)
    231 * @P9_DMSETUID: mode bit for setuid (9P2000.u)
    232 * @P9_DMSETGID: mode bit for setgid (9P2000.u)
    233 * @P9_DMSETVTX: mode bit for sticky bit (9P2000.u)
    234 *
    235 * 9P permissions differ slightly from Posix standard modes.
    236 *
    237 * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
    238 */
    239enum p9_perm_t {
    240	P9_DMDIR = 0x80000000,
    241	P9_DMAPPEND = 0x40000000,
    242	P9_DMEXCL = 0x20000000,
    243	P9_DMMOUNT = 0x10000000,
    244	P9_DMAUTH = 0x08000000,
    245	P9_DMTMP = 0x04000000,
    246/* 9P2000.u extensions */
    247	P9_DMSYMLINK = 0x02000000,
    248	P9_DMLINK = 0x01000000,
    249	P9_DMDEVICE = 0x00800000,
    250	P9_DMNAMEDPIPE = 0x00200000,
    251	P9_DMSOCKET = 0x00100000,
    252	P9_DMSETUID = 0x00080000,
    253	P9_DMSETGID = 0x00040000,
    254	P9_DMSETVTX = 0x00010000,
    255};
    256
    257/* 9p2000.L open flags */
    258#define P9_DOTL_RDONLY        00000000
    259#define P9_DOTL_WRONLY        00000001
    260#define P9_DOTL_RDWR          00000002
    261#define P9_DOTL_NOACCESS      00000003
    262#define P9_DOTL_CREATE        00000100
    263#define P9_DOTL_EXCL          00000200
    264#define P9_DOTL_NOCTTY        00000400
    265#define P9_DOTL_TRUNC         00001000
    266#define P9_DOTL_APPEND        00002000
    267#define P9_DOTL_NONBLOCK      00004000
    268#define P9_DOTL_DSYNC         00010000
    269#define P9_DOTL_FASYNC        00020000
    270#define P9_DOTL_DIRECT        00040000
    271#define P9_DOTL_LARGEFILE     00100000
    272#define P9_DOTL_DIRECTORY     00200000
    273#define P9_DOTL_NOFOLLOW      00400000
    274#define P9_DOTL_NOATIME       01000000
    275#define P9_DOTL_CLOEXEC       02000000
    276#define P9_DOTL_SYNC          04000000
    277
    278/* 9p2000.L at flags */
    279#define P9_DOTL_AT_REMOVEDIR		0x200
    280
    281/* 9p2000.L lock type */
    282#define P9_LOCK_TYPE_RDLCK 0
    283#define P9_LOCK_TYPE_WRLCK 1
    284#define P9_LOCK_TYPE_UNLCK 2
    285
    286/**
    287 * enum p9_qid_t - QID types
    288 * @P9_QTDIR: directory
    289 * @P9_QTAPPEND: append-only
    290 * @P9_QTEXCL: excluse use (only one open handle allowed)
    291 * @P9_QTMOUNT: mount points
    292 * @P9_QTAUTH: authentication file
    293 * @P9_QTTMP: non-backed-up files
    294 * @P9_QTSYMLINK: symbolic links (9P2000.u)
    295 * @P9_QTLINK: hard-link (9P2000.u)
    296 * @P9_QTFILE: normal files
    297 *
    298 * QID types are a subset of permissions - they are primarily
    299 * used to differentiate semantics for a file system entity via
    300 * a jump-table.  Their value is also the most significant 16 bits
    301 * of the permission_t
    302 *
    303 * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
    304 */
    305enum p9_qid_t {
    306	P9_QTDIR = 0x80,
    307	P9_QTAPPEND = 0x40,
    308	P9_QTEXCL = 0x20,
    309	P9_QTMOUNT = 0x10,
    310	P9_QTAUTH = 0x08,
    311	P9_QTTMP = 0x04,
    312	P9_QTSYMLINK = 0x02,
    313	P9_QTLINK = 0x01,
    314	P9_QTFILE = 0x00,
    315};
    316
    317/* 9P Magic Numbers */
    318#define P9_NOTAG	((u16)(~0))
    319#define P9_NOFID	((u32)(~0))
    320#define P9_MAXWELEM	16
    321
    322/* Minimal header size: size[4] type[1] tag[2] */
    323#define P9_HDRSZ	7
    324
    325/* ample room for Twrite/Rread header */
    326#define P9_IOHDRSZ	24
    327
    328/* Room for readdir header */
    329#define P9_READDIRHDRSZ	24
    330
    331/* size of header for zero copy read/write */
    332#define P9_ZC_HDR_SZ 4096
    333
    334/**
    335 * struct p9_qid - file system entity information
    336 * @type: 8-bit type &p9_qid_t
    337 * @version: 16-bit monotonically incrementing version number
    338 * @path: 64-bit per-server-unique ID for a file system element
    339 *
    340 * qids are identifiers used by 9P servers to track file system
    341 * entities.  The type is used to differentiate semantics for operations
    342 * on the entity (ie. read means something different on a directory than
    343 * on a file).  The path provides a server unique index for an entity
    344 * (roughly analogous to an inode number), while the version is updated
    345 * every time a file is modified and can be used to maintain cache
    346 * coherency between clients and serves.
    347 * Servers will often differentiate purely synthetic entities by setting
    348 * their version to 0, signaling that they should never be cached and
    349 * should be accessed synchronously.
    350 *
    351 * See Also://plan9.bell-labs.com/magic/man2html/2/stat
    352 */
    353
    354struct p9_qid {
    355	u8 type;
    356	u32 version;
    357	u64 path;
    358};
    359
    360/**
    361 * struct p9_wstat - file system metadata information
    362 * @size: length prefix for this stat structure instance
    363 * @type: the type of the server (equivalent to a major number)
    364 * @dev: the sub-type of the server (equivalent to a minor number)
    365 * @qid: unique id from the server of type &p9_qid
    366 * @mode: Plan 9 format permissions of type &p9_perm_t
    367 * @atime: Last access/read time
    368 * @mtime: Last modify/write time
    369 * @length: file length
    370 * @name: last element of path (aka filename)
    371 * @uid: owner name
    372 * @gid: group owner
    373 * @muid: last modifier
    374 * @extension: area used to encode extended UNIX support
    375 * @n_uid: numeric user id of owner (part of 9p2000.u extension)
    376 * @n_gid: numeric group id (part of 9p2000.u extension)
    377 * @n_muid: numeric user id of laster modifier (part of 9p2000.u extension)
    378 *
    379 * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
    380 */
    381
    382struct p9_wstat {
    383	u16 size;
    384	u16 type;
    385	u32 dev;
    386	struct p9_qid qid;
    387	u32 mode;
    388	u32 atime;
    389	u32 mtime;
    390	u64 length;
    391	const char *name;
    392	const char *uid;
    393	const char *gid;
    394	const char *muid;
    395	char *extension;	/* 9p2000.u extensions */
    396	kuid_t n_uid;		/* 9p2000.u extensions */
    397	kgid_t n_gid;		/* 9p2000.u extensions */
    398	kuid_t n_muid;		/* 9p2000.u extensions */
    399};
    400
    401struct p9_stat_dotl {
    402	u64 st_result_mask;
    403	struct p9_qid qid;
    404	u32 st_mode;
    405	kuid_t st_uid;
    406	kgid_t st_gid;
    407	u64 st_nlink;
    408	u64 st_rdev;
    409	u64 st_size;
    410	u64 st_blksize;
    411	u64 st_blocks;
    412	u64 st_atime_sec;
    413	u64 st_atime_nsec;
    414	u64 st_mtime_sec;
    415	u64 st_mtime_nsec;
    416	u64 st_ctime_sec;
    417	u64 st_ctime_nsec;
    418	u64 st_btime_sec;
    419	u64 st_btime_nsec;
    420	u64 st_gen;
    421	u64 st_data_version;
    422};
    423
    424#define P9_STATS_MODE		0x00000001ULL
    425#define P9_STATS_NLINK		0x00000002ULL
    426#define P9_STATS_UID		0x00000004ULL
    427#define P9_STATS_GID		0x00000008ULL
    428#define P9_STATS_RDEV		0x00000010ULL
    429#define P9_STATS_ATIME		0x00000020ULL
    430#define P9_STATS_MTIME		0x00000040ULL
    431#define P9_STATS_CTIME		0x00000080ULL
    432#define P9_STATS_INO		0x00000100ULL
    433#define P9_STATS_SIZE		0x00000200ULL
    434#define P9_STATS_BLOCKS		0x00000400ULL
    435
    436#define P9_STATS_BTIME		0x00000800ULL
    437#define P9_STATS_GEN		0x00001000ULL
    438#define P9_STATS_DATA_VERSION	0x00002000ULL
    439
    440#define P9_STATS_BASIC		0x000007ffULL /* Mask for fields up to BLOCKS */
    441#define P9_STATS_ALL		0x00003fffULL /* Mask for All fields above */
    442
    443/**
    444 * struct p9_iattr_dotl - P9 inode attribute for setattr
    445 * @valid: bitfield specifying which fields are valid
    446 *         same as in struct iattr
    447 * @mode: File permission bits
    448 * @uid: user id of owner
    449 * @gid: group id
    450 * @size: File size
    451 * @atime_sec: Last access time, seconds
    452 * @atime_nsec: Last access time, nanoseconds
    453 * @mtime_sec: Last modification time, seconds
    454 * @mtime_nsec: Last modification time, nanoseconds
    455 */
    456
    457struct p9_iattr_dotl {
    458	u32 valid;
    459	u32 mode;
    460	kuid_t uid;
    461	kgid_t gid;
    462	u64 size;
    463	u64 atime_sec;
    464	u64 atime_nsec;
    465	u64 mtime_sec;
    466	u64 mtime_nsec;
    467};
    468
    469#define P9_LOCK_SUCCESS 0
    470#define P9_LOCK_BLOCKED 1
    471#define P9_LOCK_ERROR 2
    472#define P9_LOCK_GRACE 3
    473
    474#define P9_LOCK_FLAGS_BLOCK 1
    475#define P9_LOCK_FLAGS_RECLAIM 2
    476
    477/* struct p9_flock: POSIX lock structure
    478 * @type - type of lock
    479 * @flags - lock flags
    480 * @start - starting offset of the lock
    481 * @length - number of bytes
    482 * @proc_id - process id which wants to take lock
    483 * @client_id - client id
    484 */
    485
    486struct p9_flock {
    487	u8 type;
    488	u32 flags;
    489	u64 start;
    490	u64 length;
    491	u32 proc_id;
    492	char *client_id;
    493};
    494
    495/* struct p9_getlock: getlock structure
    496 * @type - type of lock
    497 * @start - starting offset of the lock
    498 * @length - number of bytes
    499 * @proc_id - process id which wants to take lock
    500 * @client_id - client id
    501 */
    502
    503struct p9_getlock {
    504	u8 type;
    505	u64 start;
    506	u64 length;
    507	u32 proc_id;
    508	char *client_id;
    509};
    510
    511struct p9_rstatfs {
    512	u32 type;
    513	u32 bsize;
    514	u64 blocks;
    515	u64 bfree;
    516	u64 bavail;
    517	u64 files;
    518	u64 ffree;
    519	u64 fsid;
    520	u32 namelen;
    521};
    522
    523/**
    524 * struct p9_fcall - primary packet structure
    525 * @size: prefixed length of the structure
    526 * @id: protocol operating identifier of type &p9_msg_t
    527 * @tag: transaction id of the request
    528 * @offset: used by marshalling routines to track current position in buffer
    529 * @capacity: used by marshalling routines to track total malloc'd capacity
    530 * @sdata: payload
    531 *
    532 * &p9_fcall represents the structure for all 9P RPC
    533 * transactions.  Requests are packaged into fcalls, and reponses
    534 * must be extracted from them.
    535 *
    536 * See Also: http://plan9.bell-labs.com/magic/man2html/2/fcall
    537 */
    538
    539struct p9_fcall {
    540	u32 size;
    541	u8 id;
    542	u16 tag;
    543
    544	size_t offset;
    545	size_t capacity;
    546
    547	struct kmem_cache *cache;
    548	u8 *sdata;
    549};
    550
    551int p9_errstr2errno(char *errstr, int len);
    552
    553int p9_error_init(void);
    554#endif /* NET_9P_H */