xref: /freebsd/contrib/lib9p/fcall.h (revision 134e1779)
1*134e1779SJakub Wojciech Klama /*
2*134e1779SJakub Wojciech Klama  * Copyright 2016 Jakub Klama <jceel@FreeBSD.org>
3*134e1779SJakub Wojciech Klama  * All rights reserved
4*134e1779SJakub Wojciech Klama  *
5*134e1779SJakub Wojciech Klama  * Redistribution and use in source and binary forms, with or without
6*134e1779SJakub Wojciech Klama  * modification, are permitted providing that the following conditions
7*134e1779SJakub Wojciech Klama  * are met:
8*134e1779SJakub Wojciech Klama  * 1. Redistributions of source code must retain the above copyright
9*134e1779SJakub Wojciech Klama  *    notice, this list of conditions and the following disclaimer.
10*134e1779SJakub Wojciech Klama  * 2. Redistributions in binary form must reproduce the above copyright
11*134e1779SJakub Wojciech Klama  *    notice, this list of conditions and the following disclaimer in the
12*134e1779SJakub Wojciech Klama  *    documentation and/or other materials provided with the distribution.
13*134e1779SJakub Wojciech Klama  *
14*134e1779SJakub Wojciech Klama  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15*134e1779SJakub Wojciech Klama  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16*134e1779SJakub Wojciech Klama  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*134e1779SJakub Wojciech Klama  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
18*134e1779SJakub Wojciech Klama  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*134e1779SJakub Wojciech Klama  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*134e1779SJakub Wojciech Klama  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*134e1779SJakub Wojciech Klama  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
22*134e1779SJakub Wojciech Klama  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
23*134e1779SJakub Wojciech Klama  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24*134e1779SJakub Wojciech Klama  * POSSIBILITY OF SUCH DAMAGE.
25*134e1779SJakub Wojciech Klama  *
26*134e1779SJakub Wojciech Klama  */
27*134e1779SJakub Wojciech Klama 
28*134e1779SJakub Wojciech Klama /*
29*134e1779SJakub Wojciech Klama  * Based on libixp code: ©2007-2010 Kris Maglione <maglione.k at Gmail>
30*134e1779SJakub Wojciech Klama  */
31*134e1779SJakub Wojciech Klama 
32*134e1779SJakub Wojciech Klama #ifndef LIB9P_FCALL_H
33*134e1779SJakub Wojciech Klama #define LIB9P_FCALL_H
34*134e1779SJakub Wojciech Klama 
35*134e1779SJakub Wojciech Klama #include <stdint.h>
36*134e1779SJakub Wojciech Klama 
37*134e1779SJakub Wojciech Klama #define L9P_MAX_WELEM   256
38*134e1779SJakub Wojciech Klama 
39*134e1779SJakub Wojciech Klama /*
40*134e1779SJakub Wojciech Klama  * Function call/reply (Tfoo/Rfoo) numbers.
41*134e1779SJakub Wojciech Klama  *
42*134e1779SJakub Wojciech Klama  * These are protocol code numbers, so the exact values
43*134e1779SJakub Wojciech Klama  * matter.  However, __FIRST and __LAST_PLUS_ONE are for
44*134e1779SJakub Wojciech Klama  * debug code, and just need to encompass the entire range.
45*134e1779SJakub Wojciech Klama  *
46*134e1779SJakub Wojciech Klama  * Note that we rely (in the debug code) on Rfoo == Tfoo+1.
47*134e1779SJakub Wojciech Klama  */
48*134e1779SJakub Wojciech Klama enum l9p_ftype {
49*134e1779SJakub Wojciech Klama 	L9P__FIRST = 6,		/* NB: must be <= all legal values */
50*134e1779SJakub Wojciech Klama 	L9P_TLERROR = 6,	/* illegal; exists for parity with Rlerror */
51*134e1779SJakub Wojciech Klama 	L9P_RLERROR,
52*134e1779SJakub Wojciech Klama 	L9P_TSTATFS = 8,
53*134e1779SJakub Wojciech Klama 	L9P_RSTATFS,
54*134e1779SJakub Wojciech Klama 	L9P_TLOPEN = 12,
55*134e1779SJakub Wojciech Klama 	L9P_RLOPEN,
56*134e1779SJakub Wojciech Klama 	L9P_TLCREATE = 14,
57*134e1779SJakub Wojciech Klama 	L9P_RLCREATE,
58*134e1779SJakub Wojciech Klama 	L9P_TSYMLINK = 16,
59*134e1779SJakub Wojciech Klama 	L9P_RSYMLINK,
60*134e1779SJakub Wojciech Klama 	L9P_TMKNOD = 18,
61*134e1779SJakub Wojciech Klama 	L9P_RMKNOD,
62*134e1779SJakub Wojciech Klama 	L9P_TRENAME = 20,
63*134e1779SJakub Wojciech Klama 	L9P_RRENAME,
64*134e1779SJakub Wojciech Klama 	L9P_TREADLINK = 22,
65*134e1779SJakub Wojciech Klama 	L9P_RREADLINK,
66*134e1779SJakub Wojciech Klama 	L9P_TGETATTR = 24,
67*134e1779SJakub Wojciech Klama 	L9P_RGETATTR,
68*134e1779SJakub Wojciech Klama 	L9P_TSETATTR = 26,
69*134e1779SJakub Wojciech Klama 	L9P_RSETATTR,
70*134e1779SJakub Wojciech Klama 	L9P_TXATTRWALK = 30,
71*134e1779SJakub Wojciech Klama 	L9P_RXATTRWALK,
72*134e1779SJakub Wojciech Klama 	L9P_TXATTRCREATE = 32,
73*134e1779SJakub Wojciech Klama 	L9P_RXATTRCREATE,
74*134e1779SJakub Wojciech Klama 	L9P_TREADDIR = 40,
75*134e1779SJakub Wojciech Klama 	L9P_RREADDIR,
76*134e1779SJakub Wojciech Klama 	L9P_TFSYNC = 50,
77*134e1779SJakub Wojciech Klama 	L9P_RFSYNC,
78*134e1779SJakub Wojciech Klama 	L9P_TLOCK = 52,
79*134e1779SJakub Wojciech Klama 	L9P_RLOCK,
80*134e1779SJakub Wojciech Klama 	L9P_TGETLOCK = 54,
81*134e1779SJakub Wojciech Klama 	L9P_RGETLOCK,
82*134e1779SJakub Wojciech Klama 	L9P_TLINK = 70,
83*134e1779SJakub Wojciech Klama 	L9P_RLINK,
84*134e1779SJakub Wojciech Klama 	L9P_TMKDIR = 72,
85*134e1779SJakub Wojciech Klama 	L9P_RMKDIR,
86*134e1779SJakub Wojciech Klama 	L9P_TRENAMEAT = 74,
87*134e1779SJakub Wojciech Klama 	L9P_RRENAMEAT,
88*134e1779SJakub Wojciech Klama 	L9P_TUNLINKAT = 76,
89*134e1779SJakub Wojciech Klama 	L9P_RUNLINKAT,
90*134e1779SJakub Wojciech Klama 	L9P_TVERSION = 100,
91*134e1779SJakub Wojciech Klama 	L9P_RVERSION,
92*134e1779SJakub Wojciech Klama 	L9P_TAUTH = 102,
93*134e1779SJakub Wojciech Klama 	L9P_RAUTH,
94*134e1779SJakub Wojciech Klama 	L9P_TATTACH = 104,
95*134e1779SJakub Wojciech Klama 	L9P_RATTACH,
96*134e1779SJakub Wojciech Klama 	L9P_TERROR = 106, 	/* illegal */
97*134e1779SJakub Wojciech Klama 	L9P_RERROR,
98*134e1779SJakub Wojciech Klama 	L9P_TFLUSH = 108,
99*134e1779SJakub Wojciech Klama 	L9P_RFLUSH,
100*134e1779SJakub Wojciech Klama 	L9P_TWALK = 110,
101*134e1779SJakub Wojciech Klama 	L9P_RWALK,
102*134e1779SJakub Wojciech Klama 	L9P_TOPEN = 112,
103*134e1779SJakub Wojciech Klama 	L9P_ROPEN,
104*134e1779SJakub Wojciech Klama 	L9P_TCREATE = 114,
105*134e1779SJakub Wojciech Klama 	L9P_RCREATE,
106*134e1779SJakub Wojciech Klama 	L9P_TREAD = 116,
107*134e1779SJakub Wojciech Klama 	L9P_RREAD,
108*134e1779SJakub Wojciech Klama 	L9P_TWRITE = 118,
109*134e1779SJakub Wojciech Klama 	L9P_RWRITE,
110*134e1779SJakub Wojciech Klama 	L9P_TCLUNK = 120,
111*134e1779SJakub Wojciech Klama 	L9P_RCLUNK,
112*134e1779SJakub Wojciech Klama 	L9P_TREMOVE = 122,
113*134e1779SJakub Wojciech Klama 	L9P_RREMOVE,
114*134e1779SJakub Wojciech Klama 	L9P_TSTAT = 124,
115*134e1779SJakub Wojciech Klama 	L9P_RSTAT,
116*134e1779SJakub Wojciech Klama 	L9P_TWSTAT = 126,
117*134e1779SJakub Wojciech Klama 	L9P_RWSTAT,
118*134e1779SJakub Wojciech Klama 	L9P__LAST_PLUS_1,	/* NB: must be last */
119*134e1779SJakub Wojciech Klama };
120*134e1779SJakub Wojciech Klama 
121*134e1779SJakub Wojciech Klama /*
122*134e1779SJakub Wojciech Klama  * When a Tfoo request comes over the wire, we decode it
123*134e1779SJakub Wojciech Klama  * (pack.c) from wire format into a request laid out in
124*134e1779SJakub Wojciech Klama  * a "union l9p_fcall" object.  This object is not in wire
125*134e1779SJakub Wojciech Klama  * format, but rather in something more convenient for us
126*134e1779SJakub Wojciech Klama  * to operate on.
127*134e1779SJakub Wojciech Klama  *
128*134e1779SJakub Wojciech Klama  * We then dispatch the request (request.c, backend/fs.c) and
129*134e1779SJakub Wojciech Klama  * use another "union l9p_fcall" object to build a reply.
130*134e1779SJakub Wojciech Klama  * The reply is converted to wire format on the way back out
131*134e1779SJakub Wojciech Klama  * (pack.c again).
132*134e1779SJakub Wojciech Klama  *
133*134e1779SJakub Wojciech Klama  * All sub-objects start with a header containing the request
134*134e1779SJakub Wojciech Klama  * or reply type code and two-byte tag, and whether or not it
135*134e1779SJakub Wojciech Klama  * is needed, a four-byte fid.
136*134e1779SJakub Wojciech Klama  *
137*134e1779SJakub Wojciech Klama  * What this means here is that the data structures within
138*134e1779SJakub Wojciech Klama  * the union can be shared across various requests and replies.
139*134e1779SJakub Wojciech Klama  * For instance, replies to OPEN, CREATE, LCREATE, LOPEN, MKDIR, and
140*134e1779SJakub Wojciech Klama  * SYMLINK are all fairly similar (providing a qid and sometimes
141*134e1779SJakub Wojciech Klama  * an iounit) and hence can all use the l9p_f_ropen structure.
142*134e1779SJakub Wojciech Klama  * Which structures are used for which operations is somewhat
143*134e1779SJakub Wojciech Klama  * arbitrary; for programming ease, if an operation shares a
144*134e1779SJakub Wojciech Klama  * data structure, it still has its own name: there are union
145*134e1779SJakub Wojciech Klama  * members named ropen, rcreate, rlcreate, rlopen, rmkdir, and
146*134e1779SJakub Wojciech Klama  * rsymlink, even though all use struct l9p_f_ropen.
147*134e1779SJakub Wojciech Klama  *
148*134e1779SJakub Wojciech Klama  * The big exception to the above rule is struct l9p_f_io, which
149*134e1779SJakub Wojciech Klama  * is used as both request and reply for all of READ, WRITE, and
150*134e1779SJakub Wojciech Klama  * READDIR.  Moreover, the READDIR reply must be pre-packed into
151*134e1779SJakub Wojciech Klama  * wire format (it is handled like raw data a la READ).
152*134e1779SJakub Wojciech Klama  *
153*134e1779SJakub Wojciech Klama  * Some request messages (e.g., TREADLINK) fit in a header, having
154*134e1779SJakub Wojciech Klama  * just type code, tag, and fid.  These have no separate data
155*134e1779SJakub Wojciech Klama  * structure, nor union member name.  Similarly, some reply
156*134e1779SJakub Wojciech Klama  * messages (e.g., RCLUNK, RREMOVE, RRENAME) have just the type
157*134e1779SJakub Wojciech Klama  * code and tag.
158*134e1779SJakub Wojciech Klama  */
159*134e1779SJakub Wojciech Klama 
160*134e1779SJakub Wojciech Klama /*
161*134e1779SJakub Wojciech Klama  * Type code bits in (the first byte of) a qid.
162*134e1779SJakub Wojciech Klama  */
163*134e1779SJakub Wojciech Klama enum l9p_qid_type {
164*134e1779SJakub Wojciech Klama 	L9P_QTDIR = 0x80, /* type bit for directories */
165*134e1779SJakub Wojciech Klama 	L9P_QTAPPEND = 0x40, /* type bit for append only files */
166*134e1779SJakub Wojciech Klama 	L9P_QTEXCL = 0x20, /* type bit for exclusive use files */
167*134e1779SJakub Wojciech Klama 	L9P_QTMOUNT = 0x10, /* type bit for mounted channel */
168*134e1779SJakub Wojciech Klama 	L9P_QTAUTH = 0x08, /* type bit for authentication file */
169*134e1779SJakub Wojciech Klama 	L9P_QTTMP = 0x04, /* type bit for non-backed-up file */
170*134e1779SJakub Wojciech Klama 	L9P_QTSYMLINK = 0x02, /* type bit for symbolic link */
171*134e1779SJakub Wojciech Klama 	L9P_QTFILE = 0x00 /* type bits for plain file */
172*134e1779SJakub Wojciech Klama };
173*134e1779SJakub Wojciech Klama 
174*134e1779SJakub Wojciech Klama /*
175*134e1779SJakub Wojciech Klama  * Extra permission bits in create and file modes (stat).
176*134e1779SJakub Wojciech Klama  */
177*134e1779SJakub Wojciech Klama #define L9P_DMDIR 0x80000000
178*134e1779SJakub Wojciech Klama enum {
179*134e1779SJakub Wojciech Klama 	L9P_DMAPPEND = 0x40000000,
180*134e1779SJakub Wojciech Klama 	L9P_DMEXCL = 0x20000000,
181*134e1779SJakub Wojciech Klama 	L9P_DMMOUNT = 0x10000000,
182*134e1779SJakub Wojciech Klama 	L9P_DMAUTH = 0x08000000,
183*134e1779SJakub Wojciech Klama 	L9P_DMTMP = 0x04000000,
184*134e1779SJakub Wojciech Klama 	L9P_DMSYMLINK = 0x02000000,
185*134e1779SJakub Wojciech Klama 	/* 9P2000.u extensions */
186*134e1779SJakub Wojciech Klama 	L9P_DMDEVICE = 0x00800000,
187*134e1779SJakub Wojciech Klama 	L9P_DMNAMEDPIPE = 0x00200000,
188*134e1779SJakub Wojciech Klama 	L9P_DMSOCKET = 0x00100000,
189*134e1779SJakub Wojciech Klama 	L9P_DMSETUID = 0x00080000,
190*134e1779SJakub Wojciech Klama 	L9P_DMSETGID = 0x00040000,
191*134e1779SJakub Wojciech Klama };
192*134e1779SJakub Wojciech Klama 
193*134e1779SJakub Wojciech Klama /*
194*134e1779SJakub Wojciech Klama  * Open/create mode bits in 9P2000 and 9P2000.u operations
195*134e1779SJakub Wojciech Klama  * (not Linux lopen and lcreate flags, which are different).
196*134e1779SJakub Wojciech Klama  * Note that the mode field is only one byte wide.
197*134e1779SJakub Wojciech Klama  */
198*134e1779SJakub Wojciech Klama enum l9p_omode {
199*134e1779SJakub Wojciech Klama 	L9P_OREAD = 0,	/* open for read */
200*134e1779SJakub Wojciech Klama 	L9P_OWRITE = 1,	/* write */
201*134e1779SJakub Wojciech Klama 	L9P_ORDWR = 2,	/* read and write */
202*134e1779SJakub Wojciech Klama 	L9P_OEXEC = 3,	/* execute, == read but check execute permission */
203*134e1779SJakub Wojciech Klama 	L9P_OACCMODE = 3, /* mask for the above access-mode bits */
204*134e1779SJakub Wojciech Klama 	L9P_OTRUNC = 16,	/* or'ed in (except for exec), truncate file first */
205*134e1779SJakub Wojciech Klama 	L9P_OCEXEC = 32,	/* or'ed in, close on exec */
206*134e1779SJakub Wojciech Klama 	L9P_ORCLOSE = 64,	/* or'ed in, remove on close */
207*134e1779SJakub Wojciech Klama 	L9P_ODIRECT = 128,	/* or'ed in, direct access */
208*134e1779SJakub Wojciech Klama };
209*134e1779SJakub Wojciech Klama 
210*134e1779SJakub Wojciech Klama /*
211*134e1779SJakub Wojciech Klama  * Flag bits in 9P2000.L operations (Tlopen, Tlcreate).  These are
212*134e1779SJakub Wojciech Klama  * basically just the Linux L_* flags.  The bottom 3 bits are the
213*134e1779SJakub Wojciech Klama  * same as for l9p_omode, although open-for-exec is not used:
214*134e1779SJakub Wojciech Klama  * instead, the client does a Tgetattr and checks the mode for
215*134e1779SJakub Wojciech Klama  * execute bits, then just opens for reading.
216*134e1779SJakub Wojciech Klama  *
217*134e1779SJakub Wojciech Klama  * Each L_O_xxx is just value O_xxx has on Linux in <fcntl.h>;
218*134e1779SJakub Wojciech Klama  * not all are necessarily used.  From observation, we do get
219*134e1779SJakub Wojciech Klama  * L_O_CREAT and L_O_EXCL when creating with exclusive, and always
220*134e1779SJakub Wojciech Klama  * get L_O_LARGEFILE.  We do get L_O_APPEND when opening for
221*134e1779SJakub Wojciech Klama  * append.  We also get both L_O_DIRECT and L_O_DIRECTORY set
222*134e1779SJakub Wojciech Klama  * when opening directories.
223*134e1779SJakub Wojciech Klama  *
224*134e1779SJakub Wojciech Klama  * We probably never get L_O_NOCTTY which makes no sense, and
225*134e1779SJakub Wojciech Klama  * some of the other options may need to be handled on the client.
226*134e1779SJakub Wojciech Klama  */
227*134e1779SJakub Wojciech Klama enum l9p_l_o_flags {
228*134e1779SJakub Wojciech Klama 	L9P_L_O_CREAT =		000000100U,
229*134e1779SJakub Wojciech Klama 	L9P_L_O_EXCL =		000000200U,
230*134e1779SJakub Wojciech Klama 	L9P_L_O_NOCTTY =	000000400U,
231*134e1779SJakub Wojciech Klama 	L9P_L_O_TRUNC =		000001000U,
232*134e1779SJakub Wojciech Klama 	L9P_L_O_APPEND =	000002000U,
233*134e1779SJakub Wojciech Klama 	L9P_L_O_NONBLOCK =	000004000U,
234*134e1779SJakub Wojciech Klama 	L9P_L_O_DSYNC =		000010000U,
235*134e1779SJakub Wojciech Klama 	L9P_L_O_FASYNC =	000020000U,
236*134e1779SJakub Wojciech Klama 	L9P_L_O_DIRECT =	000040000U,
237*134e1779SJakub Wojciech Klama 	L9P_L_O_LARGEFILE =	000100000U,
238*134e1779SJakub Wojciech Klama 	L9P_L_O_DIRECTORY =	000200000U,
239*134e1779SJakub Wojciech Klama 	L9P_L_O_NOFOLLOW =	000400000U,
240*134e1779SJakub Wojciech Klama 	L9P_L_O_NOATIME =	001000000U,
241*134e1779SJakub Wojciech Klama 	L9P_L_O_CLOEXEC =	002000000U,
242*134e1779SJakub Wojciech Klama 	L9P_L_O_SYNC =		004000000U,
243*134e1779SJakub Wojciech Klama 	L9P_L_O_PATH =		010000000U,
244*134e1779SJakub Wojciech Klama 	L9P_L_O_TMPFILE =	020000000U,
245*134e1779SJakub Wojciech Klama };
246*134e1779SJakub Wojciech Klama 
247*134e1779SJakub Wojciech Klama struct l9p_hdr {
248*134e1779SJakub Wojciech Klama 	uint8_t type;
249*134e1779SJakub Wojciech Klama 	uint16_t tag;
250*134e1779SJakub Wojciech Klama 	uint32_t fid;
251*134e1779SJakub Wojciech Klama };
252*134e1779SJakub Wojciech Klama 
253*134e1779SJakub Wojciech Klama struct l9p_qid {
254*134e1779SJakub Wojciech Klama 	uint8_t  type;
255*134e1779SJakub Wojciech Klama 	uint32_t version;
256*134e1779SJakub Wojciech Klama 	uint64_t path;
257*134e1779SJakub Wojciech Klama };
258*134e1779SJakub Wojciech Klama 
259*134e1779SJakub Wojciech Klama struct l9p_stat {
260*134e1779SJakub Wojciech Klama 	uint16_t type;
261*134e1779SJakub Wojciech Klama 	uint32_t dev;
262*134e1779SJakub Wojciech Klama 	struct l9p_qid qid;
263*134e1779SJakub Wojciech Klama 	uint32_t mode;
264*134e1779SJakub Wojciech Klama 	uint32_t atime;
265*134e1779SJakub Wojciech Klama 	uint32_t mtime;
266*134e1779SJakub Wojciech Klama 	uint64_t length;
267*134e1779SJakub Wojciech Klama 	char *name;
268*134e1779SJakub Wojciech Klama 	char *uid;
269*134e1779SJakub Wojciech Klama 	char *gid;
270*134e1779SJakub Wojciech Klama 	char *muid;
271*134e1779SJakub Wojciech Klama 	char *extension;
272*134e1779SJakub Wojciech Klama 	uint32_t n_uid;
273*134e1779SJakub Wojciech Klama 	uint32_t n_gid;
274*134e1779SJakub Wojciech Klama 	uint32_t n_muid;
275*134e1779SJakub Wojciech Klama };
276*134e1779SJakub Wojciech Klama 
277*134e1779SJakub Wojciech Klama #define	L9P_FSTYPE	 0x01021997
278*134e1779SJakub Wojciech Klama 
279*134e1779SJakub Wojciech Klama struct l9p_statfs {
280*134e1779SJakub Wojciech Klama 	uint32_t type;		/* file system type */
281*134e1779SJakub Wojciech Klama 	uint32_t bsize;		/* block size for I/O */
282*134e1779SJakub Wojciech Klama 	uint64_t blocks;	/* file system size (bsize-byte blocks) */
283*134e1779SJakub Wojciech Klama 	uint64_t bfree;		/* free blocks in fs */
284*134e1779SJakub Wojciech Klama 	uint64_t bavail;	/* free blocks avail to non-superuser*/
285*134e1779SJakub Wojciech Klama 	uint64_t files;		/* file nodes in file system (# inodes) */
286*134e1779SJakub Wojciech Klama 	uint64_t ffree;		/* free file nodes in fs */
287*134e1779SJakub Wojciech Klama 	uint64_t fsid;		/* file system identifier */
288*134e1779SJakub Wojciech Klama 	uint32_t namelen;	/* maximum length of filenames */
289*134e1779SJakub Wojciech Klama };
290*134e1779SJakub Wojciech Klama 
291*134e1779SJakub Wojciech Klama struct l9p_f_version {
292*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
293*134e1779SJakub Wojciech Klama 	uint32_t msize;
294*134e1779SJakub Wojciech Klama 	char *version;
295*134e1779SJakub Wojciech Klama };
296*134e1779SJakub Wojciech Klama 
297*134e1779SJakub Wojciech Klama struct l9p_f_tflush {
298*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
299*134e1779SJakub Wojciech Klama 	uint16_t oldtag;
300*134e1779SJakub Wojciech Klama };
301*134e1779SJakub Wojciech Klama 
302*134e1779SJakub Wojciech Klama struct l9p_f_error {
303*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
304*134e1779SJakub Wojciech Klama 	char *ename;
305*134e1779SJakub Wojciech Klama 	uint32_t errnum;
306*134e1779SJakub Wojciech Klama };
307*134e1779SJakub Wojciech Klama 
308*134e1779SJakub Wojciech Klama struct l9p_f_ropen {
309*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
310*134e1779SJakub Wojciech Klama 	struct l9p_qid qid;
311*134e1779SJakub Wojciech Klama 	uint32_t iounit;
312*134e1779SJakub Wojciech Klama };
313*134e1779SJakub Wojciech Klama 
314*134e1779SJakub Wojciech Klama struct l9p_f_rauth {
315*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
316*134e1779SJakub Wojciech Klama 	struct l9p_qid aqid;
317*134e1779SJakub Wojciech Klama };
318*134e1779SJakub Wojciech Klama 
319*134e1779SJakub Wojciech Klama struct l9p_f_attach {
320*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
321*134e1779SJakub Wojciech Klama 	uint32_t afid;
322*134e1779SJakub Wojciech Klama 	char *uname;
323*134e1779SJakub Wojciech Klama 	char *aname;
324*134e1779SJakub Wojciech Klama 	uint32_t n_uname;
325*134e1779SJakub Wojciech Klama };
326*134e1779SJakub Wojciech Klama #define	L9P_NOFID ((uint32_t)-1)	/* in Tattach, no auth fid */
327*134e1779SJakub Wojciech Klama #define	L9P_NONUNAME ((uint32_t)-1)	/* in Tattach, no n_uname */
328*134e1779SJakub Wojciech Klama 
329*134e1779SJakub Wojciech Klama struct l9p_f_tcreate {
330*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
331*134e1779SJakub Wojciech Klama 	uint32_t perm;
332*134e1779SJakub Wojciech Klama 	char *name;
333*134e1779SJakub Wojciech Klama 	uint8_t mode; /* +Topen */
334*134e1779SJakub Wojciech Klama 	char *extension;
335*134e1779SJakub Wojciech Klama };
336*134e1779SJakub Wojciech Klama 
337*134e1779SJakub Wojciech Klama struct l9p_f_twalk {
338*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
339*134e1779SJakub Wojciech Klama 	uint32_t newfid;
340*134e1779SJakub Wojciech Klama 	uint16_t nwname;
341*134e1779SJakub Wojciech Klama 	char *wname[L9P_MAX_WELEM];
342*134e1779SJakub Wojciech Klama };
343*134e1779SJakub Wojciech Klama 
344*134e1779SJakub Wojciech Klama struct l9p_f_rwalk {
345*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
346*134e1779SJakub Wojciech Klama 	uint16_t nwqid;
347*134e1779SJakub Wojciech Klama 	struct l9p_qid wqid[L9P_MAX_WELEM];
348*134e1779SJakub Wojciech Klama };
349*134e1779SJakub Wojciech Klama 
350*134e1779SJakub Wojciech Klama struct l9p_f_io {
351*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
352*134e1779SJakub Wojciech Klama 	uint64_t offset; /* Tread, Twrite, Treaddir */
353*134e1779SJakub Wojciech Klama 	uint32_t count; /* Tread, Twrite, Rread, Treaddir, Rreaddir */
354*134e1779SJakub Wojciech Klama };
355*134e1779SJakub Wojciech Klama 
356*134e1779SJakub Wojciech Klama struct l9p_f_rstat {
357*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
358*134e1779SJakub Wojciech Klama 	struct l9p_stat stat;
359*134e1779SJakub Wojciech Klama };
360*134e1779SJakub Wojciech Klama 
361*134e1779SJakub Wojciech Klama struct l9p_f_twstat {
362*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
363*134e1779SJakub Wojciech Klama 	struct l9p_stat stat;
364*134e1779SJakub Wojciech Klama };
365*134e1779SJakub Wojciech Klama 
366*134e1779SJakub Wojciech Klama struct l9p_f_rstatfs {
367*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
368*134e1779SJakub Wojciech Klama 	struct l9p_statfs statfs;
369*134e1779SJakub Wojciech Klama };
370*134e1779SJakub Wojciech Klama 
371*134e1779SJakub Wojciech Klama /* Used for Tlcreate, Tlopen, Tmkdir, Tunlinkat. */
372*134e1779SJakub Wojciech Klama struct l9p_f_tlcreate {
373*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
374*134e1779SJakub Wojciech Klama 	char *name;		/* Tlcreate, Tmkdir, Tunlinkat */
375*134e1779SJakub Wojciech Klama 	uint32_t flags;		/* Tlcreate, Tlopen, Tmkdir, Tunlinkat */
376*134e1779SJakub Wojciech Klama 	uint32_t mode;		/* Tlcreate, Tmkdir */
377*134e1779SJakub Wojciech Klama 	uint32_t gid;		/* Tlcreate, Tmkdir */
378*134e1779SJakub Wojciech Klama };
379*134e1779SJakub Wojciech Klama 
380*134e1779SJakub Wojciech Klama struct l9p_f_tsymlink {
381*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
382*134e1779SJakub Wojciech Klama 	char *name;
383*134e1779SJakub Wojciech Klama 	char *symtgt;
384*134e1779SJakub Wojciech Klama 	uint32_t gid;
385*134e1779SJakub Wojciech Klama };
386*134e1779SJakub Wojciech Klama 
387*134e1779SJakub Wojciech Klama struct l9p_f_tmknod {
388*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
389*134e1779SJakub Wojciech Klama 	char *name;
390*134e1779SJakub Wojciech Klama 	uint32_t mode;
391*134e1779SJakub Wojciech Klama 	uint32_t major;
392*134e1779SJakub Wojciech Klama 	uint32_t minor;
393*134e1779SJakub Wojciech Klama 	uint32_t gid;
394*134e1779SJakub Wojciech Klama };
395*134e1779SJakub Wojciech Klama 
396*134e1779SJakub Wojciech Klama struct l9p_f_trename {
397*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
398*134e1779SJakub Wojciech Klama 	uint32_t dfid;
399*134e1779SJakub Wojciech Klama 	char *name;
400*134e1779SJakub Wojciech Klama };
401*134e1779SJakub Wojciech Klama 
402*134e1779SJakub Wojciech Klama struct l9p_f_rreadlink {
403*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
404*134e1779SJakub Wojciech Klama 	char *target;
405*134e1779SJakub Wojciech Klama };
406*134e1779SJakub Wojciech Klama 
407*134e1779SJakub Wojciech Klama struct l9p_f_tgetattr {
408*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
409*134e1779SJakub Wojciech Klama 	uint64_t request_mask;
410*134e1779SJakub Wojciech Klama };
411*134e1779SJakub Wojciech Klama 
412*134e1779SJakub Wojciech Klama struct l9p_f_rgetattr {
413*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
414*134e1779SJakub Wojciech Klama 	uint64_t valid;
415*134e1779SJakub Wojciech Klama 	struct l9p_qid qid;
416*134e1779SJakub Wojciech Klama 	uint32_t mode;
417*134e1779SJakub Wojciech Klama 	uint32_t uid;
418*134e1779SJakub Wojciech Klama 	uint32_t gid;
419*134e1779SJakub Wojciech Klama 	uint64_t nlink;
420*134e1779SJakub Wojciech Klama 	uint64_t rdev;
421*134e1779SJakub Wojciech Klama 	uint64_t size;
422*134e1779SJakub Wojciech Klama 	uint64_t blksize;
423*134e1779SJakub Wojciech Klama 	uint64_t blocks;
424*134e1779SJakub Wojciech Klama 	uint64_t atime_sec;
425*134e1779SJakub Wojciech Klama 	uint64_t atime_nsec;
426*134e1779SJakub Wojciech Klama 	uint64_t mtime_sec;
427*134e1779SJakub Wojciech Klama 	uint64_t mtime_nsec;
428*134e1779SJakub Wojciech Klama 	uint64_t ctime_sec;
429*134e1779SJakub Wojciech Klama 	uint64_t ctime_nsec;
430*134e1779SJakub Wojciech Klama 	uint64_t btime_sec;
431*134e1779SJakub Wojciech Klama 	uint64_t btime_nsec;
432*134e1779SJakub Wojciech Klama 	uint64_t gen;
433*134e1779SJakub Wojciech Klama 	uint64_t data_version;
434*134e1779SJakub Wojciech Klama };
435*134e1779SJakub Wojciech Klama 
436*134e1779SJakub Wojciech Klama /* Fields in req->request_mask and reply->valid for Tgetattr, Rgetattr. */
437*134e1779SJakub Wojciech Klama enum l9pl_getattr_flags {
438*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_MODE = 0x00000001,
439*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_NLINK = 0x00000002,
440*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_UID = 0x00000004,
441*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_GID = 0x00000008,
442*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_RDEV = 0x00000010,
443*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_ATIME = 0x00000020,
444*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_MTIME = 0x00000040,
445*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_CTIME = 0x00000080,
446*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_INO = 0x00000100,
447*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_SIZE = 0x00000200,
448*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_BLOCKS = 0x00000400,
449*134e1779SJakub Wojciech Klama 	/* everything up to and including BLOCKS is BASIC */
450*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_BASIC = L9PL_GETATTR_MODE |
451*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_NLINK |
452*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_UID |
453*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_GID |
454*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_RDEV |
455*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_ATIME |
456*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_MTIME |
457*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_CTIME |
458*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_INO |
459*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_SIZE |
460*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_BLOCKS,
461*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_BTIME = 0x00000800,
462*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_GEN = 0x00001000,
463*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_DATA_VERSION = 0x00002000,
464*134e1779SJakub Wojciech Klama 	/* BASIC + birthtime + gen + data-version = ALL */
465*134e1779SJakub Wojciech Klama 	L9PL_GETATTR_ALL = L9PL_GETATTR_BASIC |
466*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_BTIME |
467*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_GEN |
468*134e1779SJakub Wojciech Klama 		L9PL_GETATTR_DATA_VERSION,
469*134e1779SJakub Wojciech Klama };
470*134e1779SJakub Wojciech Klama 
471*134e1779SJakub Wojciech Klama struct l9p_f_tsetattr {
472*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
473*134e1779SJakub Wojciech Klama 	uint32_t valid;
474*134e1779SJakub Wojciech Klama 	uint32_t mode;
475*134e1779SJakub Wojciech Klama 	uint32_t uid;
476*134e1779SJakub Wojciech Klama 	uint32_t gid;
477*134e1779SJakub Wojciech Klama 	uint64_t size;
478*134e1779SJakub Wojciech Klama 	uint64_t atime_sec;	/* if valid & L9PL_SETATTR_ATIME_SET */
479*134e1779SJakub Wojciech Klama 	uint64_t atime_nsec;	/* (else use on-server time) */
480*134e1779SJakub Wojciech Klama 	uint64_t mtime_sec;	/* if valid & L9PL_SETATTR_MTIME_SET */
481*134e1779SJakub Wojciech Klama 	uint64_t mtime_nsec;	/* (else use on-server time) */
482*134e1779SJakub Wojciech Klama };
483*134e1779SJakub Wojciech Klama 
484*134e1779SJakub Wojciech Klama /* Fields in req->valid for Tsetattr. */
485*134e1779SJakub Wojciech Klama enum l9pl_setattr_flags {
486*134e1779SJakub Wojciech Klama 	L9PL_SETATTR_MODE = 0x00000001,
487*134e1779SJakub Wojciech Klama 	L9PL_SETATTR_UID = 0x00000002,
488*134e1779SJakub Wojciech Klama 	L9PL_SETATTR_GID = 0x00000004,
489*134e1779SJakub Wojciech Klama 	L9PL_SETATTR_SIZE = 0x00000008,
490*134e1779SJakub Wojciech Klama 	L9PL_SETATTR_ATIME = 0x00000010,
491*134e1779SJakub Wojciech Klama 	L9PL_SETATTR_MTIME = 0x00000020,
492*134e1779SJakub Wojciech Klama 	L9PL_SETATTR_CTIME = 0x00000040,
493*134e1779SJakub Wojciech Klama 	L9PL_SETATTR_ATIME_SET = 0x00000080,
494*134e1779SJakub Wojciech Klama 	L9PL_SETATTR_MTIME_SET = 0x00000100,
495*134e1779SJakub Wojciech Klama };
496*134e1779SJakub Wojciech Klama 
497*134e1779SJakub Wojciech Klama struct l9p_f_txattrwalk {
498*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
499*134e1779SJakub Wojciech Klama 	uint32_t newfid;
500*134e1779SJakub Wojciech Klama 	char *name;
501*134e1779SJakub Wojciech Klama };
502*134e1779SJakub Wojciech Klama 
503*134e1779SJakub Wojciech Klama struct l9p_f_rxattrwalk {
504*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
505*134e1779SJakub Wojciech Klama 	uint64_t size;
506*134e1779SJakub Wojciech Klama };
507*134e1779SJakub Wojciech Klama 
508*134e1779SJakub Wojciech Klama struct l9p_f_txattrcreate {
509*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
510*134e1779SJakub Wojciech Klama 	char *name;
511*134e1779SJakub Wojciech Klama 	uint64_t attr_size;
512*134e1779SJakub Wojciech Klama 	uint32_t flags;
513*134e1779SJakub Wojciech Klama };
514*134e1779SJakub Wojciech Klama 
515*134e1779SJakub Wojciech Klama struct l9p_f_tlock {
516*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
517*134e1779SJakub Wojciech Klama 	uint8_t type;		/* from l9pl_lock_type */
518*134e1779SJakub Wojciech Klama 	uint32_t flags;		/* from l9pl_lock_flags */
519*134e1779SJakub Wojciech Klama 	uint64_t start;
520*134e1779SJakub Wojciech Klama 	uint64_t length;
521*134e1779SJakub Wojciech Klama 	uint32_t proc_id;
522*134e1779SJakub Wojciech Klama 	char *client_id;
523*134e1779SJakub Wojciech Klama };
524*134e1779SJakub Wojciech Klama 
525*134e1779SJakub Wojciech Klama enum l9pl_lock_type {
526*134e1779SJakub Wojciech Klama 	L9PL_LOCK_TYPE_RDLOCK =	0,
527*134e1779SJakub Wojciech Klama 	L9PL_LOCK_TYPE_WRLOCK =	1,
528*134e1779SJakub Wojciech Klama 	L9PL_LOCK_TYPE_UNLOCK =	2,
529*134e1779SJakub Wojciech Klama };
530*134e1779SJakub Wojciech Klama 
531*134e1779SJakub Wojciech Klama enum l9pl_lock_flags {
532*134e1779SJakub Wojciech Klama 	L9PL_LOCK_TYPE_BLOCK = 1,
533*134e1779SJakub Wojciech Klama 	L9PL_LOCK_TYPE_RECLAIM = 2,
534*134e1779SJakub Wojciech Klama };
535*134e1779SJakub Wojciech Klama 
536*134e1779SJakub Wojciech Klama struct l9p_f_rlock {
537*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
538*134e1779SJakub Wojciech Klama 	uint8_t status;		/* from l9pl_lock_status */
539*134e1779SJakub Wojciech Klama };
540*134e1779SJakub Wojciech Klama 
541*134e1779SJakub Wojciech Klama enum l9pl_lock_status {
542*134e1779SJakub Wojciech Klama 	L9PL_LOCK_SUCCESS = 0,
543*134e1779SJakub Wojciech Klama 	L9PL_LOCK_BLOCKED = 1,
544*134e1779SJakub Wojciech Klama 	L9PL_LOCK_ERROR = 2,
545*134e1779SJakub Wojciech Klama 	L9PL_LOCK_GRACE = 3,
546*134e1779SJakub Wojciech Klama };
547*134e1779SJakub Wojciech Klama 
548*134e1779SJakub Wojciech Klama struct l9p_f_getlock {
549*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
550*134e1779SJakub Wojciech Klama 	uint8_t type;		/* from l9pl_lock_type */
551*134e1779SJakub Wojciech Klama 	uint64_t start;
552*134e1779SJakub Wojciech Klama 	uint64_t length;
553*134e1779SJakub Wojciech Klama 	uint32_t proc_id;
554*134e1779SJakub Wojciech Klama 	char *client_id;
555*134e1779SJakub Wojciech Klama };
556*134e1779SJakub Wojciech Klama 
557*134e1779SJakub Wojciech Klama struct l9p_f_tlink {
558*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
559*134e1779SJakub Wojciech Klama 	uint32_t dfid;
560*134e1779SJakub Wojciech Klama 	char *name;
561*134e1779SJakub Wojciech Klama };
562*134e1779SJakub Wojciech Klama 
563*134e1779SJakub Wojciech Klama struct l9p_f_trenameat {
564*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
565*134e1779SJakub Wojciech Klama 	char *oldname;
566*134e1779SJakub Wojciech Klama 	uint32_t newdirfid;
567*134e1779SJakub Wojciech Klama 	char *newname;
568*134e1779SJakub Wojciech Klama };
569*134e1779SJakub Wojciech Klama 
570*134e1779SJakub Wojciech Klama /*
571*134e1779SJakub Wojciech Klama  * Flags in Tunlinkat (which re-uses f_tlcreate data structure but
572*134e1779SJakub Wojciech Klama  * with different meaning).
573*134e1779SJakub Wojciech Klama  */
574*134e1779SJakub Wojciech Klama enum l9p_l_unlinkat_flags {
575*134e1779SJakub Wojciech Klama 	/* not sure if any other AT_* flags are passed through */
576*134e1779SJakub Wojciech Klama 	L9PL_AT_REMOVEDIR =	0x0200,
577*134e1779SJakub Wojciech Klama };
578*134e1779SJakub Wojciech Klama 
579*134e1779SJakub Wojciech Klama union l9p_fcall {
580*134e1779SJakub Wojciech Klama 	struct l9p_hdr hdr;
581*134e1779SJakub Wojciech Klama 	struct l9p_f_version version;
582*134e1779SJakub Wojciech Klama 	struct l9p_f_tflush tflush;
583*134e1779SJakub Wojciech Klama 	struct l9p_f_ropen ropen;
584*134e1779SJakub Wojciech Klama 	struct l9p_f_ropen rcreate;
585*134e1779SJakub Wojciech Klama 	struct l9p_f_ropen rattach;
586*134e1779SJakub Wojciech Klama 	struct l9p_f_error error;
587*134e1779SJakub Wojciech Klama 	struct l9p_f_rauth rauth;
588*134e1779SJakub Wojciech Klama 	struct l9p_f_attach tattach;
589*134e1779SJakub Wojciech Klama 	struct l9p_f_attach tauth;
590*134e1779SJakub Wojciech Klama 	struct l9p_f_tcreate tcreate;
591*134e1779SJakub Wojciech Klama 	struct l9p_f_tcreate topen;
592*134e1779SJakub Wojciech Klama 	struct l9p_f_twalk twalk;
593*134e1779SJakub Wojciech Klama 	struct l9p_f_rwalk rwalk;
594*134e1779SJakub Wojciech Klama 	struct l9p_f_twstat twstat;
595*134e1779SJakub Wojciech Klama 	struct l9p_f_rstat rstat;
596*134e1779SJakub Wojciech Klama 	struct l9p_f_rstatfs rstatfs;
597*134e1779SJakub Wojciech Klama 	struct l9p_f_tlcreate tlopen;
598*134e1779SJakub Wojciech Klama 	struct l9p_f_ropen rlopen;
599*134e1779SJakub Wojciech Klama 	struct l9p_f_tlcreate tlcreate;
600*134e1779SJakub Wojciech Klama 	struct l9p_f_ropen rlcreate;
601*134e1779SJakub Wojciech Klama 	struct l9p_f_tsymlink tsymlink;
602*134e1779SJakub Wojciech Klama 	struct l9p_f_ropen rsymlink;
603*134e1779SJakub Wojciech Klama 	struct l9p_f_tmknod tmknod;
604*134e1779SJakub Wojciech Klama 	struct l9p_f_ropen rmknod;
605*134e1779SJakub Wojciech Klama 	struct l9p_f_trename trename;
606*134e1779SJakub Wojciech Klama 	struct l9p_f_rreadlink rreadlink;
607*134e1779SJakub Wojciech Klama 	struct l9p_f_tgetattr tgetattr;
608*134e1779SJakub Wojciech Klama 	struct l9p_f_rgetattr rgetattr;
609*134e1779SJakub Wojciech Klama 	struct l9p_f_tsetattr tsetattr;
610*134e1779SJakub Wojciech Klama 	struct l9p_f_txattrwalk txattrwalk;
611*134e1779SJakub Wojciech Klama 	struct l9p_f_rxattrwalk rxattrwalk;
612*134e1779SJakub Wojciech Klama 	struct l9p_f_txattrcreate txattrcreate;
613*134e1779SJakub Wojciech Klama 	struct l9p_f_tlock tlock;
614*134e1779SJakub Wojciech Klama 	struct l9p_f_rlock rlock;
615*134e1779SJakub Wojciech Klama 	struct l9p_f_getlock getlock;
616*134e1779SJakub Wojciech Klama 	struct l9p_f_tlink tlink;
617*134e1779SJakub Wojciech Klama 	struct l9p_f_tlcreate tmkdir;
618*134e1779SJakub Wojciech Klama 	struct l9p_f_ropen rmkdir;
619*134e1779SJakub Wojciech Klama 	struct l9p_f_trenameat trenameat;
620*134e1779SJakub Wojciech Klama 	struct l9p_f_tlcreate tunlinkat;
621*134e1779SJakub Wojciech Klama 	struct l9p_f_io io;
622*134e1779SJakub Wojciech Klama };
623*134e1779SJakub Wojciech Klama 
624*134e1779SJakub Wojciech Klama #endif  /* LIB9P_FCALL_H */
625