Home | History | Annotate | Download | only in rpcsvc
      1  0  stevel /*
      2  0  stevel  * CDDL HEADER START
      3  0  stevel  *
      4  0  stevel  * The contents of this file are subject to the terms of the
      5  0  stevel  * Common Development and Distribution License, Version 1.0 only
      6  0  stevel  * (the "License").  You may not use this file except in compliance
      7  0  stevel  * with the License.
      8  0  stevel  *
      9  0  stevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  0  stevel  * or http://www.opensolaris.org/os/licensing.
     11  0  stevel  * See the License for the specific language governing permissions
     12  0  stevel  * and limitations under the License.
     13  0  stevel  *
     14  0  stevel  * When distributing Covered Code, include this CDDL HEADER in each
     15  0  stevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  0  stevel  * If applicable, add the following below this CDDL HEADER, with the
     17  0  stevel  * fields enclosed by brackets "[]" replaced with your own identifying
     18  0  stevel  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  0  stevel  *
     20  0  stevel  * CDDL HEADER END
     21  0  stevel  */
     22  0  stevel /*
     23  0  stevel  *  Copyright (C) The Internet Society (1998-2003).
     24  0  stevel  *  All Rights Reserved.
     25  0  stevel  */
     26  0  stevel 
     27  0  stevel /*
     28  0  stevel  *	nfs4_prot.x
     29  0  stevel  */
     30  0  stevel 
     31  0  stevel %#pragma ident	"@(#)nfs4_prot.x	1.122"
     32  0  stevel 
     33  0  stevel /*
     34  0  stevel  * Basic typedefs for RFC 1832 data type definitions
     35  0  stevel  */
     36  0  stevel 
     37  0  stevel /*
     38  0  stevel  * typedef int		int32_t;
     39  0  stevel  * typedef unsigned int	uint32_t;
     40  0  stevel  * typedef hyper		int64_t;
     41  0  stevel  * typedef unsigned hyper	uint64_t;
     42  0  stevel  */
     43  0  stevel 
     44  0  stevel /*
     45  0  stevel  * Sizes
     46  0  stevel  */
     47  0  stevel const NFS4_FHSIZE		= 128;
     48  0  stevel const NFS4_VERIFIER_SIZE	= 8;
     49  0  stevel const NFS4_OPAQUE_LIMIT		= 1024;
     50  0  stevel 
     51  0  stevel /*
     52  0  stevel  * File types
     53  0  stevel  */
     54  0  stevel enum nfs_ftype4 {
     55  0  stevel 	NF4REG		= 1,	/* Regular File */
     56  0  stevel 	NF4DIR		= 2,	/* Directory */
     57  0  stevel 	NF4BLK		= 3,	/* Special File - block device */
     58  0  stevel 	NF4CHR		= 4,	/* Special File - character device */
     59  0  stevel 	NF4LNK		= 5,	/* Symbolic Link */
     60  0  stevel 	NF4SOCK		= 6,	/* Special File - socket */
     61  0  stevel 	NF4FIFO		= 7,	/* Special File - fifo */
     62  0  stevel 	NF4ATTRDIR	= 8,	/* Attribute Directory */
     63  0  stevel 	NF4NAMEDATTR	= 9	/* Named Attribute */
     64  0  stevel };
     65  0  stevel 
     66  0  stevel /*
     67  0  stevel  * Error status
     68  0  stevel  */
     69  0  stevel enum nfsstat4 {
     70  0  stevel 	NFS4_OK			= 0,    /* everything is okay      */
     71  0  stevel 	NFS4ERR_PERM		= 1,    /* caller not privileged   */
     72  0  stevel 	NFS4ERR_NOENT		= 2,    /* no such file/directory  */
     73  0  stevel 	NFS4ERR_IO		= 5,    /* hard I/O error          */
     74  0  stevel 	NFS4ERR_NXIO		= 6,    /* no such device          */
     75  0  stevel 	NFS4ERR_ACCESS		= 13,   /* access denied           */
     76  0  stevel 	NFS4ERR_EXIST		= 17,   /* file already exists     */
     77  0  stevel 	NFS4ERR_XDEV		= 18,   /* different filesystems   */
     78  0  stevel 	/* Unused/reserved        19 */
     79  0  stevel 	NFS4ERR_NOTDIR		= 20,   /* should be a directory   */
     80  0  stevel 	NFS4ERR_ISDIR		= 21,   /* should not be directory */
     81  0  stevel 	NFS4ERR_INVAL		= 22,   /* invalid argument        */
     82  0  stevel 	NFS4ERR_FBIG		= 27,   /* file exceeds server max */
     83  0  stevel 	NFS4ERR_NOSPC		= 28,   /* no space on filesystem  */
     84  0  stevel 	NFS4ERR_ROFS		= 30,   /* read-only filesystem    */
     85  0  stevel 	NFS4ERR_MLINK		= 31,   /* too many hard links     */
     86  0  stevel 	NFS4ERR_NAMETOOLONG	= 63,   /* name exceeds server max */
     87  0  stevel 	NFS4ERR_NOTEMPTY	= 66,   /* directory not empty     */
     88  0  stevel 	NFS4ERR_DQUOT		= 69,   /* hard quota limit reached*/
     89  0  stevel 	NFS4ERR_STALE		= 70,   /* file no longer exists   */
     90  0  stevel 	NFS4ERR_BADHANDLE	= 10001,/* Illegal filehandle      */
     91  0  stevel 	NFS4ERR_BAD_COOKIE	= 10003,/* READDIR cookie is stale */
     92  0  stevel 	NFS4ERR_NOTSUPP		= 10004,/* operation not supported */
     93  0  stevel 	NFS4ERR_TOOSMALL	= 10005,/* response limit exceeded */
     94  0  stevel 	NFS4ERR_SERVERFAULT	= 10006,/* undefined server error  */
     95  0  stevel 	NFS4ERR_BADTYPE		= 10007,/* type invalid for CREATE */
     96  0  stevel 	NFS4ERR_DELAY		= 10008,/* file "busy" - retry     */
     97  0  stevel 	NFS4ERR_SAME		= 10009,/* nverify says attrs same */
     98  0  stevel 	NFS4ERR_DENIED		= 10010,/* lock unavailable	   */
     99  0  stevel 	NFS4ERR_EXPIRED		= 10011,/* lock lease expired	   */
    100  0  stevel 	NFS4ERR_LOCKED		= 10012,/* I/O failed due to lock  */
    101  0  stevel 	NFS4ERR_GRACE		= 10013,/* in grace period	   */
    102  0  stevel 	NFS4ERR_FHEXPIRED	= 10014,/* filehandle expired	   */
    103  0  stevel 	NFS4ERR_SHARE_DENIED	= 10015,/* share reserve denied	   */
    104  0  stevel 	NFS4ERR_WRONGSEC	= 10016,/* wrong security flavor   */
    105  0  stevel 	NFS4ERR_CLID_INUSE	= 10017,/* clientid in use	   */
    106  0  stevel 	NFS4ERR_RESOURCE	= 10018,/* resource exhaustion	   */
    107  0  stevel 	NFS4ERR_MOVED		= 10019,/* filesystem relocated	   */
    108  0  stevel 	NFS4ERR_NOFILEHANDLE	= 10020,/* current FH is not set   */
    109  0  stevel 	NFS4ERR_MINOR_VERS_MISMATCH = 10021,/* minor vers not supp */
    110  0  stevel 	NFS4ERR_STALE_CLIENTID	= 10022,/* server has rebooted     */
    111  0  stevel 	NFS4ERR_STALE_STATEID	= 10023,/* server has rebooted     */
    112  0  stevel 	NFS4ERR_OLD_STATEID	= 10024,/* state is out of sync    */
    113  0  stevel 	NFS4ERR_BAD_STATEID	= 10025,/* incorrect stateid       */
    114  0  stevel 	NFS4ERR_BAD_SEQID	= 10026,/* request is out of seq.  */
    115  0  stevel 	NFS4ERR_NOT_SAME	= 10027,/* verify - attrs not same */
    116  0  stevel 	NFS4ERR_LOCK_RANGE	= 10028,/* lock range not supported*/
    117  0  stevel 	NFS4ERR_SYMLINK		= 10029,/* should be file/directory*/
    118  0  stevel 	NFS4ERR_RESTOREFH	= 10030,/* no saved filehandle     */
    119  0  stevel 	NFS4ERR_LEASE_MOVED	= 10031,/* some filesystem moved   */
    120  0  stevel 	NFS4ERR_ATTRNOTSUPP	= 10032,/* recommended attr not sup*/
    121  0  stevel 	NFS4ERR_NO_GRACE	= 10033,/* reclaim outside of grace*/
    122  0  stevel 	NFS4ERR_RECLAIM_BAD	= 10034,/* reclaim error at server */
    123  0  stevel 	NFS4ERR_RECLAIM_CONFLICT = 10035,/* conflict on reclaim    */
    124  0  stevel 	NFS4ERR_BADXDR		= 10036,/* XDR decode failed       */
    125  0  stevel 	NFS4ERR_LOCKS_HELD	= 10037,/* file locks held at CLOSE*/
    126  0  stevel 	NFS4ERR_OPENMODE	= 10038,/* conflict in OPEN and I/O*/
    127  0  stevel 	NFS4ERR_BADOWNER	= 10039,/* owner translation bad   */
    128  0  stevel 	NFS4ERR_BADCHAR		= 10040,/* utf-8 char not supported*/
    129  0  stevel 	NFS4ERR_BADNAME		= 10041,/* name not supported      */
    130  0  stevel 	NFS4ERR_BAD_RANGE	= 10042,/* lock range not supported*/
    131  0  stevel 	NFS4ERR_LOCK_NOTSUPP	= 10043,/* no atomic up/downgrade  */
    132  0  stevel 	NFS4ERR_OP_ILLEGAL	= 10044,/* undefined operation     */
    133  0  stevel 	NFS4ERR_DEADLOCK	= 10045,/* file locking deadlock   */
    134  0  stevel 	NFS4ERR_FILE_OPEN	= 10046,/* open file blocks op.    */
    135  0  stevel 	NFS4ERR_ADMIN_REVOKED	= 10047,/* lockowner state revoked */
    136  0  stevel 	NFS4ERR_CB_PATH_DOWN    = 10048 /* callback path down      */
    137  0  stevel };
    138  0  stevel 
    139  0  stevel /*
    140  0  stevel  * Basic data types
    141  0  stevel  */
    142  0  stevel typedef uint32_t	bitmap4<>;
    143  0  stevel typedef uint64_t	offset4;
    144  0  stevel typedef uint32_t	count4;
    145  0  stevel typedef	uint64_t	length4;
    146  0  stevel typedef uint64_t	clientid4;
    147  0  stevel typedef uint32_t	seqid4;
    148  0  stevel typedef opaque		utf8string<>;
    149  0  stevel typedef utf8string	utf8str_cis;
    150  0  stevel typedef utf8string	utf8str_cs;
    151  0  stevel typedef utf8string	utf8str_mixed;
    152  0  stevel typedef utf8str_cs	component4;
    153  0  stevel typedef	component4	pathname4<>;
    154  0  stevel typedef uint64_t	nfs_lockid4;
    155  0  stevel typedef	uint64_t	nfs_cookie4;
    156  0  stevel typedef	utf8str_cs	linktext4;
    157  0  stevel typedef opaque		sec_oid4<>;
    158  0  stevel typedef uint32_t	qop4;
    159  0  stevel typedef	uint32_t	mode4;
    160  0  stevel typedef	uint64_t	changeid4;
    161  0  stevel typedef opaque		verifier4[NFS4_VERIFIER_SIZE];
    162  0  stevel 
    163  0  stevel /*
    164  0  stevel  * Timeval
    165  0  stevel  */
    166  0  stevel struct nfstime4 {
    167  0  stevel 	int64_t		seconds;
    168  0  stevel 	uint32_t	nseconds;
    169  0  stevel };
    170  0  stevel 
    171  0  stevel enum time_how4 {
    172  0  stevel 	SET_TO_SERVER_TIME4 = 0,
    173  0  stevel 	SET_TO_CLIENT_TIME4 = 1
    174  0  stevel };
    175  0  stevel 
    176  0  stevel union settime4 switch (time_how4 set_it) {
    177  0  stevel  case SET_TO_CLIENT_TIME4:
    178  0  stevel 	 nfstime4	time;
    179  0  stevel  default:
    180  0  stevel 	 void;
    181  0  stevel };
    182  0  stevel 
    183  0  stevel /*
    184  0  stevel  * File access handle
    185  0  stevel  */
    186  0  stevel typedef	opaque	nfs_fh4<NFS4_FHSIZE>;
    187  0  stevel 
    188  0  stevel 
    189  0  stevel /*
    190  0  stevel  * File attribute definitions
    191  0  stevel  */
    192  0  stevel 
    193  0  stevel /*
    194  0  stevel  * FSID structure for major/minor
    195  0  stevel  */
    196  0  stevel struct fsid4 {
    197  0  stevel 	uint64_t	major;
    198  0  stevel 	uint64_t	minor;
    199  0  stevel };
    200  0  stevel 
    201  0  stevel /*
    202  0  stevel  * Filesystem locations attribute for relocation/migration
    203  0  stevel  */
    204  0  stevel struct fs_location4 {
    205  0  stevel 	utf8str_cis	server<>;
    206  0  stevel 	pathname4	rootpath;
    207  0  stevel };
    208  0  stevel 
    209  0  stevel struct fs_locations4 {
    210  0  stevel 	pathname4	fs_root;
    211  0  stevel 	fs_location4	locations<>;
    212  0  stevel };
    213  0  stevel 
    214  0  stevel /*
    215  0  stevel  * Various Access Control Entry definitions
    216  0  stevel  */
    217  0  stevel 
    218  0  stevel /*
    219  0  stevel  * Mask that indicates which Access Control Entries are supported.
    220  0  stevel  * Values for the fattr4_aclsupport attribute.
    221  0  stevel  */
    222  0  stevel const ACL4_SUPPORT_ALLOW_ACL	= 0x00000001;
    223  0  stevel const ACL4_SUPPORT_DENY_ACL	= 0x00000002;
    224  0  stevel const ACL4_SUPPORT_AUDIT_ACL	= 0x00000004;
    225  0  stevel const ACL4_SUPPORT_ALARM_ACL	= 0x00000008;
    226  0  stevel 
    227  0  stevel 
    228  0  stevel typedef	uint32_t	acetype4;
    229  0  stevel 
    230  0  stevel /*
    231  0  stevel  * acetype4 values, others can be added as needed.
    232  0  stevel  */
    233  0  stevel const ACE4_ACCESS_ALLOWED_ACE_TYPE	= 0x00000000;
    234  0  stevel const ACE4_ACCESS_DENIED_ACE_TYPE	= 0x00000001;
    235  0  stevel const ACE4_SYSTEM_AUDIT_ACE_TYPE	= 0x00000002;
    236  0  stevel const ACE4_SYSTEM_ALARM_ACE_TYPE	= 0x00000003;
    237  0  stevel 
    238  0  stevel 
    239  0  stevel /*
    240  0  stevel  * ACE flag
    241  0  stevel  */
    242  0  stevel typedef uint32_t aceflag4;
    243  0  stevel 
    244  0  stevel /*
    245  0  stevel  * ACE flag values
    246  0  stevel  */
    247  0  stevel const ACE4_FILE_INHERIT_ACE		= 0x00000001;
    248  0  stevel const ACE4_DIRECTORY_INHERIT_ACE	= 0x00000002;
    249  0  stevel const ACE4_NO_PROPAGATE_INHERIT_ACE	= 0x00000004;
    250  0  stevel const ACE4_INHERIT_ONLY_ACE		= 0x00000008;
    251  0  stevel const ACE4_SUCCESSFUL_ACCESS_ACE_FLAG	= 0x00000010;
    252  0  stevel const ACE4_FAILED_ACCESS_ACE_FLAG	= 0x00000020;
    253  0  stevel const ACE4_IDENTIFIER_GROUP		= 0x00000040;
    254  0  stevel 
    255  0  stevel 
    256  0  stevel /*
    257  0  stevel  * ACE mask
    258  0  stevel  */
    259  0  stevel typedef uint32_t	acemask4;
    260  0  stevel 
    261  0  stevel /*
    262  0  stevel  * ACE mask values
    263  0  stevel  */
    264  0  stevel const ACE4_READ_DATA		= 0x00000001;
    265  0  stevel const ACE4_LIST_DIRECTORY	= 0x00000001;
    266  0  stevel const ACE4_WRITE_DATA		= 0x00000002;
    267  0  stevel const ACE4_ADD_FILE		= 0x00000002;
    268  0  stevel const ACE4_APPEND_DATA		= 0x00000004;
    269  0  stevel const ACE4_ADD_SUBDIRECTORY	= 0x00000004;
    270  0  stevel const ACE4_READ_NAMED_ATTRS	= 0x00000008;
    271  0  stevel const ACE4_WRITE_NAMED_ATTRS	= 0x00000010;
    272  0  stevel const ACE4_EXECUTE		= 0x00000020;
    273  0  stevel const ACE4_DELETE_CHILD		= 0x00000040;
    274  0  stevel const ACE4_READ_ATTRIBUTES	= 0x00000080;
    275  0  stevel const ACE4_WRITE_ATTRIBUTES	= 0x00000100;
    276  0  stevel 
    277  0  stevel const ACE4_DELETE		= 0x00010000;
    278  0  stevel const ACE4_READ_ACL		= 0x00020000;
    279  0  stevel const ACE4_WRITE_ACL		= 0x00040000;
    280  0  stevel const ACE4_WRITE_OWNER		= 0x00080000;
    281  0  stevel const ACE4_SYNCHRONIZE		= 0x00100000;
    282  0  stevel 
    283  0  stevel /*
    284  0  stevel  * ACE4_GENERIC_READ -- defined as combination of
    285  0  stevel  *	ACE4_READ_ACL |
    286  0  stevel  *	ACE4_READ_DATA |
    287  0  stevel  *	ACE4_READ_ATTRIBUTES |
    288  0  stevel  *	ACE4_SYNCHRONIZE
    289  0  stevel  */
    290  0  stevel 
    291  0  stevel const ACE4_GENERIC_READ	= 0x00120081;
    292  0  stevel 
    293  0  stevel /*
    294  0  stevel  * ACE4_GENERIC_WRITE -- defined as combination of
    295  0  stevel  *	ACE4_READ_ACL |
    296  0  stevel  *	ACE4_WRITE_DATA |
    297  0  stevel  *	ACE4_WRITE_ATTRIBUTES |
    298  0  stevel  *	ACE4_WRITE_ACL |
    299  0  stevel  *	ACE4_APPEND_DATA |
    300  0  stevel  *	ACE4_SYNCHRONIZE
    301  0  stevel  */
    302  0  stevel const ACE4_GENERIC_WRITE = 0x00160106;
    303  0  stevel 
    304  0  stevel 
    305  0  stevel /*
    306  0  stevel  * ACE4_GENERIC_EXECUTE -- defined as combination of
    307  0  stevel  *	ACE4_READ_ACL
    308  0  stevel  *	ACE4_READ_ATTRIBUTES
    309  0  stevel  *	ACE4_EXECUTE
    310  0  stevel  *	ACE4_SYNCHRONIZE
    311  0  stevel  */
    312  0  stevel const ACE4_GENERIC_EXECUTE = 0x001200A0;
    313  0  stevel 
    314  0  stevel 
    315  0  stevel /*
    316  0  stevel  * Access Control Entry definition
    317  0  stevel  */
    318  0  stevel struct nfsace4 {
    319  0  stevel 	acetype4	type;
    320  0  stevel 	aceflag4	flag;
    321  0  stevel 	acemask4	access_mask;
    322  0  stevel 	utf8str_mixed	who;
    323  0  stevel };
    324  0  stevel 
    325  0  stevel /*
    326  0  stevel  * Field definitions for the fattr4_mode attribute
    327  0  stevel  */
    328  0  stevel const MODE4_SUID = 0x800;  /* set user id on execution */
    329  0  stevel const MODE4_SGID = 0x400;  /* set group id on execution */
    330  0  stevel const MODE4_SVTX = 0x200;  /* save text even after use */
    331  0  stevel const MODE4_RUSR = 0x100;  /* read permission: owner */
    332  0  stevel const MODE4_WUSR = 0x080;  /* write permission: owner */
    333  0  stevel const MODE4_XUSR = 0x040;  /* execute permission: owner */
    334  0  stevel const MODE4_RGRP = 0x020;  /* read permission: group */
    335  0  stevel const MODE4_WGRP = 0x010;  /* write permission: group */
    336  0  stevel const MODE4_XGRP = 0x008;  /* execute permission: group */
    337  0  stevel const MODE4_ROTH = 0x004;  /* read permission: other */
    338  0  stevel const MODE4_WOTH = 0x002;  /* write permission: other */
    339  0  stevel const MODE4_XOTH = 0x001;  /* execute permission: other */
    340  0  stevel 
    341  0  stevel /*
    342  0  stevel  * Special data/attribute associated with
    343  0  stevel  * file types NF4BLK and NF4CHR.
    344  0  stevel  */
    345  0  stevel struct specdata4 {
    346  0  stevel 	uint32_t	specdata1;	/* major device number */
    347  0  stevel 	uint32_t	specdata2;	/* minor device number */
    348  0  stevel };
    349  0  stevel 
    350  0  stevel /*
    351  0  stevel  * Values for fattr4_fh_expire_type
    352  0  stevel  */
    353  0  stevel const	FH4_PERSISTENT		= 0x00000000;
    354  0  stevel const	FH4_NOEXPIRE_WITH_OPEN	= 0x00000001;
    355  0  stevel const	FH4_VOLATILE_ANY	= 0x00000002;
    356  0  stevel const	FH4_VOL_MIGRATION	= 0x00000004;
    357  0  stevel const	FH4_VOL_RENAME		= 0x00000008;
    358  0  stevel 
    359  0  stevel 
    360  0  stevel typedef bitmap4		fattr4_supported_attrs;
    361  0  stevel typedef nfs_ftype4	fattr4_type;
    362  0  stevel typedef	uint32_t	fattr4_fh_expire_type;
    363  0  stevel typedef	changeid4	fattr4_change;
    364  0  stevel typedef uint64_t	fattr4_size;
    365  0  stevel typedef	bool		fattr4_link_support;
    366  0  stevel typedef	bool		fattr4_symlink_support;
    367  0  stevel typedef bool		fattr4_named_attr;
    368  0  stevel typedef fsid4		fattr4_fsid;
    369  0  stevel typedef	bool		fattr4_unique_handles;
    370  0  stevel typedef uint32_t	fattr4_lease_time;
    371  0  stevel typedef	nfsstat4	fattr4_rdattr_error;
    372  0  stevel 
    373  0  stevel typedef nfsace4		fattr4_acl<>;
    374  0  stevel typedef uint32_t	fattr4_aclsupport;
    375  0  stevel typedef	bool		fattr4_archive;
    376  0  stevel typedef	bool		fattr4_cansettime;
    377  0  stevel typedef	bool		fattr4_case_insensitive;
    378  0  stevel typedef	bool		fattr4_case_preserving;
    379  0  stevel typedef	bool		fattr4_chown_restricted;
    380  0  stevel typedef uint64_t	fattr4_fileid;
    381  0  stevel typedef uint64_t	fattr4_files_avail;
    382  0  stevel typedef nfs_fh4		fattr4_filehandle;
    383  0  stevel typedef uint64_t	fattr4_files_free;
    384  0  stevel typedef uint64_t	fattr4_files_total;
    385  0  stevel typedef fs_locations4	fattr4_fs_locations;
    386  0  stevel typedef bool		fattr4_hidden;
    387  0  stevel typedef bool		fattr4_homogeneous;
    388  0  stevel typedef uint64_t	fattr4_maxfilesize;
    389  0  stevel typedef uint32_t	fattr4_maxlink;
    390  0  stevel typedef uint32_t	fattr4_maxname;
    391  0  stevel typedef uint64_t	fattr4_maxread;
    392  0  stevel typedef uint64_t	fattr4_maxwrite;
    393  0  stevel typedef	utf8str_cs	fattr4_mimetype;
    394  0  stevel typedef mode4		fattr4_mode;
    395  0  stevel typedef uint64_t	fattr4_mounted_on_fileid;
    396  0  stevel typedef	bool		fattr4_no_trunc;
    397  0  stevel typedef	uint32_t	fattr4_numlinks;
    398  0  stevel typedef	utf8str_mixed	fattr4_owner;
    399  0  stevel typedef	utf8str_mixed	fattr4_owner_group;
    400  0  stevel typedef uint64_t	fattr4_quota_avail_hard;
    401  0  stevel typedef uint64_t	fattr4_quota_avail_soft;
    402  0  stevel typedef uint64_t	fattr4_quota_used;
    403  0  stevel typedef specdata4	fattr4_rawdev;
    404  0  stevel typedef uint64_t	fattr4_space_avail;
    405  0  stevel typedef uint64_t	fattr4_space_free;
    406  0  stevel typedef uint64_t	fattr4_space_total;
    407  0  stevel typedef uint64_t	fattr4_space_used;
    408  0  stevel typedef bool		fattr4_system;
    409  0  stevel typedef nfstime4	fattr4_time_access;
    410  0  stevel typedef settime4	fattr4_time_access_set;
    411  0  stevel typedef nfstime4	fattr4_time_backup;
    412  0  stevel typedef nfstime4	fattr4_time_create;
    413  0  stevel typedef nfstime4	fattr4_time_delta;
    414  0  stevel typedef nfstime4	fattr4_time_metadata;
    415  0  stevel typedef nfstime4	fattr4_time_modify;
    416  0  stevel typedef settime4	fattr4_time_modify_set;
    417  0  stevel 
    418  0  stevel 
    419  0  stevel /*
    420  0  stevel  * Mandatory Attributes
    421  0  stevel  */
    422  0  stevel const FATTR4_SUPPORTED_ATTRS	= 0;
    423  0  stevel const FATTR4_TYPE		= 1;
    424  0  stevel const FATTR4_FH_EXPIRE_TYPE	= 2;
    425  0  stevel const FATTR4_CHANGE		= 3;
    426  0  stevel const FATTR4_SIZE		= 4;
    427  0  stevel const FATTR4_LINK_SUPPORT	= 5;
    428  0  stevel const FATTR4_SYMLINK_SUPPORT	= 6;
    429  0  stevel const FATTR4_NAMED_ATTR		= 7;
    430  0  stevel const FATTR4_FSID		= 8;
    431  0  stevel const FATTR4_UNIQUE_HANDLES	= 9;
    432  0  stevel const FATTR4_LEASE_TIME		= 10;
    433  0  stevel const FATTR4_RDATTR_ERROR	= 11;
    434  0  stevel const FATTR4_FILEHANDLE		= 19;
    435  0  stevel 
    436  0  stevel /*
    437  0  stevel  * Recommended Attributes
    438  0  stevel  */
    439  0  stevel const FATTR4_ACL		= 12;
    440  0  stevel const FATTR4_ACLSUPPORT		= 13;
    441  0  stevel const FATTR4_ARCHIVE		= 14;
    442  0  stevel const FATTR4_CANSETTIME		= 15;
    443  0  stevel const FATTR4_CASE_INSENSITIVE	= 16;
    444  0  stevel const FATTR4_CASE_PRESERVING	= 17;
    445  0  stevel const FATTR4_CHOWN_RESTRICTED	= 18;
    446  0  stevel const FATTR4_FILEID		= 20;
    447  0  stevel const FATTR4_FILES_AVAIL	= 21;
    448  0  stevel const FATTR4_FILES_FREE		= 22;
    449  0  stevel const FATTR4_FILES_TOTAL	= 23;
    450  0  stevel const FATTR4_FS_LOCATIONS	= 24;
    451  0  stevel const FATTR4_HIDDEN		= 25;
    452  0  stevel const FATTR4_HOMOGENEOUS	= 26;
    453  0  stevel const FATTR4_MAXFILESIZE	= 27;
    454  0  stevel const FATTR4_MAXLINK		= 28;
    455  0  stevel const FATTR4_MAXNAME		= 29;
    456  0  stevel const FATTR4_MAXREAD		= 30;
    457  0  stevel const FATTR4_MAXWRITE		= 31;
    458  0  stevel const FATTR4_MIMETYPE		= 32;
    459  0  stevel const FATTR4_MODE		= 33;
    460  0  stevel const FATTR4_NO_TRUNC		= 34;
    461  0  stevel const FATTR4_NUMLINKS		= 35;
    462  0  stevel const FATTR4_OWNER		= 36;
    463  0  stevel const FATTR4_OWNER_GROUP	= 37;
    464  0  stevel const FATTR4_QUOTA_AVAIL_HARD	= 38;
    465  0  stevel const FATTR4_QUOTA_AVAIL_SOFT	= 39;
    466  0  stevel const FATTR4_QUOTA_USED		= 40;
    467  0  stevel const FATTR4_RAWDEV		= 41;
    468  0  stevel const FATTR4_SPACE_AVAIL	= 42;
    469  0  stevel const FATTR4_SPACE_FREE		= 43;
    470  0  stevel const FATTR4_SPACE_TOTAL	= 44;
    471  0  stevel const FATTR4_SPACE_USED		= 45;
    472  0  stevel const FATTR4_SYSTEM		= 46;
    473  0  stevel const FATTR4_TIME_ACCESS	= 47;
    474  0  stevel const FATTR4_TIME_ACCESS_SET	= 48;
    475  0  stevel const FATTR4_TIME_BACKUP	= 49;
    476  0  stevel const FATTR4_TIME_CREATE	= 50;
    477  0  stevel const FATTR4_TIME_DELTA		= 51;
    478  0  stevel const FATTR4_TIME_METADATA	= 52;
    479  0  stevel const FATTR4_TIME_MODIFY	= 53;
    480  0  stevel const FATTR4_TIME_MODIFY_SET	= 54;
    481  0  stevel const FATTR4_MOUNTED_ON_FILEID	= 55;
    482  0  stevel 
    483  0  stevel typedef	opaque	attrlist4<>;
    484  0  stevel 
    485  0  stevel /*
    486  0  stevel  * File attribute container
    487  0  stevel  */
    488  0  stevel struct fattr4 {
    489  0  stevel 	bitmap4		attrmask;
    490  0  stevel 	attrlist4	attr_vals;
    491  0  stevel };
    492  0  stevel 
    493  0  stevel /*
    494  0  stevel  * Change info for the client
    495  0  stevel  */
    496  0  stevel struct change_info4 {
    497  0  stevel 	bool		atomic;
    498  0  stevel 	changeid4	before;
    499  0  stevel 	changeid4	after;
    500  0  stevel };
    501  0  stevel 
    502  0  stevel struct clientaddr4 {
    503  0  stevel 	/* see struct rpcb in RFC 1833 */
    504  0  stevel 	string r_netid<>;		/* network id */
    505  0  stevel 	string r_addr<>;		/* universal address */
    506  0  stevel };
    507  0  stevel 
    508  0  stevel /*
    509  0  stevel  * Callback program info as provided by the client
    510  0  stevel  */
    511  0  stevel struct cb_client4 {
    512  0  stevel 	uint32_t	cb_program;
    513  0  stevel 	clientaddr4	cb_location;
    514  0  stevel };
    515  0  stevel 
    516  0  stevel /*
    517  0  stevel  * Stateid
    518  0  stevel  */
    519  0  stevel struct stateid4 {
    520  0  stevel 	uint32_t	seqid;
    521  0  stevel 	opaque		other[12];
    522  0  stevel };
    523  0  stevel 
    524  0  stevel /*
    525  0  stevel  * Client ID
    526  0  stevel  */
    527  0  stevel struct nfs_client_id4 {
    528  0  stevel 	verifier4	verifier;
    529  0  stevel 	opaque		id<NFS4_OPAQUE_LIMIT>;
    530  0  stevel };
    531  0  stevel 
    532  0  stevel struct open_owner4 {
    533  0  stevel 	clientid4	clientid;
    534  0  stevel 	opaque		owner<NFS4_OPAQUE_LIMIT>;
    535  0  stevel };
    536  0  stevel 
    537  0  stevel struct lock_owner4 {
    538  0  stevel 	clientid4	clientid;
    539  0  stevel 	opaque		owner<NFS4_OPAQUE_LIMIT>;
    540  0  stevel };
    541  0  stevel 
    542  0  stevel enum nfs_lock_type4 {
    543  0  stevel 	READ_LT		= 1,
    544  0  stevel 	WRITE_LT	= 2,
    545  0  stevel 	READW_LT	= 3,	/* blocking read */
    546  0  stevel 	WRITEW_LT	= 4	/* blocking write */
    547  0  stevel };
    548  0  stevel 
    549  0  stevel /*
    550  0  stevel  * ACCESS: Check access permission
    551  0  stevel  */
    552  0  stevel const ACCESS4_READ	= 0x00000001;
    553  0  stevel const ACCESS4_LOOKUP	= 0x00000002;
    554  0  stevel const ACCESS4_MODIFY	= 0x00000004;
    555  0  stevel const ACCESS4_EXTEND	= 0x00000008;
    556  0  stevel const ACCESS4_DELETE	= 0x00000010;
    557  0  stevel const ACCESS4_EXECUTE	= 0x00000020;
    558  0  stevel 
    559  0  stevel struct ACCESS4args {
    560  0  stevel 	/* CURRENT_FH: object */
    561  0  stevel 	uint32_t	access;
    562  0  stevel };
    563  0  stevel 
    564  0  stevel struct ACCESS4resok {
    565  0  stevel 	uint32_t	supported;
    566  0  stevel 	uint32_t	access;
    567  0  stevel };
    568  0  stevel 
    569  0  stevel union ACCESS4res switch (nfsstat4 status) {
    570  0  stevel  case NFS4_OK:
    571  0  stevel 	 ACCESS4resok	resok4;
    572  0  stevel  default:
    573  0  stevel 	 void;
    574  0  stevel };
    575  0  stevel 
    576  0  stevel /*
    577  0  stevel  * CLOSE: Close a file and release share reservations
    578  0  stevel  */
    579  0  stevel struct CLOSE4args {
    580  0  stevel 	/* CURRENT_FH: object */
    581  0  stevel 	seqid4		seqid;
    582  0  stevel 	stateid4	open_stateid;
    583  0  stevel };
    584  0  stevel 
    585  0  stevel union CLOSE4res switch (nfsstat4 status) {
    586  0  stevel  case NFS4_OK:
    587  0  stevel 	 stateid4	open_stateid;
    588  0  stevel  default:
    589  0  stevel 	 void;
    590  0  stevel };
    591  0  stevel 
    592  0  stevel /*
    593  0  stevel  * COMMIT: Commit cached data on server to stable storage
    594  0  stevel  */
    595  0  stevel struct COMMIT4args {
    596  0  stevel 	/* CURRENT_FH: file */
    597  0  stevel 	offset4		offset;
    598  0  stevel 	count4		count;
    599  0  stevel };
    600  0  stevel 
    601  0  stevel struct COMMIT4resok {
    602  0  stevel 	verifier4	writeverf;
    603  0  stevel };
    604  0  stevel 
    605  0  stevel 
    606  0  stevel union COMMIT4res switch (nfsstat4 status) {
    607  0  stevel  case NFS4_OK:
    608  0  stevel 	 COMMIT4resok	resok4;
    609  0  stevel  default:
    610  0  stevel 	 void;
    611  0  stevel };
    612  0  stevel 
    613  0  stevel /*
    614  0  stevel  * CREATE: Create a non-regular file
    615  0  stevel  */
    616  0  stevel union createtype4 switch (nfs_ftype4 type) {
    617  0  stevel  case NF4LNK:
    618  0  stevel 	 linktext4	linkdata;
    619  0  stevel  case NF4BLK:
    620  0  stevel  case NF4CHR:
    621  0  stevel 	 specdata4	devdata;
    622  0  stevel  case NF4SOCK:
    623  0  stevel  case NF4FIFO:
    624  0  stevel  case NF4DIR:
    625  0  stevel 	 void;
    626  0  stevel  default:
    627  0  stevel 	 void;		/* server should return NFS4ERR_BADTYPE */
    628  0  stevel };
    629  0  stevel 
    630  0  stevel struct CREATE4args {
    631  0  stevel 	/* CURRENT_FH: directory for creation */
    632  0  stevel 	createtype4	objtype;
    633  0  stevel 	component4	objname;
    634  0  stevel 	fattr4		createattrs;
    635  0  stevel };
    636  0  stevel 
    637  0  stevel struct CREATE4resok {
    638  0  stevel 	change_info4	cinfo;
    639  0  stevel 	bitmap4		attrset;	/* attributes set */
    640  0  stevel };
    641  0  stevel 
    642  0  stevel union CREATE4res switch (nfsstat4 status) {
    643  0  stevel  case NFS4_OK:
    644  0  stevel 	 CREATE4resok resok4;
    645  0  stevel  default:
    646  0  stevel 	 void;
    647  0  stevel };
    648  0  stevel 
    649  0  stevel /*
    650  0  stevel  * DELEGPURGE: Purge Delegations Awaiting Recovery
    651  0  stevel  */
    652  0  stevel struct DELEGPURGE4args {
    653  0  stevel 	clientid4	clientid;
    654  0  stevel };
    655  0  stevel 
    656  0  stevel struct DELEGPURGE4res {
    657  0  stevel 	nfsstat4	status;
    658  0  stevel };
    659  0  stevel 
    660  0  stevel /*
    661  0  stevel  * DELEGRETURN: Return a delegation
    662  0  stevel  */
    663  0  stevel struct DELEGRETURN4args {
    664  0  stevel 	/* CURRENT_FH: delegated file */
    665  0  stevel 	stateid4	deleg_stateid;
    666  0  stevel };
    667  0  stevel 
    668  0  stevel struct DELEGRETURN4res {
    669  0  stevel 	nfsstat4	status;
    670  0  stevel };
    671  0  stevel 
    672  0  stevel /*
    673  0  stevel  * GETATTR: Get file attributes
    674  0  stevel  */
    675  0  stevel struct GETATTR4args {
    676  0  stevel 	/* CURRENT_FH: directory or file */
    677  0  stevel 	bitmap4		attr_request;
    678  0  stevel };
    679  0  stevel 
    680  0  stevel struct GETATTR4resok {
    681  0  stevel 	fattr4		obj_attributes;
    682  0  stevel };
    683  0  stevel 
    684  0  stevel union GETATTR4res switch (nfsstat4 status) {
    685  0  stevel  case NFS4_OK:
    686  0  stevel 	 GETATTR4resok	resok4;
    687  0  stevel  default:
    688  0  stevel 	 void;
    689  0  stevel };
    690  0  stevel 
    691  0  stevel /*
    692  0  stevel  * GETFH: Get current filehandle
    693  0  stevel  */
    694  0  stevel struct GETFH4resok {
    695  0  stevel 	nfs_fh4		object;
    696  0  stevel };
    697  0  stevel 
    698  0  stevel union GETFH4res switch (nfsstat4 status) {
    699  0  stevel  case NFS4_OK:
    700  0  stevel 	GETFH4resok	resok4;
    701  0  stevel  default:
    702  0  stevel 	void;
    703  0  stevel };
    704  0  stevel 
    705  0  stevel /*
    706  0  stevel  * LINK: Create link to an object
    707  0  stevel  */
    708  0  stevel struct LINK4args {
    709  0  stevel 	/* SAVED_FH: source object */
    710  0  stevel 	/* CURRENT_FH: target directory */
    711  0  stevel 	component4	newname;
    712  0  stevel };
    713  0  stevel 
    714  0  stevel struct LINK4resok {
    715  0  stevel 	change_info4	cinfo;
    716  0  stevel };
    717  0  stevel 
    718  0  stevel union LINK4res switch (nfsstat4 status) {
    719  0  stevel  case NFS4_OK:
    720  0  stevel 	 LINK4resok resok4;
    721  0  stevel  default:
    722  0  stevel 	 void;
    723  0  stevel };
    724  0  stevel 
    725  0  stevel /*
    726  0  stevel  * For LOCK, transition from open_owner to new lock_owner
    727  0  stevel  */
    728  0  stevel struct open_to_lock_owner4 {
    729  0  stevel 	seqid4		open_seqid;
    730  0  stevel 	stateid4	open_stateid;
    731  0  stevel 	seqid4		lock_seqid;
    732  0  stevel 	lock_owner4	lock_owner;
    733  0  stevel };
    734  0  stevel 
    735  0  stevel /*
    736  0  stevel  * For LOCK, existing lock_owner continues to request file locks
    737  0  stevel  */
    738  0  stevel struct exist_lock_owner4 {
    739  0  stevel 	stateid4	lock_stateid;
    740  0  stevel 	seqid4		lock_seqid;
    741  0  stevel };
    742  0  stevel 
    743  0  stevel union locker4 switch (bool new_lock_owner) {
    744  0  stevel  case TRUE:
    745  0  stevel 	open_to_lock_owner4	open_owner;
    746  0  stevel  case FALSE:
    747  0  stevel 	exist_lock_owner4	lock_owner;
    748  0  stevel };
    749  0  stevel 
    750  0  stevel /*
    751  0  stevel  * LOCK/LOCKT/LOCKU: Record lock management
    752  0  stevel  */
    753  0  stevel struct LOCK4args {
    754  0  stevel 	/* CURRENT_FH: file */
    755  0  stevel 	nfs_lock_type4	locktype;
    756  0  stevel 	bool		reclaim;
    757  0  stevel 	offset4		offset;
    758  0  stevel 	length4		length;
    759  0  stevel 	locker4		locker;
    760  0  stevel };
    761  0  stevel 
    762  0  stevel struct LOCK4denied {
    763  0  stevel 	offset4		offset;
    764  0  stevel 	length4		length;
    765  0  stevel 	nfs_lock_type4	locktype;
    766  0  stevel 	lock_owner4	owner;
    767  0  stevel };
    768  0  stevel 
    769  0  stevel struct LOCK4resok {
    770  0  stevel 	stateid4	lock_stateid;
    771  0  stevel };
    772  0  stevel 
    773  0  stevel union LOCK4res switch (nfsstat4 status) {
    774  0  stevel  case NFS4_OK:
    775  0  stevel 	 LOCK4resok	resok4;
    776  0  stevel  case NFS4ERR_DENIED:
    777  0  stevel 	 LOCK4denied	denied;
    778  0  stevel  default:
    779  0  stevel 	 void;
    780  0  stevel };
    781  0  stevel 
    782  0  stevel struct LOCKT4args {
    783  0  stevel 	/* CURRENT_FH: file */
    784  0  stevel 	nfs_lock_type4	locktype;
    785  0  stevel 	offset4		offset;
    786  0  stevel 	length4		length;
    787  0  stevel 	lock_owner4	owner;
    788  0  stevel };
    789  0  stevel 
    790  0  stevel union LOCKT4res switch (nfsstat4 status) {
    791  0  stevel  case NFS4ERR_DENIED:
    792  0  stevel 	 LOCK4denied	denied;
    793  0  stevel  case NFS4_OK:
    794  0  stevel 	 void;
    795  0  stevel  default:
    796  0  stevel 	 void;
    797  0  stevel };
    798  0  stevel 
    799  0  stevel struct LOCKU4args {
    800  0  stevel 	/* CURRENT_FH: file */
    801  0  stevel 	nfs_lock_type4	locktype;
    802  0  stevel 	seqid4		seqid;
    803  0  stevel 	stateid4	lock_stateid;
    804  0  stevel 	offset4		offset;
    805  0  stevel 	length4		length;
    806  0  stevel };
    807  0  stevel 
    808  0  stevel union LOCKU4res switch (nfsstat4 status) {
    809  0  stevel  case	NFS4_OK:
    810  0  stevel 	 stateid4	lock_stateid;
    811  0  stevel  default:
    812  0  stevel 	 void;
    813  0  stevel };
    814  0  stevel 
    815  0  stevel /*
    816  0  stevel  * LOOKUP: Lookup filename
    817  0  stevel  */
    818  0  stevel struct LOOKUP4args {
    819  0  stevel 	/* CURRENT_FH: directory */
    820  0  stevel 	component4	objname;
    821  0  stevel };
    822  0  stevel 
    823  0  stevel struct LOOKUP4res {
    824  0  stevel 	/* CURRENT_FH: object */
    825  0  stevel 	nfsstat4	status;
    826  0  stevel };
    827  0  stevel 
    828  0  stevel /*
    829  0  stevel  * LOOKUPP: Lookup parent directory
    830  0  stevel  */
    831  0  stevel struct LOOKUPP4res {
    832  0  stevel 	/* CURRENT_FH: directory */
    833  0  stevel 	nfsstat4	status;
    834  0  stevel };
    835  0  stevel 
    836  0  stevel /*
    837  0  stevel  * NVERIFY: Verify attributes different
    838  0  stevel  */
    839  0  stevel struct NVERIFY4args {
    840  0  stevel 	/* CURRENT_FH: object */
    841  0  stevel 	fattr4		obj_attributes;
    842  0  stevel };
    843  0  stevel 
    844  0  stevel struct NVERIFY4res {
    845  0  stevel 	nfsstat4	status;
    846  0  stevel };
    847  0  stevel 
    848  0  stevel /*
    849  0  stevel  * Various definitions for OPEN
    850  0  stevel  */
    851  0  stevel enum createmode4 {
    852  0  stevel 	UNCHECKED4	= 0,
    853  0  stevel 	GUARDED4	= 1,
    854  0  stevel 	EXCLUSIVE4	= 2
    855  0  stevel };
    856  0  stevel 
    857  0  stevel union createhow4 switch (createmode4 mode) {
    858  0  stevel  case UNCHECKED4:
    859  0  stevel  case GUARDED4:
    860  0  stevel 	 fattr4		createattrs;
    861  0  stevel  case EXCLUSIVE4:
    862  0  stevel 	 verifier4	createverf;
    863  0  stevel };
    864  0  stevel 
    865  0  stevel enum opentype4 {
    866  0  stevel 	OPEN4_NOCREATE	= 0,
    867  0  stevel 	OPEN4_CREATE	= 1
    868  0  stevel };
    869  0  stevel 
    870  0  stevel union openflag4 switch (opentype4 opentype) {
    871  0  stevel  case OPEN4_CREATE:
    872  0  stevel 	 createhow4	how;
    873  0  stevel  default:
    874  0  stevel 	 void;
    875  0  stevel };
    876  0  stevel 
    877  0  stevel /* Next definitions used for OPEN delegation */
    878  0  stevel enum limit_by4 {
    879  0  stevel 	NFS_LIMIT_SIZE		= 1,
    880  0  stevel 	NFS_LIMIT_BLOCKS	= 2
    881  0  stevel 	/* others as needed */
    882  0  stevel };
    883  0  stevel 
    884  0  stevel struct nfs_modified_limit4 {
    885  0  stevel 	uint32_t	num_blocks;
    886  0  stevel 	uint32_t	bytes_per_block;
    887  0  stevel };
    888  0  stevel 
    889  0  stevel union nfs_space_limit4 switch (limit_by4 limitby) {
    890  0  stevel  /* limit specified as file size */
    891  0  stevel  case NFS_LIMIT_SIZE:
    892  0  stevel 	 uint64_t		filesize;
    893  0  stevel  /* limit specified by number of blocks */
    894  0  stevel  case NFS_LIMIT_BLOCKS:
    895  0  stevel 	 nfs_modified_limit4	mod_blocks;
    896  0  stevel } ;
    897  0  stevel 
    898  0  stevel /*
    899  0  stevel  * Share Access and Deny constants for open argument
    900  0  stevel  */
    901  0  stevel const OPEN4_SHARE_ACCESS_READ	= 0x00000001;
    902  0  stevel const OPEN4_SHARE_ACCESS_WRITE	= 0x00000002;
    903  0  stevel const OPEN4_SHARE_ACCESS_BOTH	= 0x00000003;
    904  0  stevel 
    905  0  stevel const OPEN4_SHARE_DENY_NONE	= 0x00000000;
    906  0  stevel const OPEN4_SHARE_DENY_READ	= 0x00000001;
    907  0  stevel const OPEN4_SHARE_DENY_WRITE	= 0x00000002;
    908  0  stevel const OPEN4_SHARE_DENY_BOTH	= 0x00000003;
    909  0  stevel 
    910  0  stevel enum open_delegation_type4 {
    911  0  stevel 	OPEN_DELEGATE_NONE	= 0,
    912  0  stevel 	OPEN_DELEGATE_READ	= 1,
    913  0  stevel 	OPEN_DELEGATE_WRITE	= 2
    914  0  stevel };
    915  0  stevel 
    916  0  stevel enum open_claim_type4 {
    917  0  stevel 	CLAIM_NULL		= 0,
    918  0  stevel 	CLAIM_PREVIOUS		= 1,
    919  0  stevel 	CLAIM_DELEGATE_CUR	= 2,
    920  0  stevel 	CLAIM_DELEGATE_PREV	= 3
    921  0  stevel };
    922  0  stevel 
    923  0  stevel struct open_claim_delegate_cur4 {
    924  0  stevel 	stateid4	delegate_stateid;
    925  0  stevel 	component4	file;
    926  0  stevel };
    927  0  stevel 
    928  0  stevel union open_claim4 switch (open_claim_type4 claim) {
    929  0  stevel  /*
    930  0  stevel   * No special rights to file. Ordinary OPEN of the specified file.
    931  0  stevel   */
    932  0  stevel  case CLAIM_NULL:
    933  0  stevel 	/* CURRENT_FH: directory */
    934  0  stevel 	component4	file;
    935  0  stevel 
    936  0  stevel  /*
    937  0  stevel   * Right to the file established by an open previous to server
    938  0  stevel   * reboot.  File identified by filehandle obtained at that time
    939  0  stevel   * rather than by name.
    940  0  stevel   */
    941  0  stevel  case CLAIM_PREVIOUS:
    942  0  stevel 	/* CURRENT_FH: file being reclaimed */
    943  0  stevel 	open_delegation_type4	delegate_type;
    944  0  stevel 
    945  0  stevel  /*
    946  0  stevel   * Right to file based on a delegation granted by the server.
    947  0  stevel   * File is specified by name.
    948  0  stevel   */
    949  0  stevel  case CLAIM_DELEGATE_CUR:
    950  0  stevel 	/* CURRENT_FH: directory */
    951  0  stevel 	open_claim_delegate_cur4	delegate_cur_info;
    952  0  stevel 
    953  0  stevel  /* Right to file based on a delegation granted to a previous boot
    954  0  stevel   * instance of the client.  File is specified by name.
    955  0  stevel   */
    956  0  stevel  case CLAIM_DELEGATE_PREV:
    957  0  stevel 	 /* CURRENT_FH: directory */
    958  0  stevel 	component4	file_delegate_prev;
    959  0  stevel };
    960  0  stevel 
    961  0  stevel /*
    962  0  stevel  * OPEN: Open a file, potentially receiving an open delegation
    963  0  stevel  */
    964  0  stevel struct OPEN4args {
    965  0  stevel 	seqid4		seqid;
    966  0  stevel 	uint32_t	share_access;
    967  0  stevel 	uint32_t	share_deny;
    968  0  stevel 	open_owner4	owner;
    969  0  stevel 	openflag4	openhow;
    970  0  stevel 	open_claim4	claim;
    971  0  stevel };
    972  0  stevel 
    973  0  stevel struct open_read_delegation4 {
    974  0  stevel 	stateid4	stateid;	/* Stateid for delegation*/
    975  0  stevel 	bool		recall;		/* Pre-recalled flag for
    976  0  stevel 					   delegations obtained
    977  0  stevel 					   by reclaim
    978  0  stevel 					   (CLAIM_PREVIOUS) */
    979  0  stevel 	nfsace4		permissions;	/* Defines users who don't
    980  0  stevel 					   need an ACCESS call to
    981  0  stevel 					   open for read */
    982  0  stevel };
    983  0  stevel 
    984  0  stevel struct open_write_delegation4 {
    985  0  stevel 	stateid4	stateid;	/* Stateid for delegation */
    986  0  stevel 	bool		recall;		/* Pre-recalled flag for
    987  0  stevel 					   delegations obtained
    988  0  stevel 					   by reclaim
    989  0  stevel 					   (CLAIM_PREVIOUS) */
    990  0  stevel 	nfs_space_limit4 space_limit;	/* Defines condition that
    991  0  stevel 					   the client must check to
    992  0  stevel 					   determine whether the
    993  0  stevel 					   file needs to be flushed
    994  0  stevel 					   to the server on close.
    995  0  stevel 					   */
    996  0  stevel 	nfsace4		permissions;	/* Defines users who don't
    997  0  stevel 					   need an ACCESS call as
    998  0  stevel 					   part of a delegated
    999  0  stevel 					   open. */
   1000  0  stevel };
   1001  0  stevel 
   1002  0  stevel union open_delegation4
   1003  0  stevel switch (open_delegation_type4 delegation_type) {
   1004  0  stevel 	case OPEN_DELEGATE_NONE:
   1005  0  stevel 		void;
   1006  0  stevel 	case OPEN_DELEGATE_READ:
   1007  0  stevel 		open_read_delegation4 read;
   1008  0  stevel 	case OPEN_DELEGATE_WRITE:
   1009  0  stevel 		open_write_delegation4 write;
   1010  0  stevel };
   1011  0  stevel 
   1012  0  stevel /*
   1013  0  stevel  * Result flags
   1014  0  stevel  */
   1015  0  stevel /* Client must confirm open */
   1016  0  stevel const OPEN4_RESULT_CONFIRM	= 0x00000002;
   1017  0  stevel /* Type of file locking behavior at the server */
   1018  0  stevel const OPEN4_RESULT_LOCKTYPE_POSIX = 0x00000004;
   1019  0  stevel 
   1020  0  stevel struct OPEN4resok {
   1021  0  stevel 	stateid4	stateid;	/* Stateid for open */
   1022  0  stevel 	change_info4	cinfo;		/* Directory Change Info */
   1023  0  stevel 	uint32_t	rflags;		/* Result flags */
   1024  0  stevel 	bitmap4		attrset;	/* attribute set for create*/
   1025  0  stevel 	open_delegation4 delegation;	/* Info on any open
   1026  0  stevel 					   delegation */
   1027  0  stevel };
   1028  0  stevel 
   1029  0  stevel union OPEN4res switch (nfsstat4 status) {
   1030  0  stevel  case NFS4_OK:
   1031  0  stevel 	/* CURRENT_FH: opened file */
   1032  0  stevel 	OPEN4resok	resok4;
   1033  0  stevel  default:
   1034  0  stevel 	void;
   1035  0  stevel };
   1036  0  stevel 
   1037  0  stevel /*
   1038  0  stevel  * OPENATTR: open named attributes directory
   1039  0  stevel  */
   1040  0  stevel struct OPENATTR4args {
   1041  0  stevel 	/* CURRENT_FH: object */
   1042  0  stevel 	bool	createdir;
   1043  0  stevel };
   1044  0  stevel 
   1045  0  stevel struct OPENATTR4res {
   1046  0  stevel 	/* CURRENT_FH: named attr directory */
   1047  0  stevel 	nfsstat4	status;
   1048  0  stevel };
   1049  0  stevel 
   1050  0  stevel /*
   1051  0  stevel  * OPEN_CONFIRM: confirm the open
   1052  0  stevel  */
   1053  0  stevel struct OPEN_CONFIRM4args {
   1054  0  stevel 	/* CURRENT_FH: opened file */
   1055  0  stevel 	stateid4	open_stateid;
   1056  0  stevel 	seqid4		seqid;
   1057  0  stevel };
   1058  0  stevel 
   1059  0  stevel struct OPEN_CONFIRM4resok {
   1060  0  stevel 	stateid4	open_stateid;
   1061  0  stevel };
   1062  0  stevel 
   1063  0  stevel union OPEN_CONFIRM4res switch (nfsstat4 status) {
   1064  0  stevel  case NFS4_OK:
   1065  0  stevel 	 OPEN_CONFIRM4resok	resok4;
   1066  0  stevel  default:
   1067  0  stevel 	 void;
   1068  0  stevel };
   1069  0  stevel 
   1070  0  stevel /*
   1071  0  stevel  * OPEN_DOWNGRADE: downgrade the access/deny for a file
   1072  0  stevel  */
   1073  0  stevel struct OPEN_DOWNGRADE4args {
   1074  0  stevel 	/* CURRENT_FH: opened file */
   1075  0  stevel 	stateid4	open_stateid;
   1076  0  stevel 	seqid4		seqid;
   1077  0  stevel 	uint32_t	share_access;
   1078  0  stevel 	uint32_t	share_deny;
   1079  0  stevel };
   1080  0  stevel 
   1081  0  stevel struct OPEN_DOWNGRADE4resok {
   1082  0  stevel 	stateid4	open_stateid;
   1083  0  stevel };
   1084  0  stevel 
   1085  0  stevel union OPEN_DOWNGRADE4res switch(nfsstat4 status) {
   1086  0  stevel  case NFS4_OK:
   1087  0  stevel 	OPEN_DOWNGRADE4resok	resok4;
   1088  0  stevel  default:
   1089  0  stevel 	 void;
   1090  0  stevel };
   1091  0  stevel 
   1092  0  stevel /*
   1093  0  stevel  * PUTFH: Set current filehandle
   1094  0  stevel  */
   1095  0  stevel struct PUTFH4args {
   1096  0  stevel 	nfs_fh4		object;
   1097  0  stevel };
   1098  0  stevel 
   1099  0  stevel struct PUTFH4res {
   1100  0  stevel 	/* CURRENT_FH: */
   1101  0  stevel 	nfsstat4	status;
   1102  0  stevel };
   1103  0  stevel 
   1104  0  stevel /*
   1105  0  stevel  * PUTPUBFH: Set public filehandle
   1106  0  stevel  */
   1107  0  stevel struct PUTPUBFH4res {
   1108  0  stevel 	/* CURRENT_FH: public fh */
   1109  0  stevel 	nfsstat4	status;
   1110  0  stevel };
   1111  0  stevel 
   1112  0  stevel /*
   1113  0  stevel  * PUTROOTFH: Set root filehandle
   1114  0  stevel  */
   1115  0  stevel struct PUTROOTFH4res {
   1116  0  stevel 	/* CURRENT_FH: root fh */
   1117  0  stevel 	nfsstat4	status;
   1118  0  stevel };
   1119  0  stevel 
   1120  0  stevel /*
   1121  0  stevel  * READ: Read from file
   1122  0  stevel  */
   1123  0  stevel struct READ4args {
   1124  0  stevel 	/* CURRENT_FH: file */
   1125  0  stevel 	stateid4	stateid;
   1126  0  stevel 	offset4		offset;
   1127  0  stevel 	count4		count;
   1128  0  stevel };
   1129  0  stevel 
   1130  0  stevel struct READ4resok {
   1131  0  stevel 	bool		eof;
   1132  0  stevel 	opaque		data<>;
   1133  0  stevel };
   1134  0  stevel 
   1135  0  stevel union READ4res switch (nfsstat4 status) {
   1136  0  stevel  case NFS4_OK:
   1137  0  stevel 	 READ4resok	resok4;
   1138  0  stevel  default:
   1139  0  stevel 	 void;
   1140  0  stevel };
   1141  0  stevel 
   1142  0  stevel /*
   1143  0  stevel  * READDIR: Read directory
   1144  0  stevel  */
   1145  0  stevel struct READDIR4args {
   1146  0  stevel 	/* CURRENT_FH: directory */
   1147  0  stevel 	nfs_cookie4	cookie;
   1148  0  stevel 	verifier4	cookieverf;
   1149  0  stevel 	count4		dircount;
   1150  0  stevel 	count4		maxcount;
   1151  0  stevel 	bitmap4		attr_request;
   1152  0  stevel };
   1153  0  stevel 
   1154  0  stevel struct entry4 {
   1155  0  stevel 	nfs_cookie4	cookie;
   1156  0  stevel 	component4	name;
   1157  0  stevel 	fattr4		attrs;
   1158  0  stevel 	entry4		*nextentry;
   1159  0  stevel };
   1160  0  stevel 
   1161  0  stevel struct dirlist4 {
   1162  0  stevel 	entry4		*entries;
   1163  0  stevel 	bool		eof;
   1164  0  stevel };
   1165  0  stevel 
   1166  0  stevel struct READDIR4resok {
   1167  0  stevel 	verifier4	cookieverf;
   1168  0  stevel 	dirlist4	reply;
   1169  0  stevel };
   1170  0  stevel 
   1171  0  stevel 
   1172  0  stevel union READDIR4res switch (nfsstat4 status) {
   1173  0  stevel  case NFS4_OK:
   1174  0  stevel 	 READDIR4resok	resok4;
   1175  0  stevel  default:
   1176  0  stevel 	 void;
   1177  0  stevel };
   1178  0  stevel 
   1179  0  stevel 
   1180  0  stevel /*
   1181  0  stevel  * READLINK: Read symbolic link
   1182  0  stevel  */
   1183  0  stevel struct READLINK4resok {
   1184  0  stevel 	linktext4	link;
   1185  0  stevel };
   1186  0  stevel 
   1187  0  stevel union READLINK4res switch (nfsstat4 status) {
   1188  0  stevel  case NFS4_OK:
   1189  0  stevel 	 READLINK4resok	resok4;
   1190  0  stevel  default:
   1191  0  stevel 	 void;
   1192  0  stevel };
   1193  0  stevel 
   1194  0  stevel /*
   1195  0  stevel  * REMOVE: Remove filesystem object
   1196  0  stevel  */
   1197  0  stevel struct REMOVE4args {
   1198  0  stevel 	/* CURRENT_FH: directory */
   1199  0  stevel 	component4	target;
   1200  0  stevel };
   1201  0  stevel 
   1202  0  stevel struct REMOVE4resok {
   1203  0  stevel 	change_info4	cinfo;
   1204  0  stevel };
   1205  0  stevel 
   1206  0  stevel union REMOVE4res switch (nfsstat4 status) {
   1207  0  stevel  case NFS4_OK:
   1208  0  stevel 	 REMOVE4resok	resok4;
   1209  0  stevel  default:
   1210  0  stevel 	 void;
   1211  0  stevel };
   1212  0  stevel 
   1213  0  stevel /*
   1214  0  stevel  * RENAME: Rename directory entry
   1215  0  stevel  */
   1216  0  stevel struct RENAME4args {
   1217  0  stevel 	/* SAVED_FH: source directory */
   1218  0  stevel 	component4	oldname;
   1219  0  stevel 	/* CURRENT_FH: target directory */
   1220  0  stevel 	component4	newname;
   1221  0  stevel };
   1222  0  stevel 
   1223  0  stevel struct RENAME4resok {
   1224  0  stevel 	change_info4	source_cinfo;
   1225  0  stevel 	change_info4	target_cinfo;
   1226  0  stevel };
   1227  0  stevel 
   1228  0  stevel union RENAME4res switch (nfsstat4 status) {
   1229  0  stevel  case NFS4_OK:
   1230  0  stevel 	RENAME4resok	resok4;
   1231  0  stevel  default:
   1232  0  stevel 	void;
   1233  0  stevel };
   1234  0  stevel 
   1235  0  stevel /*
   1236  0  stevel  * RENEW: Renew a Lease
   1237  0  stevel  */
   1238  0  stevel struct RENEW4args {
   1239  0  stevel 	clientid4	clientid;
   1240  0  stevel };
   1241  0  stevel 
   1242  0  stevel struct RENEW4res {
   1243  0  stevel 	nfsstat4	status;
   1244  0  stevel };
   1245  0  stevel 
   1246  0  stevel /*
   1247  0  stevel  * RESTOREFH: Restore saved filehandle
   1248  0  stevel  */
   1249  0  stevel 
   1250  0  stevel struct RESTOREFH4res {
   1251  0  stevel 	/* CURRENT_FH: value of saved fh */
   1252  0  stevel 	nfsstat4	status;
   1253  0  stevel };
   1254  0  stevel 
   1255  0  stevel /*
   1256  0  stevel  * SAVEFH: Save current filehandle
   1257  0  stevel  */
   1258  0  stevel struct SAVEFH4res {
   1259  0  stevel 	/* SAVED_FH: value of current fh */
   1260  0  stevel 	nfsstat4	status;
   1261  0  stevel };
   1262  0  stevel 
   1263  0  stevel /*
   1264  0  stevel  * SECINFO: Obtain Available Security Mechanisms
   1265  0  stevel  */
   1266  0  stevel struct SECINFO4args {
   1267  0  stevel 	/* CURRENT_FH: directory */
   1268  0  stevel 	component4	name;
   1269  0  stevel };
   1270  0  stevel 
   1271  0  stevel /*
   1272  0  stevel  * From RFC 2203
   1273  0  stevel  */
   1274  0  stevel enum rpc_gss_svc_t {
   1275  0  stevel 	RPC_GSS_SVC_NONE	= 1,
   1276  0  stevel 	RPC_GSS_SVC_INTEGRITY	= 2,
   1277  0  stevel 	RPC_GSS_SVC_PRIVACY	= 3
   1278  0  stevel };
   1279  0  stevel 
   1280  0  stevel struct rpcsec_gss_info {
   1281  0  stevel 	sec_oid4	oid;
   1282  0  stevel 	qop4		qop;
   1283  0  stevel 	rpc_gss_svc_t	service;
   1284  0  stevel };
   1285  0  stevel 
   1286  0  stevel /* RPCSEC_GSS has a value of '6' - See RFC 2203 */
   1287  0  stevel union secinfo4 switch (uint32_t flavor) {
   1288  0  stevel  case RPCSEC_GSS:
   1289  0  stevel 	 rpcsec_gss_info	flavor_info;
   1290  0  stevel  default:
   1291  0  stevel 	 void;
   1292  0  stevel };
   1293  0  stevel 
   1294  0  stevel typedef secinfo4 SECINFO4resok<>;
   1295  0  stevel 
   1296  0  stevel union SECINFO4res switch (nfsstat4 status) {
   1297  0  stevel  case NFS4_OK:
   1298  0  stevel 	 SECINFO4resok resok4;
   1299  0  stevel  default:
   1300  0  stevel 	 void;
   1301  0  stevel };
   1302  0  stevel 
   1303  0  stevel /*
   1304  0  stevel  * SETATTR: Set attributes
   1305  0  stevel  */
   1306  0  stevel struct SETATTR4args {
   1307  0  stevel 	/* CURRENT_FH: target object */
   1308  0  stevel 	stateid4	stateid;
   1309  0  stevel 	fattr4		obj_attributes;
   1310  0  stevel };
   1311  0  stevel 
   1312  0  stevel struct SETATTR4res {
   1313  0  stevel 	nfsstat4	status;
   1314  0  stevel 	bitmap4		attrsset;
   1315  0  stevel };
   1316  0  stevel 
   1317  0  stevel /*
   1318  0  stevel  * SETCLIENTID
   1319  0  stevel  */
   1320  0  stevel struct SETCLIENTID4args {
   1321  0  stevel 	nfs_client_id4	client;
   1322  0  stevel 	cb_client4	callback;
   1323  0  stevel 	uint32_t	callback_ident;
   1324  0  stevel };
   1325  0  stevel 
   1326  0  stevel struct SETCLIENTID4resok {
   1327  0  stevel 	clientid4	clientid;
   1328  0  stevel 	verifier4	setclientid_confirm;
   1329  0  stevel };
   1330  0  stevel 
   1331  0  stevel union SETCLIENTID4res switch (nfsstat4 status) {
   1332  0  stevel  case NFS4_OK:
   1333  0  stevel 	 SETCLIENTID4resok	resok4;
   1334  0  stevel  case NFS4ERR_CLID_INUSE:
   1335  0  stevel 	 clientaddr4	client_using;
   1336  0  stevel  default:
   1337  0  stevel 	 void;
   1338  0  stevel };
   1339  0  stevel 
   1340  0  stevel struct SETCLIENTID_CONFIRM4args {
   1341  0  stevel 	clientid4	clientid;
   1342  0  stevel 	verifier4	setclientid_confirm;
   1343  0  stevel };
   1344  0  stevel 
   1345  0  stevel struct SETCLIENTID_CONFIRM4res {
   1346  0  stevel 	nfsstat4	status;
   1347  0  stevel };
   1348  0  stevel 
   1349  0  stevel /*
   1350  0  stevel  * VERIFY: Verify attributes same
   1351  0  stevel  */
   1352  0  stevel struct VERIFY4args {
   1353  0  stevel 	/* CURRENT_FH: object */
   1354  0  stevel 	fattr4		obj_attributes;
   1355  0  stevel };
   1356  0  stevel 
   1357  0  stevel struct VERIFY4res {
   1358  0  stevel 	nfsstat4	status;
   1359  0  stevel };
   1360  0  stevel 
   1361  0  stevel /*
   1362  0  stevel  * WRITE: Write to file
   1363  0  stevel  */
   1364  0  stevel enum stable_how4 {
   1365  0  stevel 	UNSTABLE4	= 0,
   1366  0  stevel 	DATA_SYNC4	= 1,
   1367  0  stevel 	FILE_SYNC4	= 2
   1368  0  stevel };
   1369  0  stevel 
   1370  0  stevel struct WRITE4args {
   1371  0  stevel 	/* CURRENT_FH: file */
   1372  0  stevel 	stateid4	stateid;
   1373  0  stevel 	offset4		offset;
   1374  0  stevel 	stable_how4	stable;
   1375  0  stevel 	opaque		data<>;
   1376  0  stevel };
   1377  0  stevel 
   1378  0  stevel struct WRITE4resok {
   1379  0  stevel 	count4		count;
   1380  0  stevel 	stable_how4	committed;
   1381  0  stevel 	verifier4	writeverf;
   1382  0  stevel };
   1383  0  stevel 
   1384  0  stevel union WRITE4res switch (nfsstat4 status) {
   1385  0  stevel  case NFS4_OK:
   1386  0  stevel 	 WRITE4resok	resok4;
   1387  0  stevel  default:
   1388  0  stevel 	 void;
   1389  0  stevel };
   1390  0  stevel 
   1391  0  stevel /*
   1392  0  stevel  * RELEASE_LOCKOWNER: Notify server to release lockowner
   1393  0  stevel  */
   1394  0  stevel struct RELEASE_LOCKOWNER4args {
   1395  0  stevel 	lock_owner4	lock_owner;
   1396  0  stevel };
   1397  0  stevel 
   1398  0  stevel struct RELEASE_LOCKOWNER4res {
   1399  0  stevel 	nfsstat4	status;
   1400  0  stevel };
   1401  0  stevel 
   1402  0  stevel /*
   1403  0  stevel  * ILLEGAL: Response for illegal operation numbers
   1404  0  stevel  */
   1405  0  stevel struct ILLEGAL4res {
   1406  0  stevel 	nfsstat4        status;
   1407  0  stevel };
   1408  0  stevel 
   1409  0  stevel /*
   1410  0  stevel  * Operation arrays
   1411  0  stevel  */
   1412  0  stevel 
   1413  0  stevel enum nfs_opnum4 {
   1414  0  stevel 	OP_ACCESS		= 3,
   1415  0  stevel 	OP_CLOSE		= 4,
   1416  0  stevel 	OP_COMMIT		= 5,
   1417  0  stevel 	OP_CREATE		= 6,
   1418  0  stevel 	OP_DELEGPURGE		= 7,
   1419  0  stevel 	OP_DELEGRETURN		= 8,
   1420  0  stevel 	OP_GETATTR		= 9,
   1421  0  stevel 	OP_GETFH		= 10,
   1422  0  stevel 	OP_LINK			= 11,
   1423  0  stevel 	OP_LOCK			= 12,
   1424  0  stevel 	OP_LOCKT		= 13,
   1425  0  stevel 	OP_LOCKU		= 14,
   1426  0  stevel 	OP_LOOKUP		= 15,
   1427  0  stevel 	OP_LOOKUPP		= 16,
   1428  0  stevel 	OP_NVERIFY		= 17,
   1429  0  stevel 	OP_OPEN			= 18,
   1430  0  stevel 	OP_OPENATTR		= 19,
   1431  0  stevel 	OP_OPEN_CONFIRM		= 20,
   1432  0  stevel 	OP_OPEN_DOWNGRADE	= 21,
   1433  0  stevel 	OP_PUTFH		= 22,
   1434  0  stevel 	OP_PUTPUBFH		= 23,
   1435  0  stevel 	OP_PUTROOTFH		= 24,
   1436  0  stevel 	OP_READ			= 25,
   1437  0  stevel 	OP_READDIR		= 26,
   1438  0  stevel 	OP_READLINK		= 27,
   1439  0  stevel 	OP_REMOVE		= 28,
   1440  0  stevel 	OP_RENAME		= 29,
   1441  0  stevel 	OP_RENEW		= 30,
   1442  0  stevel 	OP_RESTOREFH		= 31,
   1443  0  stevel 	OP_SAVEFH		= 32,
   1444  0  stevel 	OP_SECINFO		= 33,
   1445  0  stevel 	OP_SETATTR		= 34,
   1446  0  stevel 	OP_SETCLIENTID		= 35,
   1447  0  stevel 	OP_SETCLIENTID_CONFIRM	= 36,
   1448  0  stevel 	OP_VERIFY		= 37,
   1449  0  stevel 	OP_WRITE		= 38,
   1450  0  stevel 	OP_RELEASE_LOCKOWNER	= 39,
   1451  0  stevel 	OP_ILLEGAL		= 10044
   1452  0  stevel };
   1453  0  stevel 
   1454  0  stevel union nfs_argop4 switch (nfs_opnum4 argop) {
   1455  0  stevel  case OP_ACCESS:	ACCESS4args opaccess;
   1456  0  stevel  case OP_CLOSE:		CLOSE4args opclose;
   1457  0  stevel  case OP_COMMIT:	COMMIT4args opcommit;
   1458  0  stevel  case OP_CREATE:	CREATE4args opcreate;
   1459  0  stevel  case OP_DELEGPURGE:	DELEGPURGE4args opdelegpurge;
   1460  0  stevel  case OP_DELEGRETURN:	DELEGRETURN4args opdelegreturn;
   1461  0  stevel  case OP_GETATTR:	GETATTR4args opgetattr;
   1462  0  stevel  case OP_GETFH:		void;
   1463  0  stevel  case OP_LINK:		LINK4args oplink;
   1464  0  stevel  case OP_LOCK:		LOCK4args oplock;
   1465  0  stevel  case OP_LOCKT:		LOCKT4args oplockt;
   1466  0  stevel  case OP_LOCKU:		LOCKU4args oplocku;
   1467  0  stevel  case OP_LOOKUP:	LOOKUP4args oplookup;
   1468  0  stevel  case OP_LOOKUPP:	void;
   1469  0  stevel  case OP_NVERIFY:	NVERIFY4args opnverify;
   1470  0  stevel  case OP_OPEN:		OPEN4args opopen;
   1471  0  stevel  case OP_OPENATTR:	OPENATTR4args opopenattr;
   1472  0  stevel  case OP_OPEN_CONFIRM:	OPEN_CONFIRM4args opopen_confirm;
   1473  0  stevel  case OP_OPEN_DOWNGRADE:	OPEN_DOWNGRADE4args opopen_downgrade;
   1474  0  stevel  case OP_PUTFH:		PUTFH4args opputfh;
   1475  0  stevel  case OP_PUTPUBFH:	void;
   1476  0  stevel  case OP_PUTROOTFH:	void;
   1477  0  stevel  case OP_READ:		READ4args opread;
   1478  0  stevel  case OP_READDIR:	READDIR4args opreaddir;
   1479  0  stevel  case OP_READLINK:	void;
   1480  0  stevel  case OP_REMOVE:	REMOVE4args opremove;
   1481  0  stevel  case OP_RENAME:	RENAME4args oprename;
   1482  0  stevel  case OP_RENEW:		RENEW4args oprenew;
   1483  0  stevel  case OP_RESTOREFH:	void;
   1484  0  stevel  case OP_SAVEFH:	void;
   1485  0  stevel  case OP_SECINFO:	SECINFO4args opsecinfo;
   1486  0  stevel  case OP_SETATTR:	SETATTR4args opsetattr;
   1487  0  stevel  case OP_SETCLIENTID:	SETCLIENTID4args opsetclientid;
   1488  0  stevel  case OP_SETCLIENTID_CONFIRM:	SETCLIENTID_CONFIRM4args
   1489  0  stevel 					opsetclientid_confirm;
   1490  0  stevel  case OP_VERIFY:	VERIFY4args opverify;
   1491  0  stevel  case OP_WRITE:		WRITE4args opwrite;
   1492  0  stevel  case OP_RELEASE_LOCKOWNER:	RELEASE_LOCKOWNER4args
   1493  0  stevel 				    oprelease_lockowner;
   1494  0  stevel  case OP_ILLEGAL:	void;
   1495  0  stevel };
   1496  0  stevel 
   1497  0  stevel union nfs_resop4 switch (nfs_opnum4 resop){
   1498  0  stevel  case OP_ACCESS:	ACCESS4res opaccess;
   1499  0  stevel  case OP_CLOSE:		CLOSE4res opclose;
   1500  0  stevel  case OP_COMMIT:	COMMIT4res opcommit;
   1501  0  stevel  case OP_CREATE:	CREATE4res opcreate;
   1502  0  stevel  case OP_DELEGPURGE:	DELEGPURGE4res opdelegpurge;
   1503  0  stevel  case OP_DELEGRETURN:	DELEGRETURN4res opdelegreturn;
   1504  0  stevel  case OP_GETATTR:	GETATTR4res opgetattr;
   1505  0  stevel  case OP_GETFH:		GETFH4res opgetfh;
   1506  0  stevel  case OP_LINK:		LINK4res oplink;
   1507  0  stevel  case OP_LOCK:		LOCK4res oplock;
   1508  0  stevel  case OP_LOCKT:		LOCKT4res oplockt;
   1509  0  stevel  case OP_LOCKU:		LOCKU4res oplocku;
   1510  0  stevel  case OP_LOOKUP:	LOOKUP4res oplookup;
   1511  0  stevel  case OP_LOOKUPP:	LOOKUPP4res oplookupp;
   1512  0  stevel  case OP_NVERIFY:	NVERIFY4res opnverify;
   1513  0  stevel  case OP_OPEN:		OPEN4res opopen;
   1514  0  stevel  case OP_OPENATTR:	OPENATTR4res opopenattr;
   1515  0  stevel  case OP_OPEN_CONFIRM:	OPEN_CONFIRM4res opopen_confirm;
   1516  0  stevel  case OP_OPEN_DOWNGRADE:	OPEN_DOWNGRADE4res opopen_downgrade;
   1517  0  stevel  case OP_PUTFH:		PUTFH4res opputfh;
   1518  0  stevel  case OP_PUTPUBFH:	PUTPUBFH4res opputpubfh;
   1519  0  stevel  case OP_PUTROOTFH:	PUTROOTFH4res opputrootfh;
   1520  0  stevel  case OP_READ:		READ4res opread;
   1521  0  stevel  case OP_READDIR:	READDIR4res opreaddir;
   1522  0  stevel  case OP_READLINK:	READLINK4res opreadlink;
   1523  0  stevel  case OP_REMOVE:	REMOVE4res opremove;
   1524  0  stevel  case OP_RENAME:	RENAME4res oprename;
   1525  0  stevel  case OP_RENEW:		RENEW4res oprenew;
   1526  0  stevel  case OP_RESTOREFH:	RESTOREFH4res oprestorefh;
   1527  0  stevel  case OP_SAVEFH:	SAVEFH4res opsavefh;
   1528  0  stevel  case OP_SECINFO:	SECINFO4res opsecinfo;
   1529  0  stevel  case OP_SETATTR:	SETATTR4res opsetattr;
   1530  0  stevel  case OP_SETCLIENTID:	SETCLIENTID4res opsetclientid;
   1531  0  stevel  case OP_SETCLIENTID_CONFIRM:	SETCLIENTID_CONFIRM4res
   1532  0  stevel 					opsetclientid_confirm;
   1533  0  stevel  case OP_VERIFY:	VERIFY4res opverify;
   1534  0  stevel  case OP_WRITE:		WRITE4res opwrite;
   1535  0  stevel  case OP_RELEASE_LOCKOWNER:	RELEASE_LOCKOWNER4res
   1536  0  stevel 				    oprelease_lockowner;
   1537  0  stevel  case OP_ILLEGAL:	ILLEGAL4res opillegal;
   1538  0  stevel };
   1539  0  stevel 
   1540  0  stevel struct COMPOUND4args {
   1541  0  stevel 	utf8str_cs	tag;
   1542  0  stevel 	uint32_t	minorversion;
   1543  0  stevel 	nfs_argop4	argarray<>;
   1544  0  stevel };
   1545  0  stevel 
   1546  0  stevel struct COMPOUND4res {
   1547  0  stevel 	nfsstat4 status;
   1548  0  stevel 	utf8str_cs	tag;
   1549  0  stevel 	nfs_resop4	resarray<>;
   1550  0  stevel };
   1551  0  stevel 
   1552  0  stevel /*
   1553  0  stevel  * Remote file service routines
   1554  0  stevel  */
   1555  0  stevel program NFS4_PROGRAM {
   1556  0  stevel 	version NFS_V4 {
   1557  0  stevel 		void
   1558  0  stevel 			NFSPROC4_NULL(void) = 0;
   1559  0  stevel 
   1560  0  stevel 		COMPOUND4res
   1561  0  stevel 			NFSPROC4_COMPOUND(COMPOUND4args) = 1;
   1562  0  stevel 
   1563  0  stevel 	} = 4;
   1564  0  stevel } = 100003;
   1565  0  stevel 
   1566  0  stevel 
   1567  0  stevel 
   1568  0  stevel /*
   1569  0  stevel  * NFS4 Callback Procedure Definitions and Program
   1570  0  stevel  */
   1571  0  stevel 
   1572  0  stevel /*
   1573  0  stevel  * CB_GETATTR: Get Current Attributes
   1574  0  stevel  */
   1575  0  stevel struct CB_GETATTR4args {
   1576  0  stevel 	nfs_fh4	fh;
   1577  0  stevel 	bitmap4	attr_request;
   1578  0  stevel };
   1579  0  stevel 
   1580  0  stevel struct CB_GETATTR4resok {
   1581  0  stevel 	fattr4	obj_attributes;
   1582  0  stevel };
   1583  0  stevel 
   1584  0  stevel union CB_GETATTR4res switch (nfsstat4 status) {
   1585  0  stevel  case NFS4_OK:
   1586  0  stevel 	 CB_GETATTR4resok	resok4;
   1587  0  stevel  default:
   1588  0  stevel 	 void;
   1589  0  stevel };
   1590  0  stevel 
   1591  0  stevel /*
   1592  0  stevel  * CB_RECALL: Recall an Open Delegation
   1593  0  stevel  */
   1594  0  stevel struct CB_RECALL4args {
   1595  0  stevel 	stateid4	stateid;
   1596  0  stevel 	bool		truncate;
   1597  0  stevel 	nfs_fh4		fh;
   1598  0  stevel };
   1599  0  stevel 
   1600  0  stevel struct CB_RECALL4res {
   1601  0  stevel 	nfsstat4	status;
   1602  0  stevel };
   1603  0  stevel 
   1604  0  stevel /*
   1605  0  stevel  * CB_ILLEGAL: Response for illegal operation numbers
   1606  0  stevel  */
   1607  0  stevel struct CB_ILLEGAL4res {
   1608  0  stevel 	nfsstat4        status;
   1609  0  stevel };
   1610  0  stevel 
   1611  0  stevel /*
   1612  0  stevel  * Various definitions for CB_COMPOUND
   1613  0  stevel  */
   1614  0  stevel enum nfs_cb_opnum4 {
   1615  0  stevel 	OP_CB_GETATTR		= 3,
   1616  0  stevel 	OP_CB_RECALL		= 4,
   1617  0  stevel 	OP_CB_ILLEGAL		= 10044
   1618  0  stevel };
   1619  0  stevel 
   1620  0  stevel union nfs_cb_argop4 switch (unsigned argop) {
   1621  0  stevel  case OP_CB_GETATTR:	CB_GETATTR4args opcbgetattr;
   1622  0  stevel  case OP_CB_RECALL:	CB_RECALL4args	opcbrecall;
   1623  0  stevel  case OP_CB_ILLEGAL:	void;
   1624  0  stevel };
   1625  0  stevel 
   1626  0  stevel union nfs_cb_resop4 switch (unsigned resop){
   1627  0  stevel  case OP_CB_GETATTR:	CB_GETATTR4res	opcbgetattr;
   1628  0  stevel  case OP_CB_RECALL:	CB_RECALL4res	opcbrecall;
   1629  0  stevel  case OP_CB_ILLEGAL:	CB_ILLEGAL4res	opcbillegal;
   1630  0  stevel };
   1631  0  stevel 
   1632  0  stevel struct CB_COMPOUND4args {
   1633  0  stevel 	utf8str_cs	tag;
   1634  0  stevel 	uint32_t	minorversion;
   1635  0  stevel 	uint32_t	callback_ident;
   1636  0  stevel 	nfs_cb_argop4	argarray<>;
   1637  0  stevel };
   1638  0  stevel 
   1639  0  stevel struct CB_COMPOUND4res {
   1640  0  stevel 	nfsstat4 status;
   1641  0  stevel 	utf8str_cs	tag;
   1642  0  stevel 	nfs_cb_resop4	resarray<>;
   1643  0  stevel };
   1644  0  stevel 
   1645  0  stevel 
   1646  0  stevel /*
   1647  0  stevel  * Program number is in the transient range since the client
   1648  0  stevel  * will assign the exact transient program number and provide
   1649  0  stevel  * that to the server via the SETCLIENTID operation.
   1650  0  stevel  */
   1651  0  stevel program NFS4_CALLBACK {
   1652  0  stevel 	version NFS_CB {
   1653  0  stevel 		void
   1654  0  stevel 			CB_NULL(void) = 0;
   1655  0  stevel 		CB_COMPOUND4res
   1656  0  stevel 			CB_COMPOUND(CB_COMPOUND4args) = 1;
   1657  0  stevel 	} = 1;
   1658  0  stevel } = 0x40000000;
   1659