xref: /freebsd/sys/fs/p9fs/p9_protocol.h (revision 1d99e8d9a37e1ba528628186df57b79fe74e196c)
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