1e97ad33aSDoug Rabson /*- 2e97ad33aSDoug Rabson * Copyright (c) 2017 Juniper Networks, Inc. 3e97ad33aSDoug Rabson * All rights reserved. 4e97ad33aSDoug Rabson * 5e97ad33aSDoug Rabson * Redistribution and use in source and binary forms, with or without 6e97ad33aSDoug Rabson * modification, are permitted provided that the following conditions 7e97ad33aSDoug Rabson * are met: 8e97ad33aSDoug Rabson * 1. Redistributions of source code must retain the above copyright 9e97ad33aSDoug Rabson * notice, this list of conditions and the following disclaimer. 10e97ad33aSDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright 11e97ad33aSDoug Rabson * notice, this list of conditions and the following disclaimer in the 12e97ad33aSDoug Rabson * documentation and/or other materials provided with the distribution. 13e97ad33aSDoug Rabson * 14e97ad33aSDoug Rabson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15e97ad33aSDoug Rabson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16e97ad33aSDoug Rabson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17e97ad33aSDoug Rabson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18e97ad33aSDoug Rabson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19e97ad33aSDoug Rabson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20e97ad33aSDoug Rabson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21e97ad33aSDoug Rabson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22e97ad33aSDoug Rabson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23e97ad33aSDoug Rabson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24e97ad33aSDoug Rabson * SUCH DAMAGE. 25e97ad33aSDoug Rabson */ 26e97ad33aSDoug Rabson 27e97ad33aSDoug Rabson /* File contains 9P protocol definitions */ 28e97ad33aSDoug Rabson 29e97ad33aSDoug Rabson #ifndef FS_P9FS_P9_PROTOCOL_H 30e97ad33aSDoug Rabson #define FS_P9FS_P9_PROTOCOL_H 31e97ad33aSDoug Rabson 32e97ad33aSDoug Rabson #include <sys/types.h> 33e97ad33aSDoug Rabson 34e97ad33aSDoug Rabson /* 9P message types */ 35e97ad33aSDoug Rabson enum p9_cmds_t { 36e97ad33aSDoug Rabson P9PROTO_TLERROR = 6, /* not used */ 37e97ad33aSDoug Rabson P9PROTO_RLERROR, /* response for any failed request */ 38e97ad33aSDoug Rabson P9PROTO_TSTATFS = 8, /* file system status request */ 39e97ad33aSDoug Rabson P9PROTO_RSTATFS, /* file system status response */ 40e97ad33aSDoug Rabson P9PROTO_TLOPEN = 12, /* open a file (9P2000.L) */ 41e97ad33aSDoug Rabson P9PROTO_RLOPEN, /* response to opne request (9P2000.L) */ 42e97ad33aSDoug Rabson P9PROTO_TLCREATE = 14, /* prepare for handle for I/O on a new file (9P2000.L) */ 43e97ad33aSDoug Rabson P9PROTO_RLCREATE, /* response with file access information (9P2000.L) */ 44e97ad33aSDoug Rabson P9PROTO_TSYMLINK = 16, /* symlink creation request */ 45e97ad33aSDoug Rabson P9PROTO_RSYMLINK, /* symlink creation response */ 46e97ad33aSDoug Rabson P9PROTO_TMKNOD = 18, /* create a special file object request */ 47e97ad33aSDoug Rabson P9PROTO_RMKNOD, /* create a special file object response */ 48e97ad33aSDoug Rabson P9PROTO_TRENAME = 20, /* rename a file request */ 49e97ad33aSDoug Rabson P9PROTO_RRENAME, /* rename a file response */ 50e97ad33aSDoug Rabson P9PROTO_TREADLINK = 22, /* request to read value of symbolic link */ 51e97ad33aSDoug Rabson P9PROTO_RREADLINK, /* response to read value of symbolic link request */ 52e97ad33aSDoug Rabson P9PROTO_TGETATTR = 24, /* get file attributes request */ 53e97ad33aSDoug Rabson P9PROTO_RGETATTR, /* get file attributes response */ 54e97ad33aSDoug Rabson P9PROTO_TSETATTR = 26, /* set file attributes request */ 55e97ad33aSDoug Rabson P9PROTO_RSETATTR, /* set file attributes response */ 56e97ad33aSDoug Rabson P9PROTO_TXATTRWALK = 30,/* request to read extended attributes */ 57e97ad33aSDoug Rabson P9PROTO_RXATTRWALK, /* response from server with attributes */ 58e97ad33aSDoug Rabson P9PROTO_TXATTRCREATE = 32,/* request to set extended attribute */ 59e97ad33aSDoug Rabson P9PROTO_RXATTRCREATE, /* response from server for setting extended attribute */ 60e97ad33aSDoug Rabson P9PROTO_TREADDIR = 40, /* request to read a directory */ 61e97ad33aSDoug Rabson P9PROTO_RREADDIR, /* response from server for read request */ 62e97ad33aSDoug Rabson P9PROTO_TFSYNC = 50, /* request to flush an cached data to disk */ 63e97ad33aSDoug Rabson P9PROTO_RFSYNC, /* response when cache dat is flushed */ 64e97ad33aSDoug Rabson P9PROTO_TLOCK = 52, /* acquire or release a POSIX record lock */ 65e97ad33aSDoug Rabson P9PROTO_RLOCK, /* response with the status of the lock */ 66e97ad33aSDoug Rabson P9PROTO_TGETLOCK = 54, /* request to check for presence of a POSIX record lock */ 67e97ad33aSDoug Rabson P9PROTO_RGETLOCK, /* response with the details of the lock if acquired */ 68e97ad33aSDoug Rabson P9PROTO_TLINK = 70, /* request to create hard link */ 69e97ad33aSDoug Rabson P9PROTO_RLINK, /* create hard link response */ 70e97ad33aSDoug Rabson P9PROTO_TMKDIR = 72, /* create a directory request */ 71e97ad33aSDoug Rabson P9PROTO_RMKDIR, /* create a directory response */ 72e97ad33aSDoug Rabson P9PROTO_TRENAMEAT = 74, /* request to rename a file or directory */ 73e97ad33aSDoug Rabson P9PROTO_RRENAMEAT, /* reponse to rename request */ 74e97ad33aSDoug Rabson P9PROTO_TUNLINKAT = 76, /* unlink a file or directory */ 75e97ad33aSDoug Rabson P9PROTO_RUNLINKAT, /* reponse to unlink request */ 76e97ad33aSDoug Rabson P9PROTO_TVERSION = 100, /* request for version handshake */ 77e97ad33aSDoug Rabson P9PROTO_RVERSION, /* response for version handshake */ 78e97ad33aSDoug Rabson P9PROTO_TAUTH = 102, /* request to establish authentication channel */ 79e97ad33aSDoug Rabson P9PROTO_RAUTH, /* response with authentication information */ 80e97ad33aSDoug Rabson P9PROTO_TATTACH = 104, /* establish a user access to a file system*/ 81e97ad33aSDoug Rabson P9PROTO_RATTACH, /* response with top level handle to file hierarchy */ 82e97ad33aSDoug Rabson P9PROTO_TERROR = 106, /* not used */ 83e97ad33aSDoug Rabson P9PROTO_RERROR, /* response for any failed request */ 84e97ad33aSDoug Rabson P9PROTO_TFLUSH = 108, /* request to abort a previous request */ 85e97ad33aSDoug Rabson P9PROTO_RFLUSH, /* response when previous request has been cancelled */ 86e97ad33aSDoug Rabson P9PROTO_TWALK = 110, /* descend a directory hierarchy */ 87e97ad33aSDoug Rabson P9PROTO_RWALK, /* response with new handle for position within hierarchy */ 88e97ad33aSDoug Rabson P9PROTO_TOPEN = 112, /* prepare file handle for I/O for an existing file */ 89e97ad33aSDoug Rabson P9PROTO_ROPEN, /* response with file access information */ 90e97ad33aSDoug Rabson P9PROTO_TCREATE = 114, /* prepare for handle for I/O on a new file */ 91e97ad33aSDoug Rabson P9PROTO_RCREATE, /* response with file access information */ 92e97ad33aSDoug Rabson P9PROTO_TREAD = 116, /* request to transfer data from a file */ 93e97ad33aSDoug Rabson P9PROTO_RREAD, /* response with data requested */ 94e97ad33aSDoug Rabson P9PROTO_TWRITE = 118, /* request to transfer data to a file */ 95e97ad33aSDoug Rabson P9PROTO_RWRITE, /* response with how much data was written to the file */ 96e97ad33aSDoug Rabson P9PROTO_TCLUNK = 120, /* forget about a handle to a file within the File System */ 97e97ad33aSDoug Rabson P9PROTO_RCLUNK, /* response from the server for forgetting the file handle */ 98e97ad33aSDoug Rabson P9PROTO_TREMOVE = 122, /* request to remove a file */ 99e97ad33aSDoug Rabson P9PROTO_RREMOVE, /* response when server has removed the file */ 100e97ad33aSDoug Rabson P9PROTO_TSTAT = 124, /* request file entity attributes */ 101e97ad33aSDoug Rabson P9PROTO_RSTAT, /* response with file entity attributes */ 102e97ad33aSDoug Rabson P9PROTO_TWSTAT = 126, /* request to update file entity attributes */ 103e97ad33aSDoug Rabson P9PROTO_RWSTAT, /* response when file entity attributes are updated */ 104e97ad33aSDoug Rabson }; 105e97ad33aSDoug Rabson 106e97ad33aSDoug Rabson /* File Open Modes */ 107e97ad33aSDoug Rabson enum p9_open_mode_t { 108e97ad33aSDoug Rabson P9PROTO_OREAD = 0x00, /* open file for reading only */ 109e97ad33aSDoug Rabson P9PROTO_OWRITE = 0x01, /* open file for writing only */ 110e97ad33aSDoug Rabson P9PROTO_ORDWR = 0x02, /* open file for both reading and writing */ 111e97ad33aSDoug Rabson P9PROTO_OEXEC = 0x03, /* open file for execution */ 112e97ad33aSDoug Rabson P9PROTO_OTRUNC = 0x10, /* truncate file to zero length before opening it */ 113e97ad33aSDoug Rabson P9PROTO_OREXEC = 0x20, /* close the file when exec system call is made */ 114e97ad33aSDoug Rabson P9PROTO_ORCLOSE = 0x40, /* remove the file when it is closed */ 115e97ad33aSDoug Rabson P9PROTO_OAPPEND = 0x80, /* open the file and seek to the end of the file */ 116e97ad33aSDoug Rabson P9PROTO_OEXCL = 0x1000, /* only create a file and not open it */ 117e97ad33aSDoug Rabson }; 118e97ad33aSDoug Rabson 119e97ad33aSDoug Rabson /* FIle Permissions */ 120e97ad33aSDoug Rabson enum p9_perm_t { 121e97ad33aSDoug Rabson P9PROTO_DMDIR = 0x80000000, /* permission bit for directories */ 122e97ad33aSDoug Rabson P9PROTO_DMAPPEND = 0x40000000, /* permission bit for is append-only */ 123e97ad33aSDoug Rabson P9PROTO_DMEXCL = 0x20000000, /* permission bit for exclusive use (only one open handle allowed) */ 124e97ad33aSDoug Rabson P9PROTO_DMMOUNT = 0x10000000, /* permission bit for mount points */ 125e97ad33aSDoug Rabson P9PROTO_DMAUTH = 0x08000000, /* permission bit for authentication file */ 126e97ad33aSDoug Rabson P9PROTO_DMTMP = 0x04000000, /* permission bit for non-backed-up files */ 127e97ad33aSDoug Rabson P9PROTO_DMSYMLINK = 0x02000000, /* permission bit for symbolic link (9P2000.u) */ 128e97ad33aSDoug Rabson P9PROTO_DMLINK = 0x01000000, /* permission bit for hard-link (9P2000.u) */ 129e97ad33aSDoug Rabson P9PROTO_DMDEVICE = 0x00800000, /* permission bit for device files (9P2000.u) */ 130e97ad33aSDoug Rabson P9PROTO_DMNAMEDPIPE = 0x00200000,/* permission bit for named pipe (9P2000.u) */ 131e97ad33aSDoug Rabson P9PROTO_DMSOCKET = 0x00100000, /* permission bit for socket (9P2000.u) */ 132e97ad33aSDoug Rabson P9PROTO_DMSETUID = 0x00080000, /* permission bit for setuid (9P2000.u) */ 133e97ad33aSDoug Rabson P9PROTO_DMSETGID = 0x00040000, /* permission bit for setgid (9P2000.u) */ 134e97ad33aSDoug Rabson P9PROTO_DMSETVTX = 0x00010000, /* permission bit for sticky bit (9P2000.u) */ 135e97ad33aSDoug Rabson }; 136e97ad33aSDoug Rabson 137e97ad33aSDoug Rabson /* 138e97ad33aSDoug Rabson * QID types - they are primarly used to 139e97ad33aSDoug Rabson * differentiate semantics for a file system 140e97ad33aSDoug Rabson */ 141e97ad33aSDoug Rabson enum p9_qid_t { 142e97ad33aSDoug Rabson P9PROTO_QTDIR = 0x80, /* directory */ 143e97ad33aSDoug Rabson P9PROTO_QTAPPEND = 0x40, /* append-only */ 144e97ad33aSDoug Rabson P9PROTO_QTEXCL = 0x20, /* exclusive use (only one open handle allowed)*/ 145e97ad33aSDoug Rabson P9PROTO_QTMOUNT = 0x10, /* mount points */ 146e97ad33aSDoug Rabson P9PROTO_QTAUTH = 0x08, /* authentication file */ 147e97ad33aSDoug Rabson P9PROTO_QTTMP = 0x04, /* non-backed-up files */ 148e97ad33aSDoug Rabson P9PROTO_QTSYMLINK = 0x02, /* symbolic links */ 149e97ad33aSDoug Rabson P9PROTO_QTLINK = 0x01, /* hard link */ 150e97ad33aSDoug Rabson P9PROTO_QTFILE = 0x00, /* normal files */ 151e97ad33aSDoug Rabson }; 152e97ad33aSDoug Rabson 153e97ad33aSDoug Rabson /* P9 Magic Numbers */ 154e97ad33aSDoug Rabson #define P9PROTO_NOFID (uint32_t)(~0) 155e97ad33aSDoug Rabson #define P9_DEFUNAME "nobody" 156e97ad33aSDoug Rabson #define P9_DEFANAME "" 157e97ad33aSDoug Rabson #define P9_NONUNAME (uint32_t)(~0) 158e97ad33aSDoug Rabson #define P9_MAXWELEM 16 159e97ad33aSDoug Rabson 160e97ad33aSDoug Rabson /* Exchange unit between Qemu and Client */ 161e97ad33aSDoug Rabson struct p9_qid { 162e97ad33aSDoug Rabson uint8_t type; /* the type of the file */ 163e97ad33aSDoug Rabson uint32_t version; /* version number for given path */ 164e97ad33aSDoug Rabson uint64_t path; /* the file servers unique id for file */ 165e97ad33aSDoug Rabson }; 166e97ad33aSDoug Rabson 167e97ad33aSDoug Rabson /* FS information stat structure */ 168e97ad33aSDoug Rabson struct p9_statfs { 169e97ad33aSDoug Rabson uint32_t type; /* type of file system */ 170e97ad33aSDoug Rabson uint32_t bsize; /* optimal transfer block size */ 171e97ad33aSDoug Rabson uint64_t blocks; /* total data blocks in file system */ 172e97ad33aSDoug Rabson uint64_t bfree; /* free blocks in fs */ 173e97ad33aSDoug Rabson uint64_t bavail; /* free blocks avail to non-superuser */ 174e97ad33aSDoug Rabson uint64_t files; /* total file nodes in file system */ 175e97ad33aSDoug Rabson uint64_t ffree; /* free file nodes in fs */ 176e97ad33aSDoug Rabson uint64_t fsid; /* file system id */ 177e97ad33aSDoug Rabson uint32_t namelen; /* maximum length of filenames */ 178e97ad33aSDoug Rabson }; 179e97ad33aSDoug Rabson 180e97ad33aSDoug Rabson 181e97ad33aSDoug Rabson /* File system metadata information */ 182e97ad33aSDoug Rabson struct p9_wstat { 183e97ad33aSDoug Rabson uint16_t size; /* total byte count of the following data */ 184e97ad33aSDoug Rabson uint16_t type; /* type of file */ 185e97ad33aSDoug Rabson uint32_t dev; /* id of device containing file */ 186e97ad33aSDoug Rabson struct p9_qid qid; /* identifier used by server for file system entity information */ 187e97ad33aSDoug Rabson uint32_t mode; /* protection */ 188e97ad33aSDoug Rabson uint32_t atime; /* time of last access */ 189e97ad33aSDoug Rabson uint32_t mtime; /* time of last modification */ 190e97ad33aSDoug Rabson uint64_t length; /* length of file in bytes */ 191e97ad33aSDoug Rabson char *name; /* file name */ 192e97ad33aSDoug Rabson char *uid; /* user ID of owner */ 193e97ad33aSDoug Rabson char *gid; /* group ID of owner */ 194e97ad33aSDoug Rabson char *muid; /* name of the user who last modified the file */ 195e97ad33aSDoug Rabson char *extension; /* 9p2000.u extensions */ 196e97ad33aSDoug Rabson uid_t n_uid; /* 9p2000.u extensions */ 197e97ad33aSDoug Rabson gid_t n_gid; /* 9p2000.u extensions */ 198e97ad33aSDoug Rabson uid_t n_muid; /* 9p2000.u extensions */ 199e97ad33aSDoug Rabson }; 200e97ad33aSDoug Rabson 201e97ad33aSDoug Rabson /* The linux version of FS information stat structure*/ 202e97ad33aSDoug Rabson struct p9_stat_dotl { 203e97ad33aSDoug Rabson uint64_t st_result_mask;/* indicates fields that are requested */ 204e97ad33aSDoug Rabson struct p9_qid qid; /* identifier used by server for file system entity information */ 205e97ad33aSDoug Rabson uint32_t st_mode; /* protection */ 206e97ad33aSDoug Rabson uid_t st_uid; /* user ID of owner */ 207e97ad33aSDoug Rabson gid_t st_gid; /* group ID of owner */ 208e97ad33aSDoug Rabson uint64_t st_nlink; /* number of hard links */ 209e97ad33aSDoug Rabson uint64_t st_rdev; /* device ID (if special file) */ 210e97ad33aSDoug Rabson uint64_t st_size; /* total size, in bytes */ 211e97ad33aSDoug Rabson uint64_t st_blksize; /* blocksize for file system I/O */ 212e97ad33aSDoug Rabson uint64_t st_blocks; /* number of 512B blocks allocated */ 213e97ad33aSDoug Rabson uint64_t st_atime_sec; /* time of last access, seconds */ 214e97ad33aSDoug Rabson uint64_t st_atime_nsec; /* time of last access, nanoseconds */ 215e97ad33aSDoug Rabson uint64_t st_mtime_sec; /* time of last modification, seconds */ 216e97ad33aSDoug Rabson uint64_t st_mtime_nsec; /* time of last modifictaion, nanoseconds */ 217e97ad33aSDoug Rabson uint64_t st_ctime_sec; /* time of last status change, seconds*/ 218e97ad33aSDoug Rabson uint64_t st_ctime_nsec; /* time of last status change, nanoseconds*/ 219e97ad33aSDoug Rabson uint64_t st_btime_sec; /* following memebers are reserved for future use */ 220e97ad33aSDoug Rabson uint64_t st_btime_nsec; 221e97ad33aSDoug Rabson uint64_t st_gen; 222e97ad33aSDoug Rabson uint64_t st_data_version; 223e97ad33aSDoug Rabson }; 224e97ad33aSDoug Rabson 225e97ad33aSDoug Rabson /* P9 inode attribute for setattr */ 226e97ad33aSDoug Rabson struct p9_iattr_dotl { 227e97ad33aSDoug Rabson uint32_t valid; /* bit fields specifying which fields are valid */ 228e97ad33aSDoug Rabson uint32_t mode; /* protection */ 229e97ad33aSDoug Rabson uid_t uid; /* user id of owner */ 230e97ad33aSDoug Rabson gid_t gid; /* group id */ 231e97ad33aSDoug Rabson uint64_t size; /* file size */ 232e97ad33aSDoug Rabson uint64_t atime_sec; /* last access time in seconds */ 233e97ad33aSDoug Rabson uint64_t atime_nsec; /* last access time in nanoseconds */ 234e97ad33aSDoug Rabson uint64_t mtime_sec; /* last modification time in seconds */ 235e97ad33aSDoug Rabson uint64_t mtime_nsec; /* last modification time in nanoseconds */ 236e97ad33aSDoug Rabson }; 237e97ad33aSDoug Rabson 238e97ad33aSDoug Rabson #define P9PROTO_STATS_MODE 0x00000001ULL 239e97ad33aSDoug Rabson #define P9PROTO_STATS_NLINK 0x00000002ULL 240e97ad33aSDoug Rabson #define P9PROTO_STATS_UID 0x00000004ULL 241e97ad33aSDoug Rabson #define P9PROTO_STATS_GID 0x00000008ULL 242e97ad33aSDoug Rabson #define P9PROTO_STATS_RDEV 0x00000010ULL 243e97ad33aSDoug Rabson #define P9PROTO_STATS_ATIME 0x00000020ULL 244e97ad33aSDoug Rabson #define P9PROTO_STATS_MTIME 0x00000040ULL 245e97ad33aSDoug Rabson #define P9PROTO_STATS_CTIME 0x00000080ULL 246e97ad33aSDoug Rabson #define P9PROTO_STATS_INO 0x00000100ULL 247e97ad33aSDoug Rabson #define P9PROTO_STATS_SIZE 0x00000200ULL 248e97ad33aSDoug Rabson #define P9PROTO_STATS_BLOCKS 0x00000400ULL 249e97ad33aSDoug Rabson 250e97ad33aSDoug Rabson #define P9PROTO_STATS_BTIME 0x00000800ULL 251e97ad33aSDoug Rabson #define P9PROTO_STATS_GEN 0x00001000ULL 252e97ad33aSDoug Rabson #define P9PROTO_STATS_DATA_VERSION 0x00002000ULL 253e97ad33aSDoug Rabson 254e97ad33aSDoug Rabson #define P9PROTO_STATS_BASIC 0x000007ffULL /* Mask for fields up to BLOCKS */ 255e97ad33aSDoug Rabson #define P9PROTO_STATS_ALL 0x00003fffULL /* Mask for All fields above */ 256e97ad33aSDoug Rabson 257e97ad33aSDoug Rabson #define P9PROTO_SETATTR_MODE 0x00000001UL 258e97ad33aSDoug Rabson #define P9PROTO_SETATTR_UID 0x00000002UL 259e97ad33aSDoug Rabson #define P9PROTO_SETATTR_GID 0x00000004UL 260e97ad33aSDoug Rabson #define P9PROTO_SETATTR_SIZE 0x00000008UL 261e97ad33aSDoug Rabson #define P9PROTO_SETATTR_ATIME 0x00000010UL 262e97ad33aSDoug Rabson #define P9PROTO_SETATTR_MTIME 0x00000020UL 263e97ad33aSDoug Rabson #define P9PROTO_SETATTR_CTIME 0x00000040UL 264e97ad33aSDoug Rabson #define P9PROTO_SETATTR_ATIME_SET 0x00000080UL 265e97ad33aSDoug Rabson #define P9PROTO_SETATTR_MTIME_SET 0x00000100UL 266e97ad33aSDoug Rabson #define P9PROTO_SETATTR_MASK 0x000001bfUL 267e97ad33aSDoug Rabson 268e97ad33aSDoug Rabson #define P9PROTO_TGETATTR_BLK 512 269e97ad33aSDoug Rabson 270*1d99e8d9SMark Johnston #define P9PROTO_UNLINKAT_REMOVEDIR 0x200 271*1d99e8d9SMark Johnston 272e97ad33aSDoug Rabson /* PDU buffer used for SG lists. */ 273e97ad33aSDoug Rabson struct p9_buffer { 274e97ad33aSDoug Rabson uint32_t size; 275e97ad33aSDoug Rabson uint16_t tag; 276e97ad33aSDoug Rabson uint8_t id; 277e97ad33aSDoug Rabson size_t offset; 278e97ad33aSDoug Rabson size_t capacity; 279e97ad33aSDoug Rabson uint8_t *sdata; 280e97ad33aSDoug Rabson }; 281e97ad33aSDoug Rabson 282e97ad33aSDoug Rabson #endif /* FS_P9FS_P9_PROTOCOL_H */ 283