Home | History | Annotate | Download | only in nfs
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef _NFS4_KPROT_H
     27 #define	_NFS4_KPROT_H
     28 
     29 /*
     30  * Kernel specific version.
     31  * NFS Version 4 protocol definitions.  From nfs4_prot.x rev 1.119.
     32  */
     33 
     34 #ifdef __cplusplus
     35 extern "C" {
     36 #endif
     37 
     38 #include <rpc/rpc.h>
     39 #ifdef _KERNEL
     40 #include <rpc/rpc_rdma.h>
     41 #endif
     42 #include <sys/stream.h>
     43 
     44 #define	NFS4_FHSIZE 128
     45 #define	NFS4_VERIFIER_SIZE 8
     46 
     47 /*
     48  * Reasonable upper bounds to catch badly behaving partners
     49  */
     50 #define	NFS4_OPAQUE_LIMIT	1024
     51 #define	NFS4_COMPOUND_LIMIT	2048
     52 #define	NFS4_FS_LOCATIONS_LIMIT	65536
     53 #define	NFS4_ACL_LIMIT		65536
     54 #define	NFS4_SECINFO_LIMIT	65536
     55 #define	NFS4_FATTR4_LIMIT	1048576
     56 #define	NFS4_DATA_LIMIT		134217728
     57 
     58 enum nfs_ftype4 {
     59 	NF4REG = 1,
     60 	NF4DIR = 2,
     61 	NF4BLK = 3,
     62 	NF4CHR = 4,
     63 	NF4LNK = 5,
     64 	NF4SOCK = 6,
     65 	NF4FIFO = 7,
     66 	NF4ATTRDIR = 8,
     67 	NF4NAMEDATTR = 9
     68 };
     69 typedef enum nfs_ftype4 nfs_ftype4;
     70 
     71 enum nfsstat4 {
     72 	NFS4_OK = 0,
     73 	NFS4ERR_PERM = 1,
     74 	NFS4ERR_NOENT = 2,
     75 	NFS4ERR_IO = 5,
     76 	NFS4ERR_NXIO = 6,
     77 	NFS4ERR_ACCESS = 13,
     78 	NFS4ERR_EXIST = 17,
     79 	NFS4ERR_XDEV = 18,
     80 	NFS4ERR_NOTDIR = 20,
     81 	NFS4ERR_ISDIR = 21,
     82 	NFS4ERR_INVAL = 22,
     83 	NFS4ERR_FBIG = 27,
     84 	NFS4ERR_NOSPC = 28,
     85 	NFS4ERR_ROFS = 30,
     86 	NFS4ERR_MLINK = 31,
     87 	NFS4ERR_NAMETOOLONG = 63,
     88 	NFS4ERR_NOTEMPTY = 66,
     89 	NFS4ERR_DQUOT = 69,
     90 	NFS4ERR_STALE = 70,
     91 	NFS4ERR_BADHANDLE = 10001,
     92 	NFS4ERR_BAD_COOKIE = 10003,
     93 	NFS4ERR_NOTSUPP = 10004,
     94 	NFS4ERR_TOOSMALL = 10005,
     95 	NFS4ERR_SERVERFAULT = 10006,
     96 	NFS4ERR_BADTYPE = 10007,
     97 	NFS4ERR_DELAY = 10008,
     98 	NFS4ERR_SAME = 10009,
     99 	NFS4ERR_DENIED = 10010,
    100 	NFS4ERR_EXPIRED = 10011,
    101 	NFS4ERR_LOCKED = 10012,
    102 	NFS4ERR_GRACE = 10013,
    103 	NFS4ERR_FHEXPIRED = 10014,
    104 	NFS4ERR_SHARE_DENIED = 10015,
    105 	NFS4ERR_WRONGSEC = 10016,
    106 	NFS4ERR_CLID_INUSE = 10017,
    107 	NFS4ERR_RESOURCE = 10018,
    108 	NFS4ERR_MOVED = 10019,
    109 	NFS4ERR_NOFILEHANDLE = 10020,
    110 	NFS4ERR_MINOR_VERS_MISMATCH = 10021,
    111 	NFS4ERR_STALE_CLIENTID = 10022,
    112 	NFS4ERR_STALE_STATEID = 10023,
    113 	NFS4ERR_OLD_STATEID = 10024,
    114 	NFS4ERR_BAD_STATEID = 10025,
    115 	NFS4ERR_BAD_SEQID = 10026,
    116 	NFS4ERR_NOT_SAME = 10027,
    117 	NFS4ERR_LOCK_RANGE = 10028,
    118 	NFS4ERR_SYMLINK = 10029,
    119 	NFS4ERR_RESTOREFH = 10030,
    120 	NFS4ERR_LEASE_MOVED = 10031,
    121 	NFS4ERR_ATTRNOTSUPP = 10032,
    122 	NFS4ERR_NO_GRACE = 10033,
    123 	NFS4ERR_RECLAIM_BAD = 10034,
    124 	NFS4ERR_RECLAIM_CONFLICT = 10035,
    125 	NFS4ERR_BADXDR = 10036,
    126 	NFS4ERR_LOCKS_HELD = 10037,
    127 	NFS4ERR_OPENMODE = 10038,
    128 	NFS4ERR_BADOWNER = 10039,
    129 	NFS4ERR_BADCHAR = 10040,
    130 	NFS4ERR_BADNAME = 10041,
    131 	NFS4ERR_BAD_RANGE = 10042,
    132 	NFS4ERR_LOCK_NOTSUPP = 10043,
    133 	NFS4ERR_OP_ILLEGAL = 10044,
    134 	NFS4ERR_DEADLOCK = 10045,
    135 	NFS4ERR_FILE_OPEN = 10046,
    136 	NFS4ERR_ADMIN_REVOKED = 10047,
    137 	NFS4ERR_CB_PATH_DOWN = 10048
    138 };
    139 typedef enum nfsstat4 nfsstat4;
    140 
    141 /*
    142  * A bitmap can only be 56 bits, treat it as a uint64_t for now
    143  */
    144 typedef uint64_t bitmap4;
    145 
    146 typedef uint64_t offset4;
    147 
    148 typedef uint32_t count4;
    149 
    150 typedef uint64_t length4;
    151 
    152 typedef uint64_t clientid4;
    153 
    154 typedef uint32_t seqid4;
    155 
    156 typedef struct {
    157 	uint_t utf8string_len;
    158 	char *utf8string_val;
    159 } utf8string;
    160 
    161 typedef utf8string component4;
    162 
    163 typedef struct {
    164 	uint_t pathname4_len;
    165 	component4 *pathname4_val;
    166 } pathname4;
    167 
    168 typedef uint64_t nfs_lockid4;
    169 
    170 typedef uint64_t nfs_cookie4;
    171 
    172 typedef utf8string linktext4;
    173 
    174 typedef struct {
    175 	uint_t sec_oid4_len;
    176 	char *sec_oid4_val;
    177 } sec_oid4;
    178 
    179 typedef uint32_t qop4;
    180 
    181 typedef uint32_t mode4;
    182 
    183 typedef uint64_t changeid4;
    184 
    185 typedef uint64_t verifier4;
    186 
    187 struct nfstime4 {
    188 	int64_t seconds;
    189 	uint32_t nseconds;
    190 };
    191 typedef struct nfstime4 nfstime4;
    192 
    193 enum time_how4 {
    194 	SET_TO_SERVER_TIME4 = 0,
    195 	SET_TO_CLIENT_TIME4 = 1
    196 };
    197 typedef enum time_how4 time_how4;
    198 
    199 struct settime4 {
    200 	time_how4 set_it;
    201 	nfstime4 time;
    202 };
    203 typedef struct settime4 settime4;
    204 
    205 typedef struct {
    206 	uint_t nfs_fh4_len;
    207 	char *nfs_fh4_val;
    208 } nfs_fh4;
    209 
    210 struct fsid4 {
    211 	uint64_t major;
    212 	uint64_t minor;
    213 };
    214 typedef struct fsid4 fsid4;
    215 
    216 struct fs_location4 {
    217 	uint_t server_len;
    218 	utf8string *server_val;
    219 	pathname4 rootpath;
    220 };
    221 typedef struct fs_location4 fs_location4;
    222 
    223 struct fs_locations4 {
    224 	pathname4 fs_root;
    225 	uint_t locations_len;
    226 	fs_location4 *locations_val;
    227 };
    228 typedef struct fs_locations4 fs_locations4;
    229 
    230 /*
    231  * ACL support
    232  */
    233 
    234 #define	ACL4_SUPPORT_ALLOW_ACL 0x00000001
    235 #define	ACL4_SUPPORT_DENY_ACL 0x00000002
    236 #define	ACL4_SUPPORT_AUDIT_ACL 0x00000004
    237 #define	ACL4_SUPPORT_ALARM_ACL 0x00000008
    238 
    239 typedef uint32_t acetype4;
    240 #define	ACE4_ACCESS_ALLOWED_ACE_TYPE 0x00000000
    241 #define	ACE4_ACCESS_DENIED_ACE_TYPE 0x00000001
    242 #define	ACE4_SYSTEM_AUDIT_ACE_TYPE 0x00000002
    243 #define	ACE4_SYSTEM_ALARM_ACE_TYPE 0x00000003
    244 
    245 typedef uint32_t aceflag4;
    246 #define	ACE4_FILE_INHERIT_ACE 0x00000001
    247 #define	ACE4_DIRECTORY_INHERIT_ACE 0x00000002
    248 #define	ACE4_NO_PROPAGATE_INHERIT_ACE 0x00000004
    249 #define	ACE4_INHERIT_ONLY_ACE 0x00000008
    250 #define	ACE4_SUCCESSFUL_ACCESS_ACE_FLAG 0x00000010
    251 #define	ACE4_FAILED_ACCESS_ACE_FLAG 0x00000020
    252 #define	ACE4_IDENTIFIER_GROUP 0x00000040
    253 /*
    254  * This defines all valid flag bits, as defined by RFC 3530.  If
    255  * any additional flag bits are deemed part of the NFSv4 spec,
    256  * you must also add them to the definition below.
    257  */
    258 #define	ACE4_VALID_FLAG_BITS (\
    259     ACE4_FILE_INHERIT_ACE | \
    260     ACE4_DIRECTORY_INHERIT_ACE | \
    261     ACE4_NO_PROPAGATE_INHERIT_ACE | \
    262     ACE4_INHERIT_ONLY_ACE | \
    263     ACE4_SUCCESSFUL_ACCESS_ACE_FLAG | \
    264     ACE4_FAILED_ACCESS_ACE_FLAG | \
    265     ACE4_IDENTIFIER_GROUP)
    266 
    267 typedef uint32_t acemask4;
    268 #define	ACE4_READ_DATA 0x00000001
    269 #define	ACE4_LIST_DIRECTORY 0x00000001
    270 #define	ACE4_WRITE_DATA 0x00000002
    271 #define	ACE4_ADD_FILE 0x00000002
    272 #define	ACE4_APPEND_DATA 0x00000004
    273 #define	ACE4_ADD_SUBDIRECTORY 0x00000004
    274 #define	ACE4_READ_NAMED_ATTRS 0x00000008
    275 #define	ACE4_WRITE_NAMED_ATTRS 0x00000010
    276 #define	ACE4_EXECUTE 0x00000020
    277 #define	ACE4_DELETE_CHILD 0x00000040
    278 #define	ACE4_READ_ATTRIBUTES 0x00000080
    279 #define	ACE4_WRITE_ATTRIBUTES 0x00000100
    280 #define	ACE4_DELETE 0x00010000
    281 #define	ACE4_READ_ACL 0x00020000
    282 #define	ACE4_WRITE_ACL 0x00040000
    283 #define	ACE4_WRITE_OWNER 0x00080000
    284 #define	ACE4_SYNCHRONIZE 0x00100000
    285 #define	ACE4_GENERIC_READ 0x00120081
    286 #define	ACE4_GENERIC_WRITE 0x00160106
    287 #define	ACE4_GENERIC_EXECUTE 0x001200A0
    288 /*
    289  * This defines all valid access mask bits, as defined by RFC 3530.  If
    290  * any additional access mask bits are deemed part of the NFSv4 spec,
    291  * you must also add them to the definition below.
    292  */
    293 #define	ACE4_VALID_MASK_BITS (\
    294     ACE4_READ_DATA | \
    295     ACE4_LIST_DIRECTORY | \
    296     ACE4_WRITE_DATA | \
    297     ACE4_ADD_FILE | \
    298     ACE4_APPEND_DATA | \
    299     ACE4_ADD_SUBDIRECTORY | \
    300     ACE4_READ_NAMED_ATTRS | \
    301     ACE4_WRITE_NAMED_ATTRS | \
    302     ACE4_EXECUTE | \
    303     ACE4_DELETE_CHILD | \
    304     ACE4_READ_ATTRIBUTES | \
    305     ACE4_WRITE_ATTRIBUTES | \
    306     ACE4_DELETE | \
    307     ACE4_READ_ACL | \
    308     ACE4_WRITE_ACL | \
    309     ACE4_WRITE_OWNER | \
    310     ACE4_SYNCHRONIZE)
    311 
    312 /* Used to signify an undefined value for an acemask4 */
    313 #define	ACE4_MASK_UNDEFINED 0x80000000
    314 
    315 #define	ACE4_WHO_OWNER		"OWNER@"
    316 #define	ACE4_WHO_GROUP		"GROUP@"
    317 #define	ACE4_WHO_EVERYONE	"EVERYONE@"
    318 
    319 struct nfsace4 {
    320 	acetype4 type;
    321 	aceflag4 flag;
    322 	acemask4 access_mask;
    323 	utf8string who;
    324 };
    325 typedef struct nfsace4 nfsace4;
    326 #define	MODE4_SUID 0x800
    327 #define	MODE4_SGID 0x400
    328 #define	MODE4_SVTX 0x200
    329 #define	MODE4_RUSR 0x100
    330 #define	MODE4_WUSR 0x080
    331 #define	MODE4_XUSR 0x040
    332 #define	MODE4_RGRP 0x020
    333 #define	MODE4_WGRP 0x010
    334 #define	MODE4_XGRP 0x008
    335 #define	MODE4_ROTH 0x004
    336 #define	MODE4_WOTH 0x002
    337 #define	MODE4_XOTH 0x001
    338 
    339 /*
    340  * ACL conversion helpers
    341  */
    342 
    343 typedef enum {
    344 	ace4_unused,
    345 	ace4_user_obj,
    346 	ace4_user,
    347 	ace4_group, /* includes GROUP and GROUP_OBJ */
    348 	ace4_other_obj
    349 } ace4_to_aent_state_t;
    350 
    351 typedef struct ace4vals {
    352 	utf8string *key; /* NB: not allocated here; points to existing utf8 */
    353 	avl_node_t avl;
    354 	acemask4 mask;
    355 	acemask4 allowed;
    356 	acemask4 denied;
    357 	int aent_type;
    358 } ace4vals_t;
    359 
    360 typedef struct ace4_list {
    361 	ace4vals_t user_obj;
    362 	avl_tree_t user;
    363 	int numusers;
    364 	ace4vals_t group_obj;
    365 	avl_tree_t group;
    366 	int numgroups;
    367 	ace4vals_t other_obj;
    368 	acemask4 acl_mask;
    369 	int hasmask;
    370 	int dfacl_flag;
    371 	ace4_to_aent_state_t state;
    372 	int seen; /* bitmask of all aclent_t a_type values seen */
    373 } ace4_list_t;
    374 
    375 struct specdata4 {
    376 	uint32_t specdata1;
    377 	uint32_t specdata2;
    378 };
    379 typedef struct specdata4 specdata4;
    380 #define	FH4_PERSISTENT 0x00000000
    381 #define	FH4_NOEXPIRE_WITH_OPEN 0x00000001
    382 #define	FH4_VOLATILE_ANY 0x00000002
    383 #define	FH4_VOL_MIGRATION 0x00000004
    384 #define	FH4_VOL_RENAME 0x00000008
    385 
    386 typedef bitmap4 fattr4_supported_attrs;
    387 
    388 typedef nfs_ftype4 fattr4_type;
    389 
    390 typedef uint32_t fattr4_fh_expire_type;
    391 
    392 typedef changeid4 fattr4_change;
    393 
    394 typedef uint64_t fattr4_size;
    395 
    396 typedef bool_t fattr4_link_support;
    397 
    398 typedef bool_t fattr4_symlink_support;
    399 
    400 typedef bool_t fattr4_named_attr;
    401 
    402 typedef fsid4 fattr4_fsid;
    403 
    404 typedef bool_t fattr4_unique_handles;
    405 
    406 typedef uint32_t fattr4_lease_time;
    407 
    408 typedef nfsstat4 fattr4_rdattr_error;
    409 
    410 typedef struct {
    411 	uint_t fattr4_acl_len;
    412 	nfsace4 *fattr4_acl_val;
    413 } fattr4_acl;
    414 
    415 typedef uint32_t fattr4_aclsupport;
    416 
    417 typedef bool_t fattr4_archive;
    418 
    419 typedef bool_t fattr4_cansettime;
    420 
    421 typedef bool_t fattr4_case_insensitive;
    422 
    423 typedef bool_t fattr4_case_preserving;
    424 
    425 typedef bool_t fattr4_chown_restricted;
    426 
    427 typedef uint64_t fattr4_fileid;
    428 
    429 typedef uint64_t fattr4_files_avail;
    430 
    431 typedef nfs_fh4 fattr4_filehandle;
    432 
    433 typedef uint64_t fattr4_files_free;
    434 
    435 typedef uint64_t fattr4_files_total;
    436 
    437 typedef fs_locations4 fattr4_fs_locations;
    438 
    439 typedef bool_t fattr4_hidden;
    440 
    441 typedef bool_t fattr4_homogeneous;
    442 
    443 typedef uint64_t fattr4_maxfilesize;
    444 
    445 typedef uint32_t fattr4_maxlink;
    446 
    447 typedef uint32_t fattr4_maxname;
    448 
    449 typedef uint64_t fattr4_maxread;
    450 
    451 typedef uint64_t fattr4_maxwrite;
    452 
    453 typedef utf8string fattr4_mimetype;
    454 
    455 typedef mode4 fattr4_mode;
    456 
    457 typedef uint64_t fattr4_mounted_on_fileid;
    458 
    459 typedef bool_t fattr4_no_trunc;
    460 
    461 typedef uint32_t fattr4_numlinks;
    462 
    463 typedef utf8string fattr4_owner;
    464 
    465 typedef utf8string fattr4_owner_group;
    466 
    467 typedef uint64_t fattr4_quota_avail_hard;
    468 
    469 typedef uint64_t fattr4_quota_avail_soft;
    470 
    471 typedef uint64_t fattr4_quota_used;
    472 
    473 typedef specdata4 fattr4_rawdev;
    474 
    475 typedef uint64_t fattr4_space_avail;
    476 
    477 typedef uint64_t fattr4_space_free;
    478 
    479 typedef uint64_t fattr4_space_total;
    480 
    481 typedef uint64_t fattr4_space_used;
    482 
    483 typedef bool_t fattr4_system;
    484 
    485 typedef nfstime4 fattr4_time_access;
    486 
    487 typedef settime4 fattr4_time_access_set;
    488 
    489 typedef nfstime4 fattr4_time_backup;
    490 
    491 typedef nfstime4 fattr4_time_create;
    492 
    493 typedef nfstime4 fattr4_time_delta;
    494 
    495 typedef nfstime4 fattr4_time_metadata;
    496 
    497 typedef nfstime4 fattr4_time_modify;
    498 
    499 typedef settime4 fattr4_time_modify_set;
    500 #define	FATTR4_SUPPORTED_ATTRS 0
    501 #define	FATTR4_TYPE 1
    502 #define	FATTR4_FH_EXPIRE_TYPE 2
    503 #define	FATTR4_CHANGE 3
    504 #define	FATTR4_SIZE 4
    505 #define	FATTR4_LINK_SUPPORT 5
    506 #define	FATTR4_SYMLINK_SUPPORT 6
    507 #define	FATTR4_NAMED_ATTR 7
    508 #define	FATTR4_FSID 8
    509 #define	FATTR4_UNIQUE_HANDLES 9
    510 #define	FATTR4_LEASE_TIME 10
    511 #define	FATTR4_RDATTR_ERROR 11
    512 #define	FATTR4_FILEHANDLE 19
    513 #define	FATTR4_ACL 12
    514 #define	FATTR4_ACLSUPPORT 13
    515 #define	FATTR4_ARCHIVE 14
    516 #define	FATTR4_CANSETTIME 15
    517 #define	FATTR4_CASE_INSENSITIVE 16
    518 #define	FATTR4_CASE_PRESERVING 17
    519 #define	FATTR4_CHOWN_RESTRICTED 18
    520 #define	FATTR4_FILEID 20
    521 #define	FATTR4_FILES_AVAIL 21
    522 #define	FATTR4_FILES_FREE 22
    523 #define	FATTR4_FILES_TOTAL 23
    524 #define	FATTR4_FS_LOCATIONS 24
    525 #define	FATTR4_HIDDEN 25
    526 #define	FATTR4_HOMOGENEOUS 26
    527 #define	FATTR4_MAXFILESIZE 27
    528 #define	FATTR4_MAXLINK 28
    529 #define	FATTR4_MAXNAME 29
    530 #define	FATTR4_MAXREAD 30
    531 #define	FATTR4_MAXWRITE 31
    532 #define	FATTR4_MIMETYPE 32
    533 #define	FATTR4_MODE 33
    534 #define	FATTR4_NO_TRUNC 34
    535 #define	FATTR4_NUMLINKS 35
    536 #define	FATTR4_OWNER 36
    537 #define	FATTR4_OWNER_GROUP 37
    538 #define	FATTR4_QUOTA_AVAIL_HARD 38
    539 #define	FATTR4_QUOTA_AVAIL_SOFT 39
    540 #define	FATTR4_QUOTA_USED 40
    541 #define	FATTR4_RAWDEV 41
    542 #define	FATTR4_SPACE_AVAIL 42
    543 #define	FATTR4_SPACE_FREE 43
    544 #define	FATTR4_SPACE_TOTAL 44
    545 #define	FATTR4_SPACE_USED 45
    546 #define	FATTR4_SYSTEM 46
    547 #define	FATTR4_TIME_ACCESS 47
    548 #define	FATTR4_TIME_ACCESS_SET 48
    549 #define	FATTR4_TIME_BACKUP 49
    550 #define	FATTR4_TIME_CREATE 50
    551 #define	FATTR4_TIME_DELTA 51
    552 #define	FATTR4_TIME_METADATA 52
    553 #define	FATTR4_TIME_MODIFY 53
    554 #define	FATTR4_TIME_MODIFY_SET 54
    555 #define	FATTR4_MOUNTED_ON_FILEID 55
    556 
    557 struct fattr4 {
    558 	bitmap4 attrmask;
    559 	char *attrlist4;
    560 	uint_t attrlist4_len;
    561 };
    562 typedef struct fattr4 fattr4;
    563 
    564 struct change_info4 {
    565 	bool_t atomic;
    566 	changeid4 before;
    567 	changeid4 after;
    568 };
    569 typedef struct change_info4 change_info4;
    570 
    571 struct clientaddr4 {
    572 	char *r_netid;
    573 	char *r_addr;
    574 };
    575 typedef struct clientaddr4 clientaddr4;
    576 
    577 struct cb_client4 {
    578 	uint32_t cb_program;
    579 	clientaddr4 cb_location;
    580 };
    581 typedef struct cb_client4 cb_client4;
    582 
    583 struct stateid4 {
    584 	uint32_t seqid;
    585 	char other[12];
    586 };
    587 typedef struct stateid4 stateid4;
    588 
    589 struct nfs_client_id4 {
    590 	verifier4 verifier;
    591 	uint_t id_len;
    592 	char *id_val;
    593 };
    594 typedef struct nfs_client_id4 nfs_client_id4;
    595 
    596 struct open_owner4 {
    597 	clientid4 clientid;
    598 	uint_t owner_len;
    599 	char *owner_val;
    600 };
    601 typedef struct open_owner4 open_owner4;
    602 
    603 struct lock_owner4 {
    604 	clientid4 clientid;
    605 	uint_t owner_len;
    606 	char *owner_val;
    607 };
    608 typedef struct lock_owner4 lock_owner4;
    609 
    610 enum nfs_lock_type4 {
    611 	READ_LT = 1,
    612 	WRITE_LT = 2,
    613 	READW_LT = 3,
    614 	WRITEW_LT = 4
    615 };
    616 typedef enum nfs_lock_type4 nfs_lock_type4;
    617 #define	ACCESS4_READ 0x00000001
    618 #define	ACCESS4_LOOKUP 0x00000002
    619 #define	ACCESS4_MODIFY 0x00000004
    620 #define	ACCESS4_EXTEND 0x00000008
    621 #define	ACCESS4_DELETE 0x00000010
    622 #define	ACCESS4_EXECUTE 0x00000020
    623 
    624 struct ACCESS4args {
    625 	uint32_t access;
    626 };
    627 typedef struct ACCESS4args ACCESS4args;
    628 
    629 struct ACCESS4res {
    630 	nfsstat4 status;
    631 	uint32_t supported;
    632 	uint32_t access;
    633 };
    634 typedef struct ACCESS4res ACCESS4res;
    635 
    636 struct CLOSE4args {
    637 	seqid4 seqid;
    638 	stateid4 open_stateid;
    639 };
    640 typedef struct CLOSE4args CLOSE4args;
    641 
    642 struct CLOSE4res {
    643 	nfsstat4 status;
    644 	stateid4 open_stateid;
    645 };
    646 typedef struct CLOSE4res CLOSE4res;
    647 
    648 struct COMMIT4args {
    649 	offset4 offset;
    650 	count4 count;
    651 };
    652 typedef struct COMMIT4args COMMIT4args;
    653 
    654 struct COMMIT4res {
    655 	nfsstat4 status;
    656 	verifier4 writeverf;
    657 };
    658 typedef struct COMMIT4res COMMIT4res;
    659 
    660 struct CREATE4args {
    661 	nfs_ftype4 type;
    662 	union {
    663 		linktext4 linkdata;
    664 		specdata4 devdata;
    665 	} ftype4_u;
    666 	component4 objname;
    667 	fattr4 createattrs;
    668 };
    669 typedef struct CREATE4args CREATE4args;
    670 
    671 struct CREATE4cargs {
    672 	nfs_ftype4 type;
    673 	union {
    674 		char *clinkdata;
    675 		specdata4 devdata;
    676 	} ftype4_u;
    677 	char *cname;
    678 	fattr4 createattrs;
    679 };
    680 typedef struct CREATE4cargs CREATE4cargs;
    681 
    682 struct CREATE4res {
    683 	nfsstat4 status;
    684 	change_info4 cinfo;
    685 	bitmap4 attrset;
    686 };
    687 typedef struct CREATE4res CREATE4res;
    688 
    689 struct DELEGPURGE4args {
    690 	clientid4 clientid;
    691 };
    692 typedef struct DELEGPURGE4args DELEGPURGE4args;
    693 
    694 struct DELEGPURGE4res {
    695 	nfsstat4 status;
    696 };
    697 typedef struct DELEGPURGE4res DELEGPURGE4res;
    698 
    699 struct DELEGRETURN4args {
    700 	stateid4 deleg_stateid;
    701 };
    702 typedef struct DELEGRETURN4args DELEGRETURN4args;
    703 
    704 struct DELEGRETURN4res {
    705 	nfsstat4 status;
    706 };
    707 typedef struct DELEGRETURN4res DELEGRETURN4res;
    708 
    709 struct mntinfo4;
    710 
    711 struct GETATTR4args {
    712 	bitmap4 attr_request;
    713 	struct mntinfo4 *mi;
    714 };
    715 typedef struct GETATTR4args GETATTR4args;
    716 
    717 struct nfs4_ga_ext_res;
    718 
    719 struct nfs4_ga_res {
    720 	vattr_t				n4g_va;
    721 	unsigned			n4g_change_valid:1;
    722 	unsigned			n4g_mon_fid_valid:1;
    723 	unsigned			n4g_fsid_valid:1;
    724 	uint_t				n4g_attrerr;
    725 	uint_t				n4g_attrwhy;
    726 	bitmap4				n4g_resbmap;
    727 	fattr4_change			n4g_change;
    728 	fattr4_fsid			n4g_fsid;
    729 	fattr4_mounted_on_fileid	n4g_mon_fid;
    730 	struct nfs4_ga_ext_res		*n4g_ext_res;
    731 	vsecattr_t			n4g_vsa;
    732 };
    733 typedef struct nfs4_ga_res nfs4_ga_res_t;
    734 
    735 struct GETATTR4res {
    736 	nfsstat4 status;
    737 	fattr4 obj_attributes;
    738 	nfsstat4	ga_status;
    739 	struct nfs4_ga_res ga_res;
    740 };
    741 typedef struct GETATTR4res GETATTR4res;
    742 
    743 struct GETFH4res {
    744 	nfsstat4 status;
    745 	nfs_fh4 object;
    746 };
    747 typedef struct GETFH4res GETFH4res;
    748 
    749 struct LINK4args {
    750 	component4 newname;
    751 };
    752 typedef struct LINK4args LINK4args;
    753 
    754 struct LINK4cargs {
    755 	char *cnewname;
    756 };
    757 typedef struct LINK4cargs LINK4cargs;
    758 
    759 struct LINK4res {
    760 	nfsstat4 status;
    761 	change_info4 cinfo;
    762 };
    763 typedef struct LINK4res LINK4res;
    764 
    765 struct open_to_lock_owner4 {
    766 	seqid4 open_seqid;
    767 	stateid4 open_stateid;
    768 	seqid4 lock_seqid;
    769 	lock_owner4 lock_owner;
    770 };
    771 typedef struct open_to_lock_owner4 open_to_lock_owner4;
    772 
    773 struct exist_lock_owner4 {
    774 	stateid4 lock_stateid;
    775 	seqid4 lock_seqid;
    776 };
    777 typedef struct exist_lock_owner4 exist_lock_owner4;
    778 
    779 struct locker4 {
    780 	bool_t new_lock_owner;
    781 	union {
    782 		open_to_lock_owner4 open_owner;
    783 		exist_lock_owner4 lock_owner;
    784 	} locker4_u;
    785 };
    786 typedef struct locker4 locker4;
    787 
    788 struct LOCK4args {
    789 	nfs_lock_type4 locktype;
    790 	bool_t reclaim;
    791 	offset4 offset;
    792 	length4 length;
    793 	locker4 locker;
    794 };
    795 typedef struct LOCK4args LOCK4args;
    796 
    797 struct LOCK4denied {
    798 	offset4 offset;
    799 	length4 length;
    800 	nfs_lock_type4 locktype;
    801 	lock_owner4 owner;
    802 };
    803 typedef struct LOCK4denied LOCK4denied;
    804 
    805 struct LOCK4res {
    806 	nfsstat4 status;
    807 	union {
    808 		stateid4 lock_stateid;
    809 		LOCK4denied denied;
    810 	} LOCK4res_u;
    811 };
    812 typedef struct LOCK4res LOCK4res;
    813 
    814 struct LOCKT4args {
    815 	nfs_lock_type4 locktype;
    816 	offset4 offset;
    817 	length4 length;
    818 	lock_owner4 owner;
    819 };
    820 typedef struct LOCKT4args LOCKT4args;
    821 
    822 struct LOCKT4res {
    823 	nfsstat4 status;
    824 	LOCK4denied denied;
    825 };
    826 typedef struct LOCKT4res LOCKT4res;
    827 
    828 struct LOCKU4args {
    829 	nfs_lock_type4 locktype;
    830 	seqid4 seqid;
    831 	stateid4 lock_stateid;
    832 	offset4 offset;
    833 	length4 length;
    834 };
    835 typedef struct LOCKU4args LOCKU4args;
    836 
    837 struct LOCKU4res {
    838 	nfsstat4 status;
    839 	stateid4 lock_stateid;
    840 };
    841 typedef struct LOCKU4res LOCKU4res;
    842 
    843 struct LOOKUP4args {
    844 	component4 objname;
    845 };
    846 typedef struct LOOKUP4args LOOKUP4args;
    847 
    848 struct LOOKUP4cargs {
    849 	char *cname;
    850 };
    851 typedef struct LOOKUP4cargs LOOKUP4cargs;
    852 
    853 struct LOOKUP4res {
    854 	nfsstat4 status;
    855 };
    856 typedef struct LOOKUP4res LOOKUP4res;
    857 
    858 struct LOOKUPP4res {
    859 	nfsstat4 status;
    860 };
    861 typedef struct LOOKUPP4res LOOKUPP4res;
    862 
    863 struct NVERIFY4args {
    864 	fattr4 obj_attributes;
    865 };
    866 typedef struct NVERIFY4args NVERIFY4args;
    867 
    868 struct NVERIFY4res {
    869 	nfsstat4 status;
    870 };
    871 typedef struct NVERIFY4res NVERIFY4res;
    872 
    873 enum createmode4 {
    874 	UNCHECKED4 = 0,
    875 	GUARDED4 = 1,
    876 	EXCLUSIVE4 = 2
    877 };
    878 typedef enum createmode4 createmode4;
    879 
    880 enum opentype4 {
    881 	OPEN4_NOCREATE = 0,
    882 	OPEN4_CREATE = 1
    883 };
    884 typedef enum opentype4 opentype4;
    885 
    886 enum limit_by4 {
    887 	NFS_LIMIT_SIZE = 1,
    888 	NFS_LIMIT_BLOCKS = 2
    889 };
    890 typedef enum limit_by4 limit_by4;
    891 
    892 struct nfs_modified_limit4 {
    893 	uint32_t num_blocks;
    894 	uint32_t bytes_per_block;
    895 };
    896 typedef struct nfs_modified_limit4 nfs_modified_limit4;
    897 
    898 struct nfs_space_limit4 {
    899 	limit_by4 limitby;
    900 	union {
    901 		uint64_t filesize;
    902 		nfs_modified_limit4 mod_blocks;
    903 	} nfs_space_limit4_u;
    904 };
    905 typedef struct nfs_space_limit4 nfs_space_limit4;
    906 #define	OPEN4_SHARE_ACCESS_READ 0x00000001
    907 #define	OPEN4_SHARE_ACCESS_WRITE 0x00000002
    908 #define	OPEN4_SHARE_ACCESS_BOTH 0x00000003
    909 #define	OPEN4_SHARE_DENY_NONE 0x00000000
    910 #define	OPEN4_SHARE_DENY_READ 0x00000001
    911 #define	OPEN4_SHARE_DENY_WRITE 0x00000002
    912 #define	OPEN4_SHARE_DENY_BOTH 0x00000003
    913 
    914 enum open_delegation_type4 {