xref: /illumos-gate/usr/src/head/rpcsvc/nfs4_prot.x (revision f44e1126)
17c478bd9Sstevel@tonic-gate /*
2*f44e1126SVitaliy Gusev  * This file was machine generated for [RFC7862].
37c478bd9Sstevel@tonic-gate  *
4*f44e1126SVitaliy Gusev  * Last updated Sun Mar 13 10:58:40 PDT 2016
5bbe876c0SMarcel Telka  */
6bbe876c0SMarcel Telka 
7bbe876c0SMarcel Telka /*
8*f44e1126SVitaliy Gusev  * Copyright (c) 2016 IETF Trust and the persons identified
9*f44e1126SVitaliy Gusev  * as the authors.  All rights reserved.
10bbe876c0SMarcel Telka  *
11bbe876c0SMarcel Telka  * Redistribution and use in source and binary forms, with
12bbe876c0SMarcel Telka  * or without modification, are permitted provided that the
13bbe876c0SMarcel Telka  * following conditions are met:
14bbe876c0SMarcel Telka  *
15bbe876c0SMarcel Telka  * - Redistributions of source code must retain the above
16bbe876c0SMarcel Telka  *   copyright notice, this list of conditions and the
17bbe876c0SMarcel Telka  *   following disclaimer.
187c478bd9Sstevel@tonic-gate  *
19bbe876c0SMarcel Telka  * - Redistributions in binary form must reproduce the above
20bbe876c0SMarcel Telka  *   copyright notice, this list of conditions and the
21bbe876c0SMarcel Telka  *   following disclaimer in the documentation and/or other
22bbe876c0SMarcel Telka  *   materials provided with the distribution.
237c478bd9Sstevel@tonic-gate  *
24bbe876c0SMarcel Telka  * - Neither the name of Internet Society, IETF or IETF
25bbe876c0SMarcel Telka  *   Trust, nor the names of specific contributors, may be
26bbe876c0SMarcel Telka  *   used to endorse or promote products derived from this
27bbe876c0SMarcel Telka  *   software without specific prior written permission.
287c478bd9Sstevel@tonic-gate  *
29bbe876c0SMarcel Telka  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
30bbe876c0SMarcel Telka  *   AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
31bbe876c0SMarcel Telka  *   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32bbe876c0SMarcel Telka  *   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
33bbe876c0SMarcel Telka  *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
34bbe876c0SMarcel Telka  *   EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
35bbe876c0SMarcel Telka  *   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
36bbe876c0SMarcel Telka  *   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
37bbe876c0SMarcel Telka  *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38bbe876c0SMarcel Telka  *   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
39bbe876c0SMarcel Telka  *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
40bbe876c0SMarcel Telka  *   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
41bbe876c0SMarcel Telka  *   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
42bbe876c0SMarcel Telka  *   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
43bbe876c0SMarcel Telka  *   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44*f44e1126SVitaliy Gusev 
457c478bd9Sstevel@tonic-gate  */
46bbe876c0SMarcel Telka 
477c478bd9Sstevel@tonic-gate /*
48*f44e1126SVitaliy Gusev  * This code was derived from RFC 7863.
497c478bd9Sstevel@tonic-gate  */
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate /*
52*f44e1126SVitaliy Gusev  *      nfsv42.x
537c478bd9Sstevel@tonic-gate  */
547c478bd9Sstevel@tonic-gate 
55*f44e1126SVitaliy Gusev %#ifndef _AUTH_SYS_DEFINE_FOR_NFSv42
56*f44e1126SVitaliy Gusev %#define _AUTH_SYS_DEFINE_FOR_NFSv42
57*f44e1126SVitaliy Gusev %#include <rpc/auth_sys.h>
58*f44e1126SVitaliy Gusev %typedef struct authsys_parms authsys_parms;
59*f44e1126SVitaliy Gusev %#endif /* _AUTH_SYS_DEFINE_FOR_NFSv42 */
60*f44e1126SVitaliy Gusev 
617c478bd9Sstevel@tonic-gate /*
627c478bd9Sstevel@tonic-gate  * Basic typedefs for RFC 1832 data type definitions
637c478bd9Sstevel@tonic-gate  */
64*f44e1126SVitaliy Gusev 
657c478bd9Sstevel@tonic-gate /*
66*f44e1126SVitaliy Gusev  * typedef int                  int32_t;
67*f44e1126SVitaliy Gusev  * typedef unsigned int         uint32_t;
68bbe876c0SMarcel Telka  * typedef hyper                int64_t;
69bbe876c0SMarcel Telka  * typedef unsigned hyper       uint64_t;
707c478bd9Sstevel@tonic-gate  */
717c478bd9Sstevel@tonic-gate 
727c478bd9Sstevel@tonic-gate /*
737c478bd9Sstevel@tonic-gate  * Sizes
747c478bd9Sstevel@tonic-gate  */
75bbe876c0SMarcel Telka const NFS4_FHSIZE               = 128;
76bbe876c0SMarcel Telka const NFS4_VERIFIER_SIZE        = 8;
77bbe876c0SMarcel Telka const NFS4_OTHER_SIZE           = 12;
78bbe876c0SMarcel Telka const NFS4_OPAQUE_LIMIT         = 1024;
79*f44e1126SVitaliy Gusev const NFS4_SESSIONID_SIZE       = 16;
80bbe876c0SMarcel Telka 
81bbe876c0SMarcel Telka const NFS4_INT64_MAX            = 0x7fffffffffffffff;
82bbe876c0SMarcel Telka const NFS4_UINT64_MAX           = 0xffffffffffffffff;
83bbe876c0SMarcel Telka const NFS4_INT32_MAX            = 0x7fffffff;
84bbe876c0SMarcel Telka const NFS4_UINT32_MAX           = 0xffffffff;
85bbe876c0SMarcel Telka 
86*f44e1126SVitaliy Gusev const NFS4_MAXFILELEN           = 0xffffffffffffffff;
87*f44e1126SVitaliy Gusev const NFS4_MAXFILEOFF           = 0xfffffffffffffffe;
88*f44e1126SVitaliy Gusev 
897c478bd9Sstevel@tonic-gate 
907c478bd9Sstevel@tonic-gate /*
917c478bd9Sstevel@tonic-gate  * File types
927c478bd9Sstevel@tonic-gate  */
937c478bd9Sstevel@tonic-gate enum nfs_ftype4 {
94*f44e1126SVitaliy Gusev         NF4REG       = 1,  /* Regular File */
95*f44e1126SVitaliy Gusev         NF4DIR       = 2,  /* Directory */
96*f44e1126SVitaliy Gusev         NF4BLK       = 3,  /* Special File -- block device */
97*f44e1126SVitaliy Gusev         NF4CHR       = 4,  /* Special File -- character device */
98*f44e1126SVitaliy Gusev         NF4LNK       = 5,  /* Symbolic Link */
99*f44e1126SVitaliy Gusev         NF4SOCK      = 6,  /* Special File -- socket */
100*f44e1126SVitaliy Gusev         NF4FIFO      = 7,  /* Special File -- fifo */
101*f44e1126SVitaliy Gusev         NF4ATTRDIR   = 8,  /* Attribute Directory */
102*f44e1126SVitaliy Gusev         NF4NAMEDATTR = 9   /* Named Attribute */
1037c478bd9Sstevel@tonic-gate };
1047c478bd9Sstevel@tonic-gate 
1057c478bd9Sstevel@tonic-gate /*
1067c478bd9Sstevel@tonic-gate  * Error status
1077c478bd9Sstevel@tonic-gate  */
1087c478bd9Sstevel@tonic-gate enum nfsstat4 {
109*f44e1126SVitaliy Gusev  NFS4_OK                = 0,     /* everything is okay        */
110*f44e1126SVitaliy Gusev  NFS4ERR_PERM           = 1,     /* caller not privileged     */
111*f44e1126SVitaliy Gusev  NFS4ERR_NOENT          = 2,     /* no such file/directory    */
112*f44e1126SVitaliy Gusev  NFS4ERR_IO             = 5,     /* hard I/O error            */
113*f44e1126SVitaliy Gusev  NFS4ERR_NXIO           = 6,     /* no such device            */
114*f44e1126SVitaliy Gusev  NFS4ERR_ACCESS         = 13,    /* access denied             */
115*f44e1126SVitaliy Gusev  NFS4ERR_EXIST          = 17,    /* file already exists       */
116*f44e1126SVitaliy Gusev  NFS4ERR_XDEV           = 18,    /* different file systems    */
117*f44e1126SVitaliy Gusev 
118*f44e1126SVitaliy Gusev /*
119*f44e1126SVitaliy Gusev  * Please do not allocate value 19; it was used in NFSv3,
120*f44e1126SVitaliy Gusev  * and we do not want a value in NFSv3 to have a different
121*f44e1126SVitaliy Gusev  * meaning in NFSv4.x.
122*f44e1126SVitaliy Gusev  */
123*f44e1126SVitaliy Gusev 
124*f44e1126SVitaliy Gusev  NFS4ERR_NOTDIR         = 20,    /* should be a directory     */
125*f44e1126SVitaliy Gusev  NFS4ERR_ISDIR          = 21,    /* should not be a directory */
126*f44e1126SVitaliy Gusev  NFS4ERR_INVAL          = 22,    /* invalid argument          */
127*f44e1126SVitaliy Gusev  NFS4ERR_FBIG           = 27,    /* file exceeds server max   */
128*f44e1126SVitaliy Gusev  NFS4ERR_NOSPC          = 28,    /* no space on file system   */
129*f44e1126SVitaliy Gusev  NFS4ERR_ROFS           = 30,    /* read-only file system     */
130*f44e1126SVitaliy Gusev  NFS4ERR_MLINK          = 31,    /* too many hard links       */
131*f44e1126SVitaliy Gusev  NFS4ERR_NAMETOOLONG    = 63,    /* name exceeds server max   */
132*f44e1126SVitaliy Gusev  NFS4ERR_NOTEMPTY       = 66,    /* directory not empty       */
133*f44e1126SVitaliy Gusev  NFS4ERR_DQUOT          = 69,    /* hard quota limit reached  */
134*f44e1126SVitaliy Gusev  NFS4ERR_STALE          = 70,    /* file no longer exists     */
135*f44e1126SVitaliy Gusev  NFS4ERR_BADHANDLE      = 10001, /* illegal filehandle        */
136*f44e1126SVitaliy Gusev  NFS4ERR_BAD_COOKIE     = 10003, /* READDIR cookie is stale   */
137*f44e1126SVitaliy Gusev  NFS4ERR_NOTSUPP        = 10004, /* operation not supported   */
138*f44e1126SVitaliy Gusev  NFS4ERR_TOOSMALL       = 10005, /* response limit exceeded   */
139*f44e1126SVitaliy Gusev  NFS4ERR_SERVERFAULT    = 10006, /* undefined server error    */
140*f44e1126SVitaliy Gusev  NFS4ERR_BADTYPE        = 10007, /* type invalid for CREATE   */
141*f44e1126SVitaliy Gusev  NFS4ERR_DELAY          = 10008, /* file "busy" -- retry      */
142*f44e1126SVitaliy Gusev  NFS4ERR_SAME           = 10009, /* nverify says attrs same   */
143*f44e1126SVitaliy Gusev  NFS4ERR_DENIED         = 10010, /* lock unavailable          */
144*f44e1126SVitaliy Gusev  NFS4ERR_EXPIRED        = 10011, /* lock lease expired        */
145*f44e1126SVitaliy Gusev  NFS4ERR_LOCKED         = 10012, /* I/O failed due to lock    */
146*f44e1126SVitaliy Gusev  NFS4ERR_GRACE          = 10013, /* in grace period           */
147*f44e1126SVitaliy Gusev  NFS4ERR_FHEXPIRED      = 10014, /* filehandle expired        */
148*f44e1126SVitaliy Gusev  NFS4ERR_SHARE_DENIED   = 10015, /* share reserve denied      */
149*f44e1126SVitaliy Gusev  NFS4ERR_WRONGSEC       = 10016, /* wrong security flavor     */
150*f44e1126SVitaliy Gusev  NFS4ERR_CLID_INUSE     = 10017, /* client ID in use          */
151*f44e1126SVitaliy Gusev 
152*f44e1126SVitaliy Gusev  /* NFS4ERR_RESOURCE is not a valid error in NFSv4.1. */
153*f44e1126SVitaliy Gusev  NFS4ERR_RESOURCE       = 10018, /* resource exhaustion       */
154*f44e1126SVitaliy Gusev 
155*f44e1126SVitaliy Gusev  NFS4ERR_MOVED          = 10019, /* file system relocated     */
156*f44e1126SVitaliy Gusev  NFS4ERR_NOFILEHANDLE   = 10020, /* current FH is not set     */
157*f44e1126SVitaliy Gusev  NFS4ERR_MINOR_VERS_MISMATCH= 10021, /* minor vers not supp   */
158*f44e1126SVitaliy Gusev  NFS4ERR_STALE_CLIENTID = 10022, /* server has rebooted       */
159*f44e1126SVitaliy Gusev  NFS4ERR_STALE_STATEID  = 10023, /* server has rebooted       */
160*f44e1126SVitaliy Gusev  NFS4ERR_OLD_STATEID    = 10024, /* state is out of sync      */
161*f44e1126SVitaliy Gusev  NFS4ERR_BAD_STATEID    = 10025, /* incorrect stateid         */
162*f44e1126SVitaliy Gusev  NFS4ERR_BAD_SEQID      = 10026, /* request is out of seq.    */
163*f44e1126SVitaliy Gusev  NFS4ERR_NOT_SAME       = 10027, /* verify -- attrs not same  */
164*f44e1126SVitaliy Gusev  NFS4ERR_LOCK_RANGE     = 10028, /* overlapping lock range    */
165*f44e1126SVitaliy Gusev  NFS4ERR_SYMLINK        = 10029, /* should be file/directory  */
166*f44e1126SVitaliy Gusev  NFS4ERR_RESTOREFH      = 10030, /* no saved filehandle       */
167*f44e1126SVitaliy Gusev  NFS4ERR_LEASE_MOVED    = 10031, /* some file system moved    */
168*f44e1126SVitaliy Gusev  NFS4ERR_ATTRNOTSUPP    = 10032, /* recommended attr not supp */
169*f44e1126SVitaliy Gusev  NFS4ERR_NO_GRACE       = 10033, /* reclaim outside of grace  */
170*f44e1126SVitaliy Gusev  NFS4ERR_RECLAIM_BAD    = 10034, /* reclaim error at server   */
171*f44e1126SVitaliy Gusev  NFS4ERR_RECLAIM_CONFLICT= 10035, /* conflict on reclaim      */
172*f44e1126SVitaliy Gusev  NFS4ERR_BADXDR         = 10036, /* XDR decode failed         */
173*f44e1126SVitaliy Gusev  NFS4ERR_LOCKS_HELD     = 10037, /* file locks held at CLOSE  */
174*f44e1126SVitaliy Gusev  NFS4ERR_OPENMODE       = 10038, /* conflict in OPEN and I/O  */
175*f44e1126SVitaliy Gusev  NFS4ERR_BADOWNER       = 10039, /* owner translation bad     */
176*f44e1126SVitaliy Gusev  NFS4ERR_BADCHAR        = 10040, /* UTF-8 char not supported  */
177*f44e1126SVitaliy Gusev  NFS4ERR_BADNAME        = 10041, /* name not supported        */
178*f44e1126SVitaliy Gusev  NFS4ERR_BAD_RANGE      = 10042, /* lock range not supported  */
179*f44e1126SVitaliy Gusev  NFS4ERR_LOCK_NOTSUPP   = 10043, /* no atomic up/downgrade    */
180*f44e1126SVitaliy Gusev  NFS4ERR_OP_ILLEGAL     = 10044, /* undefined operation       */
181*f44e1126SVitaliy Gusev  NFS4ERR_DEADLOCK       = 10045, /* file-locking deadlock     */
182*f44e1126SVitaliy Gusev  NFS4ERR_FILE_OPEN      = 10046, /* open file blocks op       */
183*f44e1126SVitaliy Gusev  NFS4ERR_ADMIN_REVOKED  = 10047, /* lock-owner state revoked  */
184*f44e1126SVitaliy Gusev  NFS4ERR_CB_PATH_DOWN   = 10048, /* callback path down        */
185*f44e1126SVitaliy Gusev 
186*f44e1126SVitaliy Gusev  /* NFSv4.1 errors start here. */
187*f44e1126SVitaliy Gusev 
188*f44e1126SVitaliy Gusev  NFS4ERR_BADIOMODE      = 10049,
189*f44e1126SVitaliy Gusev  NFS4ERR_BADLAYOUT      = 10050,
190*f44e1126SVitaliy Gusev  NFS4ERR_BAD_SESSION_DIGEST = 10051,
191*f44e1126SVitaliy Gusev  NFS4ERR_BADSESSION     = 10052,
192*f44e1126SVitaliy Gusev  NFS4ERR_BADSLOT        = 10053,
193*f44e1126SVitaliy Gusev  NFS4ERR_COMPLETE_ALREADY = 10054,
194*f44e1126SVitaliy Gusev  NFS4ERR_CONN_NOT_BOUND_TO_SESSION = 10055,
195*f44e1126SVitaliy Gusev  NFS4ERR_DELEG_ALREADY_WANTED = 10056,
196*f44e1126SVitaliy Gusev  NFS4ERR_BACK_CHAN_BUSY = 10057, /* backchan reqs outstanding */
197*f44e1126SVitaliy Gusev  NFS4ERR_LAYOUTTRYLATER = 10058,
198*f44e1126SVitaliy Gusev  NFS4ERR_LAYOUTUNAVAILABLE = 10059,
199*f44e1126SVitaliy Gusev  NFS4ERR_NOMATCHING_LAYOUT = 10060,
200*f44e1126SVitaliy Gusev  NFS4ERR_RECALLCONFLICT = 10061,
201*f44e1126SVitaliy Gusev  NFS4ERR_UNKNOWN_LAYOUTTYPE = 10062,
202*f44e1126SVitaliy Gusev  NFS4ERR_SEQ_MISORDERED = 10063, /* unexpected seq. ID in req */
203*f44e1126SVitaliy Gusev  NFS4ERR_SEQUENCE_POS   = 10064, /* [CB_]SEQ. op not 1st op   */
204*f44e1126SVitaliy Gusev  NFS4ERR_REQ_TOO_BIG    = 10065, /* request too big           */
205*f44e1126SVitaliy Gusev  NFS4ERR_REP_TOO_BIG    = 10066, /* reply too big             */
206*f44e1126SVitaliy Gusev  NFS4ERR_REP_TOO_BIG_TO_CACHE =10067, /* rep. not all cached  */
207*f44e1126SVitaliy Gusev  NFS4ERR_RETRY_UNCACHED_REP =10068, /* retry + rep. uncached  */
208*f44e1126SVitaliy Gusev  NFS4ERR_UNSAFE_COMPOUND =10069, /* retry/recovery too hard   */
209*f44e1126SVitaliy Gusev  NFS4ERR_TOO_MANY_OPS   = 10070, /* too many ops in [CB_]COMP */
210*f44e1126SVitaliy Gusev  NFS4ERR_OP_NOT_IN_SESSION =10071, /* op needs [CB_]SEQ. op   */
211*f44e1126SVitaliy Gusev  NFS4ERR_HASH_ALG_UNSUPP = 10072,  /* hash alg. not supp      */
212*f44e1126SVitaliy Gusev                                    /* Error 10073 is unused.  */
213*f44e1126SVitaliy Gusev  NFS4ERR_CLIENTID_BUSY  = 10074, /* client ID has state       */
214*f44e1126SVitaliy Gusev  NFS4ERR_PNFS_IO_HOLE   = 10075, /* IO to _SPARSE file hole   */
215*f44e1126SVitaliy Gusev  NFS4ERR_SEQ_FALSE_RETRY= 10076, /* retry != original req     */
216*f44e1126SVitaliy Gusev  NFS4ERR_BAD_HIGH_SLOT  = 10077, /* req has bad highest_slot  */
217*f44e1126SVitaliy Gusev  NFS4ERR_DEADSESSION    = 10078, /* new req sent to dead sess */
218*f44e1126SVitaliy Gusev  NFS4ERR_ENCR_ALG_UNSUPP= 10079, /* encr alg. not supp        */
219*f44e1126SVitaliy Gusev  NFS4ERR_PNFS_NO_LAYOUT = 10080, /* I/O without a layout      */
220*f44e1126SVitaliy Gusev  NFS4ERR_NOT_ONLY_OP    = 10081, /* addl ops not allowed      */
221*f44e1126SVitaliy Gusev  NFS4ERR_WRONG_CRED     = 10082, /* op done by wrong cred     */
222*f44e1126SVitaliy Gusev  NFS4ERR_WRONG_TYPE     = 10083, /* op on wrong type object   */
223*f44e1126SVitaliy Gusev  NFS4ERR_DIRDELEG_UNAVAIL=10084, /* delegation not avail.     */
224*f44e1126SVitaliy Gusev  NFS4ERR_REJECT_DELEG   = 10085, /* cb rejected delegation    */
225*f44e1126SVitaliy Gusev  NFS4ERR_RETURNCONFLICT = 10086, /* layout get before return  */
226*f44e1126SVitaliy Gusev  NFS4ERR_DELEG_REVOKED  = 10087, /* deleg./layout revoked     */
227*f44e1126SVitaliy Gusev 
228*f44e1126SVitaliy Gusev  /* NFSv4.2 errors start here. */
229*f44e1126SVitaliy Gusev 
230*f44e1126SVitaliy Gusev  NFS4ERR_PARTNER_NOTSUPP= 10088, /* s2s not supported         */
231*f44e1126SVitaliy Gusev  NFS4ERR_PARTNER_NO_AUTH= 10089, /* s2s not authorized        */
232*f44e1126SVitaliy Gusev  NFS4ERR_UNION_NOTSUPP  = 10090, /* arm of union not supp     */
233*f44e1126SVitaliy Gusev  NFS4ERR_OFFLOAD_DENIED = 10091, /* dest not allowing copy    */
234*f44e1126SVitaliy Gusev  NFS4ERR_WRONG_LFS      = 10092, /* LFS not supported         */
235*f44e1126SVitaliy Gusev  NFS4ERR_BADLABEL       = 10093, /* incorrect label           */
236*f44e1126SVitaliy Gusev  NFS4ERR_OFFLOAD_NO_REQS= 10094  /* dest not meeting reqs     */
2377c478bd9Sstevel@tonic-gate };
2387c478bd9Sstevel@tonic-gate 
2397c478bd9Sstevel@tonic-gate /*
2407c478bd9Sstevel@tonic-gate  * Basic data types
2417c478bd9Sstevel@tonic-gate  */
242bbe876c0SMarcel Telka typedef opaque  attrlist4<>;
243bbe876c0SMarcel Telka typedef uint32_t        bitmap4<>;
244bbe876c0SMarcel Telka typedef uint64_t        changeid4;
245bbe876c0SMarcel Telka typedef uint64_t        clientid4;
246bbe876c0SMarcel Telka typedef uint32_t        count4;
247bbe876c0SMarcel Telka typedef uint64_t        length4;
248bbe876c0SMarcel Telka typedef uint32_t        mode4;
249bbe876c0SMarcel Telka typedef uint64_t        nfs_cookie4;
250bbe876c0SMarcel Telka typedef opaque  nfs_fh4<NFS4_FHSIZE>;
251bbe876c0SMarcel Telka typedef uint64_t        offset4;
252bbe876c0SMarcel Telka typedef uint32_t        qop4;
253bbe876c0SMarcel Telka typedef opaque  sec_oid4<>;
254*f44e1126SVitaliy Gusev typedef uint32_t        sequenceid4;
255bbe876c0SMarcel Telka typedef uint32_t        seqid4;
256*f44e1126SVitaliy Gusev typedef opaque  sessionid4[NFS4_SESSIONID_SIZE];
257*f44e1126SVitaliy Gusev typedef uint32_t        slotid4;
258bbe876c0SMarcel Telka typedef opaque  utf8string<>;
259bbe876c0SMarcel Telka typedef utf8string      utf8str_cis;
260bbe876c0SMarcel Telka typedef utf8string      utf8str_cs;
261bbe876c0SMarcel Telka typedef utf8string      utf8str_mixed;
262bbe876c0SMarcel Telka typedef utf8str_cs      component4;
263bbe876c0SMarcel Telka typedef opaque  linktext4<>;
264bbe876c0SMarcel Telka typedef utf8string      ascii_REQUIRED4;
265bbe876c0SMarcel Telka typedef component4      pathname4<>;
266bbe876c0SMarcel Telka typedef opaque  verifier4[NFS4_VERIFIER_SIZE];
267*f44e1126SVitaliy Gusev typedef string  secret4<>;
268*f44e1126SVitaliy Gusev typedef uint32_t        policy4;
269bbe876c0SMarcel Telka 
270bbe876c0SMarcel Telka /*
2717c478bd9Sstevel@tonic-gate  * Timeval
2727c478bd9Sstevel@tonic-gate  */
2737c478bd9Sstevel@tonic-gate struct nfstime4 {
274bbe876c0SMarcel Telka         int64_t         seconds;
275bbe876c0SMarcel Telka         uint32_t        nseconds;
2767c478bd9Sstevel@tonic-gate };
2777c478bd9Sstevel@tonic-gate 
2787c478bd9Sstevel@tonic-gate enum time_how4 {
279bbe876c0SMarcel Telka         SET_TO_SERVER_TIME4 = 0,
280bbe876c0SMarcel Telka         SET_TO_CLIENT_TIME4 = 1
2817c478bd9Sstevel@tonic-gate };
2827c478bd9Sstevel@tonic-gate 
2837c478bd9Sstevel@tonic-gate union settime4 switch (time_how4 set_it) {
2847c478bd9Sstevel@tonic-gate  case SET_TO_CLIENT_TIME4:
285bbe876c0SMarcel Telka          nfstime4       time;
2867c478bd9Sstevel@tonic-gate  default:
287bbe876c0SMarcel Telka          void;
2887c478bd9Sstevel@tonic-gate };
2897c478bd9Sstevel@tonic-gate 
2907c478bd9Sstevel@tonic-gate 
291*f44e1126SVitaliy Gusev typedef uint32_t nfs_lease4;
292*f44e1126SVitaliy Gusev 
2937c478bd9Sstevel@tonic-gate /*
2947c478bd9Sstevel@tonic-gate  * File attribute definitions
2957c478bd9Sstevel@tonic-gate  */
2967c478bd9Sstevel@tonic-gate 
2977c478bd9Sstevel@tonic-gate /*
298*f44e1126SVitaliy Gusev  * File System ID (FSID) structure for major/minor
2997c478bd9Sstevel@tonic-gate  */
3007c478bd9Sstevel@tonic-gate struct fsid4 {
301bbe876c0SMarcel Telka         uint64_t        major;
302bbe876c0SMarcel Telka         uint64_t        minor;
3037c478bd9Sstevel@tonic-gate };
3047c478bd9Sstevel@tonic-gate 
3057c478bd9Sstevel@tonic-gate /*
306*f44e1126SVitaliy Gusev  * File system locations attribute
307*f44e1126SVitaliy Gusev  * for relocation/migration and
308*f44e1126SVitaliy Gusev  * related attributes
3097c478bd9Sstevel@tonic-gate  */
310*f44e1126SVitaliy Gusev struct change_policy4 {
311*f44e1126SVitaliy Gusev         uint64_t        cp_major;
312*f44e1126SVitaliy Gusev         uint64_t        cp_minor;
313*f44e1126SVitaliy Gusev };
314*f44e1126SVitaliy Gusev 
3157c478bd9Sstevel@tonic-gate struct fs_location4 {
316bbe876c0SMarcel Telka         utf8str_cis     server<>;
317bbe876c0SMarcel Telka         pathname4       rootpath;
3187c478bd9Sstevel@tonic-gate };
3197c478bd9Sstevel@tonic-gate 
3207c478bd9Sstevel@tonic-gate struct fs_locations4 {
321bbe876c0SMarcel Telka         pathname4       fs_root;
322bbe876c0SMarcel Telka         fs_location4    locations<>;
3232f172c55SRobert Thurlow };
3242f172c55SRobert Thurlow 
3257c478bd9Sstevel@tonic-gate /*
326*f44e1126SVitaliy Gusev  * Various Access Control Entry (ACE) definitions
3277c478bd9Sstevel@tonic-gate  */
3287c478bd9Sstevel@tonic-gate 
3297c478bd9Sstevel@tonic-gate /*
330*f44e1126SVitaliy Gusev  * Mask that indicates which ACEs are supported.
331*f44e1126SVitaliy Gusev  * Values for the fattr4_aclsupport attribute.
3327c478bd9Sstevel@tonic-gate  */
333bbe876c0SMarcel Telka const ACL4_SUPPORT_ALLOW_ACL    = 0x00000001;
334bbe876c0SMarcel Telka const ACL4_SUPPORT_DENY_ACL     = 0x00000002;
335bbe876c0SMarcel Telka const ACL4_SUPPORT_AUDIT_ACL    = 0x00000004;
336bbe876c0SMarcel Telka const ACL4_SUPPORT_ALARM_ACL    = 0x00000008;
337bbe876c0SMarcel Telka 
3387c478bd9Sstevel@tonic-gate 
339bbe876c0SMarcel Telka typedef uint32_t        acetype4;
3407c478bd9Sstevel@tonic-gate 
3417c478bd9Sstevel@tonic-gate 
3427c478bd9Sstevel@tonic-gate /*
343*f44e1126SVitaliy Gusev  * acetype4 values.  Others can be added as needed.
3447c478bd9Sstevel@tonic-gate  */
345bbe876c0SMarcel Telka const ACE4_ACCESS_ALLOWED_ACE_TYPE      = 0x00000000;
346bbe876c0SMarcel Telka const ACE4_ACCESS_DENIED_ACE_TYPE       = 0x00000001;
347bbe876c0SMarcel Telka const ACE4_SYSTEM_AUDIT_ACE_TYPE        = 0x00000002;
348bbe876c0SMarcel Telka const ACE4_SYSTEM_ALARM_ACE_TYPE        = 0x00000003;
349bbe876c0SMarcel Telka 
3507c478bd9Sstevel@tonic-gate 
3517c478bd9Sstevel@tonic-gate 
3527c478bd9Sstevel@tonic-gate /*
3537c478bd9Sstevel@tonic-gate  * ACE flag
3547c478bd9Sstevel@tonic-gate  */
355*f44e1126SVitaliy Gusev typedef uint32_t aceflag4;
356bbe876c0SMarcel Telka 
3577c478bd9Sstevel@tonic-gate 
3587c478bd9Sstevel@tonic-gate /*
3597c478bd9Sstevel@tonic-gate  * ACE flag values
3607c478bd9Sstevel@tonic-gate  */
361bbe876c0SMarcel Telka const ACE4_FILE_INHERIT_ACE             = 0x00000001;
362bbe876c0SMarcel Telka const ACE4_DIRECTORY_INHERIT_ACE        = 0x00000002;
363bbe876c0SMarcel Telka const ACE4_NO_PROPAGATE_INHERIT_ACE     = 0x00000004;
364bbe876c0SMarcel Telka const ACE4_INHERIT_ONLY_ACE             = 0x00000008;
365bbe876c0SMarcel Telka const ACE4_SUCCESSFUL_ACCESS_ACE_FLAG   = 0x00000010;
366bbe876c0SMarcel Telka const ACE4_FAILED_ACCESS_ACE_FLAG       = 0x00000020;
367bbe876c0SMarcel Telka const ACE4_IDENTIFIER_GROUP             = 0x00000040;
368*f44e1126SVitaliy Gusev const ACE4_INHERITED_ACE                = 0x00000080;
369bbe876c0SMarcel Telka 
3707c478bd9Sstevel@tonic-gate 
3717c478bd9Sstevel@tonic-gate 
3727c478bd9Sstevel@tonic-gate /*
3737c478bd9Sstevel@tonic-gate  * ACE mask
3747c478bd9Sstevel@tonic-gate  */
375bbe876c0SMarcel Telka typedef uint32_t        acemask4;
376bbe876c0SMarcel Telka 
3777c478bd9Sstevel@tonic-gate 
3787c478bd9Sstevel@tonic-gate /*
3797c478bd9Sstevel@tonic-gate  * ACE mask values
3807c478bd9Sstevel@tonic-gate  */
381bbe876c0SMarcel Telka const ACE4_READ_DATA            = 0x00000001;
382bbe876c0SMarcel Telka const ACE4_LIST_DIRECTORY       = 0x00000001;
383bbe876c0SMarcel Telka const ACE4_WRITE_DATA           = 0x00000002;
384bbe876c0SMarcel Telka const ACE4_ADD_FILE             = 0x00000002;
385bbe876c0SMarcel Telka const ACE4_APPEND_DATA          = 0x00000004;
386bbe876c0SMarcel Telka const ACE4_ADD_SUBDIRECTORY     = 0x00000004;
387bbe876c0SMarcel Telka const ACE4_READ_NAMED_ATTRS     = 0x00000008;
388bbe876c0SMarcel Telka const ACE4_WRITE_NAMED_ATTRS    = 0x00000010;
389bbe876c0SMarcel Telka const ACE4_EXECUTE              = 0x00000020;
390bbe876c0SMarcel Telka const ACE4_DELETE_CHILD         = 0x00000040;
391bbe876c0SMarcel Telka const ACE4_READ_ATTRIBUTES      = 0x00000080;
392bbe876c0SMarcel Telka const ACE4_WRITE_ATTRIBUTES     = 0x00000100;
393*f44e1126SVitaliy Gusev const ACE4_WRITE_RETENTION      = 0x00000200;
394*f44e1126SVitaliy Gusev const ACE4_WRITE_RETENTION_HOLD = 0x00000400;
395bbe876c0SMarcel Telka 
396bbe876c0SMarcel Telka const ACE4_DELETE               = 0x00010000;
397bbe876c0SMarcel Telka const ACE4_READ_ACL             = 0x00020000;
398bbe876c0SMarcel Telka const ACE4_WRITE_ACL            = 0x00040000;
399bbe876c0SMarcel Telka const ACE4_WRITE_OWNER          = 0x00080000;
400bbe876c0SMarcel Telka const ACE4_SYNCHRONIZE          = 0x00100000;
401bbe876c0SMarcel Telka 
4027c478bd9Sstevel@tonic-gate 
4037c478bd9Sstevel@tonic-gate /*
404*f44e1126SVitaliy Gusev  * ACE4_GENERIC_READ -- defined as a combination of
405bbe876c0SMarcel Telka  *      ACE4_READ_ACL |
406bbe876c0SMarcel Telka  *      ACE4_READ_DATA |
407bbe876c0SMarcel Telka  *      ACE4_READ_ATTRIBUTES |
408bbe876c0SMarcel Telka  *      ACE4_SYNCHRONIZE
4097c478bd9Sstevel@tonic-gate  */
4107c478bd9Sstevel@tonic-gate 
411bbe876c0SMarcel Telka const ACE4_GENERIC_READ = 0x00120081;
4127c478bd9Sstevel@tonic-gate 
4137c478bd9Sstevel@tonic-gate /*
414*f44e1126SVitaliy Gusev  * ACE4_GENERIC_WRITE -- defined as a combination of
415bbe876c0SMarcel Telka  *      ACE4_READ_ACL |
416bbe876c0SMarcel Telka  *      ACE4_WRITE_DATA |
417bbe876c0SMarcel Telka  *      ACE4_WRITE_ATTRIBUTES |
418bbe876c0SMarcel Telka  *      ACE4_WRITE_ACL |
419bbe876c0SMarcel Telka  *      ACE4_APPEND_DATA |
420bbe876c0SMarcel Telka  *      ACE4_SYNCHRONIZE
4217c478bd9Sstevel@tonic-gate  */
4227c478bd9Sstevel@tonic-gate const ACE4_GENERIC_WRITE = 0x00160106;
4237c478bd9Sstevel@tonic-gate 
4247c478bd9Sstevel@tonic-gate 
4257c478bd9Sstevel@tonic-gate /*
426*f44e1126SVitaliy Gusev  * ACE4_GENERIC_EXECUTE -- defined as a combination of
427*f44e1126SVitaliy Gusev  *      ACE4_READ_ACL |
428*f44e1126SVitaliy Gusev  *      ACE4_READ_ATTRIBUTES |
429*f44e1126SVitaliy Gusev  *      ACE4_EXECUTE |
430bbe876c0SMarcel Telka  *      ACE4_SYNCHRONIZE
4317c478bd9Sstevel@tonic-gate  */
4327c478bd9Sstevel@tonic-gate const ACE4_GENERIC_EXECUTE = 0x001200A0;
4337c478bd9Sstevel@tonic-gate 
4347c478bd9Sstevel@tonic-gate 
4357c478bd9Sstevel@tonic-gate /*
436*f44e1126SVitaliy Gusev  * ACE definition
4377c478bd9Sstevel@tonic-gate  */
4387c478bd9Sstevel@tonic-gate struct nfsace4 {
439*f44e1126SVitaliy Gusev         acetype4        type;
440*f44e1126SVitaliy Gusev         aceflag4        flag;
441*f44e1126SVitaliy Gusev         acemask4        access_mask;
442*f44e1126SVitaliy Gusev         utf8str_mixed   who;
443*f44e1126SVitaliy Gusev };
444*f44e1126SVitaliy Gusev 
445*f44e1126SVitaliy Gusev 
446*f44e1126SVitaliy Gusev /*
447*f44e1126SVitaliy Gusev  * Access Control List (ACL) flag
448*f44e1126SVitaliy Gusev  */
449*f44e1126SVitaliy Gusev 
450*f44e1126SVitaliy Gusev typedef uint32_t aclflag4;
451*f44e1126SVitaliy Gusev 
452*f44e1126SVitaliy Gusev /*
453*f44e1126SVitaliy Gusev  * ACL flag values
454*f44e1126SVitaliy Gusev  */
455*f44e1126SVitaliy Gusev const ACL4_AUTO_INHERIT         = 0x00000001;
456*f44e1126SVitaliy Gusev const ACL4_PROTECTED            = 0x00000002;
457*f44e1126SVitaliy Gusev const ACL4_DEFAULTED            = 0x00000004;
458*f44e1126SVitaliy Gusev 
459*f44e1126SVitaliy Gusev 
460*f44e1126SVitaliy Gusev /*
461*f44e1126SVitaliy Gusev  * Version 4.1 ACL definition
462*f44e1126SVitaliy Gusev  */
463*f44e1126SVitaliy Gusev struct nfsacl41 {
464*f44e1126SVitaliy Gusev         aclflag4        na41_flag;
465*f44e1126SVitaliy Gusev         nfsace4         na41_aces<>;
4667c478bd9Sstevel@tonic-gate };
4677c478bd9Sstevel@tonic-gate 
468bbe876c0SMarcel Telka 
4697c478bd9Sstevel@tonic-gate /*
470*f44e1126SVitaliy Gusev  * Field definitions for the fattr4_mode
471*f44e1126SVitaliy Gusev  * and fattr4_mode_set_masked attributes
4727c478bd9Sstevel@tonic-gate  */
4737c478bd9Sstevel@tonic-gate const MODE4_SUID = 0x800;  /* set user id on execution */
4747c478bd9Sstevel@tonic-gate const MODE4_SGID = 0x400;  /* set group id on execution */
4757c478bd9Sstevel@tonic-gate const MODE4_SVTX = 0x200;  /* save text even after use */
4767c478bd9Sstevel@tonic-gate const MODE4_RUSR = 0x100;  /* read permission: owner */
4777c478bd9Sstevel@tonic-gate const MODE4_WUSR = 0x080;  /* write permission: owner */
4787c478bd9Sstevel@tonic-gate const MODE4_XUSR = 0x040;  /* execute permission: owner */
4797c478bd9Sstevel@tonic-gate const MODE4_RGRP = 0x020;  /* read permission: group */
4807c478bd9Sstevel@tonic-gate const MODE4_WGRP = 0x010;  /* write permission: group */
4817c478bd9Sstevel@tonic-gate const MODE4_XGRP = 0x008;  /* execute permission: group */
4827c478bd9Sstevel@tonic-gate const MODE4_ROTH = 0x004;  /* read permission: other */
4837c478bd9Sstevel@tonic-gate const MODE4_WOTH = 0x002;  /* write permission: other */
4847c478bd9Sstevel@tonic-gate const MODE4_XOTH = 0x001;  /* execute permission: other */
4857c478bd9Sstevel@tonic-gate 
486bbe876c0SMarcel Telka 
487*f44e1126SVitaliy Gusev /*
488*f44e1126SVitaliy Gusev  * Masked mode for the mode_set_masked attribute
489*f44e1126SVitaliy Gusev  */
490*f44e1126SVitaliy Gusev struct mode_masked4 {
491*f44e1126SVitaliy Gusev  mode4  mm_value_to_set; /* Values of bits
492*f44e1126SVitaliy Gusev                             to set or reset
493*f44e1126SVitaliy Gusev                             in mode */
494*f44e1126SVitaliy Gusev 
495*f44e1126SVitaliy Gusev  mode4  mm_mask_bits;    /* Mask of bits to
496*f44e1126SVitaliy Gusev                             set or reset
497*f44e1126SVitaliy Gusev                             in mode */
498*f44e1126SVitaliy Gusev };
499*f44e1126SVitaliy Gusev 
5007c478bd9Sstevel@tonic-gate /*
5017c478bd9Sstevel@tonic-gate  * Special data/attribute associated with
502*f44e1126SVitaliy Gusev  * file types NF4BLK and NF4CHR
5037c478bd9Sstevel@tonic-gate  */
5047c478bd9Sstevel@tonic-gate struct specdata4 {
505*f44e1126SVitaliy Gusev  uint32_t specdata1; /* Major device number */
506*f44e1126SVitaliy Gusev  uint32_t specdata2; /* Minor device number */
5077c478bd9Sstevel@tonic-gate };
5087c478bd9Sstevel@tonic-gate 
5097c478bd9Sstevel@tonic-gate /*
510bbe876c0SMarcel Telka  * Values for fattr4_fh_expire_type
5117c478bd9Sstevel@tonic-gate  */
512bbe876c0SMarcel Telka const FH4_PERSISTENT          = 0x00000000;
513bbe876c0SMarcel Telka const FH4_NOEXPIRE_WITH_OPEN  = 0x00000001;
514bbe876c0SMarcel Telka const FH4_VOLATILE_ANY        = 0x00000002;
515bbe876c0SMarcel Telka const FH4_VOL_MIGRATION       = 0x00000004;
516bbe876c0SMarcel Telka const FH4_VOL_RENAME          = 0x00000008;
517bbe876c0SMarcel Telka 
518bbe876c0SMarcel Telka 
519*f44e1126SVitaliy Gusev struct netaddr4 {
520*f44e1126SVitaliy Gusev         /* See struct rpcb in RFC 1833. */
521*f44e1126SVitaliy Gusev         string na_r_netid<>;    /* Network id */
522*f44e1126SVitaliy Gusev         string na_r_addr<>;     /* Universal address */
523*f44e1126SVitaliy Gusev };
524*f44e1126SVitaliy Gusev 
525*f44e1126SVitaliy Gusev 
526*f44e1126SVitaliy Gusev /*
527*f44e1126SVitaliy Gusev  * Data structures new to NFSv4.1
528*f44e1126SVitaliy Gusev  */
529*f44e1126SVitaliy Gusev 
530*f44e1126SVitaliy Gusev struct nfs_impl_id4 {
531*f44e1126SVitaliy Gusev         utf8str_cis   nii_domain;
532*f44e1126SVitaliy Gusev         utf8str_cs    nii_name;
533*f44e1126SVitaliy Gusev         nfstime4      nii_date;
534*f44e1126SVitaliy Gusev };
535*f44e1126SVitaliy Gusev 
536*f44e1126SVitaliy Gusev 
537*f44e1126SVitaliy Gusev /*
538*f44e1126SVitaliy Gusev  * Stateid
539*f44e1126SVitaliy Gusev  */
540*f44e1126SVitaliy Gusev struct stateid4 {
541*f44e1126SVitaliy Gusev         uint32_t        seqid;
542*f44e1126SVitaliy Gusev         opaque          other[NFS4_OTHER_SIZE];
543*f44e1126SVitaliy Gusev };
544*f44e1126SVitaliy Gusev 
545*f44e1126SVitaliy Gusev enum layouttype4 {
546*f44e1126SVitaliy Gusev         LAYOUT4_NFSV4_1_FILES   = 0x1,
547*f44e1126SVitaliy Gusev         LAYOUT4_OSD2_OBJECTS    = 0x2,
548*f44e1126SVitaliy Gusev         LAYOUT4_BLOCK_VOLUME    = 0x3
549*f44e1126SVitaliy Gusev };
550*f44e1126SVitaliy Gusev 
551*f44e1126SVitaliy Gusev struct layout_content4 {
552*f44e1126SVitaliy Gusev         layouttype4 loc_type;
553*f44e1126SVitaliy Gusev         opaque      loc_body<>;
554*f44e1126SVitaliy Gusev };
555*f44e1126SVitaliy Gusev 
556*f44e1126SVitaliy Gusev 
557*f44e1126SVitaliy Gusev %/*
558*f44e1126SVitaliy Gusev % * LAYOUT4_OSD2_OBJECTS loc_body description
559*f44e1126SVitaliy Gusev % * is in a separate .x file.
560*f44e1126SVitaliy Gusev % */
561*f44e1126SVitaliy Gusev %
562*f44e1126SVitaliy Gusev %/*
563*f44e1126SVitaliy Gusev % * LAYOUT4_BLOCK_VOLUME loc_body description
564*f44e1126SVitaliy Gusev % * is in a separate .x file.
565*f44e1126SVitaliy Gusev % */
566*f44e1126SVitaliy Gusev 
567*f44e1126SVitaliy Gusev struct layouthint4 {
568*f44e1126SVitaliy Gusev         layouttype4             loh_type;
569*f44e1126SVitaliy Gusev         opaque                  loh_body<>;
570*f44e1126SVitaliy Gusev };
571*f44e1126SVitaliy Gusev 
572*f44e1126SVitaliy Gusev enum layoutiomode4 {
573*f44e1126SVitaliy Gusev         LAYOUTIOMODE4_READ      = 1,
574*f44e1126SVitaliy Gusev         LAYOUTIOMODE4_RW        = 2,
575*f44e1126SVitaliy Gusev         LAYOUTIOMODE4_ANY       = 3
576*f44e1126SVitaliy Gusev };
577*f44e1126SVitaliy Gusev 
578*f44e1126SVitaliy Gusev struct layout4 {
579*f44e1126SVitaliy Gusev         offset4                 lo_offset;
580*f44e1126SVitaliy Gusev         length4                 lo_length;
581*f44e1126SVitaliy Gusev         layoutiomode4           lo_iomode;
582*f44e1126SVitaliy Gusev         layout_content4         lo_content;
583*f44e1126SVitaliy Gusev };
584*f44e1126SVitaliy Gusev 
585*f44e1126SVitaliy Gusev const NFS4_DEVICEID4_SIZE = 16;
586*f44e1126SVitaliy Gusev 
587*f44e1126SVitaliy Gusev typedef opaque  deviceid4[NFS4_DEVICEID4_SIZE];
588*f44e1126SVitaliy Gusev 
589*f44e1126SVitaliy Gusev struct device_addr4 {
590*f44e1126SVitaliy Gusev         layouttype4             da_layout_type;
591*f44e1126SVitaliy Gusev         opaque                  da_addr_body<>;
592*f44e1126SVitaliy Gusev };
593*f44e1126SVitaliy Gusev 
594*f44e1126SVitaliy Gusev 
595*f44e1126SVitaliy Gusev struct layoutupdate4 {
596*f44e1126SVitaliy Gusev         layouttype4             lou_type;
597*f44e1126SVitaliy Gusev         opaque                  lou_body<>;
598*f44e1126SVitaliy Gusev };
599*f44e1126SVitaliy Gusev 
600*f44e1126SVitaliy Gusev %
601*f44e1126SVitaliy Gusev /* Constants used for LAYOUTRETURN and CB_LAYOUTRECALL */
602*f44e1126SVitaliy Gusev const LAYOUT4_RET_REC_FILE              = 1;
603*f44e1126SVitaliy Gusev const LAYOUT4_RET_REC_FSID              = 2;
604*f44e1126SVitaliy Gusev const LAYOUT4_RET_REC_ALL               = 3;
605*f44e1126SVitaliy Gusev %
606*f44e1126SVitaliy Gusev enum layoutreturn_type4 {
607*f44e1126SVitaliy Gusev         LAYOUTRETURN4_FILE = LAYOUT4_RET_REC_FILE,
608*f44e1126SVitaliy Gusev         LAYOUTRETURN4_FSID = LAYOUT4_RET_REC_FSID,
609*f44e1126SVitaliy Gusev         LAYOUTRETURN4_ALL  = LAYOUT4_RET_REC_ALL
610*f44e1126SVitaliy Gusev };
611*f44e1126SVitaliy Gusev 
612*f44e1126SVitaliy Gusev struct layoutreturn_file4 {
613*f44e1126SVitaliy Gusev         offset4         lrf_offset;
614*f44e1126SVitaliy Gusev         length4         lrf_length;
615*f44e1126SVitaliy Gusev         stateid4        lrf_stateid;
616*f44e1126SVitaliy Gusev %       /* layouttype4 specific data */
617*f44e1126SVitaliy Gusev         opaque          lrf_body<>;
618*f44e1126SVitaliy Gusev };
619*f44e1126SVitaliy Gusev 
620*f44e1126SVitaliy Gusev union layoutreturn4 switch (layoutreturn_type4 lr_returntype) {
621*f44e1126SVitaliy Gusev         case LAYOUTRETURN4_FILE:
622*f44e1126SVitaliy Gusev                 layoutreturn_file4      lr_layout;
623*f44e1126SVitaliy Gusev         default:
624*f44e1126SVitaliy Gusev                 void;
625*f44e1126SVitaliy Gusev };
626*f44e1126SVitaliy Gusev %
627*f44e1126SVitaliy Gusev 
628*f44e1126SVitaliy Gusev enum fs4_status_type {
629*f44e1126SVitaliy Gusev         STATUS4_FIXED     = 1,
630*f44e1126SVitaliy Gusev         STATUS4_UPDATED   = 2,
631*f44e1126SVitaliy Gusev         STATUS4_VERSIONED = 3,
632*f44e1126SVitaliy Gusev         STATUS4_WRITABLE  = 4,
633*f44e1126SVitaliy Gusev         STATUS4_REFERRAL  = 5
634*f44e1126SVitaliy Gusev };
635*f44e1126SVitaliy Gusev 
636*f44e1126SVitaliy Gusev struct fs4_status {
637*f44e1126SVitaliy Gusev         bool            fss_absent;
638*f44e1126SVitaliy Gusev         fs4_status_type fss_type;
639*f44e1126SVitaliy Gusev         utf8str_cs      fss_source;
640*f44e1126SVitaliy Gusev         utf8str_cs      fss_current;
641*f44e1126SVitaliy Gusev         int32_t         fss_age;
642*f44e1126SVitaliy Gusev         nfstime4        fss_version;
643*f44e1126SVitaliy Gusev };
644*f44e1126SVitaliy Gusev 
645*f44e1126SVitaliy Gusev 
646*f44e1126SVitaliy Gusev const TH4_READ_SIZE     = 0;
647*f44e1126SVitaliy Gusev const TH4_WRITE_SIZE    = 1;
648*f44e1126SVitaliy Gusev const TH4_READ_IOSIZE   = 2;
649*f44e1126SVitaliy Gusev const TH4_WRITE_IOSIZE  = 3;
650*f44e1126SVitaliy Gusev 
651*f44e1126SVitaliy Gusev typedef length4 threshold4_read_size;
652*f44e1126SVitaliy Gusev typedef length4 threshold4_write_size;
653*f44e1126SVitaliy Gusev typedef length4 threshold4_read_iosize;
654*f44e1126SVitaliy Gusev typedef length4 threshold4_write_iosize;
655*f44e1126SVitaliy Gusev 
656*f44e1126SVitaliy Gusev struct threshold_item4 {
657*f44e1126SVitaliy Gusev         layouttype4     thi_layout_type;
658*f44e1126SVitaliy Gusev         bitmap4         thi_hintset;
659*f44e1126SVitaliy Gusev         opaque          thi_hintlist<>;
660*f44e1126SVitaliy Gusev };
661*f44e1126SVitaliy Gusev 
662*f44e1126SVitaliy Gusev struct mdsthreshold4 {
663*f44e1126SVitaliy Gusev         threshold_item4 mth_hints<>;
664*f44e1126SVitaliy Gusev };
665*f44e1126SVitaliy Gusev 
666*f44e1126SVitaliy Gusev const RET4_DURATION_INFINITE    = 0xffffffffffffffff;
667*f44e1126SVitaliy Gusev struct retention_get4 {
668*f44e1126SVitaliy Gusev         uint64_t        rg_duration;
669*f44e1126SVitaliy Gusev         nfstime4        rg_begin_time<1>;
670*f44e1126SVitaliy Gusev };
671*f44e1126SVitaliy Gusev 
672*f44e1126SVitaliy Gusev struct retention_set4 {
673*f44e1126SVitaliy Gusev         bool            rs_enable;
674*f44e1126SVitaliy Gusev         uint64_t        rs_duration<1>;
675*f44e1126SVitaliy Gusev };
676*f44e1126SVitaliy Gusev 
677*f44e1126SVitaliy Gusev const FSCHARSET_CAP4_CONTAINS_NON_UTF8  = 0x1;
678*f44e1126SVitaliy Gusev const FSCHARSET_CAP4_ALLOWS_ONLY_UTF8   = 0x2;
679*f44e1126SVitaliy Gusev 
680*f44e1126SVitaliy Gusev typedef uint32_t        fs_charset_cap4;
681*f44e1126SVitaliy Gusev 
682*f44e1126SVitaliy Gusev 
683*f44e1126SVitaliy Gusev /*
684*f44e1126SVitaliy Gusev  * Data structures new to NFSv4.2
685*f44e1126SVitaliy Gusev  */
686*f44e1126SVitaliy Gusev 
687*f44e1126SVitaliy Gusev enum netloc_type4 {
688*f44e1126SVitaliy Gusev         NL4_NAME        = 1,
689*f44e1126SVitaliy Gusev         NL4_URL         = 2,
690*f44e1126SVitaliy Gusev         NL4_NETADDR     = 3
691*f44e1126SVitaliy Gusev };
692*f44e1126SVitaliy Gusev union netloc4 switch (netloc_type4 nl_type) {
693*f44e1126SVitaliy Gusev         case NL4_NAME:          utf8str_cis nl_name;
694*f44e1126SVitaliy Gusev         case NL4_URL:           utf8str_cis nl_url;
695*f44e1126SVitaliy Gusev         case NL4_NETADDR:       netaddr4    nl_addr;
696*f44e1126SVitaliy Gusev };
697*f44e1126SVitaliy Gusev 
698*f44e1126SVitaliy Gusev enum change_attr_type4 {
699*f44e1126SVitaliy Gusev            NFS4_CHANGE_TYPE_IS_MONOTONIC_INCR         = 0,
700*f44e1126SVitaliy Gusev            NFS4_CHANGE_TYPE_IS_VERSION_COUNTER        = 1,
701*f44e1126SVitaliy Gusev            NFS4_CHANGE_TYPE_IS_VERSION_COUNTER_NOPNFS = 2,
702*f44e1126SVitaliy Gusev            NFS4_CHANGE_TYPE_IS_TIME_METADATA          = 3,
703*f44e1126SVitaliy Gusev            NFS4_CHANGE_TYPE_IS_UNDEFINED              = 4
704*f44e1126SVitaliy Gusev };
705*f44e1126SVitaliy Gusev 
706*f44e1126SVitaliy Gusev struct labelformat_spec4 {
707*f44e1126SVitaliy Gusev         policy4 lfs_lfs;
708*f44e1126SVitaliy Gusev         policy4 lfs_pi;
709*f44e1126SVitaliy Gusev };
710*f44e1126SVitaliy Gusev 
711*f44e1126SVitaliy Gusev struct sec_label4 {
712*f44e1126SVitaliy Gusev         labelformat_spec4       slai_lfs;
713*f44e1126SVitaliy Gusev         opaque                  slai_data<>;
714*f44e1126SVitaliy Gusev };
715*f44e1126SVitaliy Gusev 
716*f44e1126SVitaliy Gusev 
717*f44e1126SVitaliy Gusev struct copy_from_auth_priv {
718*f44e1126SVitaliy Gusev         secret4             cfap_shared_secret;
719*f44e1126SVitaliy Gusev         netloc4             cfap_destination;
720*f44e1126SVitaliy Gusev         /* The NFSv4 user name that the user principal maps to */
721*f44e1126SVitaliy Gusev         utf8str_mixed       cfap_username;
722*f44e1126SVitaliy Gusev };
723*f44e1126SVitaliy Gusev 
724*f44e1126SVitaliy Gusev struct copy_to_auth_priv {
725*f44e1126SVitaliy Gusev         /* Equal to cfap_shared_secret */
726*f44e1126SVitaliy Gusev         secret4              ctap_shared_secret;
727*f44e1126SVitaliy Gusev         netloc4              ctap_source<>;
728*f44e1126SVitaliy Gusev         /* The NFSv4 user name that the user principal maps to */
729*f44e1126SVitaliy Gusev         utf8str_mixed        ctap_username;
730*f44e1126SVitaliy Gusev };
731*f44e1126SVitaliy Gusev 
732*f44e1126SVitaliy Gusev struct copy_confirm_auth_priv {
733*f44e1126SVitaliy Gusev         /* Equal to GSS_GetMIC() of cfap_shared_secret */
734*f44e1126SVitaliy Gusev         opaque              ccap_shared_secret_mic<>;
735*f44e1126SVitaliy Gusev         /* The NFSv4 user name that the user principal maps to */
736*f44e1126SVitaliy Gusev         utf8str_mixed       ccap_username;
737*f44e1126SVitaliy Gusev };
738*f44e1126SVitaliy Gusev 
739*f44e1126SVitaliy Gusev 
740*f44e1126SVitaliy Gusev struct app_data_block4 {
741*f44e1126SVitaliy Gusev         offset4         adb_offset;
742*f44e1126SVitaliy Gusev         length4         adb_block_size;
743*f44e1126SVitaliy Gusev         length4         adb_block_count;
744*f44e1126SVitaliy Gusev         length4         adb_reloff_blocknum;
745*f44e1126SVitaliy Gusev         count4          adb_block_num;
746*f44e1126SVitaliy Gusev         length4         adb_reloff_pattern;
747*f44e1126SVitaliy Gusev         opaque          adb_pattern<>;
748*f44e1126SVitaliy Gusev };
749*f44e1126SVitaliy Gusev 
750*f44e1126SVitaliy Gusev 
751*f44e1126SVitaliy Gusev struct data4 {
752*f44e1126SVitaliy Gusev         offset4         d_offset;
753*f44e1126SVitaliy Gusev         opaque          d_data<>;
754*f44e1126SVitaliy Gusev };
755*f44e1126SVitaliy Gusev 
756*f44e1126SVitaliy Gusev struct data_info4 {
757*f44e1126SVitaliy Gusev         offset4         di_offset;
758*f44e1126SVitaliy Gusev         length4         di_length;
759*f44e1126SVitaliy Gusev };
760*f44e1126SVitaliy Gusev 
761*f44e1126SVitaliy Gusev 
762*f44e1126SVitaliy Gusev enum data_content4 {
763*f44e1126SVitaliy Gusev         NFS4_CONTENT_DATA = 0,
764*f44e1126SVitaliy Gusev         NFS4_CONTENT_HOLE = 1
765*f44e1126SVitaliy Gusev };
766*f44e1126SVitaliy Gusev 
767*f44e1126SVitaliy Gusev 
768*f44e1126SVitaliy Gusev 
769*f44e1126SVitaliy Gusev enum stable_how4 {
770*f44e1126SVitaliy Gusev         UNSTABLE4       = 0,
771*f44e1126SVitaliy Gusev         DATA_SYNC4      = 1,
772*f44e1126SVitaliy Gusev         FILE_SYNC4      = 2
773*f44e1126SVitaliy Gusev };
774*f44e1126SVitaliy Gusev 
775*f44e1126SVitaliy Gusev 
776*f44e1126SVitaliy Gusev 
777*f44e1126SVitaliy Gusev struct write_response4 {
778*f44e1126SVitaliy Gusev         stateid4        wr_callback_id<1>;
779*f44e1126SVitaliy Gusev         length4         wr_count;
780*f44e1126SVitaliy Gusev         stable_how4     wr_committed;
781*f44e1126SVitaliy Gusev         verifier4       wr_writeverf;
782*f44e1126SVitaliy Gusev };
783*f44e1126SVitaliy Gusev 
784*f44e1126SVitaliy Gusev 
785*f44e1126SVitaliy Gusev /*
786*f44e1126SVitaliy Gusev  * NFSv4.1 attributes
787*f44e1126SVitaliy Gusev  */
788*f44e1126SVitaliy Gusev typedef bitmap4         fattr4_supported_attrs;
789*f44e1126SVitaliy Gusev typedef nfs_ftype4      fattr4_type;
790*f44e1126SVitaliy Gusev typedef uint32_t        fattr4_fh_expire_type;
791*f44e1126SVitaliy Gusev typedef changeid4       fattr4_change;
792*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_size;
793*f44e1126SVitaliy Gusev typedef bool            fattr4_link_support;
794*f44e1126SVitaliy Gusev typedef bool            fattr4_symlink_support;
795*f44e1126SVitaliy Gusev typedef bool            fattr4_named_attr;
796*f44e1126SVitaliy Gusev typedef fsid4           fattr4_fsid;
797*f44e1126SVitaliy Gusev typedef bool            fattr4_unique_handles;
798*f44e1126SVitaliy Gusev typedef nfs_lease4      fattr4_lease_time;
799*f44e1126SVitaliy Gusev typedef nfsstat4        fattr4_rdattr_error;
800*f44e1126SVitaliy Gusev typedef nfsace4         fattr4_acl<>;
801*f44e1126SVitaliy Gusev typedef uint32_t        fattr4_aclsupport;
802*f44e1126SVitaliy Gusev typedef bool            fattr4_archive;
803*f44e1126SVitaliy Gusev typedef bool            fattr4_cansettime;
804*f44e1126SVitaliy Gusev typedef bool            fattr4_case_insensitive;
805*f44e1126SVitaliy Gusev typedef bool            fattr4_case_preserving;
806*f44e1126SVitaliy Gusev typedef bool            fattr4_chown_restricted;
807*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_fileid;
808*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_files_avail;
809*f44e1126SVitaliy Gusev typedef nfs_fh4         fattr4_filehandle;
810*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_files_free;
811*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_files_total;
812*f44e1126SVitaliy Gusev typedef fs_locations4   fattr4_fs_locations;
813*f44e1126SVitaliy Gusev typedef bool            fattr4_hidden;
814*f44e1126SVitaliy Gusev typedef bool            fattr4_homogeneous;
815*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_maxfilesize;
816*f44e1126SVitaliy Gusev typedef uint32_t        fattr4_maxlink;
817*f44e1126SVitaliy Gusev typedef uint32_t        fattr4_maxname;
818*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_maxread;
819*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_maxwrite;
820*f44e1126SVitaliy Gusev typedef ascii_REQUIRED4 fattr4_mimetype;
821*f44e1126SVitaliy Gusev typedef mode4           fattr4_mode;
822*f44e1126SVitaliy Gusev typedef mode_masked4    fattr4_mode_set_masked;
823*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_mounted_on_fileid;
824*f44e1126SVitaliy Gusev typedef bool            fattr4_no_trunc;
825*f44e1126SVitaliy Gusev typedef uint32_t        fattr4_numlinks;
826*f44e1126SVitaliy Gusev typedef utf8str_mixed   fattr4_owner;
827*f44e1126SVitaliy Gusev typedef utf8str_mixed   fattr4_owner_group;
828*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_quota_avail_hard;
829*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_quota_avail_soft;
830*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_quota_used;
831*f44e1126SVitaliy Gusev typedef specdata4       fattr4_rawdev;
832*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_space_avail;
833*f44e1126SVitaliy Gusev typedef length4         fattr4_space_free;
834*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_space_total;
835*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_space_used;
836*f44e1126SVitaliy Gusev typedef bool            fattr4_system;
837*f44e1126SVitaliy Gusev typedef nfstime4        fattr4_time_access;
838*f44e1126SVitaliy Gusev typedef settime4        fattr4_time_access_set;
839*f44e1126SVitaliy Gusev typedef nfstime4        fattr4_time_backup;
840*f44e1126SVitaliy Gusev typedef nfstime4        fattr4_time_create;
841*f44e1126SVitaliy Gusev typedef nfstime4        fattr4_time_delta;
842*f44e1126SVitaliy Gusev typedef nfstime4        fattr4_time_metadata;
843*f44e1126SVitaliy Gusev typedef nfstime4        fattr4_time_modify;
844*f44e1126SVitaliy Gusev typedef settime4        fattr4_time_modify_set;
845*f44e1126SVitaliy Gusev /*
846*f44e1126SVitaliy Gusev  * Attributes new to NFSv4.1
847*f44e1126SVitaliy Gusev  */
848*f44e1126SVitaliy Gusev typedef bitmap4         fattr4_suppattr_exclcreat;
849*f44e1126SVitaliy Gusev typedef nfstime4        fattr4_dir_notif_delay;
850*f44e1126SVitaliy Gusev typedef nfstime4        fattr4_dirent_notif_delay;
851*f44e1126SVitaliy Gusev typedef layouttype4     fattr4_fs_layout_types<>;
852*f44e1126SVitaliy Gusev typedef fs4_status      fattr4_fs_status;
853*f44e1126SVitaliy Gusev typedef fs_charset_cap4 fattr4_fs_charset_cap;
854*f44e1126SVitaliy Gusev typedef uint32_t        fattr4_layout_alignment;
855*f44e1126SVitaliy Gusev typedef uint32_t        fattr4_layout_blksize;
856*f44e1126SVitaliy Gusev typedef layouthint4     fattr4_layout_hint;
857*f44e1126SVitaliy Gusev typedef layouttype4     fattr4_layout_types<>;
858*f44e1126SVitaliy Gusev typedef mdsthreshold4   fattr4_mdsthreshold;
859*f44e1126SVitaliy Gusev typedef retention_get4  fattr4_retention_get;
860*f44e1126SVitaliy Gusev typedef retention_set4  fattr4_retention_set;
861*f44e1126SVitaliy Gusev typedef retention_get4  fattr4_retentevt_get;
862*f44e1126SVitaliy Gusev typedef retention_set4  fattr4_retentevt_set;
863*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_retention_hold;
864*f44e1126SVitaliy Gusev typedef nfsacl41        fattr4_dacl;
865*f44e1126SVitaliy Gusev typedef nfsacl41        fattr4_sacl;
866*f44e1126SVitaliy Gusev typedef change_policy4  fattr4_change_policy;
867*f44e1126SVitaliy Gusev /*
868*f44e1126SVitaliy Gusev  * Attributes new to NFSv4.2
869bbe876c0SMarcel Telka  */
870*f44e1126SVitaliy Gusev typedef uint64_t        fattr4_space_freed;
871*f44e1126SVitaliy Gusev typedef change_attr_type4
872*f44e1126SVitaliy Gusev                 fattr4_change_attr_type;
873*f44e1126SVitaliy Gusev typedef sec_label4      fattr4_sec_label;
874*f44e1126SVitaliy Gusev typedef uint32_t        fattr4_clone_blksize;
875*f44e1126SVitaliy Gusev 
876*f44e1126SVitaliy Gusev %/*
877*f44e1126SVitaliy Gusev % * REQUIRED attributes
878*f44e1126SVitaliy Gusev % */
879bbe876c0SMarcel Telka const FATTR4_SUPPORTED_ATTRS    = 0;
880bbe876c0SMarcel Telka const FATTR4_TYPE               = 1;
881bbe876c0SMarcel Telka const FATTR4_FH_EXPIRE_TYPE     = 2;
882bbe876c0SMarcel Telka const FATTR4_CHANGE             = 3;
883bbe876c0SMarcel Telka const FATTR4_SIZE               = 4;
884bbe876c0SMarcel Telka const FATTR4_LINK_SUPPORT       = 5;
885bbe876c0SMarcel Telka const FATTR4_SYMLINK_SUPPORT    = 6;
886bbe876c0SMarcel Telka const FATTR4_NAMED_ATTR         = 7;
887bbe876c0SMarcel Telka const FATTR4_FSID               = 8;
888bbe876c0SMarcel Telka const FATTR4_UNIQUE_HANDLES     = 9;
889bbe876c0SMarcel Telka const FATTR4_LEASE_TIME         = 10;
890bbe876c0SMarcel Telka const FATTR4_RDATTR_ERROR       = 11;
891bbe876c0SMarcel Telka const FATTR4_FILEHANDLE         = 19;
892bbe876c0SMarcel Telka 
893*f44e1126SVitaliy Gusev %/*
894*f44e1126SVitaliy Gusev % * New to NFSv4.1
895*f44e1126SVitaliy Gusev % */
896*f44e1126SVitaliy Gusev const FATTR4_SUPPATTR_EXCLCREAT = 75;
897*f44e1126SVitaliy Gusev 
898*f44e1126SVitaliy Gusev %/*
899*f44e1126SVitaliy Gusev % * RECOMMENDED attributes
900*f44e1126SVitaliy Gusev % */
901bbe876c0SMarcel Telka const FATTR4_ACL                = 12;
902bbe876c0SMarcel Telka const FATTR4_ACLSUPPORT         = 13;
903bbe876c0SMarcel Telka const FATTR4_ARCHIVE            = 14;
904bbe876c0SMarcel Telka const FATTR4_CANSETTIME         = 15;
905bbe876c0SMarcel Telka const FATTR4_CASE_INSENSITIVE   = 16;
906bbe876c0SMarcel Telka const FATTR4_CASE_PRESERVING    = 17;
907bbe876c0SMarcel Telka const FATTR4_CHOWN_RESTRICTED   = 18;
908bbe876c0SMarcel Telka const FATTR4_FILEID             = 20;
909bbe876c0SMarcel Telka const FATTR4_FILES_AVAIL        = 21;
910bbe876c0SMarcel Telka const FATTR4_FILES_FREE         = 22;
911bbe876c0SMarcel Telka const FATTR4_FILES_TOTAL        = 23;
912bbe876c0SMarcel Telka const FATTR4_FS_LOCATIONS       = 24;
913bbe876c0SMarcel Telka const FATTR4_HIDDEN             = 25;
914bbe876c0SMarcel Telka const FATTR4_HOMOGENEOUS        = 26;
915bbe876c0SMarcel Telka const FATTR4_MAXFILESIZE        = 27;
916bbe876c0SMarcel Telka const FATTR4_MAXLINK            = 28;
917bbe876c0SMarcel Telka const FATTR4_MAXNAME            = 29;
918bbe876c0SMarcel Telka const FATTR4_MAXREAD            = 30;
919bbe876c0SMarcel Telka const FATTR4_MAXWRITE           = 31;
920bbe876c0SMarcel Telka const FATTR4_MIMETYPE           = 32;
921bbe876c0SMarcel Telka const FATTR4_MODE               = 33;
922bbe876c0SMarcel Telka const FATTR4_NO_TRUNC           = 34;
923bbe876c0SMarcel Telka const FATTR4_NUMLINKS           = 35;
924bbe876c0SMarcel Telka const FATTR4_OWNER              = 36;
925bbe876c0SMarcel Telka const FATTR4_OWNER_GROUP        = 37;
926bbe876c0SMarcel Telka const FATTR4_QUOTA_AVAIL_HARD   = 38;
927bbe876c0SMarcel Telka const FATTR4_QUOTA_AVAIL_SOFT   = 39;
928bbe876c0SMarcel Telka const FATTR4_QUOTA_USED         = 40;
929bbe876c0SMarcel Telka const FATTR4_RAWDEV             = 41;
930bbe876c0SMarcel Telka const FATTR4_SPACE_AVAIL        = 42;
931bbe876c0SMarcel Telka const FATTR4_SPACE_FREE         = 43;
932bbe876c0SMarcel Telka const FATTR4_SPACE_TOTAL        = 44;
933bbe876c0SMarcel Telka const FATTR4_SPACE_USED         = 45;
934bbe876c0SMarcel Telka const FATTR4_SYSTEM             = 46;
935bbe876c0SMarcel Telka const FATTR4_TIME_ACCESS        = 47;
936bbe876c0SMarcel Telka const FATTR4_TIME_ACCESS_SET    = 48;
937bbe876c0SMarcel Telka const FATTR4_TIME_BACKUP        = 49;
938bbe876c0SMarcel Telka const FATTR4_TIME_CREATE        = 50;
939bbe876c0SMarcel Telka const FATTR4_TIME_DELTA         = 51;
940bbe876c0SMarcel Telka const FATTR4_TIME_METADATA      = 52;
941bbe876c0SMarcel Telka const FATTR4_TIME_MODIFY        = 53;
942bbe876c0SMarcel Telka const FATTR4_TIME_MODIFY_SET    = 54;
943bbe876c0SMarcel Telka const FATTR4_MOUNTED_ON_FILEID  = 55;
9447c478bd9Sstevel@tonic-gate 
945*f44e1126SVitaliy Gusev %/*
946*f44e1126SVitaliy Gusev % * New to NFSv4.1
947*f44e1126SVitaliy Gusev % */
948*f44e1126SVitaliy Gusev const FATTR4_DIR_NOTIF_DELAY    = 56;
949*f44e1126SVitaliy Gusev const FATTR4_DIRENT_NOTIF_DELAY = 57;
950*f44e1126SVitaliy Gusev const FATTR4_DACL               = 58;
951*f44e1126SVitaliy Gusev const FATTR4_SACL               = 59;
952*f44e1126SVitaliy Gusev const FATTR4_CHANGE_POLICY      = 60;
953*f44e1126SVitaliy Gusev const FATTR4_FS_STATUS          = 61;
954*f44e1126SVitaliy Gusev const FATTR4_FS_LAYOUT_TYPES    = 62;
955*f44e1126SVitaliy Gusev const FATTR4_LAYOUT_HINT        = 63;
956*f44e1126SVitaliy Gusev const FATTR4_LAYOUT_TYPES       = 64;
957*f44e1126SVitaliy Gusev const FATTR4_LAYOUT_BLKSIZE     = 65;
958*f44e1126SVitaliy Gusev const FATTR4_LAYOUT_ALIGNMENT   = 66;
959*f44e1126SVitaliy Gusev const FATTR4_FS_LOCATIONS_INFO  = 67;
960*f44e1126SVitaliy Gusev const FATTR4_MDSTHRESHOLD       = 68;
961*f44e1126SVitaliy Gusev const FATTR4_RETENTION_GET      = 69;
962*f44e1126SVitaliy Gusev const FATTR4_RETENTION_SET      = 70;
963*f44e1126SVitaliy Gusev const FATTR4_RETENTEVT_GET      = 71;
964*f44e1126SVitaliy Gusev const FATTR4_RETENTEVT_SET      = 72;
965*f44e1126SVitaliy Gusev const FATTR4_RETENTION_HOLD     = 73;
966*f44e1126SVitaliy Gusev const FATTR4_MODE_SET_MASKED    = 74;
967*f44e1126SVitaliy Gusev const FATTR4_FS_CHARSET_CAP     = 76;
968*f44e1126SVitaliy Gusev 
969*f44e1126SVitaliy Gusev %/*
970*f44e1126SVitaliy Gusev % * New to NFSv4.2
971*f44e1126SVitaliy Gusev % */
972*f44e1126SVitaliy Gusev const FATTR4_CLONE_BLKSIZE      = 77;
973*f44e1126SVitaliy Gusev const FATTR4_SPACE_FREED        = 78;
974*f44e1126SVitaliy Gusev const FATTR4_CHANGE_ATTR_TYPE   = 79;
975*f44e1126SVitaliy Gusev const FATTR4_SEC_LABEL          = 80;
976*f44e1126SVitaliy Gusev 
9777c478bd9Sstevel@tonic-gate /*
9787c478bd9Sstevel@tonic-gate  * File attribute container
9797c478bd9Sstevel@tonic-gate  */
9807c478bd9Sstevel@tonic-gate struct fattr4 {
981bbe876c0SMarcel Telka         bitmap4         attrmask;
982bbe876c0SMarcel Telka         attrlist4       attr_vals;
9837c478bd9Sstevel@tonic-gate };
9847c478bd9Sstevel@tonic-gate 
9857c478bd9Sstevel@tonic-gate /*
9867c478bd9Sstevel@tonic-gate  * Change info for the client
9877c478bd9Sstevel@tonic-gate  */
9887c478bd9Sstevel@tonic-gate struct change_info4 {
989bbe876c0SMarcel Telka         bool            atomic;
990bbe876c0SMarcel Telka         changeid4       before;
991bbe876c0SMarcel Telka         changeid4       after;
9927c478bd9Sstevel@tonic-gate };
9937c478bd9Sstevel@tonic-gate 
994*f44e1126SVitaliy Gusev typedef netaddr4 clientaddr4;
995bbe876c0SMarcel Telka 
9967c478bd9Sstevel@tonic-gate /*
9977c478bd9Sstevel@tonic-gate  * Callback program info as provided by the client
9987c478bd9Sstevel@tonic-gate  */
9997c478bd9Sstevel@tonic-gate struct cb_client4 {
1000*f44e1126SVitaliy Gusev         uint32_t        cb_program;
1001*f44e1126SVitaliy Gusev         netaddr4        cb_location;
10027c478bd9Sstevel@tonic-gate };
10037c478bd9Sstevel@tonic-gate 
10047c478bd9Sstevel@tonic-gate /*
1005*f44e1126SVitaliy Gusev  * NFSv4.0 long-hand client ID
10067c478bd9Sstevel@tonic-gate  */
1007*f44e1126SVitaliy Gusev struct nfs_client_id4 {
1008*f44e1126SVitaliy Gusev         verifier4       verifier;
1009*f44e1126SVitaliy Gusev         opaque          id<NFS4_OPAQUE_LIMIT>;
10107c478bd9Sstevel@tonic-gate };
10117c478bd9Sstevel@tonic-gate 
10127c478bd9Sstevel@tonic-gate /*
1013*f44e1126SVitaliy Gusev  * NFSv4.1 client owner (aka long-hand client ID)
10147c478bd9Sstevel@tonic-gate  */
1015*f44e1126SVitaliy Gusev struct client_owner4 {
1016*f44e1126SVitaliy Gusev         verifier4       co_verifier;
1017*f44e1126SVitaliy Gusev         opaque          co_ownerid<NFS4_OPAQUE_LIMIT>;
10187c478bd9Sstevel@tonic-gate };
10197c478bd9Sstevel@tonic-gate 
1020bbe876c0SMarcel Telka 
1021*f44e1126SVitaliy Gusev /*
1022*f44e1126SVitaliy Gusev  * NFSv4.1 server owner
1023*f44e1126SVitaliy Gusev  */
1024*f44e1126SVitaliy Gusev struct server_owner4 {
1025*f44e1126SVitaliy Gusev  uint64_t       so_minor_id;
1026*f44e1126SVitaliy Gusev  opaque         so_major_id<NFS4_OPAQUE_LIMIT>;
10277c478bd9Sstevel@tonic-gate };
10287c478bd9Sstevel@tonic-gate 
1029bbe876c0SMarcel Telka 
1030*f44e1126SVitaliy Gusev struct state_owner4 {
1031bbe876c0SMarcel Telka         clientid4       clientid;
1032bbe876c0SMarcel Telka         opaque          owner<NFS4_OPAQUE_LIMIT>;
10337c478bd9Sstevel@tonic-gate };
10347c478bd9Sstevel@tonic-gate 
1035*f44e1126SVitaliy Gusev typedef state_owner4 open_owner4;
1036*f44e1126SVitaliy Gusev typedef state_owner4 lock_owner4;
1037*f44e1126SVitaliy Gusev 
1038bbe876c0SMarcel Telka 
10397c478bd9Sstevel@tonic-gate enum nfs_lock_type4 {
1040bbe876c0SMarcel Telka         READ_LT         = 1,
1041bbe876c0SMarcel Telka         WRITE_LT        = 2,
1042*f44e1126SVitaliy Gusev         READW_LT        = 3,    /* Blocking read */
1043*f44e1126SVitaliy Gusev         WRITEW_LT       = 4     /* Blocking write */
1044*f44e1126SVitaliy Gusev };
1045*f44e1126SVitaliy Gusev 
1046*f44e1126SVitaliy Gusev 
1047*f44e1126SVitaliy Gusev %
1048*f44e1126SVitaliy Gusev %/* Input for computing subkeys */
1049*f44e1126SVitaliy Gusev enum ssv_subkey4 {
1050*f44e1126SVitaliy Gusev         SSV4_SUBKEY_MIC_I2T     = 1,
1051*f44e1126SVitaliy Gusev         SSV4_SUBKEY_MIC_T2I     = 2,
1052*f44e1126SVitaliy Gusev         SSV4_SUBKEY_SEAL_I2T    = 3,
1053*f44e1126SVitaliy Gusev         SSV4_SUBKEY_SEAL_T2I    = 4
1054*f44e1126SVitaliy Gusev };
1055*f44e1126SVitaliy Gusev %
1056*f44e1126SVitaliy Gusev 
1057*f44e1126SVitaliy Gusev %
1058*f44e1126SVitaliy Gusev %/* Input for computing smt_hmac */
1059*f44e1126SVitaliy Gusev struct ssv_mic_plain_tkn4 {
1060*f44e1126SVitaliy Gusev   uint32_t        smpt_ssv_seq;
1061*f44e1126SVitaliy Gusev   opaque          smpt_orig_plain<>;
1062*f44e1126SVitaliy Gusev };
1063*f44e1126SVitaliy Gusev %
1064*f44e1126SVitaliy Gusev 
1065*f44e1126SVitaliy Gusev %
1066*f44e1126SVitaliy Gusev %/*
1067*f44e1126SVitaliy Gusev % * Secret State Verifier Generic Security Service (SSV GSS)
1068*f44e1126SVitaliy Gusev % * PerMsgToken token
1069*f44e1126SVitaliy Gusev % */
1070*f44e1126SVitaliy Gusev struct ssv_mic_tkn4 {
1071*f44e1126SVitaliy Gusev   uint32_t        smt_ssv_seq;
1072*f44e1126SVitaliy Gusev   opaque          smt_hmac<>;
1073*f44e1126SVitaliy Gusev };
1074*f44e1126SVitaliy Gusev %
1075*f44e1126SVitaliy Gusev 
1076*f44e1126SVitaliy Gusev %
1077*f44e1126SVitaliy Gusev %/* Input for computing ssct_encr_data and ssct_hmac */
1078*f44e1126SVitaliy Gusev struct ssv_seal_plain_tkn4 {
1079*f44e1126SVitaliy Gusev   opaque          sspt_confounder<>;
1080*f44e1126SVitaliy Gusev   uint32_t        sspt_ssv_seq;
1081*f44e1126SVitaliy Gusev   opaque          sspt_orig_plain<>;
1082*f44e1126SVitaliy Gusev   opaque          sspt_pad<>;
1083*f44e1126SVitaliy Gusev };
1084*f44e1126SVitaliy Gusev %
1085*f44e1126SVitaliy Gusev 
1086*f44e1126SVitaliy Gusev %
1087*f44e1126SVitaliy Gusev %/* SSV GSS SealedMessage token */
1088*f44e1126SVitaliy Gusev struct ssv_seal_cipher_tkn4 {
1089*f44e1126SVitaliy Gusev   uint32_t      ssct_ssv_seq;
1090*f44e1126SVitaliy Gusev   opaque        ssct_iv<>;
1091*f44e1126SVitaliy Gusev   opaque        ssct_encr_data<>;
1092*f44e1126SVitaliy Gusev   opaque        ssct_hmac<>;
1093*f44e1126SVitaliy Gusev };
1094*f44e1126SVitaliy Gusev %
1095*f44e1126SVitaliy Gusev 
1096*f44e1126SVitaliy Gusev /*
1097*f44e1126SVitaliy Gusev  * Defines an individual server replica
1098*f44e1126SVitaliy Gusev  */
1099*f44e1126SVitaliy Gusev struct fs_locations_server4 {
1100*f44e1126SVitaliy Gusev        int32_t          fls_currency;
1101*f44e1126SVitaliy Gusev        opaque           fls_info<>;
1102*f44e1126SVitaliy Gusev        utf8str_cis      fls_server;
1103*f44e1126SVitaliy Gusev };
1104*f44e1126SVitaliy Gusev 
1105*f44e1126SVitaliy Gusev /*
1106*f44e1126SVitaliy Gusev  * Byte indices of items within
1107*f44e1126SVitaliy Gusev  * fls_info: flag fields, class numbers,
1108*f44e1126SVitaliy Gusev  * bytes indicating ranks and orders
1109*f44e1126SVitaliy Gusev  */
1110*f44e1126SVitaliy Gusev const FSLI4BX_GFLAGS            = 0;
1111*f44e1126SVitaliy Gusev const FSLI4BX_TFLAGS            = 1;
1112*f44e1126SVitaliy Gusev 
1113*f44e1126SVitaliy Gusev const FSLI4BX_CLSIMUL           = 2;
1114*f44e1126SVitaliy Gusev const FSLI4BX_CLHANDLE          = 3;
1115*f44e1126SVitaliy Gusev const FSLI4BX_CLFILEID          = 4;
1116*f44e1126SVitaliy Gusev const FSLI4BX_CLWRITEVER        = 5;
1117*f44e1126SVitaliy Gusev const FSLI4BX_CLCHANGE          = 6;
1118*f44e1126SVitaliy Gusev const FSLI4BX_CLREADDIR         = 7;
1119*f44e1126SVitaliy Gusev 
1120*f44e1126SVitaliy Gusev const FSLI4BX_READRANK          = 8;
1121*f44e1126SVitaliy Gusev const FSLI4BX_WRITERANK         = 9;
1122*f44e1126SVitaliy Gusev const FSLI4BX_READORDER         = 10;
1123*f44e1126SVitaliy Gusev const FSLI4BX_WRITEORDER        = 11;
1124*f44e1126SVitaliy Gusev 
1125*f44e1126SVitaliy Gusev /*
1126*f44e1126SVitaliy Gusev  * Bits defined within the general flag byte
1127*f44e1126SVitaliy Gusev  */
1128*f44e1126SVitaliy Gusev const FSLI4GF_WRITABLE          = 0x01;
1129*f44e1126SVitaliy Gusev const FSLI4GF_CUR_REQ           = 0x02;
1130*f44e1126SVitaliy Gusev const FSLI4GF_ABSENT            = 0x04;
1131*f44e1126SVitaliy Gusev const FSLI4GF_GOING             = 0x08;
1132*f44e1126SVitaliy Gusev const FSLI4GF_SPLIT             = 0x10;
1133*f44e1126SVitaliy Gusev 
1134*f44e1126SVitaliy Gusev /*
1135*f44e1126SVitaliy Gusev  * Bits defined within the transport flag byte
1136*f44e1126SVitaliy Gusev  */
1137*f44e1126SVitaliy Gusev const FSLI4TF_RDMA              = 0x01;
1138*f44e1126SVitaliy Gusev 
1139*f44e1126SVitaliy Gusev /*
1140*f44e1126SVitaliy Gusev  * Defines a set of replicas sharing
1141*f44e1126SVitaliy Gusev  * a common value of the root path
1142*f44e1126SVitaliy Gusev  * within the corresponding
1143*f44e1126SVitaliy Gusev  * single-server namespaces
1144*f44e1126SVitaliy Gusev  */
1145*f44e1126SVitaliy Gusev struct fs_locations_item4 {
1146*f44e1126SVitaliy Gusev        fs_locations_server4     fli_entries<>;
1147*f44e1126SVitaliy Gusev        pathname4                fli_rootpath;
1148*f44e1126SVitaliy Gusev };
1149*f44e1126SVitaliy Gusev 
1150*f44e1126SVitaliy Gusev /*
1151*f44e1126SVitaliy Gusev  * Defines the overall structure of
1152*f44e1126SVitaliy Gusev  * the fs_locations_info attribute
1153*f44e1126SVitaliy Gusev  */
1154*f44e1126SVitaliy Gusev struct fs_locations_info4 {
1155*f44e1126SVitaliy Gusev        uint32_t                 fli_flags;
1156*f44e1126SVitaliy Gusev        int32_t                  fli_valid_for;
1157*f44e1126SVitaliy Gusev        pathname4                fli_fs_root;
1158*f44e1126SVitaliy Gusev        fs_locations_item4       fli_items<>;
1159*f44e1126SVitaliy Gusev };
1160*f44e1126SVitaliy Gusev 
1161*f44e1126SVitaliy Gusev /*
1162*f44e1126SVitaliy Gusev  * Flag bits in fli_flags
1163*f44e1126SVitaliy Gusev  */
1164*f44e1126SVitaliy Gusev const FSLI4IF_VAR_SUB           = 0x00000001;
1165*f44e1126SVitaliy Gusev 
1166*f44e1126SVitaliy Gusev typedef fs_locations_info4 fattr4_fs_locations_info;
1167*f44e1126SVitaliy Gusev 
1168*f44e1126SVitaliy Gusev const NFL4_UFLG_MASK                    = 0x0000003F;
1169*f44e1126SVitaliy Gusev const NFL4_UFLG_DENSE                   = 0x00000001;
1170*f44e1126SVitaliy Gusev const NFL4_UFLG_COMMIT_THRU_MDS         = 0x00000002;
1171*f44e1126SVitaliy Gusev const NFL42_UFLG_IO_ADVISE_THRU_MDS     = 0x00000004;
1172*f44e1126SVitaliy Gusev const NFL4_UFLG_STRIPE_UNIT_SIZE_MASK   = 0xFFFFFFC0;
1173*f44e1126SVitaliy Gusev 
1174*f44e1126SVitaliy Gusev typedef uint32_t nfl_util4;
1175*f44e1126SVitaliy Gusev 
1176*f44e1126SVitaliy Gusev %
1177*f44e1126SVitaliy Gusev 
1178*f44e1126SVitaliy Gusev enum filelayout_hint_care4 {
1179*f44e1126SVitaliy Gusev         NFLH4_CARE_DENSE        = NFL4_UFLG_DENSE,
1180*f44e1126SVitaliy Gusev 
1181*f44e1126SVitaliy Gusev         NFLH4_CARE_COMMIT_THRU_MDS
1182*f44e1126SVitaliy Gusev                                 = NFL4_UFLG_COMMIT_THRU_MDS,
1183*f44e1126SVitaliy Gusev 
1184*f44e1126SVitaliy Gusev         NFL42_CARE_IO_ADVISE_THRU_MDS
1185*f44e1126SVitaliy Gusev                                 = NFL42_UFLG_IO_ADVISE_THRU_MDS,
1186*f44e1126SVitaliy Gusev 
1187*f44e1126SVitaliy Gusev         NFLH4_CARE_STRIPE_UNIT_SIZE
1188*f44e1126SVitaliy Gusev                                 = 0x00000040,
1189*f44e1126SVitaliy Gusev 
1190*f44e1126SVitaliy Gusev         NFLH4_CARE_STRIPE_COUNT = 0x00000080
11917c478bd9Sstevel@tonic-gate };
1192*f44e1126SVitaliy Gusev %
1193*f44e1126SVitaliy Gusev %/*
1194*f44e1126SVitaliy Gusev % * Encoded in the loh_body field of data type layouthint4:
1195*f44e1126SVitaliy Gusev % */
1196*f44e1126SVitaliy Gusev %
1197*f44e1126SVitaliy Gusev struct nfsv4_1_file_layouthint4 {
1198*f44e1126SVitaliy Gusev         uint32_t        nflh_care;
1199*f44e1126SVitaliy Gusev         nfl_util4       nflh_util;
1200*f44e1126SVitaliy Gusev         count4          nflh_stripe_count;
1201*f44e1126SVitaliy Gusev };
1202*f44e1126SVitaliy Gusev 
1203*f44e1126SVitaliy Gusev %
1204*f44e1126SVitaliy Gusev 
1205*f44e1126SVitaliy Gusev %
1206*f44e1126SVitaliy Gusev typedef netaddr4 multipath_list4<>;
1207*f44e1126SVitaliy Gusev %
1208*f44e1126SVitaliy Gusev %/*
1209*f44e1126SVitaliy Gusev % * Encoded in the da_addr_body field of data type device_addr4:
1210*f44e1126SVitaliy Gusev % */
1211*f44e1126SVitaliy Gusev struct nfsv4_1_file_layout_ds_addr4 {
1212*f44e1126SVitaliy Gusev         uint32_t        nflda_stripe_indices<>;
1213*f44e1126SVitaliy Gusev         multipath_list4 nflda_multipath_ds_list<>;
1214*f44e1126SVitaliy Gusev };
1215*f44e1126SVitaliy Gusev 
1216*f44e1126SVitaliy Gusev %
1217*f44e1126SVitaliy Gusev 
1218*f44e1126SVitaliy Gusev %
1219*f44e1126SVitaliy Gusev %/*
1220*f44e1126SVitaliy Gusev % * Encoded in the loc_body field of data type layout_content4:
1221*f44e1126SVitaliy Gusev % */
1222*f44e1126SVitaliy Gusev struct nfsv4_1_file_layout4 {
1223*f44e1126SVitaliy Gusev          deviceid4      nfl_deviceid;
1224*f44e1126SVitaliy Gusev          nfl_util4      nfl_util;
1225*f44e1126SVitaliy Gusev          uint32_t       nfl_first_stripe_index;
1226*f44e1126SVitaliy Gusev          offset4        nfl_pattern_offset;
1227*f44e1126SVitaliy Gusev          nfs_fh4        nfl_fh_list<>;
1228*f44e1126SVitaliy Gusev };
1229*f44e1126SVitaliy Gusev 
1230*f44e1126SVitaliy Gusev %
12317c478bd9Sstevel@tonic-gate 
1232bbe876c0SMarcel Telka 
1233*f44e1126SVitaliy Gusev /*
1234*f44e1126SVitaliy Gusev  * Operation arrays (the opnum first)
1235*f44e1126SVitaliy Gusev  */
1236*f44e1126SVitaliy Gusev 
1237*f44e1126SVitaliy Gusev enum nfs_opnum4 {
1238*f44e1126SVitaliy Gusev  OP_ACCESS               = 3,
1239*f44e1126SVitaliy Gusev  OP_CLOSE                = 4,
1240*f44e1126SVitaliy Gusev  OP_COMMIT               = 5,
1241*f44e1126SVitaliy Gusev  OP_CREATE               = 6,
1242*f44e1126SVitaliy Gusev  OP_DELEGPURGE           = 7,
1243*f44e1126SVitaliy Gusev  OP_DELEGRETURN          = 8,
1244*f44e1126SVitaliy Gusev  OP_GETATTR              = 9,
1245*f44e1126SVitaliy Gusev  OP_GETFH                = 10,
1246*f44e1126SVitaliy Gusev  OP_LINK                 = 11,
1247*f44e1126SVitaliy Gusev  OP_LOCK                 = 12,
1248*f44e1126SVitaliy Gusev  OP_LOCKT                = 13,
1249*f44e1126SVitaliy Gusev  OP_LOCKU                = 14,
1250*f44e1126SVitaliy Gusev  OP_LOOKUP               = 15,
1251*f44e1126SVitaliy Gusev  OP_LOOKUPP              = 16,
1252*f44e1126SVitaliy Gusev  OP_NVERIFY              = 17,
1253*f44e1126SVitaliy Gusev  OP_OPEN                 = 18,
1254*f44e1126SVitaliy Gusev  OP_OPENATTR             = 19,
1255*f44e1126SVitaliy Gusev  OP_OPEN_CONFIRM         = 20, /* Mandatory not-to-implement */
1256*f44e1126SVitaliy Gusev  OP_OPEN_DOWNGRADE       = 21,
1257*f44e1126SVitaliy Gusev  OP_PUTFH                = 22,
1258*f44e1126SVitaliy Gusev  OP_PUTPUBFH             = 23,
1259*f44e1126SVitaliy Gusev  OP_PUTROOTFH            = 24,
1260*f44e1126SVitaliy Gusev  OP_READ                 = 25,
1261*f44e1126SVitaliy Gusev  OP_READDIR              = 26,
1262*f44e1126SVitaliy Gusev  OP_READLINK             = 27,
1263*f44e1126SVitaliy Gusev  OP_REMOVE               = 28,
1264*f44e1126SVitaliy Gusev  OP_RENAME               = 29,
1265*f44e1126SVitaliy Gusev  OP_RENEW                = 30, /* Mandatory not-to-implement */
1266*f44e1126SVitaliy Gusev  OP_RESTOREFH            = 31,
1267*f44e1126SVitaliy Gusev  OP_SAVEFH               = 32,
1268*f44e1126SVitaliy Gusev  OP_SECINFO              = 33,
1269*f44e1126SVitaliy Gusev  OP_SETATTR              = 34,
1270*f44e1126SVitaliy Gusev  OP_SETCLIENTID          = 35, /* Mandatory not-to-implement */
1271*f44e1126SVitaliy Gusev  OP_SETCLIENTID_CONFIRM  = 36, /* Mandatory not-to-implement */
1272*f44e1126SVitaliy Gusev  OP_VERIFY               = 37,
1273*f44e1126SVitaliy Gusev  OP_WRITE                = 38,
1274*f44e1126SVitaliy Gusev  OP_RELEASE_LOCKOWNER    = 39, /* Mandatory not-to-implement */
1275*f44e1126SVitaliy Gusev %
1276*f44e1126SVitaliy Gusev %/* New operations for NFSv4.1 */
1277*f44e1126SVitaliy Gusev %
1278*f44e1126SVitaliy Gusev  OP_BACKCHANNEL_CTL      = 40,
1279*f44e1126SVitaliy Gusev  OP_BIND_CONN_TO_SESSION = 41,
1280*f44e1126SVitaliy Gusev  OP_EXCHANGE_ID          = 42,
1281*f44e1126SVitaliy Gusev  OP_CREATE_SESSION       = 43,
1282*f44e1126SVitaliy Gusev  OP_DESTROY_SESSION      = 44,
1283*f44e1126SVitaliy Gusev  OP_FREE_STATEID         = 45,
1284*f44e1126SVitaliy Gusev  OP_GET_DIR_DELEGATION   = 46,
1285*f44e1126SVitaliy Gusev  OP_GETDEVICEINFO        = 47,
1286*f44e1126SVitaliy Gusev  OP_GETDEVICELIST        = 48,
1287*f44e1126SVitaliy Gusev  OP_LAYOUTCOMMIT         = 49,
1288*f44e1126SVitaliy Gusev  OP_LAYOUTGET            = 50,
1289*f44e1126SVitaliy Gusev  OP_LAYOUTRETURN         = 51,
1290*f44e1126SVitaliy Gusev  OP_SECINFO_NO_NAME      = 52,
1291*f44e1126SVitaliy Gusev  OP_SEQUENCE             = 53,
1292*f44e1126SVitaliy Gusev  OP_SET_SSV              = 54,
1293*f44e1126SVitaliy Gusev  OP_TEST_STATEID         = 55,
1294*f44e1126SVitaliy Gusev  OP_WANT_DELEGATION      = 56,
1295*f44e1126SVitaliy Gusev  OP_DESTROY_CLIENTID     = 57,
1296*f44e1126SVitaliy Gusev  OP_RECLAIM_COMPLETE     = 58,
1297*f44e1126SVitaliy Gusev %
1298*f44e1126SVitaliy Gusev %/* New operations for NFSv4.2 */
1299*f44e1126SVitaliy Gusev %
1300*f44e1126SVitaliy Gusev  OP_ALLOCATE             = 59,
1301*f44e1126SVitaliy Gusev  OP_COPY                 = 60,
1302*f44e1126SVitaliy Gusev  OP_COPY_NOTIFY          = 61,
1303*f44e1126SVitaliy Gusev  OP_DEALLOCATE           = 62,
1304*f44e1126SVitaliy Gusev  OP_IO_ADVISE            = 63,
1305*f44e1126SVitaliy Gusev  OP_LAYOUTERROR          = 64,
1306*f44e1126SVitaliy Gusev  OP_LAYOUTSTATS          = 65,
1307*f44e1126SVitaliy Gusev  OP_OFFLOAD_CANCEL       = 66,
1308*f44e1126SVitaliy Gusev  OP_OFFLOAD_STATUS       = 67,
1309*f44e1126SVitaliy Gusev  OP_READ_PLUS            = 68,
1310*f44e1126SVitaliy Gusev  OP_SEEK                 = 69,
1311*f44e1126SVitaliy Gusev  OP_WRITE_SAME           = 70,
1312*f44e1126SVitaliy Gusev  OP_CLONE                = 71,
1313*f44e1126SVitaliy Gusev  OP_ILLEGAL              = 10044
1314*f44e1126SVitaliy Gusev };
1315*f44e1126SVitaliy Gusev 
1316*f44e1126SVitaliy Gusev 
1317*f44e1126SVitaliy Gusev 
1318*f44e1126SVitaliy Gusev const ACCESS4_READ       = 0x00000001;
1319*f44e1126SVitaliy Gusev const ACCESS4_LOOKUP     = 0x00000002;
1320*f44e1126SVitaliy Gusev const ACCESS4_MODIFY     = 0x00000004;
1321*f44e1126SVitaliy Gusev const ACCESS4_EXTEND     = 0x00000008;
1322*f44e1126SVitaliy Gusev const ACCESS4_DELETE     = 0x00000010;
1323*f44e1126SVitaliy Gusev const ACCESS4_EXECUTE    = 0x00000020;
13247c478bd9Sstevel@tonic-gate 
13257c478bd9Sstevel@tonic-gate struct ACCESS4args {
1326bbe876c0SMarcel Telka         /* CURRENT_FH: object */
1327bbe876c0SMarcel Telka         uint32_t        access;
13287c478bd9Sstevel@tonic-gate };
13297c478bd9Sstevel@tonic-gate 
13307c478bd9Sstevel@tonic-gate struct ACCESS4resok {
1331bbe876c0SMarcel Telka         uint32_t        supported;
1332bbe876c0SMarcel Telka         uint32_t        access;
13337c478bd9Sstevel@tonic-gate };
13347c478bd9Sstevel@tonic-gate 
13357c478bd9Sstevel@tonic-gate union ACCESS4res switch (nfsstat4 status) {
13367c478bd9Sstevel@tonic-gate  case NFS4_OK:
1337*f44e1126SVitaliy Gusev          ACCESS4resok    resok4;
13387c478bd9Sstevel@tonic-gate  default:
1339bbe876c0SMarcel Telka          void;
13407c478bd9Sstevel@tonic-gate };
13417c478bd9Sstevel@tonic-gate 
1342*f44e1126SVitaliy Gusev struct CLONE4args {
1343*f44e1126SVitaliy Gusev         /* SAVED_FH: source file */
1344*f44e1126SVitaliy Gusev         /* CURRENT_FH: destination file */
1345*f44e1126SVitaliy Gusev         stateid4        cl_src_stateid;
1346*f44e1126SVitaliy Gusev         stateid4        cl_dst_stateid;
1347*f44e1126SVitaliy Gusev         offset4         cl_src_offset;
1348*f44e1126SVitaliy Gusev         offset4         cl_dst_offset;
1349*f44e1126SVitaliy Gusev         length4         cl_count;
1350*f44e1126SVitaliy Gusev };
1351*f44e1126SVitaliy Gusev 
1352*f44e1126SVitaliy Gusev struct CLONE4res {
1353*f44e1126SVitaliy Gusev         nfsstat4        cl_status;
1354*f44e1126SVitaliy Gusev };
13557c478bd9Sstevel@tonic-gate struct CLOSE4args {
1356bbe876c0SMarcel Telka         /* CURRENT_FH: object */
1357bbe876c0SMarcel Telka         seqid4          seqid;
1358bbe876c0SMarcel Telka         stateid4        open_stateid;
13597c478bd9Sstevel@tonic-gate };
13607c478bd9Sstevel@tonic-gate 
13617c478bd9Sstevel@tonic-gate union CLOSE4res switch (nfsstat4 status) {
13627c478bd9Sstevel@tonic-gate  case NFS4_OK:
1363bbe876c0SMarcel Telka          stateid4       open_stateid;
13647c478bd9Sstevel@tonic-gate  default:
1365bbe876c0SMarcel Telka          void;
13667c478bd9Sstevel@tonic-gate };
13677c478bd9Sstevel@tonic-gate 
13687c478bd9Sstevel@tonic-gate struct COMMIT4args {
1369bbe876c0SMarcel Telka         /* CURRENT_FH: file */
1370bbe876c0SMarcel Telka         offset4         offset;
1371bbe876c0SMarcel Telka         count4          count;
13727c478bd9Sstevel@tonic-gate };
13737c478bd9Sstevel@tonic-gate 
13747c478bd9Sstevel@tonic-gate struct COMMIT4resok {
1375bbe876c0SMarcel Telka         verifier4       writeverf;
13767c478bd9Sstevel@tonic-gate };
13777c478bd9Sstevel@tonic-gate 
13787c478bd9Sstevel@tonic-gate union COMMIT4res switch (nfsstat4 status) {
13797c478bd9Sstevel@tonic-gate  case NFS4_OK:
1380bbe876c0SMarcel Telka          COMMIT4resok   resok4;
13817c478bd9Sstevel@tonic-gate  default:
1382bbe876c0SMarcel Telka          void;
13837c478bd9Sstevel@tonic-gate };
13847c478bd9Sstevel@tonic-gate 
13857c478bd9Sstevel@tonic-gate union createtype4 switch (nfs_ftype4 type) {
13867c478bd9Sstevel@tonic-gate  case NF4LNK:
1387bbe876c0SMarcel Telka          linktext4 linkdata;
13887c478bd9Sstevel@tonic-gate  case NF4BLK:
13897c478bd9Sstevel@tonic-gate  case NF4CHR:
1390bbe876c0SMarcel Telka          specdata4 devdata;
13917c478bd9Sstevel@tonic-gate  case NF4SOCK:
13927c478bd9Sstevel@tonic-gate  case NF4FIFO:
13937c478bd9Sstevel@tonic-gate  case NF4DIR:
1394bbe876c0SMarcel Telka          void;
13957c478bd9Sstevel@tonic-gate  default:
1396*f44e1126SVitaliy Gusev          void;  /* Server should return NFS4ERR_BADTYPE. */
13977c478bd9Sstevel@tonic-gate };
13987c478bd9Sstevel@tonic-gate 
13997c478bd9Sstevel@tonic-gate struct CREATE4args {
1400bbe876c0SMarcel Telka         /* CURRENT_FH: directory for creation */
1401bbe876c0SMarcel Telka         createtype4     objtype;
1402bbe876c0SMarcel Telka         component4      objname;
1403bbe876c0SMarcel Telka         fattr4          createattrs;
14047c478bd9Sstevel@tonic-gate };
14057c478bd9Sstevel@tonic-gate 
14067c478bd9Sstevel@tonic-gate struct CREATE4resok {
1407bbe876c0SMarcel Telka         change_info4    cinfo;
1408*f44e1126SVitaliy Gusev         bitmap4         attrset;        /* Attributes set */
14097c478bd9Sstevel@tonic-gate };
14107c478bd9Sstevel@tonic-gate 
14117c478bd9Sstevel@tonic-gate union CREATE4res switch (nfsstat4 status) {
14127c478bd9Sstevel@tonic-gate  case NFS4_OK:
1413*f44e1126SVitaliy Gusev          /* New CURRENTFH: created object */
1414bbe876c0SMarcel Telka          CREATE4resok resok4;
14157c478bd9Sstevel@tonic-gate  default:
1416bbe876c0SMarcel Telka          void;
14177c478bd9Sstevel@tonic-gate };
14187c478bd9Sstevel@tonic-gate 
14197c478bd9Sstevel@tonic-gate struct DELEGPURGE4args {
1420bbe876c0SMarcel Telka         clientid4       clientid;
14217c478bd9Sstevel@tonic-gate };
14227c478bd9Sstevel@tonic-gate 
14237c478bd9Sstevel@tonic-gate struct DELEGPURGE4res {
1424bbe876c0SMarcel Telka         nfsstat4        status;
14257c478bd9Sstevel@tonic-gate };
14267c478bd9Sstevel@tonic-gate 
14277c478bd9Sstevel@tonic-gate struct DELEGRETURN4args {
1428*f44e1126SVitaliy Gusev         /* CURRENT_FH: delegated object */
1429bbe876c0SMarcel Telka         stateid4        deleg_stateid;
14307c478bd9Sstevel@tonic-gate };
14317c478bd9Sstevel@tonic-gate 
14327c478bd9Sstevel@tonic-gate struct DELEGRETURN4res {
1433bbe876c0SMarcel Telka         nfsstat4        status;
14347c478bd9Sstevel@tonic-gate };
14357c478bd9Sstevel@tonic-gate 
14367c478bd9Sstevel@tonic-gate struct GETATTR4args {
1437*f44e1126SVitaliy Gusev         /* CURRENT_FH: object */
1438bbe876c0SMarcel Telka         bitmap4         attr_request;
14397c478bd9Sstevel@tonic-gate };
14407c478bd9Sstevel@tonic-gate 
14417c478bd9Sstevel@tonic-gate struct GETATTR4resok {
1442bbe876c0SMarcel Telka         fattr4          obj_attributes;
14437c478bd9Sstevel@tonic-gate };
14447c478bd9Sstevel@tonic-gate 
14457c478bd9Sstevel@tonic-gate union GETATTR4res switch (nfsstat4 status) {
14467c478bd9Sstevel@tonic-gate  case NFS4_OK:
1447bbe876c0SMarcel Telka          GETATTR4resok  resok4;
14487c478bd9Sstevel@tonic-gate  default:
1449bbe876c0SMarcel Telka          void;
14507c478bd9Sstevel@tonic-gate };
14517c478bd9Sstevel@tonic-gate 
14527c478bd9Sstevel@tonic-gate struct GETFH4resok {
1453bbe876c0SMarcel Telka         nfs_fh4         object;
14547c478bd9Sstevel@tonic-gate };
14557c478bd9Sstevel@tonic-gate 
14567c478bd9Sstevel@tonic-gate union GETFH4res switch (nfsstat4 status) {
14577c478bd9Sstevel@tonic-gate  case NFS4_OK:
1458bbe876c0SMarcel Telka          GETFH4resok     resok4;
14597c478bd9Sstevel@tonic-gate  default:
1460bbe876c0SMarcel Telka          void;
14617c478bd9Sstevel@tonic-gate };
14627c478bd9Sstevel@tonic-gate 
14637c478bd9Sstevel@tonic-gate struct LINK4args {
1464bbe876c0SMarcel Telka         /* SAVED_FH: source object */
1465bbe876c0SMarcel Telka         /* CURRENT_FH: target directory */
1466bbe876c0SMarcel Telka         component4      newname;
14677c478bd9Sstevel@tonic-gate };
14687c478bd9Sstevel@tonic-gate 
14697c478bd9Sstevel@tonic-gate struct LINK4resok {
1470bbe876c0SMarcel Telka         change_info4    cinfo;
14717c478bd9Sstevel@tonic-gate };
14727c478bd9Sstevel@tonic-gate 
14737c478bd9Sstevel@tonic-gate union LINK4res switch (nfsstat4 status) {
14747c478bd9Sstevel@tonic-gate  case NFS4_OK:
1475bbe876c0SMarcel Telka          LINK4resok resok4;
14767c478bd9Sstevel@tonic-gate  default:
1477bbe876c0SMarcel Telka          void;
14787c478bd9Sstevel@tonic-gate };
14797c478bd9Sstevel@tonic-gate 
14807c478bd9Sstevel@tonic-gate /*
1481*f44e1126SVitaliy Gusev  * For LOCK, transition from open_stateid and lock_owner
1482*f44e1126SVitaliy Gusev  * to a lock stateid.
14837c478bd9Sstevel@tonic-gate  */
14847c478bd9Sstevel@tonic-gate struct open_to_lock_owner4 {
1485bbe876c0SMarcel Telka         seqid4          open_seqid;
1486bbe876c0SMarcel Telka         stateid4        open_stateid;
1487bbe876c0SMarcel Telka         seqid4          lock_seqid;
1488bbe876c0SMarcel Telka         lock_owner4     lock_owner;
14897c478bd9Sstevel@tonic-gate };
1490bbe876c0SMarcel Telka 
14917c478bd9Sstevel@tonic-gate /*
1492*f44e1126SVitaliy Gusev  * For LOCK, existing lock stateid continues to request new
1493*f44e1126SVitaliy Gusev  * file lock for the same lock_owner and open_stateid.
14947c478bd9Sstevel@tonic-gate  */
14957c478bd9Sstevel@tonic-gate struct exist_lock_owner4 {
1496bbe876c0SMarcel Telka         stateid4        lock_stateid;
1497bbe876c0SMarcel Telka         seqid4          lock_seqid;
14987c478bd9Sstevel@tonic-gate };
14997c478bd9Sstevel@tonic-gate 
15007c478bd9Sstevel@tonic-gate union locker4 switch (bool new_lock_owner) {
15017c478bd9Sstevel@tonic-gate  case TRUE:
1502bbe876c0SMarcel Telka         open_to_lock_owner4     open_owner;
15037c478bd9Sstevel@tonic-gate  case FALSE:
1504bbe876c0SMarcel Telka         exist_lock_owner4       lock_owner;
15057c478bd9Sstevel@tonic-gate };
15067c478bd9Sstevel@tonic-gate 
15077c478bd9Sstevel@tonic-gate /*
15087c478bd9Sstevel@tonic-gate  * LOCK/LOCKT/LOCKU: Record lock management
15097c478bd9Sstevel@tonic-gate  */
15107c478bd9Sstevel@tonic-gate struct LOCK4args {
1511bbe876c0SMarcel Telka         /* CURRENT_FH: file */
1512bbe876c0SMarcel Telka         nfs_lock_type4  locktype;
1513bbe876c0SMarcel Telka         bool            reclaim;
1514bbe876c0SMarcel Telka         offset4         offset;
1515bbe876c0SMarcel Telka         length4         length;
1516bbe876c0SMarcel Telka         locker4         locker;
15177c478bd9Sstevel@tonic-gate };
15187c478bd9Sstevel@tonic-gate 
15197c478bd9Sstevel@tonic-gate struct LOCK4denied {
1520bbe876c0SMarcel Telka         offset4         offset;
1521bbe876c0SMarcel Telka         length4         length;
1522bbe876c0SMarcel Telka         nfs_lock_type4  locktype;
1523bbe876c0SMarcel Telka         lock_owner4     owner;
15247c478bd9Sstevel@tonic-gate };
15257c478bd9Sstevel@tonic-gate 
15267c478bd9Sstevel@tonic-gate struct LOCK4resok {
1527bbe876c0SMarcel Telka         stateid4        lock_stateid;
15287c478bd9Sstevel@tonic-gate };
15297c478bd9Sstevel@tonic-gate 
15307c478bd9Sstevel@tonic-gate union LOCK4res switch (nfsstat4 status) {
15317c478bd9Sstevel@tonic-gate  case NFS4_OK:
1532bbe876c0SMarcel Telka          LOCK4resok     resok4;
15337c478bd9Sstevel@tonic-gate  case NFS4ERR_DENIED:
1534bbe876c0SMarcel Telka          LOCK4denied    denied;
15357c478bd9Sstevel@tonic-gate  default:
1536bbe876c0SMarcel Telka          void;
15377c478bd9Sstevel@tonic-gate };
15387c478bd9Sstevel@tonic-gate 
15397c478bd9Sstevel@tonic-gate struct LOCKT4args {
1540bbe876c0SMarcel Telka         /* CURRENT_FH: file */
1541bbe876c0SMarcel Telka         nfs_lock_type4  locktype;
1542bbe876c0SMarcel Telka         offset4         offset;
1543bbe876c0SMarcel Telka         length4         length;
1544bbe876c0SMarcel Telka         lock_owner4     owner;
15457c478bd9Sstevel@tonic-gate };
15467c478bd9Sstevel@tonic-gate 
15477c478bd9Sstevel@tonic-gate union LOCKT4res switch (nfsstat4 status) {
15487c478bd9Sstevel@tonic-gate  case NFS4ERR_DENIED:
1549bbe876c0SMarcel Telka          LOCK4denied    denied;
15507c478bd9Sstevel@tonic-gate  case NFS4_OK:
1551bbe876c0SMarcel Telka          void;
15527c478bd9Sstevel@tonic-gate  default:
1553bbe876c0SMarcel Telka          void;
15547c478bd9Sstevel@tonic-gate };
15557c478bd9Sstevel@tonic-gate 
15567c478bd9Sstevel@tonic-gate struct LOCKU4args {
1557bbe876c0SMarcel Telka         /* CURRENT_FH: file */
1558bbe876c0SMarcel Telka         nfs_lock_type4  locktype;
1559bbe876c0SMarcel Telka         seqid4          seqid;
1560bbe876c0SMarcel Telka         stateid4        lock_stateid;
1561bbe876c0SMarcel Telka         offset4         offset;
1562bbe876c0SMarcel Telka         length4         length;
15637c478bd9Sstevel@tonic-gate };
15647c478bd9Sstevel@tonic-gate 
15657c478bd9Sstevel@tonic-gate union LOCKU4res switch (nfsstat4 status) {
1566bbe876c0SMarcel Telka  case NFS4_OK:
1567bbe876c0SMarcel Telka          stateid4       lock_stateid;
15687c478bd9Sstevel@tonic-gate  default:
1569bbe876c0SMarcel Telka          void;
15707c478bd9Sstevel@tonic-gate };
15717c478bd9Sstevel@tonic-gate 
15727c478bd9Sstevel@tonic-gate struct LOOKUP4args {
1573bbe876c0SMarcel Telka         /* CURRENT_FH: directory */
1574bbe876c0SMarcel Telka         component4      objname;
15757c478bd9Sstevel@tonic-gate };
15767c478bd9Sstevel@tonic-gate 
15777c478bd9Sstevel@tonic-gate struct LOOKUP4res {
1578*f44e1126SVitaliy Gusev         /* New CURRENT_FH: object */
1579bbe876c0SMarcel Telka         nfsstat4        status;
15807c478bd9Sstevel@tonic-gate };
15817c478bd9Sstevel@tonic-gate 
15827c478bd9Sstevel@tonic-gate struct LOOKUPP4res {
1583*f44e1126SVitaliy Gusev         /* New CURRENT_FH: parent directory */
1584bbe876c0SMarcel Telka         nfsstat4        status;
15857c478bd9Sstevel@tonic-gate };
15867c478bd9Sstevel@tonic-gate 
15877c478bd9Sstevel@tonic-gate struct NVERIFY4args {
1588bbe876c0SMarcel Telka         /* CURRENT_FH: object */
1589bbe876c0SMarcel Telka         fattr4          obj_attributes;
15907c478bd9Sstevel@tonic-gate };
15917c478bd9Sstevel@tonic-gate 
15927c478bd9Sstevel@tonic-gate struct NVERIFY4res {
1593bbe876c0SMarcel Telka         nfsstat4        status;
15947c478bd9Sstevel@tonic-gate };
15957c478bd9Sstevel@tonic-gate 
15967c478bd9Sstevel@tonic-gate /*
15977c478bd9Sstevel@tonic-gate  * Various definitions for OPEN
15987c478bd9Sstevel@tonic-gate  */
15997c478bd9Sstevel@tonic-gate enum createmode4 {
1600bbe876c0SMarcel Telka         UNCHECKED4      = 0,
1601bbe876c0SMarcel Telka         GUARDED4        = 1,
1602*f44e1126SVitaliy Gusev         /* Deprecated in NFSv4.1 */
1603*f44e1126SVitaliy Gusev         EXCLUSIVE4      = 2,
1604*f44e1126SVitaliy Gusev         /*
1605*f44e1126SVitaliy Gusev          * New to NFSv4.1.  If session is persistent,
1606*f44e1126SVitaliy Gusev          * GUARDED4 MUST be used.  Otherwise, use
1607*f44e1126SVitaliy Gusev          * EXCLUSIVE4_1 instead of EXCLUSIVE4.
1608*f44e1126SVitaliy Gusev          */
1609*f44e1126SVitaliy Gusev         EXCLUSIVE4_1    = 3
1610*f44e1126SVitaliy Gusev };
1611*f44e1126SVitaliy Gusev 
1612*f44e1126SVitaliy Gusev struct creatverfattr {
1613*f44e1126SVitaliy Gusev          verifier4      cva_verf;
1614*f44e1126SVitaliy Gusev          fattr4         cva_attrs;
16157c478bd9Sstevel@tonic-gate };
16167c478bd9Sstevel@tonic-gate 
16177c478bd9Sstevel@tonic-gate union createhow4 switch (createmode4 mode) {
16187c478bd9Sstevel@tonic-gate  case UNCHECKED4:
16197c478bd9Sstevel@tonic-gate  case GUARDED4:
1620bbe876c0SMarcel Telka          fattr4         createattrs;
16217c478bd9Sstevel@tonic-gate  case EXCLUSIVE4:
1622bbe876c0SMarcel Telka          verifier4      createverf;
1623*f44e1126SVitaliy Gusev  case EXCLUSIVE4_1:
1624*f44e1126SVitaliy Gusev          creatverfattr  ch_createboth;
16257c478bd9Sstevel@tonic-gate };
16267c478bd9Sstevel@tonic-gate 
16277c478bd9Sstevel@tonic-gate enum opentype4 {
1628bbe876c0SMarcel Telka         OPEN4_NOCREATE  = 0,
1629bbe876c0SMarcel Telka         OPEN4_CREATE    = 1
16307c478bd9Sstevel@tonic-gate };
16317c478bd9Sstevel@tonic-gate 
16327c478bd9Sstevel@tonic-gate union openflag4 switch (opentype4 opentype) {
16337c478bd9Sstevel@tonic-gate  case OPEN4_CREATE:
1634bbe876c0SMarcel Telka          createhow4     how;
16357c478bd9Sstevel@tonic-gate  default:
1636bbe876c0SMarcel Telka          void;
16377c478bd9Sstevel@tonic-gate };
16387c478bd9Sstevel@tonic-gate 
16397c478bd9Sstevel@tonic-gate /* Next definitions used for OPEN delegation */
16407c478bd9Sstevel@tonic-gate enum limit_by4 {
1641bbe876c0SMarcel Telka         NFS_LIMIT_SIZE          = 1,
1642bbe876c0SMarcel Telka         NFS_LIMIT_BLOCKS        = 2
1643*f44e1126SVitaliy Gusev         /* Others as needed */
16447c478bd9Sstevel@tonic-gate };
16457c478bd9Sstevel@tonic-gate 
16467c478bd9Sstevel@tonic-gate struct nfs_modified_limit4 {
1647bbe876c0SMarcel Telka         uint32_t        num_blocks;
1648bbe876c0SMarcel Telka         uint32_t        bytes_per_block;
16497c478bd9Sstevel@tonic-gate };
16507c478bd9Sstevel@tonic-gate 
16517c478bd9Sstevel@tonic-gate union nfs_space_limit4 switch (limit_by4 limitby) {
1652*f44e1126SVitaliy Gusev  /* Limit specified as file size */
16537c478bd9Sstevel@tonic-gate  case NFS_LIMIT_SIZE:
1654bbe876c0SMarcel Telka          uint64_t               filesize;
1655*f44e1126SVitaliy Gusev  /* Limit specified by number of blocks */
16567c478bd9Sstevel@tonic-gate  case NFS_LIMIT_BLOCKS:
1657bbe876c0SMarcel Telka          nfs_modified_limit4    mod_blocks;
165829c2b691SPatrick Mooney };
1659a57549b4SVitaliy Gusev 
1660*f44e1126SVitaliy Gusev /*
1661*f44e1126SVitaliy Gusev  * Share Access and Deny constants for open argument
1662*f44e1126SVitaliy Gusev  */
1663*f44e1126SVitaliy Gusev const OPEN4_SHARE_ACCESS_READ   = 0x00000001;
1664*f44e1126SVitaliy Gusev const OPEN4_SHARE_ACCESS_WRITE  = 0x00000002;
1665*f44e1126SVitaliy Gusev const OPEN4_SHARE_ACCESS_BOTH   = 0x00000003;
1666*f44e1126SVitaliy Gusev 
1667*f44e1126SVitaliy Gusev const OPEN4_SHARE_DENY_NONE     = 0x00000000;
1668*f44e1126SVitaliy Gusev const OPEN4_SHARE_DENY_READ     = 0x00000001;
1669*f44e1126SVitaliy Gusev const OPEN4_SHARE_DENY_WRITE    = 0x00000002;
1670*f44e1126SVitaliy Gusev const OPEN4_SHARE_DENY_BOTH     = 0x00000003;
1671*f44e1126SVitaliy Gusev 
1672*f44e1126SVitaliy Gusev 
1673*f44e1126SVitaliy Gusev /* New flags for share_access field of OPEN4args */
1674*f44e1126SVitaliy Gusev const OPEN4_SHARE_ACCESS_WANT_DELEG_MASK        = 0xFF00;
1675*f44e1126SVitaliy Gusev const OPEN4_SHARE_ACCESS_WANT_NO_PREFERENCE     = 0x0000;
1676*f44e1126SVitaliy Gusev const OPEN4_SHARE_ACCESS_WANT_READ_DELEG        = 0x0100;
1677*f44e1126SVitaliy Gusev const OPEN4_SHARE_ACCESS_WANT_WRITE_DELEG       = 0x0200;
1678*f44e1126SVitaliy Gusev const OPEN4_SHARE_ACCESS_WANT_ANY_DELEG         = 0x0300;
1679*f44e1126SVitaliy Gusev const OPEN4_SHARE_ACCESS_WANT_NO_DELEG          = 0x0400;
1680*f44e1126SVitaliy Gusev const OPEN4_SHARE_ACCESS_WANT_CANCEL            = 0x0500;
1681*f44e1126SVitaliy Gusev 
1682*f44e1126SVitaliy Gusev const
1683*f44e1126SVitaliy Gusev  OPEN4_SHARE_ACCESS_WANT_SIGNAL_DELEG_WHEN_RESRC_AVAIL
1684*f44e1126SVitaliy Gusev  = 0x10000;
1685*f44e1126SVitaliy Gusev 
1686*f44e1126SVitaliy Gusev const
1687*f44e1126SVitaliy Gusev  OPEN4_SHARE_ACCESS_WANT_PUSH_DELEG_WHEN_UNCONTENDED
1688*f44e1126SVitaliy Gusev  = 0x20000;
1689*f44e1126SVitaliy Gusev 
1690*f44e1126SVitaliy Gusev enum open_delegation_type4 {
1691*f44e1126SVitaliy Gusev         OPEN_DELEGATE_NONE      = 0,
1692*f44e1126SVitaliy Gusev         OPEN_DELEGATE_READ      = 1,
1693*f44e1126SVitaliy Gusev         OPEN_DELEGATE_WRITE     = 2,
1694*f44e1126SVitaliy Gusev         OPEN_DELEGATE_NONE_EXT  = 3 /* New to NFSv4.1 */
1695*f44e1126SVitaliy Gusev };
1696*f44e1126SVitaliy Gusev 
1697*f44e1126SVitaliy Gusev enum open_claim_type4 {
1698*f44e1126SVitaliy Gusev         /*
1699*f44e1126SVitaliy Gusev          * Not a reclaim
1700*f44e1126SVitaliy Gusev          */
1701*f44e1126SVitaliy Gusev         CLAIM_NULL              = 0,
1702*f44e1126SVitaliy Gusev 
1703*f44e1126SVitaliy Gusev         CLAIM_PREVIOUS          = 1,
1704*f44e1126SVitaliy Gusev         CLAIM_DELEGATE_CUR      = 2,
1705*f44e1126SVitaliy Gusev         CLAIM_DELEGATE_PREV     = 3,
1706*f44e1126SVitaliy Gusev 
1707*f44e1126SVitaliy Gusev         /*
1708*f44e1126SVitaliy Gusev          * Not a reclaim
1709*f44e1126SVitaliy Gusev          *
1710*f44e1126SVitaliy Gusev          * Like CLAIM_NULL, but object identified
1711*f44e1126SVitaliy Gusev          * by the current filehandle
1712*f44e1126SVitaliy Gusev          */
1713*f44e1126SVitaliy Gusev         CLAIM_FH                = 4, /* New to NFSv4.1 */
1714*f44e1126SVitaliy Gusev 
1715*f44e1126SVitaliy Gusev         /*
1716*f44e1126SVitaliy Gusev          * Like CLAIM_DELEGATE_CUR, but object identified
1717*f44e1126SVitaliy Gusev          * by current filehandle
1718*f44e1126SVitaliy Gusev          */
1719*f44e1126SVitaliy Gusev         CLAIM_DELEG_CUR_FH      = 5, /* New to NFSv4.1 */
1720*f44e1126SVitaliy Gusev 
1721*f44e1126SVitaliy Gusev         /*
1722*f44e1126SVitaliy Gusev          * Like CLAIM_DELEGATE_PREV, but object identified
1723*f44e1126SVitaliy Gusev          * by current filehandle
1724*f44e1126SVitaliy Gusev          */
1725*f44e1126SVitaliy Gusev         CLAIM_DELEG_PREV_FH     = 6 /* New to NFSv4.1 */
1726*f44e1126SVitaliy Gusev };
1727*f44e1126SVitaliy Gusev 
1728*f44e1126SVitaliy Gusev struct open_claim_delegate_cur4 {
1729*f44e1126SVitaliy Gusev         stateid4        delegate_stateid;
1730bbe876c0SMarcel Telka         component4      file;
17317c478bd9Sstevel@tonic-gate };
17327c478bd9Sstevel@tonic-gate 
17337c478bd9Sstevel@tonic-gate union open_claim4 switch (open_claim_type4 claim) {
17347c478bd9Sstevel@tonic-gate  /*
1735bbe876c0SMarcel Telka   * No special rights to file.
1736bbe876c0SMarcel Telka   * Ordinary OPEN of the specified file.
17377c478bd9Sstevel@tonic-gate   */
17387c478bd9Sstevel@tonic-gate  case CLAIM_NULL:
1739bbe876c0SMarcel Telka         /* CURRENT_FH: directory */
1740bbe876c0SMarcel Telka         component4      file;
17417c478bd9Sstevel@tonic-gate  /*
1742bbe876c0SMarcel Telka   * Right to the file established by an
1743bbe876c0SMarcel Telka   * open previous to server reboot.  File
1744bbe876c0SMarcel Telka   * identified by filehandle obtained at
1745bbe876c0SMarcel Telka   * that time rather than by name.
17467c478bd9Sstevel@tonic-gate   */
17477c478bd9Sstevel@tonic-gate  case CLAIM_PREVIOUS:
1748bbe876c0SMarcel Telka         /* CURRENT_FH: file being reclaimed */
1749bbe876c0SMarcel Telka         open_delegation_type4   delegate_type;
17507c478bd9Sstevel@tonic-gate 
17517c478bd9Sstevel@tonic-gate  /*
1752bbe876c0SMarcel Telka   * Right to file based on a delegation
1753bbe876c0SMarcel Telka   * granted by the server.  File is
1754bbe876c0SMarcel Telka   * specified by name.
17557c478bd9Sstevel@tonic-gate   */
17567c478bd9Sstevel@tonic-gate  case CLAIM_DELEGATE_CUR:
1757bbe876c0SMarcel Telka         /* CURRENT_FH: directory */
1758bbe876c0SMarcel Telka         open_claim_delegate_cur4        delegate_cur_info;
1759bbe876c0SMarcel Telka 
1760bbe876c0SMarcel Telka  /*
1761bbe876c0SMarcel Telka   * Right to file based on a delegation
1762bbe876c0SMarcel Telka   * granted to a previous boot instance
1763bbe876c0SMarcel Telka   * of the client.  File is specified by name.
17647c478bd9Sstevel@tonic-gate   */
17657c478bd9Sstevel@tonic-gate  case CLAIM_DELEGATE_PREV:
1766*f44e1126SVitaliy Gusev          /* CURRENT_FH: directory */
1767bbe876c0SMarcel Telka         component4      file_delegate_prev;
1768*f44e1126SVitaliy Gusev 
1769*f44e1126SVitaliy Gusev  /*
1770*f44e1126SVitaliy Gusev   * Like CLAIM_NULL.  No special rights
1771*f44e1126SVitaliy Gusev   * to file.  Ordinary OPEN of the
1772*f44e1126SVitaliy Gusev   * specified file by current filehandle.
1773*f44e1126SVitaliy Gusev   */
1774*f44e1126SVitaliy Gusev  case CLAIM_FH: /* New to NFSv4.1 */
1775*f44e1126SVitaliy Gusev         /* CURRENT_FH: regular file to open */
1776*f44e1126SVitaliy Gusev         void;
1777*f44e1126SVitaliy Gusev 
1778*f44e1126SVitaliy Gusev  /*
1779*f44e1126SVitaliy Gusev   * Like CLAIM_DELEGATE_PREV.  Right to file based on a
1780*f44e1126SVitaliy Gusev   * delegation granted to a previous boot
1781*f44e1126SVitaliy Gusev   * instance of the client.  File is identified
1782*f44e1126SVitaliy Gusev   * by filehandle.
1783*f44e1126SVitaliy Gusev   */
1784*f44e1126SVitaliy Gusev  case CLAIM_DELEG_PREV_FH: /* New to NFSv4.1 */
1785*f44e1126SVitaliy Gusev         /* CURRENT_FH: file being opened */
1786*f44e1126SVitaliy Gusev         void;
1787*f44e1126SVitaliy Gusev 
1788*f44e1126SVitaliy Gusev  /*
1789*f44e1126SVitaliy Gusev   * Like CLAIM_DELEGATE_CUR.  Right to file based on
1790*f44e1126SVitaliy Gusev   * a delegation granted by the server.
1791*f44e1126SVitaliy Gusev   * File is identified by filehandle.
1792*f44e1126SVitaliy Gusev   */
1793*f44e1126SVitaliy Gusev  case CLAIM_DELEG_CUR_FH: /* New to NFSv4.1 */
1794*f44e1126SVitaliy Gusev          /* CURRENT_FH: file being opened */
1795*f44e1126SVitaliy Gusev          stateid4       oc_delegate_stateid;
1796*f44e1126SVitaliy Gusev 
17977c478bd9Sstevel@tonic-gate };
17987c478bd9Sstevel@tonic-gate 
17997c478bd9Sstevel@tonic-gate /*
1800*f44e1126SVitaliy Gusev  * OPEN: Open a file, potentially receiving an open delegation.
18017c478bd9Sstevel@tonic-gate  */
18027c478bd9Sstevel@tonic-gate struct OPEN4args {
1803bbe876c0SMarcel Telka         seqid4          seqid;
1804bbe876c0SMarcel Telka         uint32_t        share_access;
1805bbe876c0SMarcel Telka         uint32_t        share_deny;
1806bbe876c0SMarcel Telka         open_owner4     owner;
1807bbe876c0SMarcel Telka         openflag4       openhow;
1808bbe876c0SMarcel Telka         open_claim4     claim;
18097c478bd9Sstevel@tonic-gate };
18107c478bd9Sstevel@tonic-gate 
18117c478bd9Sstevel@tonic-gate struct open_read_delegation4 {
1812bbe876c0SMarcel Telka  stateid4 stateid;    /* Stateid for delegation */
1813bbe876c0SMarcel Telka  bool     recall;     /* Pre-recalled flag for
1814bbe876c0SMarcel Telka                          delegations obtained
1815*f44e1126SVitaliy Gusev                          by reclaim (CLAIM_PREVIOUS) */
1816bbe876c0SMarcel Telka 
1817bbe876c0SMarcel Telka  nfsace4 permissions; /* Defines users who don't
1818bbe876c0SMarcel Telka                          need an ACCESS call to
1819*f44e1126SVitaliy Gusev                          open for read */
18207c478bd9Sstevel@tonic-gate };
18217c478bd9Sstevel@tonic-gate 
18227c478bd9Sstevel@tonic-gate struct open_write_delegation4 {
1823bbe876c0SMarcel Telka  stateid4 stateid;      /* Stateid for delegation */
1824bbe876c0SMarcel Telka  bool     recall;       /* Pre-recalled flag for
1825bbe876c0SMarcel Telka                            delegations obtained
1826bbe876c0SMarcel Telka                            by reclaim
1827*f44e1126SVitaliy Gusev                            (CLAIM_PREVIOUS) */
1828bbe876c0SMarcel Telka 
1829bbe876c0SMarcel Telka  nfs_space_limit4
1830bbe876c0SMarcel Telka            space_limit; /* Defines condition that
1831bbe876c0SMarcel Telka                            the client must check to
1832bbe876c0SMarcel Telka                            determine whether the
1833bbe876c0SMarcel Telka                            file needs to be flushed
1834*f44e1126SVitaliy Gusev                            to the server on close */
1835bbe876c0SMarcel Telka 
1836bbe876c0SMarcel Telka  nfsace4   permissions; /* Defines users who don't
1837bbe876c0SMarcel Telka                            need an ACCESS call as
1838bbe876c0SMarcel Telka                            part of a delegated
1839*f44e1126SVitaliy Gusev                            open */
1840*f44e1126SVitaliy Gusev };
1841*f44e1126SVitaliy Gusev 
1842*f44e1126SVitaliy Gusev 
1843*f44e1126SVitaliy Gusev enum why_no_delegation4 { /* New to NFSv4.1 */
1844*f44e1126SVitaliy Gusev         WND4_NOT_WANTED                 = 0,
1845*f44e1126SVitaliy Gusev         WND4_CONTENTION                 = 1,
1846*f44e1126SVitaliy Gusev         WND4_RESOURCE                   = 2,
1847*f44e1126SVitaliy Gusev         WND4_NOT_SUPP_FTYPE             = 3,
1848*f44e1126SVitaliy Gusev         WND4_WRITE_DELEG_NOT_SUPP_FTYPE = 4,
1849*f44e1126SVitaliy Gusev         WND4_NOT_SUPP_UPGRADE           = 5,
1850*f44e1126SVitaliy Gusev         WND4_NOT_SUPP_DOWNGRADE         = 6,
1851*f44e1126SVitaliy Gusev         WND4_CANCELLED                  = 7,
1852*f44e1126SVitaliy Gusev         WND4_IS_DIR                     = 8
1853*f44e1126SVitaliy Gusev };
1854*f44e1126SVitaliy Gusev 
1855*f44e1126SVitaliy Gusev union open_none_delegation4 /* New to NFSv4.1 */
1856*f44e1126SVitaliy Gusev  switch (why_no_delegation4 ond_why) {
1857*f44e1126SVitaliy Gusev          case WND4_CONTENTION:
1858*f44e1126SVitaliy Gusev                  bool ond_server_will_push_deleg;
1859*f44e1126SVitaliy Gusev          case WND4_RESOURCE:
1860*f44e1126SVitaliy Gusev                  bool ond_server_will_signal_avail;
1861*f44e1126SVitaliy Gusev          default:
1862*f44e1126SVitaliy Gusev                  void;
18637c478bd9Sstevel@tonic-gate };
18647c478bd9Sstevel@tonic-gate 
18657c478bd9Sstevel@tonic-gate union open_delegation4
1866*f44e1126SVitaliy Gusev  switch (open_delegation_type4 delegation_type) {
1867*f44e1126SVitaliy Gusev          case OPEN_DELEGATE_NONE:
1868*f44e1126SVitaliy Gusev                  void;
1869*f44e1126SVitaliy Gusev          case OPEN_DELEGATE_READ:
1870*f44e1126SVitaliy Gusev                  open_read_delegation4 read;
1871*f44e1126SVitaliy Gusev          case OPEN_DELEGATE_WRITE:
1872*f44e1126SVitaliy Gusev                  open_write_delegation4 write;
1873*f44e1126SVitaliy Gusev          case OPEN_DELEGATE_NONE_EXT: /* New to NFSv4.1 */
1874*f44e1126SVitaliy Gusev                  open_none_delegation4 od_whynone;
18757c478bd9Sstevel@tonic-gate };
18767c478bd9Sstevel@tonic-gate 
18777c478bd9Sstevel@tonic-gate /*
18787c478bd9Sstevel@tonic-gate  * Result flags
18797c478bd9Sstevel@tonic-gate  */
1880bbe876c0SMarcel Telka 
1881*f44e1126SVitaliy Gusev /* Client must confirm open. */
1882bbe876c0SMarcel Telka const OPEN4_RESULT_CONFIRM      = 0x00000002;
1883*f44e1126SVitaliy Gusev /* Type of file-locking behavior at the server */
18847c478bd9Sstevel@tonic-gate const OPEN4_RESULT_LOCKTYPE_POSIX = 0x00000004;
1885*f44e1126SVitaliy Gusev /* Server will preserve file if removed while open. */
1886*f44e1126SVitaliy Gusev const OPEN4_RESULT_PRESERVE_UNLINKED = 0x00000008;
1887*f44e1126SVitaliy Gusev 
1888*f44e1126SVitaliy Gusev /*
1889*f44e1126SVitaliy Gusev  * Server may use CB_NOTIFY_LOCK on locks
1890*f44e1126SVitaliy Gusev  * derived from this open.
1891*f44e1126SVitaliy Gusev  */
1892*f44e1126SVitaliy Gusev const OPEN4_RESULT_MAY_NOTIFY_LOCK = 0x00000020;
18937c478bd9Sstevel@tonic-gate 
18947c478bd9Sstevel@tonic-gate struct OPEN4resok {
1895*f44e1126SVitaliy Gusev  stateid4         stateid;      /* Stateid for open */
1896*f44e1126SVitaliy Gusev  change_info4     cinfo;        /* Directory change info */
1897*f44e1126SVitaliy Gusev  uint32_t         rflags;       /* Result flags */
1898*f44e1126SVitaliy Gusev  bitmap4          attrset;      /* Attribute set for create */
1899*f44e1126SVitaliy Gusev  open_delegation4 delegation;   /* Info on any open
1900bbe876c0SMarcel Telka                                    delegation */
19017c478bd9Sstevel@tonic-gate };
19027c478bd9Sstevel@tonic-gate 
19037c478bd9Sstevel@tonic-gate union OPEN4res switch (nfsstat4 status) {
19047c478bd9Sstevel@tonic-gate  case NFS4_OK:
1905*f44e1126SVitaliy Gusev          /* New CURRENT_FH: opened file */
1906bbe876c0SMarcel Telka          OPEN4resok      resok4;
19077c478bd9Sstevel@tonic-gate  default:
1908bbe876c0SMarcel Telka          void;
1909bbe876c0SMarcel Telka };
19107c478bd9Sstevel@tonic-gate 
19117c478bd9Sstevel@tonic-gate struct OPENATTR4args {
1912bbe876c0SMarcel Telka         /* CURRENT_FH: object */
1913bbe876c0SMarcel Telka         bool    createdir;
19147c478bd9Sstevel@tonic-gate };
19157c478bd9Sstevel@tonic-gate 
19167c478bd9Sstevel@tonic-gate struct OPENATTR4res {
1917*f44e1126SVitaliy Gusev         /*
1918*f44e1126SVitaliy Gusev          * If status is NFS4_OK,
1919*f44e1126SVitaliy Gusev          *   New CURRENT_FH: named attribute
1920*f44e1126SVitaliy Gusev          *                   directory
1921*f44e1126SVitaliy Gusev          */
1922bbe876c0SMarcel Telka         nfsstat4        status;
19237c478bd9Sstevel@tonic-gate };
19247c478bd9Sstevel@tonic-gate 
1925*f44e1126SVitaliy Gusev /* Obsolete in NFSv4.1 */
19267c478bd9Sstevel@tonic-gate struct OPEN_CONFIRM4args {
1927bbe876c0SMarcel Telka         /* CURRENT_FH: opened file */
1928bbe876c0SMarcel Telka         stateid4        open_stateid;
1929bbe876c0SMarcel Telka         seqid4          seqid;
19307c478bd9Sstevel@tonic-gate };
19317c478bd9Sstevel@tonic-gate 
19327c478bd9Sstevel@tonic-gate struct OPEN_CONFIRM4resok {
1933bbe876c0SMarcel Telka         stateid4        open_stateid;
19347c478bd9Sstevel@tonic-gate };
19357c478bd9Sstevel@tonic-gate 
19367c478bd9Sstevel@tonic-gate union OPEN_CONFIRM4res switch (nfsstat4 status) {
19377c478bd9Sstevel@tonic-gate  case NFS4_OK:
1938bbe876c0SMarcel Telka          OPEN_CONFIRM4resok     resok4;
19397c478bd9Sstevel@tonic-gate  default:
1940bbe876c0SMarcel Telka          void;
19417c478bd9Sstevel@tonic-gate };
19427c478bd9Sstevel@tonic-gate 
19437c478bd9Sstevel@tonic-gate struct OPEN_DOWNGRADE4args {
1944bbe876c0SMarcel Telka         /* CURRENT_FH: opened file */
1945bbe876c0SMarcel Telka         stateid4        open_stateid;
1946bbe876c0SMarcel Telka         seqid4          seqid;
1947bbe876c0SMarcel Telka         uint32_t        share_access;
1948bbe876c0SMarcel Telka         uint32_t        share_deny;
19497c478bd9Sstevel@tonic-gate };
19507c478bd9Sstevel@tonic-gate 
19517c478bd9Sstevel@tonic-gate struct OPEN_DOWNGRADE4resok {
1952bbe876c0SMarcel Telka         stateid4        open_stateid;
19537c478bd9Sstevel@tonic-gate };
19547c478bd9Sstevel@tonic-gate 
1955bbe876c0SMarcel Telka union OPEN_DOWNGRADE4res switch (nfsstat4 status) {
19567c478bd9Sstevel@tonic-gate  case NFS4_OK:
1957bbe876c0SMarcel Telka          OPEN_DOWNGRADE4resok    resok4;
19587c478bd9Sstevel@tonic-gate  default:
1959bbe876c0SMarcel Telka          void;
19607c478bd9Sstevel@tonic-gate };
19617c478bd9Sstevel@tonic-gate 
19627c478bd9Sstevel@tonic-gate struct PUTFH4args {
1963bbe876c0SMarcel Telka         nfs_fh4         object;
19647c478bd9Sstevel@tonic-gate };
19657c478bd9Sstevel@tonic-gate 
19667c478bd9Sstevel@tonic-gate struct PUTFH4res {
1967*f44e1126SVitaliy Gusev         /*
1968*f44e1126SVitaliy Gusev          * If status is NFS4_OK,
1969*f44e1126SVitaliy Gusev          *   New CURRENT_FH: argument to PUTFH
1970*f44e1126SVitaliy Gusev          */
1971bbe876c0SMarcel Telka         nfsstat4        status;
19727c478bd9Sstevel@tonic-gate };
19737c478bd9Sstevel@tonic-gate 
19747c478bd9Sstevel@tonic-gate struct PUTPUBFH4res {
1975*f44e1126SVitaliy Gusev         /*
1976*f44e1126SVitaliy Gusev          * If status is NFS4_OK,
1977*f44e1126SVitaliy Gusev          *   New CURRENT_FH: public fh
1978*f44e1126SVitaliy Gusev          */
1979bbe876c0SMarcel Telka         nfsstat4        status;
19807c478bd9Sstevel@tonic-gate };
19817c478bd9Sstevel@tonic-gate 
19827c478bd9Sstevel@tonic-gate struct PUTROOTFH4res {
1983*f44e1126SVitaliy Gusev         /*
1984*f44e1126SVitaliy Gusev          * If status is NFS4_OK,
1985*f44e1126SVitaliy Gusev          *   New CURRENT_FH: root fh
1986*f44e1126SVitaliy Gusev          */
1987bbe876c0SMarcel Telka         nfsstat4        status;
19887c478bd9Sstevel@tonic-gate };
19897c478bd9Sstevel@tonic-gate 
19907c478bd9Sstevel@tonic-gate struct READ4args {
1991bbe876c0SMarcel Telka         /* CURRENT_FH: file */
1992bbe876c0SMarcel Telka         stateid4        stateid;
1993bbe876c0SMarcel Telka         offset4         offset;
1994bbe876c0SMarcel Telka         count4          count;
19957c478bd9Sstevel@tonic-gate };
19967c478bd9Sstevel@tonic-gate 
19977c478bd9Sstevel@tonic-gate struct READ4resok {
1998bbe876c0SMarcel Telka         bool            eof;
1999bbe876c0SMarcel Telka         opaque          data<>;
20007c478bd9Sstevel@tonic-gate };
20017c478bd9Sstevel@tonic-gate 
20027c478bd9Sstevel@tonic-gate union READ4res switch (nfsstat4 status) {
20037c478bd9Sstevel@tonic-gate  case NFS4_OK:
2004bbe876c0SMarcel Telka          READ4resok     resok4;
20057c478bd9Sstevel@tonic-gate  default:
2006bbe876c0SMarcel Telka          void;
20077c478bd9Sstevel@tonic-gate };
20087c478bd9Sstevel@tonic-gate 
20097c478bd9Sstevel@tonic-gate struct READDIR4args {
2010bbe876c0SMarcel Telka         /* CURRENT_FH: directory */
2011bbe876c0SMarcel Telka         nfs_cookie4     cookie;
2012bbe876c0SMarcel Telka         verifier4       cookieverf;
2013bbe876c0SMarcel Telka         count4          dircount;
2014bbe876c0SMarcel Telka         count4          maxcount;
2015bbe876c0SMarcel Telka         bitmap4         attr_request;
20167c478bd9Sstevel@tonic-gate };
20177c478bd9Sstevel@tonic-gate 
20187c478bd9Sstevel@tonic-gate struct entry4 {
2019bbe876c0SMarcel Telka         nfs_cookie4     cookie;
2020bbe876c0SMarcel Telka         component4      name;
2021bbe876c0SMarcel Telka         fattr4          attrs;
2022bbe876c0SMarcel Telka         entry4          *nextentry;
20237c478bd9Sstevel@tonic-gate };
20247c478bd9Sstevel@tonic-gate 
20257c478bd9Sstevel@tonic-gate struct dirlist4 {
2026bbe876c0SMarcel Telka         entry4          *entries;
2027bbe876c0SMarcel Telka         bool            eof;
20287c478bd9Sstevel@tonic-gate };
20297c478bd9Sstevel@tonic-gate 
20307c478bd9Sstevel@tonic-gate struct READDIR4resok {
2031bbe876c0SMarcel Telka         verifier4       cookieverf;
2032bbe876c0SMarcel Telka         dirlist4        reply;
20337c478bd9Sstevel@tonic-gate };
20347c478bd9Sstevel@tonic-gate 
20357c478bd9Sstevel@tonic-gate 
20367c478bd9Sstevel@tonic-gate union READDIR4res switch (nfsstat4 status) {
20377c478bd9Sstevel@tonic-gate  case NFS4_OK:
2038bbe876c0SMarcel Telka          READDIR4resok  resok4;
20397c478bd9Sstevel@tonic-gate  default:
2040bbe876c0SMarcel Telka          void;
20417c478bd9Sstevel@tonic-gate };
20427c478bd9Sstevel@tonic-gate 
20437c478bd9Sstevel@tonic-gate 
20447c478bd9Sstevel@tonic-gate struct READLINK4resok {
2045bbe876c0SMarcel Telka         linktext4       link;
20467c478bd9Sstevel@tonic-gate };
20477c478bd9Sstevel@tonic-gate 
20487c478bd9Sstevel@tonic-gate union READLINK4res switch (nfsstat4 status) {
20497c478bd9Sstevel@tonic-gate  case NFS4_OK:
2050bbe876c0SMarcel Telka          READLINK4resok resok4;
20517c478bd9Sstevel@tonic-gate  default:
2052bbe876c0SMarcel Telka          void;
20537c478bd9Sstevel@tonic-gate };
20547c478bd9Sstevel@tonic-gate 
20557c478bd9Sstevel@tonic-gate struct REMOVE4args {
2056bbe876c0SMarcel Telka         /* CURRENT_FH: directory */
2057bbe876c0SMarcel Telka         component4      target;
20587c478bd9Sstevel@tonic-gate };
20597c478bd9Sstevel@tonic-gate 
20607c478bd9Sstevel@tonic-gate struct REMOVE4resok {
2061bbe876c0SMarcel Telka         change_info4    cinfo;
20627c478bd9Sstevel@tonic-gate };
20637c478bd9Sstevel@tonic-gate 
20647c478bd9Sstevel@tonic-gate union REMOVE4res switch (nfsstat4 status) {
20657c478bd9Sstevel@tonic-gate  case NFS4_OK:
2066bbe876c0SMarcel Telka          REMOVE4resok   resok4;
20677c478bd9Sstevel@tonic-gate  default:
2068bbe876c0SMarcel Telka          void;
20697c478bd9Sstevel@tonic-gate };
20707c478bd9Sstevel@tonic-gate 
20717c478bd9Sstevel@tonic-gate struct RENAME4args {
2072bbe876c0SMarcel Telka         /* SAVED_FH: source directory */
2073bbe876c0SMarcel Telka         component4      oldname;
2074bbe876c0SMarcel Telka         /* CURRENT_FH: target directory */
2075bbe876c0SMarcel Telka         component4      newname;
20767c478bd9Sstevel@tonic-gate };
20777c478bd9Sstevel@tonic-gate 
20787c478bd9Sstevel@tonic-gate struct RENAME4resok {
2079bbe876c0SMarcel Telka         change_info4    source_cinfo;
2080bbe876c0SMarcel Telka         change_info4    target_cinfo;
20817c478bd9Sstevel@tonic-gate };
20827c478bd9Sstevel@tonic-gate 
20837c478bd9Sstevel@tonic-gate union RENAME4res switch (nfsstat4 status) {
20847c478bd9Sstevel@tonic-gate  case NFS4_OK:
2085bbe876c0SMarcel Telka          RENAME4resok    resok4;
20867c478bd9Sstevel@tonic-gate  default:
2087bbe876c0SMarcel Telka          void;
20887c478bd9Sstevel@tonic-gate };
20897c478bd9Sstevel@tonic-gate 
2090*f44e1126SVitaliy Gusev /* Obsolete in NFSv4.1 */
20917c478bd9Sstevel@tonic-gate struct RENEW4args {
2092bbe876c0SMarcel Telka         clientid4       clientid;
20937c478bd9Sstevel@tonic-gate };
20947c478bd9Sstevel@tonic-gate 
20957c478bd9Sstevel@tonic-gate struct RENEW4res {
2096bbe876c0SMarcel Telka         nfsstat4        status;
20977c478bd9Sstevel@tonic-gate };
20987c478bd9Sstevel@tonic-gate 
20997c478bd9Sstevel@tonic-gate struct RESTOREFH4res {
2100*f44e1126SVitaliy Gusev         /*
2101*f44e1126SVitaliy Gusev          * If status is NFS4_OK,
2102*f44e1126SVitaliy Gusev          *   New CURRENT_FH: value of saved fh
2103*f44e1126SVitaliy Gusev          */
2104bbe876c0SMarcel Telka         nfsstat4        status;
21057c478bd9Sstevel@tonic-gate };
21067c478bd9Sstevel@tonic-gate 
21077c478bd9Sstevel@tonic-gate struct SAVEFH4res {
2108*f44e1126SVitaliy Gusev         /*
2109*f44e1126SVitaliy Gusev          * If status is NFS4_OK,
2110*f44e1126SVitaliy Gusev          *   New SAVED_FH: value of current fh
2111*f44e1126SVitaliy Gusev          */
2112bbe876c0SMarcel Telka         nfsstat4        status;
21137c478bd9Sstevel@tonic-gate };
21147c478bd9Sstevel@tonic-gate 
21157c478bd9Sstevel@tonic-gate struct SECINFO4args {
2116bbe876c0SMarcel Telka         /* CURRENT_FH: directory */
2117bbe876c0SMarcel Telka         component4      name;
21187c478bd9Sstevel@tonic-gate };
21197c478bd9Sstevel@tonic-gate 
21207c478bd9Sstevel@tonic-gate /*
21217c478bd9Sstevel@tonic-gate  * From RFC 2203
21227c478bd9Sstevel@tonic-gate  */
21237c478bd9Sstevel@tonic-gate enum rpc_gss_svc_t {
2124bbe876c0SMarcel Telka         RPC_GSS_SVC_NONE        = 1,
2125bbe876c0SMarcel Telka         RPC_GSS_SVC_INTEGRITY   = 2,
2126bbe876c0SMarcel Telka         RPC_GSS_SVC_PRIVACY     = 3
21277c478bd9Sstevel@tonic-gate };
21287c478bd9Sstevel@tonic-gate 
21297c478bd9Sstevel@tonic-gate struct rpcsec_gss_info {
2130bbe876c0SMarcel Telka         sec_oid4        oid;
2131bbe876c0SMarcel Telka         qop4            qop;
2132bbe876c0SMarcel Telka         rpc_gss_svc_t   service;
2133bbe876c0SMarcel Telka };
2134bbe876c0SMarcel Telka 
2135*f44e1126SVitaliy Gusev /* RPCSEC_GSS has a value of "6".  See RFC 2203. */
21367c478bd9Sstevel@tonic-gate union secinfo4 switch (uint32_t flavor) {
21377c478bd9Sstevel@tonic-gate  case RPCSEC_GSS:
2138bbe876c0SMarcel Telka          rpcsec_gss_info        flavor_info;
21397c478bd9Sstevel@tonic-gate  default:
2140bbe876c0SMarcel Telka          void;
21417c478bd9Sstevel@tonic-gate };
21427c478bd9Sstevel@tonic-gate 
21437c478bd9Sstevel@tonic-gate typedef secinfo4 SECINFO4resok<>;
21447c478bd9Sstevel@tonic-gate 
21457c478bd9Sstevel@tonic-gate union SECINFO4res switch (nfsstat4 status) {
21467c478bd9Sstevel@tonic-gate  case NFS4_OK:
2147*f44e1126SVitaliy Gusev          /* CURRENTFH: consumed */
2148bbe876c0SMarcel Telka          SECINFO4resok resok4;
21497c478bd9Sstevel@tonic-gate  default:
2150bbe876c0SMarcel Telka          void;
2151bbe876c0SMarcel Telka };
21527c478bd9Sstevel@tonic-gate 
21537c478bd9Sstevel@tonic-gate struct SETATTR4args {
2154bbe876c0SMarcel Telka         /* CURRENT_FH: target object */
2155bbe876c0SMarcel Telka         stateid4        stateid;
2156bbe876c0SMarcel Telka         fattr4          obj_attributes;
21577c478bd9Sstevel@tonic-gate };
21587c478bd9Sstevel@tonic-gate 
21597c478bd9Sstevel@tonic-gate struct SETATTR4res {
2160bbe876c0SMarcel Telka         nfsstat4        status;
2161bbe876c0SMarcel Telka         bitmap4         attrsset;
21627c478bd9Sstevel@tonic-gate };
21637c478bd9Sstevel@tonic-gate 
2164*f44e1126SVitaliy Gusev /* Obsolete in NFSv4.1 */
21657c478bd9Sstevel@tonic-gate struct SETCLIENTID4args {
2166bbe876c0SMarcel Telka         nfs_client_id4  client;
2167bbe876c0SMarcel Telka         cb_client4      callback;
2168bbe876c0SMarcel Telka         uint32_t        callback_ident;
2169bbe876c0SMarcel Telka };
21707c478bd9Sstevel@tonic-gate 
21717c478bd9Sstevel@tonic-gate struct SETCLIENTID4resok {
2172bbe876c0SMarcel Telka         clientid4       clientid;
2173bbe876c0SMarcel Telka         verifier4       setclientid_confirm;
21747c478bd9Sstevel@tonic-gate };
21757c478bd9Sstevel@tonic-gate 
21767c478bd9Sstevel@tonic-gate union SETCLIENTID4res switch (nfsstat4 status) {
21777c478bd9Sstevel@tonic-gate  case NFS4_OK:
2178bbe876c0SMarcel Telka          SETCLIENTID4resok      resok4;
21797c478bd9Sstevel@tonic-gate  case NFS4ERR_CLID_INUSE:
2180bbe876c0SMarcel Telka          clientaddr4    client_using;
21817c478bd9Sstevel@tonic-gate  default:
2182bbe876c0SMarcel Telka          void;
21837c478bd9Sstevel@tonic-gate };
21847c478bd9Sstevel@tonic-gate 
2185*f44e1126SVitaliy Gusev /* Obsolete in NFSv4.1 */
21867c478bd9Sstevel@tonic-gate struct SETCLIENTID_CONFIRM4args {
2187bbe876c0SMarcel Telka         clientid4       clientid;
2188bbe876c0SMarcel Telka         verifier4       setclientid_confirm;
21897c478bd9Sstevel@tonic-gate };
21907c478bd9Sstevel@tonic-gate 
21917c478bd9Sstevel@tonic-gate struct SETCLIENTID_CONFIRM4res {
2192bbe876c0SMarcel Telka         nfsstat4        status;
21937c478bd9Sstevel@tonic-gate };
21947c478bd9Sstevel@tonic-gate 
21957c478bd9Sstevel@tonic-gate struct VERIFY4args {
2196bbe876c0SMarcel Telka         /* CURRENT_FH: object */
2197bbe876c0SMarcel Telka         fattr4          obj_attributes;
21987c478bd9Sstevel@tonic-gate };
21997c478bd9Sstevel@tonic-gate 
22007c478bd9Sstevel@tonic-gate struct VERIFY4res {
2201bbe876c0SMarcel Telka         nfsstat4        status;
22027c478bd9Sstevel@tonic-gate };
22037c478bd9Sstevel@tonic-gate 
22047c478bd9Sstevel@tonic-gate struct WRITE4args {
2205bbe876c0SMarcel Telka         /* CURRENT_FH: file */
2206bbe876c0SMarcel Telka         stateid4        stateid;
2207bbe876c0SMarcel Telka         offset4         offset;
2208bbe876c0SMarcel Telka         stable_how4     stable;
2209bbe876c0SMarcel Telka         opaque          data<>;
22107c478bd9Sstevel@tonic-gate };
22117c478bd9Sstevel@tonic-gate 
22127c478bd9Sstevel@tonic-gate struct WRITE4resok {
2213bbe876c0SMarcel Telka         count4          count;
2214bbe876c0SMarcel Telka         stable_how4     committed;
2215bbe876c0SMarcel Telka         verifier4       writeverf;
22167c478bd9Sstevel@tonic-gate };
22177c478bd9Sstevel@tonic-gate 
22187c478bd9Sstevel@tonic-gate union WRITE4res switch (nfsstat4 status) {
22197c478bd9Sstevel@tonic-gate  case NFS4_OK:
2220bbe876c0SMarcel Telka          WRITE4resok    resok4;
22217c478bd9Sstevel@tonic-gate  default:
2222bbe876c0SMarcel Telka          void;
22237c478bd9Sstevel@tonic-gate };
22247c478bd9Sstevel@tonic-gate 
2225*f44e1126SVitaliy Gusev /* Obsolete in NFSv4.1 */
22267c478bd9Sstevel@tonic-gate struct RELEASE_LOCKOWNER4args {
2227bbe876c0SMarcel Telka         lock_owner4     lock_owner;
22287c478bd9Sstevel@tonic-gate };
22297c478bd9Sstevel@tonic-gate 
22307c478bd9Sstevel@tonic-gate struct RELEASE_LOCKOWNER4res {
2231bbe876c0SMarcel Telka         nfsstat4        status;
22327c478bd9Sstevel@tonic-gate };
22337c478bd9Sstevel@tonic-gate 
22347c478bd9Sstevel@tonic-gate struct ILLEGAL4res {
2235bbe876c0SMarcel Telka         nfsstat4        status;
22367c478bd9Sstevel@tonic-gate };
22377c478bd9Sstevel@tonic-gate 
2238*f44e1126SVitaliy Gusev typedef opaque gsshandle4_t<>;
2239*f44e1126SVitaliy Gusev 
2240*f44e1126SVitaliy Gusev struct gss_cb_handles4 {
2241*f44e1126SVitaliy Gusev         rpc_gss_svc_t           gcbp_service; /* RFC 2203 */
2242*f44e1126SVitaliy Gusev         gsshandle4_t            gcbp_handle_from_server;
2243*f44e1126SVitaliy Gusev         gsshandle4_t            gcbp_handle_from_client;
2244*f44e1126SVitaliy Gusev };
2245*f44e1126SVitaliy Gusev 
2246*f44e1126SVitaliy Gusev union callback_sec_parms4 switch (uint32_t cb_secflavor) {
2247*f44e1126SVitaliy Gusev  case AUTH_NONE:
2248*f44e1126SVitaliy Gusev          void;
2249*f44e1126SVitaliy Gusev  case AUTH_SYS:
2250*f44e1126SVitaliy Gusev          authsys_parms   cbsp_sys_cred; /* RFC 5531 */
2251*f44e1126SVitaliy Gusev  case RPCSEC_GSS:
2252*f44e1126SVitaliy Gusev          gss_cb_handles4 cbsp_gss_handles;
2253*f44e1126SVitaliy Gusev };
2254*f44e1126SVitaliy Gusev 
2255*f44e1126SVitaliy Gusev struct BACKCHANNEL_CTL4args {
2256*f44e1126SVitaliy Gusev         uint32_t                bca_cb_program;
2257*f44e1126SVitaliy Gusev         callback_sec_parms4     bca_sec_parms<>;
2258*f44e1126SVitaliy Gusev };
2259*f44e1126SVitaliy Gusev 
2260*f44e1126SVitaliy Gusev struct BACKCHANNEL_CTL4res {
2261*f44e1126SVitaliy Gusev         nfsstat4                bcr_status;
2262*f44e1126SVitaliy Gusev };
2263*f44e1126SVitaliy Gusev 
2264*f44e1126SVitaliy Gusev enum channel_dir_from_client4 {
2265*f44e1126SVitaliy Gusev  CDFC4_FORE             = 0x1,
2266*f44e1126SVitaliy Gusev  CDFC4_BACK             = 0x2,
2267*f44e1126SVitaliy Gusev  CDFC4_FORE_OR_BOTH     = 0x3,
2268*f44e1126SVitaliy Gusev  CDFC4_BACK_OR_BOTH     = 0x7
2269*f44e1126SVitaliy Gusev };
2270*f44e1126SVitaliy Gusev 
2271*f44e1126SVitaliy Gusev struct BIND_CONN_TO_SESSION4args {
2272*f44e1126SVitaliy Gusev  sessionid4     bctsa_sessid;
2273*f44e1126SVitaliy Gusev 
2274*f44e1126SVitaliy Gusev  channel_dir_from_client4
2275*f44e1126SVitaliy Gusev                 bctsa_dir;
2276*f44e1126SVitaliy Gusev 
2277*f44e1126SVitaliy Gusev  bool           bctsa_use_conn_in_rdma_mode;
2278*f44e1126SVitaliy Gusev };
2279*f44e1126SVitaliy Gusev 
2280*f44e1126SVitaliy Gusev enum channel_dir_from_server4 {
2281*f44e1126SVitaliy Gusev  CDFS4_FORE     = 0x1,
2282*f44e1126SVitaliy Gusev  CDFS4_BACK     = 0x2,
2283*f44e1126SVitaliy Gusev  CDFS4_BOTH     = 0x3
2284*f44e1126SVitaliy Gusev };
2285*f44e1126SVitaliy Gusev 
2286*f44e1126SVitaliy Gusev struct BIND_CONN_TO_SESSION4resok {
2287*f44e1126SVitaliy Gusev  sessionid4     bctsr_sessid;
2288*f44e1126SVitaliy Gusev 
2289*f44e1126SVitaliy Gusev  channel_dir_from_server4
2290*f44e1126SVitaliy Gusev                 bctsr_dir;
2291*f44e1126SVitaliy Gusev 
2292*f44e1126SVitaliy Gusev  bool           bctsr_use_conn_in_rdma_mode;
2293*f44e1126SVitaliy Gusev };
2294*f44e1126SVitaliy Gusev 
2295*f44e1126SVitaliy Gusev union BIND_CONN_TO_SESSION4res
2296*f44e1126SVitaliy Gusev  switch (nfsstat4 bctsr_status) {
2297*f44e1126SVitaliy Gusev          case NFS4_OK:
2298*f44e1126SVitaliy Gusev                  BIND_CONN_TO_SESSION4resok  bctsr_resok4;
2299*f44e1126SVitaliy Gusev          default:
2300*f44e1126SVitaliy Gusev                  void;
2301*f44e1126SVitaliy Gusev };
2302*f44e1126SVitaliy Gusev 
2303*f44e1126SVitaliy Gusev const EXCHGID4_FLAG_SUPP_MOVED_REFER    = 0x00000001;
2304*f44e1126SVitaliy Gusev const EXCHGID4_FLAG_SUPP_MOVED_MIGR     = 0x00000002;
2305*f44e1126SVitaliy Gusev const EXCHGID4_FLAG_SUPP_FENCE_OPS      = 0x00000004;
2306*f44e1126SVitaliy Gusev 
2307*f44e1126SVitaliy Gusev const EXCHGID4_FLAG_BIND_PRINC_STATEID  = 0x00000100;
2308*f44e1126SVitaliy Gusev 
2309*f44e1126SVitaliy Gusev const EXCHGID4_FLAG_USE_NON_PNFS        = 0x00010000;
2310*f44e1126SVitaliy Gusev const EXCHGID4_FLAG_USE_PNFS_MDS        = 0x00020000;
2311*f44e1126SVitaliy Gusev const EXCHGID4_FLAG_USE_PNFS_DS         = 0x00040000;
2312*f44e1126SVitaliy Gusev 
2313*f44e1126SVitaliy Gusev const EXCHGID4_FLAG_MASK_PNFS           = 0x00070000;
2314*f44e1126SVitaliy Gusev 
2315*f44e1126SVitaliy Gusev const EXCHGID4_FLAG_UPD_CONFIRMED_REC_A = 0x40000000;
2316*f44e1126SVitaliy Gusev const EXCHGID4_FLAG_CONFIRMED_R         = 0x80000000;
2317*f44e1126SVitaliy Gusev 
2318*f44e1126SVitaliy Gusev struct state_protect_ops4 {
2319*f44e1126SVitaliy Gusev         bitmap4 spo_must_enforce;
2320*f44e1126SVitaliy Gusev         bitmap4 spo_must_allow;
2321*f44e1126SVitaliy Gusev };
2322*f44e1126SVitaliy Gusev 
2323*f44e1126SVitaliy Gusev struct ssv_sp_parms4 {
2324*f44e1126SVitaliy Gusev         state_protect_ops4      ssp_ops;
2325*f44e1126SVitaliy Gusev         sec_oid4                ssp_hash_algs<>;
2326*f44e1126SVitaliy Gusev         sec_oid4                ssp_encr_algs<>;
2327*f44e1126SVitaliy Gusev         uint32_t                ssp_window;
2328*f44e1126SVitaliy Gusev         uint32_t                ssp_num_gss_handles;
2329*f44e1126SVitaliy Gusev };
2330*f44e1126SVitaliy Gusev 
2331*f44e1126SVitaliy Gusev enum state_protect_how4 {
2332*f44e1126SVitaliy Gusev         SP4_NONE      = 0,
2333*f44e1126SVitaliy Gusev         SP4_MACH_CRED = 1,
2334*f44e1126SVitaliy Gusev         SP4_SSV       = 2
2335*f44e1126SVitaliy Gusev };
2336*f44e1126SVitaliy Gusev 
2337*f44e1126SVitaliy Gusev union state_protect4_a switch (state_protect_how4 spa_how) {
2338*f44e1126SVitaliy Gusev         case SP4_NONE:
2339*f44e1126SVitaliy Gusev                 void;
2340*f44e1126SVitaliy Gusev         case SP4_MACH_CRED:
2341*f44e1126SVitaliy Gusev                 state_protect_ops4      spa_mach_ops;
2342*f44e1126SVitaliy Gusev         case SP4_SSV:
2343*f44e1126SVitaliy Gusev                 ssv_sp_parms4           spa_ssv_parms;
2344*f44e1126SVitaliy Gusev };
2345*f44e1126SVitaliy Gusev 
2346*f44e1126SVitaliy Gusev struct EXCHANGE_ID4args {
2347*f44e1126SVitaliy Gusev         client_owner4           eia_clientowner;
2348*f44e1126SVitaliy Gusev         uint32_t                eia_flags;
2349*f44e1126SVitaliy Gusev         state_protect4_a        eia_state_protect;
2350*f44e1126SVitaliy Gusev         nfs_impl_id4            eia_client_impl_id<1>;
2351*f44e1126SVitaliy Gusev };
2352*f44e1126SVitaliy Gusev 
2353*f44e1126SVitaliy Gusev struct ssv_prot_info4 {
2354*f44e1126SVitaliy Gusev  state_protect_ops4     spi_ops;
2355*f44e1126SVitaliy Gusev  uint32_t               spi_hash_alg;
2356*f44e1126SVitaliy Gusev  uint32_t               spi_encr_alg;
2357*f44e1126SVitaliy Gusev  uint32_t               spi_ssv_len;
2358*f44e1126SVitaliy Gusev  uint32_t               spi_window;
2359*f44e1126SVitaliy Gusev  gsshandle4_t           spi_handles<>;
2360*f44e1126SVitaliy Gusev };
2361*f44e1126SVitaliy Gusev 
2362*f44e1126SVitaliy Gusev union state_protect4_r switch (state_protect_how4 spr_how) {
2363*f44e1126SVitaliy Gusev  case SP4_NONE:
2364*f44e1126SVitaliy Gusev          void;
2365*f44e1126SVitaliy Gusev  case SP4_MACH_CRED:
2366*f44e1126SVitaliy Gusev          state_protect_ops4     spr_mach_ops;
2367*f44e1126SVitaliy Gusev  case SP4_SSV:
2368*f44e1126SVitaliy Gusev          ssv_prot_info4         spr_ssv_info;
2369*f44e1126SVitaliy Gusev };
2370*f44e1126SVitaliy Gusev 
2371*f44e1126SVitaliy Gusev struct EXCHANGE_ID4resok {
2372*f44e1126SVitaliy Gusev  clientid4        eir_clientid;
2373*f44e1126SVitaliy Gusev  sequenceid4      eir_sequenceid;
2374*f44e1126SVitaliy Gusev  uint32_t         eir_flags;
2375*f44e1126SVitaliy Gusev  state_protect4_r eir_state_protect;
2376*f44e1126SVitaliy Gusev  server_owner4    eir_server_owner;
2377*f44e1126SVitaliy Gusev  opaque           eir_server_scope<NFS4_OPAQUE_LIMIT>;
2378*f44e1126SVitaliy Gusev  nfs_impl_id4     eir_server_impl_id<1>;
2379*f44e1126SVitaliy Gusev };
2380*f44e1126SVitaliy Gusev 
2381*f44e1126SVitaliy Gusev union EXCHANGE_ID4res switch (nfsstat4 eir_status) {
2382*f44e1126SVitaliy Gusev  case NFS4_OK:
2383*f44e1126SVitaliy Gusev          EXCHANGE_ID4resok      eir_resok4;
2384*f44e1126SVitaliy Gusev 
2385*f44e1126SVitaliy Gusev  default:
2386*f44e1126SVitaliy Gusev          void;
2387*f44e1126SVitaliy Gusev };
2388*f44e1126SVitaliy Gusev 
2389*f44e1126SVitaliy Gusev struct channel_attrs4 {
2390*f44e1126SVitaliy Gusev         count4                  ca_headerpadsize;
2391*f44e1126SVitaliy Gusev         count4                  ca_maxrequestsize;
2392*f44e1126SVitaliy Gusev         count4                  ca_maxresponsesize;
2393*f44e1126SVitaliy Gusev         count4                  ca_maxresponsesize_cached;
2394*f44e1126SVitaliy Gusev         count4                  ca_maxoperations;
2395*f44e1126SVitaliy Gusev         count4                  ca_maxrequests;
2396*f44e1126SVitaliy Gusev         uint32_t                ca_rdma_ird<1>;
2397*f44e1126SVitaliy Gusev };
2398*f44e1126SVitaliy Gusev 
2399*f44e1126SVitaliy Gusev const CREATE_SESSION4_FLAG_PERSIST              = 0x00000001;
2400*f44e1126SVitaliy Gusev const CREATE_SESSION4_FLAG_CONN_BACK_CHAN       = 0x00000002;
2401*f44e1126SVitaliy Gusev const CREATE_SESSION4_FLAG_CONN_RDMA            = 0x00000004;
2402*f44e1126SVitaliy Gusev 
2403*f44e1126SVitaliy Gusev struct CREATE_SESSION4args {
2404*f44e1126SVitaliy Gusev         clientid4               csa_clientid;
2405*f44e1126SVitaliy Gusev         sequenceid4             csa_sequence;
2406*f44e1126SVitaliy Gusev 
2407*f44e1126SVitaliy Gusev         uint32_t                csa_flags;
2408*f44e1126SVitaliy Gusev 
2409*f44e1126SVitaliy Gusev         channel_attrs4          csa_fore_chan_attrs;
2410*f44e1126SVitaliy Gusev         channel_attrs4          csa_back_chan_attrs;
2411*f44e1126SVitaliy Gusev 
2412*f44e1126SVitaliy Gusev         uint32_t                csa_cb_program;
2413*f44e1126SVitaliy Gusev         callback_sec_parms4     csa_sec_parms<>;
2414*f44e1126SVitaliy Gusev };
2415*f44e1126SVitaliy Gusev 
2416*f44e1126SVitaliy Gusev struct CREATE_SESSION4resok {
2417*f44e1126SVitaliy Gusev         sessionid4              csr_sessionid;
2418*f44e1126SVitaliy Gusev         sequenceid4             csr_sequence;
2419*f44e1126SVitaliy Gusev 
2420*f44e1126SVitaliy Gusev         uint32_t                csr_flags;
2421*f44e1126SVitaliy Gusev 
2422*f44e1126SVitaliy Gusev         channel_attrs4          csr_fore_chan_attrs;
2423*f44e1126SVitaliy Gusev         channel_attrs4          csr_back_chan_attrs;
2424*f44e1126SVitaliy Gusev };
2425*f44e1126SVitaliy Gusev 
2426*f44e1126SVitaliy Gusev union CREATE_SESSION4res switch (nfsstat4 csr_status) {
2427*f44e1126SVitaliy Gusev  case NFS4_OK:
2428*f44e1126SVitaliy Gusev          CREATE_SESSION4resok   csr_resok4;
2429*f44e1126SVitaliy Gusev  default:
2430*f44e1126SVitaliy Gusev          void;
2431*f44e1126SVitaliy Gusev };
2432*f44e1126SVitaliy Gusev 
2433*f44e1126SVitaliy Gusev struct DESTROY_SESSION4args {
2434*f44e1126SVitaliy Gusev         sessionid4      dsa_sessionid;
2435*f44e1126SVitaliy Gusev };
2436*f44e1126SVitaliy Gusev 
2437*f44e1126SVitaliy Gusev struct DESTROY_SESSION4res {
2438*f44e1126SVitaliy Gusev         nfsstat4        dsr_status;
2439*f44e1126SVitaliy Gusev };
2440*f44e1126SVitaliy Gusev 
2441*f44e1126SVitaliy Gusev struct FREE_STATEID4args {
2442*f44e1126SVitaliy Gusev         stateid4        fsa_stateid;
2443*f44e1126SVitaliy Gusev };
2444*f44e1126SVitaliy Gusev 
2445*f44e1126SVitaliy Gusev struct FREE_STATEID4res {
2446*f44e1126SVitaliy Gusev         nfsstat4        fsr_status;
2447*f44e1126SVitaliy Gusev };
2448*f44e1126SVitaliy Gusev 
2449*f44e1126SVitaliy Gusev 
2450*f44e1126SVitaliy Gusev typedef nfstime4 attr_notice4;
2451*f44e1126SVitaliy Gusev 
2452*f44e1126SVitaliy Gusev struct GET_DIR_DELEGATION4args {
2453*f44e1126SVitaliy Gusev         /* CURRENT_FH: delegated directory */
2454*f44e1126SVitaliy Gusev         bool            gdda_signal_deleg_avail;
2455*f44e1126SVitaliy Gusev         bitmap4         gdda_notification_types;
2456*f44e1126SVitaliy Gusev         attr_notice4    gdda_child_attr_delay;
2457*f44e1126SVitaliy Gusev         attr_notice4    gdda_dir_attr_delay;
2458*f44e1126SVitaliy Gusev         bitmap4         gdda_child_attributes;
2459*f44e1126SVitaliy Gusev         bitmap4         gdda_dir_attributes;
2460*f44e1126SVitaliy Gusev };
2461*f44e1126SVitaliy Gusev struct GET_DIR_DELEGATION4resok {
2462*f44e1126SVitaliy Gusev         verifier4       gddr_cookieverf;
2463*f44e1126SVitaliy Gusev         /* Stateid for get_dir_delegation */
2464*f44e1126SVitaliy Gusev         stateid4        gddr_stateid;
2465*f44e1126SVitaliy Gusev         /* Which notifications can the server support? */
2466*f44e1126SVitaliy Gusev         bitmap4         gddr_notification;
2467*f44e1126SVitaliy Gusev         bitmap4         gddr_child_attributes;
2468*f44e1126SVitaliy Gusev         bitmap4         gddr_dir_attributes;
2469*f44e1126SVitaliy Gusev };
2470*f44e1126SVitaliy Gusev 
2471*f44e1126SVitaliy Gusev enum gddrnf4_status {
2472*f44e1126SVitaliy Gusev         GDD4_OK         = 0,
2473*f44e1126SVitaliy Gusev         GDD4_UNAVAIL    = 1
2474*f44e1126SVitaliy Gusev };
2475*f44e1126SVitaliy Gusev 
2476*f44e1126SVitaliy Gusev union GET_DIR_DELEGATION4res_non_fatal
2477*f44e1126SVitaliy Gusev  switch (gddrnf4_status gddrnf_status) {
2478*f44e1126SVitaliy Gusev          case GDD4_OK:
2479*f44e1126SVitaliy Gusev               GET_DIR_DELEGATION4resok      gddrnf_resok4;
2480*f44e1126SVitaliy Gusev          case GDD4_UNAVAIL:
2481*f44e1126SVitaliy Gusev           bool                gddrnf_will_signal_deleg_avail;
2482*f44e1126SVitaliy Gusev };
2483*f44e1126SVitaliy Gusev 
2484*f44e1126SVitaliy Gusev union GET_DIR_DELEGATION4res
2485*f44e1126SVitaliy Gusev  switch (nfsstat4 gddr_status) {
2486*f44e1126SVitaliy Gusev          case NFS4_OK:
2487*f44e1126SVitaliy Gusev           GET_DIR_DELEGATION4res_non_fatal   gddr_res_non_fatal4;
2488*f44e1126SVitaliy Gusev          default:
2489*f44e1126SVitaliy Gusev                  void;
2490*f44e1126SVitaliy Gusev };
2491*f44e1126SVitaliy Gusev 
2492*f44e1126SVitaliy Gusev struct GETDEVICEINFO4args {
2493*f44e1126SVitaliy Gusev         deviceid4       gdia_device_id;
2494*f44e1126SVitaliy Gusev         layouttype4     gdia_layout_type;
2495*f44e1126SVitaliy Gusev         count4          gdia_maxcount;
2496*f44e1126SVitaliy Gusev         bitmap4         gdia_notify_types;
2497*f44e1126SVitaliy Gusev };
2498*f44e1126SVitaliy Gusev 
2499*f44e1126SVitaliy Gusev struct GETDEVICEINFO4resok {
2500*f44e1126SVitaliy Gusev         device_addr4    gdir_device_addr;
2501*f44e1126SVitaliy Gusev         bitmap4         gdir_notification;
2502*f44e1126SVitaliy Gusev };
2503*f44e1126SVitaliy Gusev 
2504*f44e1126SVitaliy Gusev union GETDEVICEINFO4res switch (nfsstat4 gdir_status) {
2505*f44e1126SVitaliy Gusev  case NFS4_OK:
2506*f44e1126SVitaliy Gusev          GETDEVICEINFO4resok     gdir_resok4;
2507*f44e1126SVitaliy Gusev  case NFS4ERR_TOOSMALL:
2508*f44e1126SVitaliy Gusev          count4                  gdir_mincount;
2509*f44e1126SVitaliy Gusev  default:
2510*f44e1126SVitaliy Gusev          void;
2511*f44e1126SVitaliy Gusev };
2512*f44e1126SVitaliy Gusev 
2513*f44e1126SVitaliy Gusev struct GETDEVICELIST4args {
2514*f44e1126SVitaliy Gusev         /* CURRENT_FH: object belonging to the file system */
2515*f44e1126SVitaliy Gusev         layouttype4     gdla_layout_type;
2516*f44e1126SVitaliy Gusev 
2517*f44e1126SVitaliy Gusev         /* Number of device IDs to return */
2518*f44e1126SVitaliy Gusev         count4          gdla_maxdevices;
2519*f44e1126SVitaliy Gusev 
2520*f44e1126SVitaliy Gusev         nfs_cookie4     gdla_cookie;
2521*f44e1126SVitaliy Gusev         verifier4       gdla_cookieverf;
2522*f44e1126SVitaliy Gusev };
2523*f44e1126SVitaliy Gusev 
2524*f44e1126SVitaliy Gusev struct GETDEVICELIST4resok {
2525*f44e1126SVitaliy Gusev         nfs_cookie4             gdlr_cookie;
2526*f44e1126SVitaliy Gusev         verifier4               gdlr_cookieverf;
2527*f44e1126SVitaliy Gusev         deviceid4               gdlr_deviceid_list<>;
2528*f44e1126SVitaliy Gusev         bool                    gdlr_eof;
2529*f44e1126SVitaliy Gusev };
2530*f44e1126SVitaliy Gusev 
2531*f44e1126SVitaliy Gusev union GETDEVICELIST4res switch (nfsstat4 gdlr_status) {
2532*f44e1126SVitaliy Gusev  case NFS4_OK:
2533*f44e1126SVitaliy Gusev          GETDEVICELIST4resok     gdlr_resok4;
2534*f44e1126SVitaliy Gusev  default:
2535*f44e1126SVitaliy Gusev          void;
2536*f44e1126SVitaliy Gusev };
2537*f44e1126SVitaliy Gusev 
2538*f44e1126SVitaliy Gusev union newtime4 switch (bool nt_timechanged) {
2539*f44e1126SVitaliy Gusev  case TRUE:
2540*f44e1126SVitaliy Gusev          nfstime4           nt_time;
2541*f44e1126SVitaliy Gusev  case FALSE:
2542*f44e1126SVitaliy Gusev          void;
2543*f44e1126SVitaliy Gusev };
2544*f44e1126SVitaliy Gusev 
2545*f44e1126SVitaliy Gusev union newoffset4 switch (bool no_newoffset) {
2546*f44e1126SVitaliy Gusev  case TRUE:
2547*f44e1126SVitaliy Gusev          offset4           no_offset;
2548*f44e1126SVitaliy Gusev  case FALSE:
2549*f44e1126SVitaliy Gusev          void;
2550*f44e1126SVitaliy Gusev };
2551*f44e1126SVitaliy Gusev 
2552*f44e1126SVitaliy Gusev struct LAYOUTCOMMIT4args {
2553*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
2554*f44e1126SVitaliy Gusev         offset4                 loca_offset;
2555*f44e1126SVitaliy Gusev         length4                 loca_length;
2556*f44e1126SVitaliy Gusev         bool                    loca_reclaim;
2557*f44e1126SVitaliy Gusev         stateid4                loca_stateid;
2558*f44e1126SVitaliy Gusev         newoffset4              loca_last_write_offset;
2559*f44e1126SVitaliy Gusev         newtime4                loca_time_modify;
2560*f44e1126SVitaliy Gusev         layoutupdate4           loca_layoutupdate;
2561*f44e1126SVitaliy Gusev };
2562*f44e1126SVitaliy Gusev union newsize4 switch (bool ns_sizechanged) {
2563*f44e1126SVitaliy Gusev  case TRUE:
2564*f44e1126SVitaliy Gusev          length4         ns_size;
2565*f44e1126SVitaliy Gusev  case FALSE:
2566*f44e1126SVitaliy Gusev          void;
2567*f44e1126SVitaliy Gusev };
2568*f44e1126SVitaliy Gusev 
2569*f44e1126SVitaliy Gusev struct LAYOUTCOMMIT4resok {
2570*f44e1126SVitaliy Gusev         newsize4                locr_newsize;
2571*f44e1126SVitaliy Gusev };
2572*f44e1126SVitaliy Gusev 
2573*f44e1126SVitaliy Gusev union LAYOUTCOMMIT4res switch (nfsstat4 locr_status) {
2574*f44e1126SVitaliy Gusev  case NFS4_OK:
2575*f44e1126SVitaliy Gusev          LAYOUTCOMMIT4resok      locr_resok4;
2576*f44e1126SVitaliy Gusev  default:
2577*f44e1126SVitaliy Gusev          void;
2578*f44e1126SVitaliy Gusev };
2579*f44e1126SVitaliy Gusev 
2580*f44e1126SVitaliy Gusev struct LAYOUTGET4args {
2581*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
2582*f44e1126SVitaliy Gusev         bool                    loga_signal_layout_avail;
2583*f44e1126SVitaliy Gusev         layouttype4             loga_layout_type;
2584*f44e1126SVitaliy Gusev         layoutiomode4           loga_iomode;
2585*f44e1126SVitaliy Gusev         offset4                 loga_offset;
2586*f44e1126SVitaliy Gusev         length4                 loga_length;
2587*f44e1126SVitaliy Gusev         length4                 loga_minlength;
2588*f44e1126SVitaliy Gusev         stateid4                loga_stateid;
2589*f44e1126SVitaliy Gusev         count4                  loga_maxcount;
2590*f44e1126SVitaliy Gusev };
2591*f44e1126SVitaliy Gusev struct LAYOUTGET4resok {
2592*f44e1126SVitaliy Gusev         bool               logr_return_on_close;
2593*f44e1126SVitaliy Gusev         stateid4           logr_stateid;
2594*f44e1126SVitaliy Gusev         layout4            logr_layout<>;
2595*f44e1126SVitaliy Gusev };
2596*f44e1126SVitaliy Gusev 
2597*f44e1126SVitaliy Gusev union LAYOUTGET4res switch (nfsstat4 logr_status) {
2598*f44e1126SVitaliy Gusev  case NFS4_OK:
2599*f44e1126SVitaliy Gusev          LAYOUTGET4resok     logr_resok4;
2600*f44e1126SVitaliy Gusev  case NFS4ERR_LAYOUTTRYLATER:
2601*f44e1126SVitaliy Gusev          bool                logr_will_signal_layout_avail;
2602*f44e1126SVitaliy Gusev  default:
2603*f44e1126SVitaliy Gusev          void;
2604*f44e1126SVitaliy Gusev };
2605*f44e1126SVitaliy Gusev 
2606*f44e1126SVitaliy Gusev 
2607*f44e1126SVitaliy Gusev struct LAYOUTRETURN4args {
2608*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
2609*f44e1126SVitaliy Gusev         bool                    lora_reclaim;
2610*f44e1126SVitaliy Gusev         layouttype4             lora_layout_type;
2611*f44e1126SVitaliy Gusev         layoutiomode4           lora_iomode;
2612*f44e1126SVitaliy Gusev         layoutreturn4           lora_layoutreturn;
2613*f44e1126SVitaliy Gusev };
2614*f44e1126SVitaliy Gusev 
2615*f44e1126SVitaliy Gusev 
2616*f44e1126SVitaliy Gusev union layoutreturn_stateid switch (bool lrs_present) {
2617*f44e1126SVitaliy Gusev  case TRUE:
2618*f44e1126SVitaliy Gusev          stateid4                lrs_stateid;
2619*f44e1126SVitaliy Gusev  case FALSE:
2620*f44e1126SVitaliy Gusev          void;
2621*f44e1126SVitaliy Gusev };
2622*f44e1126SVitaliy Gusev 
2623*f44e1126SVitaliy Gusev union LAYOUTRETURN4res switch (nfsstat4 lorr_status) {
2624*f44e1126SVitaliy Gusev  case NFS4_OK:
2625*f44e1126SVitaliy Gusev          layoutreturn_stateid    lorr_stateid;
2626*f44e1126SVitaliy Gusev  default:
2627*f44e1126SVitaliy Gusev          void;
2628*f44e1126SVitaliy Gusev };
2629*f44e1126SVitaliy Gusev 
2630*f44e1126SVitaliy Gusev enum secinfo_style4 {
2631*f44e1126SVitaliy Gusev         SECINFO_STYLE4_CURRENT_FH       = 0,
2632*f44e1126SVitaliy Gusev         SECINFO_STYLE4_PARENT           = 1
2633*f44e1126SVitaliy Gusev };
2634*f44e1126SVitaliy Gusev 
2635*f44e1126SVitaliy Gusev /* CURRENT_FH: object or child directory */
2636*f44e1126SVitaliy Gusev typedef secinfo_style4 SECINFO_NO_NAME4args;
2637*f44e1126SVitaliy Gusev 
2638*f44e1126SVitaliy Gusev /* CURRENTFH: consumed if status is NFS4_OK */
2639*f44e1126SVitaliy Gusev typedef SECINFO4res SECINFO_NO_NAME4res;
2640*f44e1126SVitaliy Gusev 
2641*f44e1126SVitaliy Gusev struct SEQUENCE4args {
2642*f44e1126SVitaliy Gusev         sessionid4     sa_sessionid;
2643*f44e1126SVitaliy Gusev         sequenceid4    sa_sequenceid;
2644*f44e1126SVitaliy Gusev         slotid4        sa_slotid;
2645*f44e1126SVitaliy Gusev         slotid4        sa_highest_slotid;
2646*f44e1126SVitaliy Gusev         bool           sa_cachethis;
2647*f44e1126SVitaliy Gusev };
2648*f44e1126SVitaliy Gusev 
2649*f44e1126SVitaliy Gusev const SEQ4_STATUS_CB_PATH_DOWN                  = 0x00000001;
2650*f44e1126SVitaliy Gusev const SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING      = 0x00000002;
2651*f44e1126SVitaliy Gusev const SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRED       = 0x00000004;
2652*f44e1126SVitaliy Gusev const SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED     = 0x00000008;
2653*f44e1126SVitaliy Gusev const SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED    = 0x00000010;
2654*f44e1126SVitaliy Gusev const SEQ4_STATUS_ADMIN_STATE_REVOKED           = 0x00000020;
2655*f44e1126SVitaliy Gusev const SEQ4_STATUS_RECALLABLE_STATE_REVOKED      = 0x00000040;
2656*f44e1126SVitaliy Gusev const SEQ4_STATUS_LEASE_MOVED                   = 0x00000080;
2657*f44e1126SVitaliy Gusev const SEQ4_STATUS_RESTART_RECLAIM_NEEDED        = 0x00000100;
2658*f44e1126SVitaliy Gusev const SEQ4_STATUS_CB_PATH_DOWN_SESSION          = 0x00000200;
2659*f44e1126SVitaliy Gusev const SEQ4_STATUS_BACKCHANNEL_FAULT             = 0x00000400;
2660*f44e1126SVitaliy Gusev const SEQ4_STATUS_DEVID_CHANGED                 = 0x00000800;
2661*f44e1126SVitaliy Gusev const SEQ4_STATUS_DEVID_DELETED                 = 0x00001000;
2662*f44e1126SVitaliy Gusev 
2663*f44e1126SVitaliy Gusev struct SEQUENCE4resok {
2664*f44e1126SVitaliy Gusev         sessionid4      sr_sessionid;
2665*f44e1126SVitaliy Gusev         sequenceid4     sr_sequenceid;
2666*f44e1126SVitaliy Gusev         slotid4         sr_slotid;
2667*f44e1126SVitaliy Gusev         slotid4         sr_highest_slotid;
2668*f44e1126SVitaliy Gusev         slotid4         sr_target_highest_slotid;
2669*f44e1126SVitaliy Gusev         uint32_t        sr_status_flags;
2670*f44e1126SVitaliy Gusev };
2671*f44e1126SVitaliy Gusev 
2672*f44e1126SVitaliy Gusev union SEQUENCE4res switch (nfsstat4 sr_status) {
2673*f44e1126SVitaliy Gusev  case NFS4_OK:
2674*f44e1126SVitaliy Gusev          SEQUENCE4resok  sr_resok4;
2675*f44e1126SVitaliy Gusev  default:
2676*f44e1126SVitaliy Gusev          void;
2677*f44e1126SVitaliy Gusev };
2678*f44e1126SVitaliy Gusev 
2679*f44e1126SVitaliy Gusev struct ssa_digest_input4 {
2680*f44e1126SVitaliy Gusev         SEQUENCE4args sdi_seqargs;
2681*f44e1126SVitaliy Gusev };
2682*f44e1126SVitaliy Gusev 
2683*f44e1126SVitaliy Gusev struct SET_SSV4args {
2684*f44e1126SVitaliy Gusev         opaque          ssa_ssv<>;
2685*f44e1126SVitaliy Gusev         opaque          ssa_digest<>;
2686*f44e1126SVitaliy Gusev };
2687*f44e1126SVitaliy Gusev 
2688*f44e1126SVitaliy Gusev struct ssr_digest_input4 {
2689*f44e1126SVitaliy Gusev         SEQUENCE4res sdi_seqres;
2690*f44e1126SVitaliy Gusev };
2691*f44e1126SVitaliy Gusev 
2692*f44e1126SVitaliy Gusev struct SET_SSV4resok {
2693*f44e1126SVitaliy Gusev         opaque          ssr_digest<>;
2694*f44e1126SVitaliy Gusev };
2695*f44e1126SVitaliy Gusev 
2696*f44e1126SVitaliy Gusev union SET_SSV4res switch (nfsstat4 ssr_status) {
2697*f44e1126SVitaliy Gusev  case NFS4_OK:
2698*f44e1126SVitaliy Gusev          SET_SSV4resok   ssr_resok4;
2699*f44e1126SVitaliy Gusev  default:
2700*f44e1126SVitaliy Gusev          void;
2701*f44e1126SVitaliy Gusev };
2702*f44e1126SVitaliy Gusev 
2703*f44e1126SVitaliy Gusev struct TEST_STATEID4args {
2704*f44e1126SVitaliy Gusev         stateid4        ts_stateids<>;
2705*f44e1126SVitaliy Gusev };
2706*f44e1126SVitaliy Gusev 
2707*f44e1126SVitaliy Gusev struct TEST_STATEID4resok {
2708*f44e1126SVitaliy Gusev         nfsstat4        tsr_status_codes<>;
2709*f44e1126SVitaliy Gusev };
2710*f44e1126SVitaliy Gusev 
2711*f44e1126SVitaliy Gusev union TEST_STATEID4res switch (nfsstat4 tsr_status) {
2712*f44e1126SVitaliy Gusev  case NFS4_OK:
2713*f44e1126SVitaliy Gusev          TEST_STATEID4resok tsr_resok4;
2714*f44e1126SVitaliy Gusev  default:
2715*f44e1126SVitaliy Gusev          void;
2716*f44e1126SVitaliy Gusev };
2717*f44e1126SVitaliy Gusev 
2718*f44e1126SVitaliy Gusev union deleg_claim4 switch (open_claim_type4 dc_claim) {
27197c478bd9Sstevel@tonic-gate /*
2720*f44e1126SVitaliy Gusev  * No special rights to object.  Ordinary delegation
2721*f44e1126SVitaliy Gusev  * request of the specified object.  Object identified
2722*f44e1126SVitaliy Gusev  * by filehandle.
27237c478bd9Sstevel@tonic-gate  */
2724*f44e1126SVitaliy Gusev  case CLAIM_FH: /* New to NFSv4.1 */
2725*f44e1126SVitaliy Gusev          /* CURRENT_FH: object being delegated */
2726*f44e1126SVitaliy Gusev           void;
27277c478bd9Sstevel@tonic-gate 
2728*f44e1126SVitaliy Gusev /*
2729*f44e1126SVitaliy Gusev  * Right to file based on a delegation granted
2730*f44e1126SVitaliy Gusev  * to a previous boot instance of the client.
2731*f44e1126SVitaliy Gusev  * File is specified by filehandle.
2732*f44e1126SVitaliy Gusev  */
2733*f44e1126SVitaliy Gusev  case CLAIM_DELEG_PREV_FH: /* New to NFSv4.1 */
2734*f44e1126SVitaliy Gusev          /* CURRENT_FH: object being delegated */
2735*f44e1126SVitaliy Gusev           void;
2736*f44e1126SVitaliy Gusev 
2737*f44e1126SVitaliy Gusev /*
2738*f44e1126SVitaliy Gusev  * Right to the file established by an open previous
2739*f44e1126SVitaliy Gusev  * to server reboot.  File identified by filehandle.
2740*f44e1126SVitaliy Gusev  * Used during server reclaim grace period.
2741*f44e1126SVitaliy Gusev  */
2742*f44e1126SVitaliy Gusev  case CLAIM_PREVIOUS:
2743*f44e1126SVitaliy Gusev          /* CURRENT_FH: object being reclaimed */
2744*f44e1126SVitaliy Gusev           open_delegation_type4   dc_delegate_type;
2745a57549b4SVitaliy Gusev };
2746a57549b4SVitaliy Gusev 
2747*f44e1126SVitaliy Gusev struct WANT_DELEGATION4args {
2748*f44e1126SVitaliy Gusev         uint32_t        wda_want;
2749*f44e1126SVitaliy Gusev         deleg_claim4    wda_claim;
2750*f44e1126SVitaliy Gusev };
2751*f44e1126SVitaliy Gusev 
2752*f44e1126SVitaliy Gusev union WANT_DELEGATION4res switch (nfsstat4 wdr_status) {
2753*f44e1126SVitaliy Gusev  case NFS4_OK:
2754*f44e1126SVitaliy Gusev          open_delegation4 wdr_resok4;
2755*f44e1126SVitaliy Gusev  default:
2756*f44e1126SVitaliy Gusev          void;
2757*f44e1126SVitaliy Gusev };
2758*f44e1126SVitaliy Gusev 
2759*f44e1126SVitaliy Gusev struct DESTROY_CLIENTID4args {
2760*f44e1126SVitaliy Gusev         clientid4       dca_clientid;
2761*f44e1126SVitaliy Gusev };
2762*f44e1126SVitaliy Gusev 
2763*f44e1126SVitaliy Gusev struct DESTROY_CLIENTID4res {
2764*f44e1126SVitaliy Gusev         nfsstat4        dcr_status;
2765*f44e1126SVitaliy Gusev };
2766*f44e1126SVitaliy Gusev 
2767*f44e1126SVitaliy Gusev struct RECLAIM_COMPLETE4args {
2768*f44e1126SVitaliy Gusev         /*
2769*f44e1126SVitaliy Gusev          * If rca_one_fs TRUE,
2770*f44e1126SVitaliy Gusev          *
2771*f44e1126SVitaliy Gusev          *    CURRENT_FH: object in
2772*f44e1126SVitaliy Gusev          *    file system for which the
2773*f44e1126SVitaliy Gusev          *    reclaim is complete.
2774*f44e1126SVitaliy Gusev          */
2775*f44e1126SVitaliy Gusev         bool            rca_one_fs;
2776*f44e1126SVitaliy Gusev };
2777*f44e1126SVitaliy Gusev 
2778*f44e1126SVitaliy Gusev struct RECLAIM_COMPLETE4res {
2779*f44e1126SVitaliy Gusev         nfsstat4        rcr_status;
2780*f44e1126SVitaliy Gusev };
2781*f44e1126SVitaliy Gusev 
2782*f44e1126SVitaliy Gusev struct COPY4args {
2783*f44e1126SVitaliy Gusev         /* SAVED_FH: source file */
2784*f44e1126SVitaliy Gusev         /* CURRENT_FH: destination file */
2785*f44e1126SVitaliy Gusev         stateid4        ca_src_stateid;
2786*f44e1126SVitaliy Gusev         stateid4        ca_dst_stateid;
2787*f44e1126SVitaliy Gusev         offset4         ca_src_offset;
2788*f44e1126SVitaliy Gusev         offset4         ca_dst_offset;
2789*f44e1126SVitaliy Gusev         length4         ca_count;
2790*f44e1126SVitaliy Gusev         bool            ca_consecutive;
2791*f44e1126SVitaliy Gusev         bool            ca_synchronous;
2792*f44e1126SVitaliy Gusev         netloc4         ca_source_server<>;
2793*f44e1126SVitaliy Gusev };
2794*f44e1126SVitaliy Gusev 
2795*f44e1126SVitaliy Gusev 
2796*f44e1126SVitaliy Gusev struct copy_requirements4 {
2797*f44e1126SVitaliy Gusev         bool            cr_consecutive;
2798*f44e1126SVitaliy Gusev         bool            cr_synchronous;
2799*f44e1126SVitaliy Gusev };
2800*f44e1126SVitaliy Gusev 
2801*f44e1126SVitaliy Gusev struct COPY4resok {
2802*f44e1126SVitaliy Gusev         write_response4         cr_response;
2803*f44e1126SVitaliy Gusev         copy_requirements4      cr_requirements;
2804*f44e1126SVitaliy Gusev };
2805*f44e1126SVitaliy Gusev 
2806*f44e1126SVitaliy Gusev union COPY4res switch (nfsstat4 cr_status) {
2807*f44e1126SVitaliy Gusev  case NFS4_OK:
2808*f44e1126SVitaliy Gusev          COPY4resok              cr_resok4;
2809*f44e1126SVitaliy Gusev  case NFS4ERR_OFFLOAD_NO_REQS:
2810*f44e1126SVitaliy Gusev          copy_requirements4      cr_requirements;
2811*f44e1126SVitaliy Gusev  default:
2812*f44e1126SVitaliy Gusev          void;
2813*f44e1126SVitaliy Gusev };
2814*f44e1126SVitaliy Gusev 
2815*f44e1126SVitaliy Gusev struct COPY_NOTIFY4args {
2816*f44e1126SVitaliy Gusev         /* CURRENT_FH: source file */
2817*f44e1126SVitaliy Gusev         stateid4        cna_src_stateid;
2818*f44e1126SVitaliy Gusev         netloc4         cna_destination_server;
2819*f44e1126SVitaliy Gusev };
2820*f44e1126SVitaliy Gusev 
2821*f44e1126SVitaliy Gusev struct COPY_NOTIFY4resok {
2822*f44e1126SVitaliy Gusev         nfstime4        cnr_lease_time;
2823*f44e1126SVitaliy Gusev         stateid4        cnr_stateid;
2824*f44e1126SVitaliy Gusev         netloc4         cnr_source_server<>;
2825*f44e1126SVitaliy Gusev };
2826*f44e1126SVitaliy Gusev 
2827*f44e1126SVitaliy Gusev union COPY_NOTIFY4res switch (nfsstat4 cnr_status) {
2828*f44e1126SVitaliy Gusev  case NFS4_OK:
2829*f44e1126SVitaliy Gusev          COPY_NOTIFY4resok       resok4;
2830*f44e1126SVitaliy Gusev  default:
2831*f44e1126SVitaliy Gusev          void;
2832*f44e1126SVitaliy Gusev };
2833*f44e1126SVitaliy Gusev 
2834*f44e1126SVitaliy Gusev struct OFFLOAD_CANCEL4args {
2835*f44e1126SVitaliy Gusev         /* CURRENT_FH: file to cancel */
2836*f44e1126SVitaliy Gusev         stateid4        oca_stateid;
2837*f44e1126SVitaliy Gusev };
2838*f44e1126SVitaliy Gusev 
2839*f44e1126SVitaliy Gusev struct OFFLOAD_CANCEL4res {
2840*f44e1126SVitaliy Gusev         nfsstat4        ocr_status;
2841*f44e1126SVitaliy Gusev };
2842*f44e1126SVitaliy Gusev 
2843*f44e1126SVitaliy Gusev 
2844*f44e1126SVitaliy Gusev struct OFFLOAD_STATUS4args {
2845*f44e1126SVitaliy Gusev         /* CURRENT_FH: destination file */
2846*f44e1126SVitaliy Gusev         stateid4        osa_stateid;
2847*f44e1126SVitaliy Gusev };
2848*f44e1126SVitaliy Gusev 
2849*f44e1126SVitaliy Gusev struct OFFLOAD_STATUS4resok {
2850*f44e1126SVitaliy Gusev         length4         osr_count;
2851*f44e1126SVitaliy Gusev         nfsstat4        osr_complete<1>;
2852*f44e1126SVitaliy Gusev };
2853*f44e1126SVitaliy Gusev 
2854*f44e1126SVitaliy Gusev union OFFLOAD_STATUS4res switch (nfsstat4 osr_status) {
2855*f44e1126SVitaliy Gusev  case NFS4_OK:
2856*f44e1126SVitaliy Gusev          OFFLOAD_STATUS4resok            osr_resok4;
2857*f44e1126SVitaliy Gusev  default:
2858*f44e1126SVitaliy Gusev          void;
2859*f44e1126SVitaliy Gusev };
2860*f44e1126SVitaliy Gusev 
2861*f44e1126SVitaliy Gusev struct ALLOCATE4args {
2862*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
2863*f44e1126SVitaliy Gusev         stateid4        aa_stateid;
2864*f44e1126SVitaliy Gusev         offset4         aa_offset;
2865*f44e1126SVitaliy Gusev         length4         aa_length;
2866*f44e1126SVitaliy Gusev };
2867*f44e1126SVitaliy Gusev struct ALLOCATE4res {
2868*f44e1126SVitaliy Gusev         nfsstat4        ar_status;
2869*f44e1126SVitaliy Gusev };
2870*f44e1126SVitaliy Gusev 
2871*f44e1126SVitaliy Gusev struct DEALLOCATE4args {
2872*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
2873*f44e1126SVitaliy Gusev         stateid4        da_stateid;
2874*f44e1126SVitaliy Gusev         offset4         da_offset;
2875*f44e1126SVitaliy Gusev         length4         da_length;
2876*f44e1126SVitaliy Gusev };
2877*f44e1126SVitaliy Gusev 
2878*f44e1126SVitaliy Gusev 
2879*f44e1126SVitaliy Gusev struct DEALLOCATE4res {
2880*f44e1126SVitaliy Gusev         nfsstat4        dr_status;
2881*f44e1126SVitaliy Gusev };
2882*f44e1126SVitaliy Gusev enum IO_ADVISE_type4 {
2883*f44e1126SVitaliy Gusev         IO_ADVISE4_NORMAL                       = 0,
2884*f44e1126SVitaliy Gusev         IO_ADVISE4_SEQUENTIAL                   = 1,
2885*f44e1126SVitaliy Gusev         IO_ADVISE4_SEQUENTIAL_BACKWARDS         = 2,
2886*f44e1126SVitaliy Gusev         IO_ADVISE4_RANDOM                       = 3,
2887*f44e1126SVitaliy Gusev         IO_ADVISE4_WILLNEED                     = 4,
2888*f44e1126SVitaliy Gusev         IO_ADVISE4_WILLNEED_OPPORTUNISTIC       = 5,
2889*f44e1126SVitaliy Gusev         IO_ADVISE4_DONTNEED                     = 6,
2890*f44e1126SVitaliy Gusev         IO_ADVISE4_NOREUSE                      = 7,
2891*f44e1126SVitaliy Gusev         IO_ADVISE4_READ                         = 8,
2892*f44e1126SVitaliy Gusev         IO_ADVISE4_WRITE                        = 9,
2893*f44e1126SVitaliy Gusev         IO_ADVISE4_INIT_PROXIMITY               = 10
2894*f44e1126SVitaliy Gusev };
2895*f44e1126SVitaliy Gusev 
2896*f44e1126SVitaliy Gusev struct IO_ADVISE4args {
2897*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
2898*f44e1126SVitaliy Gusev         stateid4        iaa_stateid;
2899*f44e1126SVitaliy Gusev         offset4         iaa_offset;
2900*f44e1126SVitaliy Gusev         length4         iaa_count;
2901*f44e1126SVitaliy Gusev         bitmap4         iaa_hints;
2902*f44e1126SVitaliy Gusev };
2903*f44e1126SVitaliy Gusev 
2904*f44e1126SVitaliy Gusev struct IO_ADVISE4resok {
2905*f44e1126SVitaliy Gusev         bitmap4 ior_hints;
2906*f44e1126SVitaliy Gusev };
2907*f44e1126SVitaliy Gusev 
2908*f44e1126SVitaliy Gusev union IO_ADVISE4res switch (nfsstat4 ior_status) {
2909*f44e1126SVitaliy Gusev  case NFS4_OK:
2910*f44e1126SVitaliy Gusev          IO_ADVISE4resok resok4;
2911*f44e1126SVitaliy Gusev  default:
2912*f44e1126SVitaliy Gusev          void;
2913*f44e1126SVitaliy Gusev };
2914*f44e1126SVitaliy Gusev 
2915*f44e1126SVitaliy Gusev 
2916*f44e1126SVitaliy Gusev struct device_error4 {
2917*f44e1126SVitaliy Gusev         deviceid4       de_deviceid;
2918*f44e1126SVitaliy Gusev         nfsstat4        de_status;
2919*f44e1126SVitaliy Gusev         nfs_opnum4      de_opnum;
2920*f44e1126SVitaliy Gusev };
2921*f44e1126SVitaliy Gusev 
2922*f44e1126SVitaliy Gusev 
2923*f44e1126SVitaliy Gusev struct LAYOUTERROR4args {
2924*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
2925*f44e1126SVitaliy Gusev         offset4                 lea_offset;
2926*f44e1126SVitaliy Gusev         length4                 lea_length;
2927*f44e1126SVitaliy Gusev         stateid4                lea_stateid;
2928*f44e1126SVitaliy Gusev         device_error4           lea_errors<>;
2929*f44e1126SVitaliy Gusev };
2930*f44e1126SVitaliy Gusev 
2931*f44e1126SVitaliy Gusev struct LAYOUTERROR4res {
2932*f44e1126SVitaliy Gusev         nfsstat4        ler_status;
2933*f44e1126SVitaliy Gusev };
2934*f44e1126SVitaliy Gusev 
2935*f44e1126SVitaliy Gusev struct io_info4 {
2936*f44e1126SVitaliy Gusev         uint64_t        ii_count;
2937*f44e1126SVitaliy Gusev         uint64_t        ii_bytes;
2938*f44e1126SVitaliy Gusev };
2939*f44e1126SVitaliy Gusev 
2940*f44e1126SVitaliy Gusev struct LAYOUTSTATS4args {
2941*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
2942*f44e1126SVitaliy Gusev         offset4                 lsa_offset;
2943*f44e1126SVitaliy Gusev         length4                 lsa_length;
2944*f44e1126SVitaliy Gusev         stateid4                lsa_stateid;
2945*f44e1126SVitaliy Gusev         io_info4                lsa_read;
2946*f44e1126SVitaliy Gusev         io_info4                lsa_write;
2947*f44e1126SVitaliy Gusev         deviceid4               lsa_deviceid;
2948*f44e1126SVitaliy Gusev         layoutupdate4           lsa_layoutupdate;
2949*f44e1126SVitaliy Gusev };
2950*f44e1126SVitaliy Gusev 
2951*f44e1126SVitaliy Gusev struct LAYOUTSTATS4res {
2952*f44e1126SVitaliy Gusev         nfsstat4        lsr_status;
2953*f44e1126SVitaliy Gusev };
2954*f44e1126SVitaliy Gusev 
2955*f44e1126SVitaliy Gusev struct READ_PLUS4args {
2956*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
2957*f44e1126SVitaliy Gusev         stateid4        rpa_stateid;
2958*f44e1126SVitaliy Gusev         offset4         rpa_offset;
2959*f44e1126SVitaliy Gusev         count4          rpa_count;
2960*f44e1126SVitaliy Gusev };
2961*f44e1126SVitaliy Gusev union read_plus_content switch (data_content4 rpc_content) {
2962*f44e1126SVitaliy Gusev  case NFS4_CONTENT_DATA:
2963*f44e1126SVitaliy Gusev          data4           rpc_data;
2964*f44e1126SVitaliy Gusev  case NFS4_CONTENT_HOLE:
2965*f44e1126SVitaliy Gusev          data_info4      rpc_hole;
2966*f44e1126SVitaliy Gusev  default:
2967*f44e1126SVitaliy Gusev          void;
2968*f44e1126SVitaliy Gusev };
2969*f44e1126SVitaliy Gusev 
2970*f44e1126SVitaliy Gusev /*
2971*f44e1126SVitaliy Gusev  * Allow a return of an array of contents.
2972*f44e1126SVitaliy Gusev  */
2973*f44e1126SVitaliy Gusev struct read_plus_res4 {
2974*f44e1126SVitaliy Gusev         bool                    rpr_eof;
2975*f44e1126SVitaliy Gusev         read_plus_content       rpr_contents<>;
2976*f44e1126SVitaliy Gusev };
2977*f44e1126SVitaliy Gusev 
2978*f44e1126SVitaliy Gusev union READ_PLUS4res switch (nfsstat4 rp_status) {
2979*f44e1126SVitaliy Gusev  case NFS4_OK:
2980*f44e1126SVitaliy Gusev          read_plus_res4  rp_resok4;
2981*f44e1126SVitaliy Gusev  default:
2982*f44e1126SVitaliy Gusev          void;
2983*f44e1126SVitaliy Gusev };
2984*f44e1126SVitaliy Gusev 
2985*f44e1126SVitaliy Gusev struct SEEK4args {
2986*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
2987*f44e1126SVitaliy Gusev         stateid4        sa_stateid;
2988*f44e1126SVitaliy Gusev         offset4         sa_offset;
2989*f44e1126SVitaliy Gusev         data_content4   sa_what;
2990*f44e1126SVitaliy Gusev };
2991*f44e1126SVitaliy Gusev struct seek_res4 {
2992*f44e1126SVitaliy Gusev         bool            sr_eof;
2993*f44e1126SVitaliy Gusev         offset4         sr_offset;
2994*f44e1126SVitaliy Gusev };
2995*f44e1126SVitaliy Gusev union SEEK4res switch (nfsstat4 sa_status) {
2996*f44e1126SVitaliy Gusev  case NFS4_OK:
2997*f44e1126SVitaliy Gusev          seek_res4       resok4;
2998*f44e1126SVitaliy Gusev  default:
2999*f44e1126SVitaliy Gusev          void;
3000*f44e1126SVitaliy Gusev };
3001*f44e1126SVitaliy Gusev 
3002*f44e1126SVitaliy Gusev struct WRITE_SAME4args {
3003*f44e1126SVitaliy Gusev         /* CURRENT_FH: file */
3004*f44e1126SVitaliy Gusev         stateid4        wsa_stateid;
3005*f44e1126SVitaliy Gusev         stable_how4     wsa_stable;
3006*f44e1126SVitaliy Gusev         app_data_block4 wsa_adb;
3007*f44e1126SVitaliy Gusev };
3008*f44e1126SVitaliy Gusev 
3009*f44e1126SVitaliy Gusev 
3010*f44e1126SVitaliy Gusev union WRITE_SAME4res switch (nfsstat4 wsr_status) {
3011*f44e1126SVitaliy Gusev  case NFS4_OK:
3012*f44e1126SVitaliy Gusev          write_response4         resok4;
3013*f44e1126SVitaliy Gusev  default:
3014*f44e1126SVitaliy Gusev          void;
3015*f44e1126SVitaliy Gusev };
3016*f44e1126SVitaliy Gusev 
3017*f44e1126SVitaliy Gusev 
3018*f44e1126SVitaliy Gusev /*
3019*f44e1126SVitaliy Gusev  * Operation arrays (the rest)
3020*f44e1126SVitaliy Gusev  */
3021*f44e1126SVitaliy Gusev 
30227c478bd9Sstevel@tonic-gate union nfs_argop4 switch (nfs_opnum4 argop) {
3023*f44e1126SVitaliy Gusev  case OP_ACCESS:         ACCESS4args opaccess;
3024*f44e1126SVitaliy Gusev  case OP_CLOSE:          CLOSE4args opclose;
3025*f44e1126SVitaliy Gusev  case OP_COMMIT:         COMMIT4args opcommit;
3026*f44e1126SVitaliy Gusev  case OP_CREATE:         CREATE4args opcreate;
3027*f44e1126SVitaliy Gusev  case OP_DELEGPURGE:     DELEGPURGE4args opdelegpurge;
3028*f44e1126SVitaliy Gusev  case OP_DELEGRETURN:    DELEGRETURN4args opdelegreturn;
3029*f44e1126SVitaliy Gusev  case OP_GETATTR:        GETATTR4args opgetattr;
3030*f44e1126SVitaliy Gusev  case OP_GETFH:          void;
3031*f44e1126SVitaliy Gusev  case OP_LINK:           LINK4args oplink;
3032*f44e1126SVitaliy Gusev  case OP_LOCK:           LOCK4args oplock;
3033*f44e1126SVitaliy Gusev  case OP_LOCKT:          LOCKT4args oplockt;
3034*f44e1126SVitaliy Gusev  case OP_LOCKU:          LOCKU4args oplocku;
3035*f44e1126SVitaliy Gusev  case OP_LOOKUP:         LOOKUP4args oplookup;
3036*f44e1126SVitaliy Gusev  case OP_LOOKUPP:        void;
3037*f44e1126SVitaliy Gusev  case OP_NVERIFY:        NVERIFY4args opnverify;
3038*f44e1126SVitaliy Gusev  case OP_OPEN:           OPEN4args opopen;
3039*f44e1126SVitaliy Gusev  case OP_OPENATTR:       OPENATTR4args opopenattr;
3040*f44e1126SVitaliy Gusev 
3041*f44e1126SVitaliy Gusev  /* Not for NFSv4.1 */
3042*f44e1126SVitaliy Gusev  case OP_OPEN_CONFIRM:   OPEN_CONFIRM4args opopen_confirm;
3043*f44e1126SVitaliy Gusev 
3044*f44e1126SVitaliy Gusev  case OP_OPEN_DOWNGRADE: OPEN_DOWNGRADE4args opopen_downgrade;
3045*f44e1126SVitaliy Gusev 
3046*f44e1126SVitaliy Gusev  case OP_PUTFH:          PUTFH4args opputfh;
3047*f44e1126SVitaliy Gusev  case OP_PUTPUBFH:       void;
3048*f44e1126SVitaliy Gusev  case OP_PUTROOTFH:      void;
3049*f44e1126SVitaliy Gusev  case OP_READ:           READ4args opread;
3050*f44e1126SVitaliy Gusev  case OP_READDIR:        READDIR4args opreaddir;
3051*f44e1126SVitaliy Gusev  case OP_READLINK:       void;
3052*f44e1126SVitaliy Gusev  case OP_REMOVE:         REMOVE4args opremove;
3053*f44e1126SVitaliy Gusev  case OP_RENAME:         RENAME4args oprename;
3054*f44e1126SVitaliy Gusev 
3055*f44e1126SVitaliy Gusev  /* Not for NFSv4.1 */
3056*f44e1126SVitaliy Gusev  case OP_RENEW:          RENEW4args oprenew;
3057*f44e1126SVitaliy Gusev 
3058*f44e1126SVitaliy Gusev  case OP_RESTOREFH:      void;
3059*f44e1126SVitaliy Gusev  case OP_SAVEFH:         void;
3060*f44e1126SVitaliy Gusev  case OP_SECINFO:        SECINFO4args opsecinfo;
3061*f44e1126SVitaliy Gusev  case OP_SETATTR:        SETATTR4args opsetattr;
3062*f44e1126SVitaliy Gusev 
3063*f44e1126SVitaliy Gusev  /* Not for NFSv4.1 */
3064*f44e1126SVitaliy Gusev  case OP_SETCLIENTID:    SETCLIENTID4args opsetclientid;
3065*f44e1126SVitaliy Gusev 
3066*f44e1126SVitaliy Gusev  /* Not for NFSv4.1 */
3067*f44e1126SVitaliy Gusev  case OP_SETCLIENTID_CONFIRM:
3068*f44e1126SVitaliy Gusev                          SETCLIENTID_CONFIRM4args
3069*f44e1126SVitaliy Gusev                                  opsetclientid_confirm;
3070*f44e1126SVitaliy Gusev 
3071*f44e1126SVitaliy Gusev  case OP_VERIFY:         VERIFY4args opverify;
3072*f44e1126SVitaliy Gusev  case OP_WRITE:          WRITE4args opwrite;
3073*f44e1126SVitaliy Gusev 
3074*f44e1126SVitaliy Gusev  /* Not for NFSv4.1 */
3075bbe876c0SMarcel Telka  case OP_RELEASE_LOCKOWNER:
3076*f44e1126SVitaliy Gusev                          RELEASE_LOCKOWNER4args
3077*f44e1126SVitaliy Gusev                                  oprelease_lockowner;
3078*f44e1126SVitaliy Gusev 
3079*f44e1126SVitaliy Gusev  /* Operations new to NFSv4.1 */
3080*f44e1126SVitaliy Gusev  case OP_BACKCHANNEL_CTL:
3081*f44e1126SVitaliy Gusev                          BACKCHANNEL_CTL4args opbackchannel_ctl;
3082*f44e1126SVitaliy Gusev 
3083*f44e1126SVitaliy Gusev  case OP_BIND_CONN_TO_SESSION:
3084*f44e1126SVitaliy Gusev                          BIND_CONN_TO_SESSION4args
3085*f44e1126SVitaliy Gusev                                  opbind_conn_to_session;
3086*f44e1126SVitaliy Gusev 
3087*f44e1126SVitaliy Gusev  case OP_EXCHANGE_ID:    EXCHANGE_ID4args opexchange_id;
3088*f44e1126SVitaliy Gusev 
3089*f44e1126SVitaliy Gusev  case OP_CREATE_SESSION: CREATE_SESSION4args opcreate_session;
3090*f44e1126SVitaliy Gusev 
3091*f44e1126SVitaliy Gusev  case OP_DESTROY_SESSION:
3092*f44e1126SVitaliy Gusev                          DESTROY_SESSION4args opdestroy_session;
3093*f44e1126SVitaliy Gusev 
3094*f44e1126SVitaliy Gusev  case OP_FREE_STATEID:   FREE_STATEID4args opfree_stateid;
3095*f44e1126SVitaliy Gusev 
3096*f44e1126SVitaliy Gusev  case OP_GET_DIR_DELEGATION:
3097*f44e1126SVitaliy Gusev                          GET_DIR_DELEGATION4args
3098*f44e1126SVitaliy Gusev                                  opget_dir_delegation;
3099*f44e1126SVitaliy Gusev 
3100*f44e1126SVitaliy Gusev  case OP_GETDEVICEINFO:  GETDEVICEINFO4args opgetdeviceinfo;
3101*f44e1126SVitaliy Gusev  case OP_GETDEVICELIST:  GETDEVICELIST4args opgetdevicelist;
3102*f44e1126SVitaliy Gusev  case OP_LAYOUTCOMMIT:   LAYOUTCOMMIT4args oplayoutcommit;
3103*f44e1126SVitaliy Gusev  case OP_LAYOUTGET:      LAYOUTGET4args oplayoutget;
3104*f44e1126SVitaliy Gusev  case OP_LAYOUTRETURN:   LAYOUTRETURN4args oplayoutreturn;
3105*f44e1126SVitaliy Gusev 
3106*f44e1126SVitaliy Gusev  case OP_SECINFO_NO_NAME:
3107*f44e1126SVitaliy Gusev                          SECINFO_NO_NAME4args opsecinfo_no_name;
3108*f44e1126SVitaliy Gusev 
3109*f44e1126SVitaliy Gusev  case OP_SEQUENCE:       SEQUENCE4args opsequence;
3110*f44e1126SVitaliy Gusev  case OP_SET_SSV:        SET_SSV4args opset_ssv;
3111*f44e1126SVitaliy Gusev  case OP_TEST_STATEID:   TEST_STATEID4args optest_stateid;
3112*f44e1126SVitaliy Gusev 
3113*f44e1126SVitaliy Gusev  case OP_WANT_DELEGATION:
3114*f44e1126SVitaliy Gusev                          WANT_DELEGATION4args opwant_delegation;
3115*f44e1126SVitaliy Gusev 
3116*f44e1126SVitaliy Gusev  case OP_DESTROY_CLIENTID:
3117*f44e1126SVitaliy Gusev                          DESTROY_CLIENTID4args
3118*f44e1126SVitaliy Gusev                                  opdestroy_clientid;
3119*f44e1126SVitaliy Gusev 
3120*f44e1126SVitaliy Gusev  case OP_RECLAIM_COMPLETE:
3121*f44e1126SVitaliy Gusev                          RECLAIM_COMPLETE4args
3122*f44e1126SVitaliy Gusev                                  opreclaim_complete;
3123*f44e1126SVitaliy Gusev 
3124*f44e1126SVitaliy Gusev  /* Operations new to NFSv4.2 */
3125*f44e1126SVitaliy Gusev  case OP_ALLOCATE:       ALLOCATE4args opallocate;
3126*f44e1126SVitaliy Gusev  case OP_COPY:           COPY4args opcopy;
3127*f44e1126SVitaliy Gusev  case OP_COPY_NOTIFY:    COPY_NOTIFY4args opoffload_notify;
3128*f44e1126SVitaliy Gusev  case OP_DEALLOCATE:     DEALLOCATE4args opdeallocate;
3129*f44e1126SVitaliy Gusev  case OP_IO_ADVISE:      IO_ADVISE4args opio_advise;
3130*f44e1126SVitaliy Gusev  case OP_LAYOUTERROR:    LAYOUTERROR4args oplayouterror;
3131*f44e1126SVitaliy Gusev  case OP_LAYOUTSTATS:    LAYOUTSTATS4args oplayoutstats;
3132*f44e1126SVitaliy Gusev  case OP_OFFLOAD_CANCEL: OFFLOAD_CANCEL4args opoffload_cancel;
3133*f44e1126SVitaliy Gusev  case OP_OFFLOAD_STATUS: OFFLOAD_STATUS4args opoffload_status;
3134*f44e1126SVitaliy Gusev  case OP_READ_PLUS:      READ_PLUS4args opread_plus;
3135*f44e1126SVitaliy Gusev  case OP_SEEK:           SEEK4args opseek;
3136*f44e1126SVitaliy Gusev  case OP_WRITE_SAME:     WRITE_SAME4args opwrite_same;
3137*f44e1126SVitaliy Gusev  case OP_CLONE:          CLONE4args opclone;
3138*f44e1126SVitaliy Gusev 
3139*f44e1126SVitaliy Gusev  /* Operations not new to NFSv4.1 */
3140*f44e1126SVitaliy Gusev  case OP_ILLEGAL:        void;
3141bbe876c0SMarcel Telka };
3142bbe876c0SMarcel Telka 
3143bbe876c0SMarcel Telka union nfs_resop4 switch (nfs_opnum4 resop) {
3144*f44e1126SVitaliy Gusev  case OP_ACCESS:         ACCESS4res opaccess;
3145*f44e1126SVitaliy Gusev  case OP_CLOSE:          CLOSE4res opclose;
3146*f44e1126SVitaliy Gusev  case OP_COMMIT:         COMMIT4res opcommit;
3147*f44e1126SVitaliy Gusev  case OP_CREATE:         CREATE4res opcreate;
3148*f44e1126SVitaliy Gusev  case OP_DELEGPURGE:     DELEGPURGE4res opdelegpurge;
3149*f44e1126SVitaliy Gusev  case OP_DELEGRETURN:    DELEGRETURN4res opdelegreturn;
3150*f44e1126SVitaliy Gusev  case OP_GETATTR:        GETATTR4res opgetattr;
3151*f44e1126SVitaliy Gusev  case OP_GETFH:          GETFH4res opgetfh;
3152*f44e1126SVitaliy Gusev  case OP_LINK:           LINK4res oplink;
3153*f44e1126SVitaliy Gusev  case OP_LOCK:           LOCK4res oplock;
3154*f44e1126SVitaliy Gusev  case OP_LOCKT:          LOCKT4res oplockt;
3155*f44e1126SVitaliy Gusev  case OP_LOCKU:          LOCKU4res oplocku;
3156*f44e1126SVitaliy Gusev  case OP_LOOKUP:         LOOKUP4res oplookup;
3157*f44e1126SVitaliy Gusev  case OP_LOOKUPP:        LOOKUPP4res oplookupp;
3158*f44e1126SVitaliy Gusev  case OP_NVERIFY:        NVERIFY4res opnverify;
3159*f44e1126SVitaliy Gusev  case OP_OPEN:           OPEN4res opopen;
3160*f44e1126SVitaliy Gusev  case OP_OPENATTR:       OPENATTR4res opopenattr;
3161*f44e1126SVitaliy Gusev  /* Not for NFSv4.1 */
3162*f44e1126SVitaliy Gusev  case OP_OPEN_CONFIRM:   OPEN_CONFIRM4res opopen_confirm;
3163*f44e1126SVitaliy Gusev 
3164*f44e1126SVitaliy Gusev  case OP_OPEN_DOWNGRADE: OPEN_DOWNGRADE4res opopen_downgrade;
3165*f44e1126SVitaliy Gusev 
3166*f44e1126SVitaliy Gusev  case OP_PUTFH:          PUTFH4res opputfh;
3167*f44e1126SVitaliy Gusev  case OP_PUTPUBFH:       PUTPUBFH4res opputpubfh;
3168*f44e1126SVitaliy Gusev  case OP_PUTROOTFH:      PUTROOTFH4res opputrootfh;
3169*f44e1126SVitaliy Gusev  case OP_READ:           READ4res opread;
3170*f44e1126SVitaliy Gusev  case OP_READDIR:        READDIR4res opreaddir;
3171*f44e1126SVitaliy Gusev  case OP_READLINK:       READLINK4res opreadlink;
3172*f44e1126SVitaliy Gusev  case OP_REMOVE:         REMOVE4res opremove;
3173*f44e1126SVitaliy Gusev  case OP_RENAME:         RENAME4res oprename;
3174*f44e1126SVitaliy Gusev  /* Not for NFSv4.1 */
3175*f44e1126SVitaliy Gusev  case OP_RENEW:          RENEW4res oprenew;
3176*f44e1126SVitaliy Gusev  case OP_RESTOREFH:      RESTOREFH4res oprestorefh;
3177*f44e1126SVitaliy Gusev  case OP_SAVEFH:         SAVEFH4res opsavefh;
3178*f44e1126SVitaliy Gusev  case OP_SECINFO:        SECINFO4res opsecinfo;
3179*f44e1126SVitaliy Gusev  case OP_SETATTR:        SETATTR4res opsetattr;
3180*f44e1126SVitaliy Gusev  /* Not for NFSv4.1 */
3181*f44e1126SVitaliy Gusev  case OP_SETCLIENTID:    SETCLIENTID4res opsetclientid;
3182*f44e1126SVitaliy Gusev 
3183*f44e1126SVitaliy Gusev  /* Not for NFSv4.1 */
3184bbe876c0SMarcel Telka  case OP_SETCLIENTID_CONFIRM:
3185*f44e1126SVitaliy Gusev                          SETCLIENTID_CONFIRM4res
3186*f44e1126SVitaliy Gusev                                  opsetclientid_confirm;
3187*f44e1126SVitaliy Gusev  case OP_VERIFY:         VERIFY4res opverify;
3188*f44e1126SVitaliy Gusev  case OP_WRITE:          WRITE4res opwrite;
3189*f44e1126SVitaliy Gusev 
3190*f44e1126SVitaliy Gusev  /* Not for NFSv4.1 */
3191bbe876c0SMarcel Telka  case OP_RELEASE_LOCKOWNER:
3192*f44e1126SVitaliy Gusev                          RELEASE_LOCKOWNER4res
3193*f44e1126SVitaliy Gusev                                  oprelease_lockowner;
3194*f44e1126SVitaliy Gusev 
3195*f44e1126SVitaliy Gusev  /* Operations new to NFSv4.1 */
3196*f44e1126SVitaliy Gusev  case OP_BACKCHANNEL_CTL:
3197*f44e1126SVitaliy Gusev                          BACKCHANNEL_CTL4res opbackchannel_ctl;
3198*f44e1126SVitaliy Gusev 
3199*f44e1126SVitaliy Gusev  case OP_BIND_CONN_TO_SESSION:
3200*f44e1126SVitaliy Gusev                          BIND_CONN_TO_SESSION4res
3201*f44e1126SVitaliy Gusev                                  opbind_conn_to_session;
3202*f44e1126SVitaliy Gusev 
3203*f44e1126SVitaliy Gusev  case OP_EXCHANGE_ID:    EXCHANGE_ID4res opexchange_id;
3204*f44e1126SVitaliy Gusev 
3205*f44e1126SVitaliy Gusev  case OP_CREATE_SESSION: CREATE_SESSION4res opcreate_session;
3206*f44e1126SVitaliy Gusev 
3207*f44e1126SVitaliy Gusev  case OP_DESTROY_SESSION:
3208*f44e1126SVitaliy Gusev                          DESTROY_SESSION4res opdestroy_session;
3209*f44e1126SVitaliy Gusev 
3210*f44e1126SVitaliy Gusev  case OP_FREE_STATEID:   FREE_STATEID4res opfree_stateid;
3211*f44e1126SVitaliy Gusev 
3212*f44e1126SVitaliy Gusev  case OP_GET_DIR_DELEGATION:
3213*f44e1126SVitaliy Gusev                          GET_DIR_DELEGATION4res
3214*f44e1126SVitaliy Gusev                                  opget_dir_delegation;
3215*f44e1126SVitaliy Gusev 
3216*f44e1126SVitaliy Gusev  case OP_GETDEVICEINFO:  GETDEVICEINFO4res opgetdeviceinfo;
3217*f44e1126SVitaliy Gusev  case OP_GETDEVICELIST:  GETDEVICELIST4res opgetdevicelist;
3218*f44e1126SVitaliy Gusev  case OP_LAYOUTCOMMIT:   LAYOUTCOMMIT4res oplayoutcommit;
3219*f44e1126SVitaliy Gusev  case OP_LAYOUTGET:      LAYOUTGET4res oplayoutget;
3220*f44e1126SVitaliy Gusev  case OP_LAYOUTRETURN:   LAYOUTRETURN4res oplayoutreturn;
3221*f44e1126SVitaliy Gusev 
3222*f44e1126SVitaliy Gusev  case OP_SECINFO_NO_NAME:
3223*f44e1126SVitaliy Gusev                          SECINFO_NO_NAME4res opsecinfo_no_name;
3224*f44e1126SVitaliy Gusev 
3225*f44e1126SVitaliy Gusev  case OP_SEQUENCE:       SEQUENCE4res opsequence;
3226*f44e1126SVitaliy Gusev  case OP_SET_SSV:        SET_SSV4res opset_ssv;
3227*f44e1126SVitaliy Gusev  case OP_TEST_STATEID:   TEST_STATEID4res optest_stateid;
3228*f44e1126SVitaliy Gusev 
3229*f44e1126SVitaliy Gusev  case OP_WANT_DELEGATION:
3230*f44e1126SVitaliy Gusev                          WANT_DELEGATION4res opwant_delegation;
3231*f44e1126SVitaliy Gusev 
3232*f44e1126SVitaliy Gusev  case OP_DESTROY_CLIENTID:
3233*f44e1126SVitaliy Gusev                          DESTROY_CLIENTID4res
3234*f44e1126SVitaliy Gusev                                  opdestroy_clientid;
3235*f44e1126SVitaliy Gusev 
3236*f44e1126SVitaliy Gusev  case OP_RECLAIM_COMPLETE:
3237*f44e1126SVitaliy Gusev                          RECLAIM_COMPLETE4res
3238*f44e1126SVitaliy Gusev                                  opreclaim_complete;
3239*f44e1126SVitaliy Gusev 
3240*f44e1126SVitaliy Gusev  /* Operations new to NFSv4.2 */
3241*f44e1126SVitaliy Gusev  case OP_ALLOCATE:       ALLOCATE4res opallocate;
3242*f44e1126SVitaliy Gusev  case OP_COPY:           COPY4res opcopy;
3243*f44e1126SVitaliy Gusev  case OP_COPY_NOTIFY:    COPY_NOTIFY4res opcopy_notify;
3244*f44e1126SVitaliy Gusev  case OP_DEALLOCATE:     DEALLOCATE4res opdeallocate;
3245*f44e1126SVitaliy Gusev  case OP_IO_ADVISE:      IO_ADVISE4res opio_advise;
3246*f44e1126SVitaliy Gusev  case OP_LAYOUTERROR:    LAYOUTERROR4res oplayouterror;
3247*f44e1126SVitaliy Gusev  case OP_LAYOUTSTATS:    LAYOUTSTATS4res oplayoutstats;
3248*f44e1126SVitaliy Gusev  case OP_OFFLOAD_CANCEL: OFFLOAD_CANCEL4res opoffload_cancel;
3249*f44e1126SVitaliy Gusev  case OP_OFFLOAD_STATUS: OFFLOAD_STATUS4res opoffload_status;
3250*f44e1126SVitaliy Gusev  case OP_READ_PLUS:      READ_PLUS4res opread_plus;
3251*f44e1126SVitaliy Gusev  case OP_SEEK:           SEEK4res opseek;
3252*f44e1126SVitaliy Gusev  case OP_WRITE_SAME:     WRITE_SAME4res opwrite_same;
3253*f44e1126SVitaliy Gusev  case OP_CLONE:          CLONE4res opclone;
3254*f44e1126SVitaliy Gusev 
3255*f44e1126SVitaliy Gusev  /* Operations not new to NFSv4.1 */
3256*f44e1126SVitaliy Gusev  case OP_ILLEGAL:        ILLEGAL4res opillegal;
32577c478bd9Sstevel@tonic-gate };
32587c478bd9Sstevel@tonic-gate 
32597c478bd9Sstevel@tonic-gate struct COMPOUND4args {
3260*f44e1126SVitaliy Gusev         utf8str_cs       tag;
3261*f44e1126SVitaliy Gusev         uint32_t         minorversion;
3262*f44e1126SVitaliy Gusev         nfs_argop4       argarray<>;
32637c478bd9Sstevel@tonic-gate };
32647c478bd9Sstevel@tonic-gate 
32657c478bd9Sstevel@tonic-gate struct COMPOUND4res {
3266*f44e1126SVitaliy Gusev         nfsstat4         status;
3267*f44e1126SVitaliy Gusev         utf8str_cs       tag;
3268*f44e1126SVitaliy Gusev         nfs_resop4       resarray<>;
32697c478bd9Sstevel@tonic-gate };
32707c478bd9Sstevel@tonic-gate 
3271bbe876c0SMarcel Telka 
32727c478bd9Sstevel@tonic-gate /*
32737c478bd9Sstevel@tonic-gate  * Remote file service routines
32747c478bd9Sstevel@tonic-gate  */
32757c478bd9Sstevel@tonic-gate program NFS4_PROGRAM {
3276bbe876c0SMarcel Telka         version NFS_V4 {
3277bbe876c0SMarcel Telka                 void
3278*f44e1126SVitaliy Gusev                          NFSPROC4_NULL(void) = 0;
32797c478bd9Sstevel@tonic-gate 
3280bbe876c0SMarcel Telka                 COMPOUND4res
3281*f44e1126SVitaliy Gusev                          NFSPROC4_COMPOUND(COMPOUND4args) = 1;
32827c478bd9Sstevel@tonic-gate 
3283bbe876c0SMarcel Telka         } = 4;
32847c478bd9Sstevel@tonic-gate } = 100003;
32857c478bd9Sstevel@tonic-gate 
32867c478bd9Sstevel@tonic-gate /*
3287bbe876c0SMarcel Telka  * NFS4 callback procedure definitions and program
32887c478bd9Sstevel@tonic-gate  */
32897c478bd9Sstevel@tonic-gate struct CB_GETATTR4args {
3290bbe876c0SMarcel Telka         nfs_fh4 fh;
3291bbe876c0SMarcel Telka         bitmap4 attr_request;
32927c478bd9Sstevel@tonic-gate };
32937c478bd9Sstevel@tonic-gate 
32947c478bd9Sstevel@tonic-gate struct CB_GETATTR4resok {
3295bbe876c0SMarcel Telka         fattr4  obj_attributes;
32967c478bd9Sstevel@tonic-gate };
32977c478bd9Sstevel@tonic-gate 
32987c478bd9Sstevel@tonic-gate union CB_GETATTR4res switch (nfsstat4 status) {
32997c478bd9Sstevel@tonic-gate  case NFS4_OK:
3300bbe876c0SMarcel Telka          CB_GETATTR4resok       resok4;
33017c478bd9Sstevel@tonic-gate  default:
3302bbe876c0SMarcel Telka          void;
33037c478bd9Sstevel@tonic-gate };
33047c478bd9Sstevel@tonic-gate 
33057c478bd9Sstevel@tonic-gate struct CB_RECALL4args {
3306bbe876c0SMarcel Telka         stateid4        stateid;
3307bbe876c0SMarcel Telka         bool            truncate;
3308bbe876c0SMarcel Telka         nfs_fh4         fh;
33097c478bd9Sstevel@tonic-gate };
33107c478bd9Sstevel@tonic-gate 
33117c478bd9Sstevel@tonic-gate struct CB_RECALL4res {
3312bbe876c0SMarcel Telka         nfsstat4        status;
33137c478bd9Sstevel@tonic-gate };
33147c478bd9Sstevel@tonic-gate 
33157c478bd9Sstevel@tonic-gate /*
33167c478bd9Sstevel@tonic-gate  * CB_ILLEGAL: Response for illegal operation numbers
33177c478bd9Sstevel@tonic-gate  */
33187c478bd9Sstevel@tonic-gate struct CB_ILLEGAL4res {
3319bbe876c0SMarcel Telka         nfsstat4        status;
33207c478bd9Sstevel@tonic-gate };
33217c478bd9Sstevel@tonic-gate 
33227c478bd9Sstevel@tonic-gate /*
3323*f44e1126SVitaliy Gusev  * NFSv4.1 callback arguments and results
3324a57549b4SVitaliy Gusev  */
3325*f44e1126SVitaliy Gusev 
3326*f44e1126SVitaliy Gusev enum layoutrecall_type4 {
3327*f44e1126SVitaliy Gusev         LAYOUTRECALL4_FILE = LAYOUT4_RET_REC_FILE,
3328*f44e1126SVitaliy Gusev         LAYOUTRECALL4_FSID = LAYOUT4_RET_REC_FSID,
3329*f44e1126SVitaliy Gusev         LAYOUTRECALL4_ALL  = LAYOUT4_RET_REC_ALL
3330*f44e1126SVitaliy Gusev };
3331*f44e1126SVitaliy Gusev 
3332*f44e1126SVitaliy Gusev struct layoutrecall_file4 {
3333*f44e1126SVitaliy Gusev         nfs_fh4         lor_fh;
3334*f44e1126SVitaliy Gusev         offset4         lor_offset;
3335*f44e1126SVitaliy Gusev         length4         lor_length;
3336*f44e1126SVitaliy Gusev         stateid4        lor_stateid;
3337*f44e1126SVitaliy Gusev };
3338*f44e1126SVitaliy Gusev 
3339*f44e1126SVitaliy Gusev union layoutrecall4 switch (layoutrecall_type4 lor_recalltype) {
3340*f44e1126SVitaliy Gusev  case LAYOUTRECALL4_FILE:
3341*f44e1126SVitaliy Gusev          layoutrecall_file4 lor_layout;
3342*f44e1126SVitaliy Gusev  case LAYOUTRECALL4_FSID:
3343*f44e1126SVitaliy Gusev          fsid4              lor_fsid;
3344*f44e1126SVitaliy Gusev  case LAYOUTRECALL4_ALL:
3345*f44e1126SVitaliy Gusev          void;
3346*f44e1126SVitaliy Gusev };
3347*f44e1126SVitaliy Gusev 
3348*f44e1126SVitaliy Gusev struct CB_LAYOUTRECALL4args {
3349*f44e1126SVitaliy Gusev         layouttype4             clora_type;
3350*f44e1126SVitaliy Gusev         layoutiomode4           clora_iomode;
3351*f44e1126SVitaliy Gusev         bool                    clora_changed;
3352*f44e1126SVitaliy Gusev         layoutrecall4           clora_recall;
3353*f44e1126SVitaliy Gusev };
3354*f44e1126SVitaliy Gusev struct CB_LAYOUTRECALL4res {
3355*f44e1126SVitaliy Gusev         nfsstat4        clorr_status;
3356*f44e1126SVitaliy Gusev };
3357*f44e1126SVitaliy Gusev 
3358*f44e1126SVitaliy Gusev /*
3359*f44e1126SVitaliy Gusev  * Directory notification types
3360*f44e1126SVitaliy Gusev  */
3361*f44e1126SVitaliy Gusev enum notify_type4 {
3362*f44e1126SVitaliy Gusev         NOTIFY4_CHANGE_CHILD_ATTRS     = 0,
3363*f44e1126SVitaliy Gusev         NOTIFY4_CHANGE_DIR_ATTRS       = 1,
3364*f44e1126SVitaliy Gusev         NOTIFY4_REMOVE_ENTRY           = 2,
3365*f44e1126SVitaliy Gusev         NOTIFY4_ADD_ENTRY              = 3,
3366*f44e1126SVitaliy Gusev         NOTIFY4_RENAME_ENTRY           = 4,
3367*f44e1126SVitaliy Gusev         NOTIFY4_CHANGE_COOKIE_VERIFIER = 5
3368*f44e1126SVitaliy Gusev };
3369*f44e1126SVitaliy Gusev 
3370*f44e1126SVitaliy Gusev /* Changed entry information */
3371*f44e1126SVitaliy Gusev struct notify_entry4 {
3372*f44e1126SVitaliy Gusev         component4      ne_file;
3373*f44e1126SVitaliy Gusev         fattr4          ne_attrs;
3374a57549b4SVitaliy Gusev };
3375a57549b4SVitaliy Gusev 
3376*f44e1126SVitaliy Gusev /* Previous entry information */
3377*f44e1126SVitaliy Gusev struct prev_entry4 {
3378*f44e1126SVitaliy Gusev         notify_entry4   pe_prev_entry;
3379*f44e1126SVitaliy Gusev         /* What READDIR returned for this entry */
3380*f44e1126SVitaliy Gusev         nfs_cookie4     pe_prev_entry_cookie;
3381a57549b4SVitaliy Gusev };
3382a57549b4SVitaliy Gusev 
3383*f44e1126SVitaliy Gusev struct notify_remove4 {
3384*f44e1126SVitaliy Gusev         notify_entry4   nrm_old_entry;
3385*f44e1126SVitaliy Gusev         nfs_cookie4     nrm_old_entry_cookie;
3386*f44e1126SVitaliy Gusev };
3387*f44e1126SVitaliy Gusev 
3388*f44e1126SVitaliy Gusev struct notify_add4 {
3389*f44e1126SVitaliy Gusev         /*
3390*f44e1126SVitaliy Gusev          * During a rename, contains
3391*f44e1126SVitaliy Gusev          * the object that was deleted.
3392*f44e1126SVitaliy Gusev          */
3393*f44e1126SVitaliy Gusev         notify_remove4      nad_old_entry<1>;
3394*f44e1126SVitaliy Gusev         notify_entry4       nad_new_entry;
3395*f44e1126SVitaliy Gusev         /* What READDIR would have returned for this entry */
3396*f44e1126SVitaliy Gusev         nfs_cookie4         nad_new_entry_cookie<1>;
3397*f44e1126SVitaliy Gusev         prev_entry4         nad_prev_entry<1>;
3398*f44e1126SVitaliy Gusev         bool                nad_last_entry;
3399*f44e1126SVitaliy Gusev };
3400*f44e1126SVitaliy Gusev 
3401*f44e1126SVitaliy Gusev struct notify_attr4 {
3402*f44e1126SVitaliy Gusev         notify_entry4   na_changed_entry;
3403*f44e1126SVitaliy Gusev };
3404*f44e1126SVitaliy Gusev 
3405*f44e1126SVitaliy Gusev struct notify_rename4 {
3406*f44e1126SVitaliy Gusev         notify_remove4  nrn_old_entry;
3407*f44e1126SVitaliy Gusev         notify_add4     nrn_new_entry;
3408*f44e1126SVitaliy Gusev };
3409*f44e1126SVitaliy Gusev 
3410*f44e1126SVitaliy Gusev struct notify_verifier4 {
3411*f44e1126SVitaliy Gusev         verifier4       nv_old_cookieverf;
3412*f44e1126SVitaliy Gusev         verifier4       nv_new_cookieverf;
3413*f44e1126SVitaliy Gusev };
3414*f44e1126SVitaliy Gusev 
3415*f44e1126SVitaliy Gusev /*
3416*f44e1126SVitaliy Gusev  * Objects of type notify_<>4 and
3417*f44e1126SVitaliy Gusev  * notify_device_<>4 are encoded in this.
3418*f44e1126SVitaliy Gusev  */
3419*f44e1126SVitaliy Gusev typedef opaque notifylist4<>;
3420*f44e1126SVitaliy Gusev 
3421*f44e1126SVitaliy Gusev struct notify4 {
3422*f44e1126SVitaliy Gusev         /* Composed from notify_type4 or notify_deviceid_type4 */
3423*f44e1126SVitaliy Gusev         bitmap4         notify_mask;
3424*f44e1126SVitaliy Gusev         notifylist4     notify_vals;
3425*f44e1126SVitaliy Gusev };
3426*f44e1126SVitaliy Gusev 
3427*f44e1126SVitaliy Gusev struct CB_NOTIFY4args {
3428*f44e1126SVitaliy Gusev         stateid4    cna_stateid;
3429*f44e1126SVitaliy Gusev         nfs_fh4     cna_fh;
3430*f44e1126SVitaliy Gusev         notify4     cna_changes<>;
3431*f44e1126SVitaliy Gusev };
3432*f44e1126SVitaliy Gusev 
3433*f44e1126SVitaliy Gusev struct CB_NOTIFY4res {
3434*f44e1126SVitaliy Gusev         nfsstat4    cnr_status;
3435*f44e1126SVitaliy Gusev };
3436*f44e1126SVitaliy Gusev 
3437*f44e1126SVitaliy Gusev struct CB_PUSH_DELEG4args {
3438*f44e1126SVitaliy Gusev         nfs_fh4          cpda_fh;
3439*f44e1126SVitaliy Gusev         open_delegation4 cpda_delegation;
3440*f44e1126SVitaliy Gusev 
3441*f44e1126SVitaliy Gusev };
3442*f44e1126SVitaliy Gusev 
3443*f44e1126SVitaliy Gusev struct CB_PUSH_DELEG4res {
3444*f44e1126SVitaliy Gusev         nfsstat4 cpdr_status;
3445*f44e1126SVitaliy Gusev };
3446*f44e1126SVitaliy Gusev 
3447*f44e1126SVitaliy Gusev const RCA4_TYPE_MASK_RDATA_DLG          = 0;
3448*f44e1126SVitaliy Gusev const RCA4_TYPE_MASK_WDATA_DLG          = 1;
3449*f44e1126SVitaliy Gusev const RCA4_TYPE_MASK_DIR_DLG            = 2;
3450*f44e1126SVitaliy Gusev const RCA4_TYPE_MASK_FILE_LAYOUT        = 3;
3451*f44e1126SVitaliy Gusev const RCA4_TYPE_MASK_BLK_LAYOUT         = 4;
3452*f44e1126SVitaliy Gusev const RCA4_TYPE_MASK_OBJ_LAYOUT_MIN     = 8;
3453*f44e1126SVitaliy Gusev const RCA4_TYPE_MASK_OBJ_LAYOUT_MAX     = 9;
3454*f44e1126SVitaliy Gusev const RCA4_TYPE_MASK_OTHER_LAYOUT_MIN   = 12;
3455*f44e1126SVitaliy Gusev const RCA4_TYPE_MASK_OTHER_LAYOUT_MAX   = 15;
3456*f44e1126SVitaliy Gusev 
3457*f44e1126SVitaliy Gusev struct CB_RECALL_ANY4args      {
3458*f44e1126SVitaliy Gusev        uint32_t         craa_objects_to_keep;
3459*f44e1126SVitaliy Gusev        bitmap4          craa_type_mask;
3460*f44e1126SVitaliy Gusev };
3461*f44e1126SVitaliy Gusev 
3462*f44e1126SVitaliy Gusev struct CB_RECALL_ANY4res {
3463*f44e1126SVitaliy Gusev         nfsstat4        crar_status;
3464*f44e1126SVitaliy Gusev };
3465*f44e1126SVitaliy Gusev 
3466*f44e1126SVitaliy Gusev typedef CB_RECALL_ANY4args CB_RECALLABLE_OBJ_AVAIL4args;
3467*f44e1126SVitaliy Gusev 
3468*f44e1126SVitaliy Gusev struct CB_RECALLABLE_OBJ_AVAIL4res {
3469*f44e1126SVitaliy Gusev         nfsstat4        croa_status;
3470*f44e1126SVitaliy Gusev };
3471*f44e1126SVitaliy Gusev 
3472*f44e1126SVitaliy Gusev struct CB_RECALL_SLOT4args {
3473*f44e1126SVitaliy Gusev         slotid4       rsa_target_highest_slotid;
3474*f44e1126SVitaliy Gusev };
3475*f44e1126SVitaliy Gusev 
3476*f44e1126SVitaliy Gusev struct CB_RECALL_SLOT4res {
3477*f44e1126SVitaliy Gusev         nfsstat4   rsr_status;
3478*f44e1126SVitaliy Gusev };
3479*f44e1126SVitaliy Gusev 
3480*f44e1126SVitaliy Gusev struct referring_call4 {
3481*f44e1126SVitaliy Gusev         sequenceid4     rc_sequenceid;
3482*f44e1126SVitaliy Gusev         slotid4         rc_slotid;
3483*f44e1126SVitaliy Gusev };
3484*f44e1126SVitaliy Gusev 
3485*f44e1126SVitaliy Gusev struct referring_call_list4 {
3486*f44e1126SVitaliy Gusev         sessionid4      rcl_sessionid;
3487*f44e1126SVitaliy Gusev         referring_call4 rcl_referring_calls<>;
3488*f44e1126SVitaliy Gusev };
3489*f44e1126SVitaliy Gusev 
3490*f44e1126SVitaliy Gusev struct CB_SEQUENCE4args {
3491*f44e1126SVitaliy Gusev         sessionid4           csa_sessionid;
3492*f44e1126SVitaliy Gusev         sequenceid4          csa_sequenceid;
3493*f44e1126SVitaliy Gusev         slotid4              csa_slotid;
3494*f44e1126SVitaliy Gusev         slotid4              csa_highest_slotid;
3495*f44e1126SVitaliy Gusev         bool                 csa_cachethis;
3496*f44e1126SVitaliy Gusev         referring_call_list4 csa_referring_call_lists<>;
3497*f44e1126SVitaliy Gusev };
3498*f44e1126SVitaliy Gusev 
3499*f44e1126SVitaliy Gusev struct CB_SEQUENCE4resok {
3500*f44e1126SVitaliy Gusev         sessionid4         csr_sessionid;
3501*f44e1126SVitaliy Gusev         sequenceid4        csr_sequenceid;
3502*f44e1126SVitaliy Gusev         slotid4            csr_slotid;
3503*f44e1126SVitaliy Gusev         slotid4            csr_highest_slotid;
3504*f44e1126SVitaliy Gusev         slotid4            csr_target_highest_slotid;
3505*f44e1126SVitaliy Gusev };
3506*f44e1126SVitaliy Gusev 
3507*f44e1126SVitaliy Gusev union CB_SEQUENCE4res switch (nfsstat4 csr_status) {
3508*f44e1126SVitaliy Gusev  case NFS4_OK:
3509*f44e1126SVitaliy Gusev          CB_SEQUENCE4resok   csr_resok4;
3510*f44e1126SVitaliy Gusev  default:
3511*f44e1126SVitaliy Gusev          void;
3512*f44e1126SVitaliy Gusev };
3513*f44e1126SVitaliy Gusev 
3514*f44e1126SVitaliy Gusev struct CB_WANTS_CANCELLED4args {
3515*f44e1126SVitaliy Gusev         bool cwca_contended_wants_cancelled;
3516*f44e1126SVitaliy Gusev         bool cwca_resourced_wants_cancelled;
3517*f44e1126SVitaliy Gusev };
3518*f44e1126SVitaliy Gusev 
3519*f44e1126SVitaliy Gusev struct CB_WANTS_CANCELLED4res {
3520*f44e1126SVitaliy Gusev         nfsstat4        cwcr_status;
3521*f44e1126SVitaliy Gusev };
3522*f44e1126SVitaliy Gusev 
3523*f44e1126SVitaliy Gusev struct CB_NOTIFY_LOCK4args {
3524*f44e1126SVitaliy Gusev     nfs_fh4     cnla_fh;
3525*f44e1126SVitaliy Gusev     lock_owner4 cnla_lock_owner;
3526*f44e1126SVitaliy Gusev };
3527*f44e1126SVitaliy Gusev 
3528*f44e1126SVitaliy Gusev struct CB_NOTIFY_LOCK4res {
3529*f44e1126SVitaliy Gusev         nfsstat4        cnlr_status;
3530*f44e1126SVitaliy Gusev };
3531*f44e1126SVitaliy Gusev 
3532*f44e1126SVitaliy Gusev /*
3533*f44e1126SVitaliy Gusev  * Device notification types
3534*f44e1126SVitaliy Gusev  */
3535*f44e1126SVitaliy Gusev enum notify_deviceid_type4 {
3536*f44e1126SVitaliy Gusev         NOTIFY_DEVICEID4_CHANGE = 1,
3537*f44e1126SVitaliy Gusev         NOTIFY_DEVICEID4_DELETE = 2
3538*f44e1126SVitaliy Gusev };
3539*f44e1126SVitaliy Gusev 
3540*f44e1126SVitaliy Gusev /* For NOTIFY4_DEVICEID4_DELETE */
3541*f44e1126SVitaliy Gusev struct notify_deviceid_delete4 {
3542*f44e1126SVitaliy Gusev         layouttype4     ndd_layouttype;
3543*f44e1126SVitaliy Gusev         deviceid4       ndd_deviceid;
3544*f44e1126SVitaliy Gusev };
3545*f44e1126SVitaliy Gusev 
3546*f44e1126SVitaliy Gusev /* For NOTIFY4_DEVICEID4_CHANGE */
3547*f44e1126SVitaliy Gusev struct notify_deviceid_change4 {
3548*f44e1126SVitaliy Gusev         layouttype4     ndc_layouttype;
3549*f44e1126SVitaliy Gusev         deviceid4       ndc_deviceid;
3550*f44e1126SVitaliy Gusev         bool            ndc_immediate;
3551*f44e1126SVitaliy Gusev };
3552*f44e1126SVitaliy Gusev 
3553*f44e1126SVitaliy Gusev struct CB_NOTIFY_DEVICEID4args {
3554*f44e1126SVitaliy Gusev         notify4 cnda_changes<>;
3555*f44e1126SVitaliy Gusev };
3556*f44e1126SVitaliy Gusev 
3557*f44e1126SVitaliy Gusev struct CB_NOTIFY_DEVICEID4res {
3558*f44e1126SVitaliy Gusev         nfsstat4        cndr_status;
3559*f44e1126SVitaliy Gusev };
3560*f44e1126SVitaliy Gusev 
3561*f44e1126SVitaliy Gusev union offload_info4 switch (nfsstat4 coa_status) {
3562*f44e1126SVitaliy Gusev  case NFS4_OK:
3563*f44e1126SVitaliy Gusev          write_response4 coa_resok4;
3564*f44e1126SVitaliy Gusev  default:
3565*f44e1126SVitaliy Gusev          length4         coa_bytes_copied;
3566*f44e1126SVitaliy Gusev };
3567*f44e1126SVitaliy Gusev struct CB_OFFLOAD4args {
3568*f44e1126SVitaliy Gusev         nfs_fh4         coa_fh;
3569*f44e1126SVitaliy Gusev         stateid4        coa_stateid;
3570*f44e1126SVitaliy Gusev         offload_info4   coa_offload_info;
3571*f44e1126SVitaliy Gusev };
3572*f44e1126SVitaliy Gusev struct CB_OFFLOAD4res {
3573*f44e1126SVitaliy Gusev         nfsstat4        cor_status;
3574*f44e1126SVitaliy Gusev };
3575*f44e1126SVitaliy Gusev /*
3576*f44e1126SVitaliy Gusev  * Various definitions for CB_COMPOUND
3577*f44e1126SVitaliy Gusev  */
3578*f44e1126SVitaliy Gusev %
3579*f44e1126SVitaliy Gusev enum nfs_cb_opnum4 {
3580*f44e1126SVitaliy Gusev         OP_CB_GETATTR                   = 3,
3581*f44e1126SVitaliy Gusev         OP_CB_RECALL                    = 4,
3582*f44e1126SVitaliy Gusev %/* Callback operations new to NFSv4.1 */
3583*f44e1126SVitaliy Gusev         OP_CB_LAYOUTRECALL              = 5,
3584*f44e1126SVitaliy Gusev         OP_CB_NOTIFY                    = 6,
3585*f44e1126SVitaliy Gusev         OP_CB_PUSH_DELEG                = 7,
3586*f44e1126SVitaliy Gusev         OP_CB_RECALL_ANY                = 8,
3587*f44e1126SVitaliy Gusev         OP_CB_RECALLABLE_OBJ_AVAIL      = 9,
3588*f44e1126SVitaliy Gusev         OP_CB_RECALL_SLOT               = 10,
3589*f44e1126SVitaliy Gusev         OP_CB_SEQUENCE                  = 11,
3590*f44e1126SVitaliy Gusev         OP_CB_WANTS_CANCELLED           = 12,
3591*f44e1126SVitaliy Gusev         OP_CB_NOTIFY_LOCK               = 13,
3592*f44e1126SVitaliy Gusev         OP_CB_NOTIFY_DEVICEID           = 14,
3593*f44e1126SVitaliy Gusev %/* Callback operations new to NFSv4.2 */
3594*f44e1126SVitaliy Gusev         OP_CB_OFFLOAD                   = 15,
3595*f44e1126SVitaliy Gusev 
3596*f44e1126SVitaliy Gusev         OP_CB_ILLEGAL                   = 10044
3597*f44e1126SVitaliy Gusev };
3598*f44e1126SVitaliy Gusev 
3599*f44e1126SVitaliy Gusev union nfs_cb_argop4 switch (nfs_cb_opnum4 argop) {
3600*f44e1126SVitaliy Gusev  case OP_CB_GETATTR:
3601*f44e1126SVitaliy Gusev       CB_GETATTR4args           opcbgetattr;
3602*f44e1126SVitaliy Gusev 
3603*f44e1126SVitaliy Gusev  /* New NFSv4.1 operations */
3604*f44e1126SVitaliy Gusev  case OP_CB_RECALL:
3605*f44e1126SVitaliy Gusev       CB_RECALL4args            opcbrecall;
3606*f44e1126SVitaliy Gusev  case OP_CB_LAYOUTRECALL:
3607*f44e1126SVitaliy Gusev       CB_LAYOUTRECALL4args      opcblayoutrecall;
3608*f44e1126SVitaliy Gusev  case OP_CB_NOTIFY:
3609*f44e1126SVitaliy Gusev       CB_NOTIFY4args            opcbnotify;
3610*f44e1126SVitaliy Gusev  case OP_CB_PUSH_DELEG:
3611*f44e1126SVitaliy Gusev       CB_PUSH_DELEG4args        opcbpush_deleg;
3612*f44e1126SVitaliy Gusev  case OP_CB_RECALL_ANY:
3613*f44e1126SVitaliy Gusev       CB_RECALL_ANY4args        opcbrecall_any;
3614*f44e1126SVitaliy Gusev  case OP_CB_RECALLABLE_OBJ_AVAIL:
3615*f44e1126SVitaliy Gusev       CB_RECALLABLE_OBJ_AVAIL4args opcbrecallable_obj_avail;
3616*f44e1126SVitaliy Gusev  case OP_CB_RECALL_SLOT:
3617*f44e1126SVitaliy Gusev       CB_RECALL_SLOT4args       opcbrecall_slot;
3618*f44e1126SVitaliy Gusev  case OP_CB_SEQUENCE:
3619*f44e1126SVitaliy Gusev       CB_SEQUENCE4args          opcbsequence;
3620*f44e1126SVitaliy Gusev  case OP_CB_WANTS_CANCELLED:
3621*f44e1126SVitaliy Gusev       CB_WANTS_CANCELLED4args   opcbwants_cancelled;
3622*f44e1126SVitaliy Gusev  case OP_CB_NOTIFY_LOCK:
3623*f44e1126SVitaliy Gusev       CB_NOTIFY_LOCK4args       opcbnotify_lock;
3624*f44e1126SVitaliy Gusev  case OP_CB_NOTIFY_DEVICEID:
3625*f44e1126SVitaliy Gusev       CB_NOTIFY_DEVICEID4args   opcbnotify_deviceid;
3626*f44e1126SVitaliy Gusev 
3627*f44e1126SVitaliy Gusev  /* New NFSv4.2 operations */
3628*f44e1126SVitaliy Gusev  case OP_CB_OFFLOAD:
3629*f44e1126SVitaliy Gusev       CB_OFFLOAD4args           opcboffload;
3630*f44e1126SVitaliy Gusev 
3631*f44e1126SVitaliy Gusev  case OP_CB_ILLEGAL:            void;
3632*f44e1126SVitaliy Gusev };
3633*f44e1126SVitaliy Gusev 
3634*f44e1126SVitaliy Gusev union nfs_cb_resop4 switch (nfs_cb_opnum4 resop) {
3635*f44e1126SVitaliy Gusev  case OP_CB_GETATTR:    CB_GETATTR4res  opcbgetattr;
3636*f44e1126SVitaliy Gusev  case OP_CB_RECALL:     CB_RECALL4res   opcbrecall;
3637*f44e1126SVitaliy Gusev 
3638*f44e1126SVitaliy Gusev  /* New NFSv4.1 operations */
3639*f44e1126SVitaliy Gusev  case OP_CB_LAYOUTRECALL:
3640*f44e1126SVitaliy Gusev                         CB_LAYOUTRECALL4res
3641*f44e1126SVitaliy Gusev                                         opcblayoutrecall;
3642*f44e1126SVitaliy Gusev 
3643*f44e1126SVitaliy Gusev  case OP_CB_NOTIFY:     CB_NOTIFY4res   opcbnotify;
3644*f44e1126SVitaliy Gusev 
3645*f44e1126SVitaliy Gusev  case OP_CB_PUSH_DELEG: CB_PUSH_DELEG4res
3646*f44e1126SVitaliy Gusev                                         opcbpush_deleg;
3647*f44e1126SVitaliy Gusev 
3648*f44e1126SVitaliy Gusev  case OP_CB_RECALL_ANY: CB_RECALL_ANY4res
3649*f44e1126SVitaliy Gusev                                         opcbrecall_any;
3650*f44e1126SVitaliy Gusev 
3651*f44e1126SVitaliy Gusev  case OP_CB_RECALLABLE_OBJ_AVAIL:
3652*f44e1126SVitaliy Gusev                         CB_RECALLABLE_OBJ_AVAIL4res
3653*f44e1126SVitaliy Gusev                                 opcbrecallable_obj_avail;
3654*f44e1126SVitaliy Gusev 
3655*f44e1126SVitaliy Gusev  case OP_CB_RECALL_SLOT:
3656*f44e1126SVitaliy Gusev                         CB_RECALL_SLOT4res
3657*f44e1126SVitaliy Gusev                                         opcbrecall_slot;
3658*f44e1126SVitaliy Gusev 
3659*f44e1126SVitaliy Gusev  case OP_CB_SEQUENCE:   CB_SEQUENCE4res opcbsequence;
3660*f44e1126SVitaliy Gusev 
3661*f44e1126SVitaliy Gusev  case OP_CB_WANTS_CANCELLED:
3662*f44e1126SVitaliy Gusev                         CB_WANTS_CANCELLED4res
3663*f44e1126SVitaliy Gusev                                 opcbwants_cancelled;
3664*f44e1126SVitaliy Gusev 
3665*f44e1126SVitaliy Gusev  case OP_CB_NOTIFY_LOCK:
3666*f44e1126SVitaliy Gusev                         CB_NOTIFY_LOCK4res
3667*f44e1126SVitaliy Gusev                                         opcbnotify_lock;
3668*f44e1126SVitaliy Gusev 
3669*f44e1126SVitaliy Gusev  case OP_CB_NOTIFY_DEVICEID:
3670*f44e1126SVitaliy Gusev                         CB_NOTIFY_DEVICEID4res
3671*f44e1126SVitaliy Gusev                                         opcbnotify_deviceid;
3672*f44e1126SVitaliy Gusev 
3673*f44e1126SVitaliy Gusev  /* New NFSv4.2 operations */
3674*f44e1126SVitaliy Gusev  case OP_CB_OFFLOAD:    CB_OFFLOAD4res  opcboffload;
3675*f44e1126SVitaliy Gusev 
3676*f44e1126SVitaliy Gusev  /* Not new operation */
3677*f44e1126SVitaliy Gusev  case OP_CB_ILLEGAL:    CB_ILLEGAL4res  opcbillegal;
36787c478bd9Sstevel@tonic-gate };
36797c478bd9Sstevel@tonic-gate 
3680bbe876c0SMarcel Telka 
36817c478bd9Sstevel@tonic-gate struct CB_COMPOUND4args {
3682bbe876c0SMarcel Telka         utf8str_cs      tag;
3683bbe876c0SMarcel Telka         uint32_t        minorversion;
3684bbe876c0SMarcel Telka         uint32_t        callback_ident;
3685bbe876c0SMarcel Telka         nfs_cb_argop4   argarray<>;
36867c478bd9Sstevel@tonic-gate };
36877c478bd9Sstevel@tonic-gate 
36887c478bd9Sstevel@tonic-gate struct CB_COMPOUND4res {
3689*f44e1126SVitaliy Gusev         nfsstat4 status;
3690bbe876c0SMarcel Telka         utf8str_cs      tag;
3691bbe876c0SMarcel Telka         nfs_cb_resop4   resarray<>;
36927c478bd9Sstevel@tonic-gate };
36937c478bd9Sstevel@tonic-gate 
36947c478bd9Sstevel@tonic-gate 
3695bbe876c0SMarcel Telka 
36967c478bd9Sstevel@tonic-gate /*
3697bbe876c0SMarcel Telka  * Program number is in the transient range, since the client
36987c478bd9Sstevel@tonic-gate  * will assign the exact transient program number and provide
3699*f44e1126SVitaliy Gusev  * that to the server via the CREATE_SESSION or
3700*f44e1126SVitaliy Gusev  * BACKCHANNEL_CTL operations.
37017c478bd9Sstevel@tonic-gate  */
37027c478bd9Sstevel@tonic-gate program NFS4_CALLBACK {
3703bbe876c0SMarcel Telka         version NFS_CB {
3704bbe876c0SMarcel Telka                 void
3705bbe876c0SMarcel Telka                         CB_NULL(void) = 0;
3706bbe876c0SMarcel Telka                 CB_COMPOUND4res
3707bbe876c0SMarcel Telka                         CB_COMPOUND(CB_COMPOUND4args) = 1;
3708bbe876c0SMarcel Telka         } = 1;
37097c478bd9Sstevel@tonic-gate } = 0x40000000;
3710