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