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 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 /*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
     27 /*	  All Rights Reserved  	*/
     28 
     29 #ifndef	_NFS_NFS_H
     30 #define	_NFS_NFS_H
     31 
     32 /*	nfs.h 2.38 88/08/19 SMI 	*/
     33 
     34 #include <sys/isa_defs.h>
     35 #include <sys/vfs.h>
     36 #include <sys/stream.h>
     37 #include <rpc/types.h>
     38 #include <sys/types32.h>
     39 #ifdef _KERNEL
     40 #include <rpc/rpc_rdma.h>
     41 #include <rpc/rpc.h>
     42 #include <sys/fcntl.h>
     43 #include <sys/kstat.h>
     44 #include <sys/dirent.h>
     45 #include <sys/zone.h>
     46 #include <sys/tsol/label.h>
     47 #include <sys/nvpair.h>
     48 #include <nfs/mount.h>
     49 #include <sys/vfs_opreg.h>
     50 #endif
     51 #include <vm/page.h>
     52 #include <rpc/rpc_sztypes.h>
     53 #include <sys/sysmacros.h>
     54 #ifdef	__cplusplus
     55 extern "C" {
     56 #endif
     57 
     58 /*
     59  * Solaris NFS daemons configuration file location
     60  */
     61 #define	NFSADMIN	"/etc/default/nfs"
     62 
     63 /*
     64  * remote file service numbers
     65  */
     66 #define	NFS_PROGRAM	((rpcprog_t)100003)
     67 #define	NFS_VERSMIN	((rpcvers_t)2)
     68 #define	NFS_VERSMAX	((rpcvers_t)4)
     69 #define	NFS_VERSION	((rpcvers_t)2)
     70 #define	NFS_PORT	2049
     71 
     72 /*
     73  * Used to determine registration and service handling of versions
     74  */
     75 #define	NFS_VERSMIN_DEFAULT	((rpcvers_t)2)
     76 #define	NFS_VERSMAX_DEFAULT	((rpcvers_t)4)
     77 
     78 extern rpcvers_t nfs_versmin;
     79 extern rpcvers_t nfs_versmax;
     80 
     81 /*
     82  * Default delegation setting for the server ==> "on"
     83  */
     84 #define	NFS_SERVER_DELEGATION_DEFAULT	(TRUE)
     85 
     86 /* Maximum size of data portion of a remote request */
     87 #define	NFS_MAXDATA	8192
     88 #define	NFS_MAXNAMLEN	255
     89 #define	NFS_MAXPATHLEN	1024
     90 
     91 /*
     92  * Rpc retransmission parameters
     93  */
     94 #define	NFS_TIMEO	11	/* initial timeout for clts in 10th of a sec */
     95 #define	NFS_RETRIES	5	/* times to retry request */
     96 #define	NFS_COTS_TIMEO	600	/* initial timeout for cots in 10th of a sec */
     97 
     98 /*
     99  * The value of UID_NOBODY/GID_NOBODY presented to the world via NFS.
    100  * UID_NOBODY/GID_NOBODY is translated to NFS_UID_NOBODY/NFS_GID_NOBODY
    101  * when being sent out over the network and NFS_UID_NOBODY/NFS_GID_NOBODY
    102  * is translated to UID_NOBODY/GID_NOBODY when received.
    103  */
    104 #define	NFS_UID_NOBODY	-2
    105 #define	NFS_GID_NOBODY	-2
    106 
    107 /*
    108  * maximum transfer size for different interfaces
    109  */
    110 #define	ECTSIZE	2048
    111 #define	IETSIZE	8192
    112 
    113 /*
    114  * WebNFS error status
    115  */
    116 enum wnfsstat {
    117 	WNFSERR_CLNT_FLAVOR = 20001	/* invalid client sec flavor */
    118 };
    119 
    120 /*
    121  * Error status
    122  * Should include all possible net errors.
    123  * For now we just cast errno into an enum nfsstat.
    124  */
    125 enum nfsstat {
    126 	NFS_OK = 0,			/* no error */
    127 	NFSERR_PERM = 1,		/* Not owner */
    128 	NFSERR_NOENT = 2,		/* No such file or directory */
    129 	NFSERR_IO = 5,			/* I/O error */
    130 	NFSERR_NXIO = 6,		/* No such device or address */
    131 	NFSERR_ACCES = 13,		/* Permission denied */
    132 	NFSERR_EXIST = 17,		/* File exists */
    133 	NFSERR_XDEV = 18,		/* Cross-device link */
    134 	NFSERR_NODEV = 19,		/* No such device */
    135 	NFSERR_NOTDIR = 20,		/* Not a directory */
    136 	NFSERR_ISDIR = 21,		/* Is a directory */
    137 	NFSERR_INVAL = 22,		/* Invalid argument */
    138 	NFSERR_FBIG = 27,		/* File too large */
    139 	NFSERR_NOSPC = 28,		/* No space left on device */
    140 	NFSERR_ROFS = 30,		/* Read-only file system */
    141 	NFSERR_OPNOTSUPP = 45,		/* Operation not supported */
    142 	NFSERR_NAMETOOLONG = 63,	/* File name too long */
    143 	NFSERR_NOTEMPTY = 66,		/* Directory not empty */
    144 	NFSERR_DQUOT = 69,		/* Disc quota exceeded */
    145 	NFSERR_STALE = 70,		/* Stale NFS file handle */
    146 	NFSERR_REMOTE = 71,		/* Object is remote */
    147 	NFSERR_WFLUSH = 99		/* write cache flushed */
    148 };
    149 
    150 typedef enum nfsstat nfsstat;
    151 
    152 /*
    153  * File types
    154  */
    155 enum nfsftype {
    156 	NFNON,
    157 	NFREG,		/* regular file */
    158 	NFDIR,		/* directory */
    159 	NFBLK,		/* block special */
    160 	NFCHR,		/* character special */
    161 	NFLNK,		/* symbolic link */
    162 	NFSOC		/* socket */
    163 };
    164 
    165 /*
    166  * Macros for converting device numbers to and from the format
    167  * SunOS 4.x used. SVR4 uses 14 bit majors and 18 bits minors,
    168  * SunOS 4.x used 8 bit majors and 8 bit minors. It isn't sufficient
    169  * to use the cmpdev() and expdev() macros because they only compress
    170  * 7 bit (and smaller) majors. We must compress 8 bit majors too.
    171  * If the major or minor exceeds 8 bits, then we send it out in
    172  * full 32 bit format and hope that the peer can deal with it.
    173  */
    174 
    175 #define	SO4_BITSMAJOR	8	/* # of SunOS 4.x major device bits */
    176 #define	SO4_BITSMINOR	8	/* # of SunOS 4.x minor device bits */
    177 #define	SO4_MAXMAJ	0xff	/* SunOS 4.x max major value */
    178 #define	SO4_MAXMIN	0xff	/* SunOS 4.x max minor value */
    179 
    180 /*
    181  * Convert to over-the-wire device number format
    182  */
    183 #define	nfsv2_cmpdev(x) \
    184 	((uint32_t) \
    185 	((getmajor(x) > SO4_MAXMAJ || getminor(x) > SO4_MAXMIN) ? NODEV : \
    186 	((getmajor(x) << SO4_BITSMINOR) | (getminor(x) & SO4_MAXMIN))))
    187 
    188 /*
    189  * Convert from over-the-wire format to SVR4 device number format
    190  */
    191 #define	nfsv2_expdev(x) \
    192 	makedevice((((x) >> SO4_BITSMINOR) & SO4_MAXMAJ), (x) & SO4_MAXMIN)
    193 
    194 /*
    195  * Special kludge for fifos (named pipes)  [to adhere to NFS Protocol Spec]
    196  *
    197  * VFIFO is not in the protocol spec (VNON will be replaced by VFIFO)
    198  * so the over-the-wire representation is VCHR with a '-1' device number.
    199  *
    200  * NOTE: This kludge becomes unnecessary with the Protocol Revision,
    201  *	 but it may be necessary to support it (backwards compatibility).
    202  */
    203 #define	NFS_FIFO_TYPE	NFCHR
    204 #define	NFS_FIFO_MODE	S_IFCHR
    205 #define	NFS_FIFO_DEV	((uint32_t)-1)
    206 
    207 /* identify fifo in nfs attributes */
    208 #define	NA_ISFIFO(NA)	(((NA)->na_type == NFS_FIFO_TYPE) && \
    209 			    ((NA)->na_rdev == NFS_FIFO_DEV))
    210 
    211 /* set fifo in nfs attributes */
    212 #define	NA_SETFIFO(NA)	{ \
    213 		(NA)->na_type = NFS_FIFO_TYPE; \
    214 		(NA)->na_rdev = NFS_FIFO_DEV; \
    215 		(NA)->na_mode = ((NA)->na_mode & ~S_IFMT) | NFS_FIFO_MODE; \
    216 		}
    217 
    218 /*
    219  * Check for time overflow using a kernel tunable to determine whether
    220  * we should accept or reject an unsigned 32-bit time value. Time value in NFS
    221  * v2/3 protocol is unsigned 32 bit, but ILP32 kernel only allows 31 bits.
    222  * In nfsv4, time value is a signed 64 bit, so needs to be checked for
    223  * overflow as well (e.g. for setattr). So define the tunable as follows:
    224  * nfs_allow_preepoch_time is TRUE if pre-epoch (negative) times are allowed
    225  * and is FALSE (the default) otherwise. For nfsv2/3 this means that
    226  * if negative times are allowed, the uint32_t time value is interpreted
    227  * as a signed int, otherwise as a large positive number. For nfsv4,
    228  * we use the value as is - except that if negative times are not allowed,
    229  * we will not accept a negative value otw.
    230  *
    231  * So for nfsv2/3 (uint32_t):
    232  *
    233  * If nfs_allow_preepoch_time is
    234  * FALSE, the maximum time value is INT32_MAX for 32-bit kernels and
    235  * UINT32_MAX for 64-bit kernels (to allow times larger than 2038)
    236  * and the minimum is zero. Note that in that case, a 32-bit application
    237  * running on a 64-bit kernel will not be able to access files with
    238  * the larger time values.
    239  * If nfs_allow_preepoch_time is TRUE, the maximum time value is INT32_MAX
    240  * for both kernel configurations and the minimum is INT32_MIN.
    241  *
    242  * And for nfsv4 (int64_t):
    243  *
    244  * nfsv4 allows for negative values in the protocol, and has a 64-bit
    245  * time field, so nfs_allow_preepoch_time can be ignored.
    246  */
    247 #ifdef _KERNEL
    248 
    249 extern bool_t		nfs_allow_preepoch_time;
    250 
    251 #ifdef _LP64
    252 
    253 /*
    254  * If no negative otw values are allowed, may use the full 32-bits of the
    255  * time to represent time later than 2038, by presenting the value as an
    256  * unsigned (but this can only be used by 64-bit apps due to cstat32
    257  * restrictions). If negative values are allowed, cannot represent times
    258  * after 2038. Either way, all 32 bits have a valid representation.
    259  */
    260 
    261 /* Check if nfstime4 seconds (int64_t) can be stored in the system time */
    262 #define	NFS4_TIME_OK(tt)	TRUE
    263 
    264 
    265 #define	NFS3_TIME_OVERFLOW(tt)	(FALSE)
    266 #define	NFS2_TIME_OVERFLOW(tt)	(FALSE)
    267 
    268 /*
    269  * check if a time_t (int64_t) is ok when preepoch times are allowed -
    270  * nfsv2/3: every 32-bit value is accepted, but can't overflow 64->32.
    271  * nfsv4: every value is valid.
    272  */
    273 #define	NFS_PREEPOCH_TIME_T_OK(tt)					\
    274 	(((tt) >= (time_t)INT32_MIN) && ((tt) <= (time_t)INT32_MAX))
    275 
    276 /*
    277  * check if a time_t (int64_t) is ok when preepoch times are not allowed -
    278  * nfsv2/3: every positive 32-bit value is accepted, but can't overflow 64->32.
    279  * nfsv4: every value is valid.
    280  */
    281 #define	NFS_NO_PREEPOCH_TIME_T_OK(tt)					\
    282 	(((tt) >= 0) && ((tt) <= (time_t)(ulong_t)UINT32_MAX))
    283 
    284 #else /* not _LP64 */
    285 
    286 /*
    287  * Cannot represent times after 2038 in a 32-bit kernel, but we may wish to
    288  * restrict the use of negative values (which violate the protocol).
    289  * So if negative times allowed, all uint32 time values are valid. Otherwise
    290  * only those which are less than INT32_MAX (msb=0).
    291  *
    292  * NFSv4 uses int64_t for the time, so in a 32-bit kernel the nfsv4 value
    293  * must fit in an int32_t.
    294  */
    295 
    296 /* Only allow signed 32-bit time values */
    297 
    298 /* Check if an nfstime4 (int64_t) can be stored in the system time */
    299 #define	NFS4_TIME_OK(tt)						\
    300 	(((tt) <= INT32_MAX) &&	((tt) >= INT32_MIN))
    301 
    302 #define	NFS3_TIME_OVERFLOW(tt)	((tt) > INT32_MAX)
    303 #define	NFS2_TIME_OVERFLOW(tt)	((tt) > INT32_MAX)
    304 
    305 /*
    306  * check if a time_t (int32_t) is ok when preepoch times are allowed -
    307  * every 32-bit value is accepted
    308  */
    309 #define	NFS_PREEPOCH_TIME_T_OK(tt)	TRUE
    310 
    311 /*
    312  * check if a time_t (int32_t) is ok when preepoch times are not allowed -
    313  * only positive values are accepted.
    314  */
    315 #define	NFS_NO_PREEPOCH_TIME_T_OK(tt)	((tt) >= 0)
    316 
    317 #endif /* _LP64 */
    318 
    319 /* Check if an nfstime3 (uint32_t) can be stored in the system time */
    320 #define	NFS3_TIME_OK(tt)						\
    321 	(nfs_allow_preepoch_time || (!NFS3_TIME_OVERFLOW(tt)))
    322 
    323 /* Check if an nfs2_timeval (uint32_t) can be stored in the system time. */
    324 #define	NFS2_TIME_OK(tt)						\
    325 	(nfs_allow_preepoch_time || (!NFS2_TIME_OVERFLOW(tt)))
    326 
    327 /*
    328  * Test if time_t (signed long) can be sent over the wire - for v2/3 only if:
    329  * 1. The time value can fit in a uint32_t; and
    330  * 2. Either the time value is positive or allow preepoch times.
    331  * No restrictions for nfsv4.
    332  */
    333 #define	NFS_TIME_T_OK(tt)						\
    334 	(nfs_allow_preepoch_time ?					\
    335 		NFS_PREEPOCH_TIME_T_OK(tt) : NFS_NO_PREEPOCH_TIME_T_OK(tt))
    336 
    337 #define	NFS4_TIME_T_OK(tt)		TRUE
    338 
    339 /* Test if all attr times are valid */
    340 #define	NFS_VAP_TIME_OK(vap)						\
    341 	(nfs_allow_preepoch_time ?					\
    342 		(NFS_PREEPOCH_TIME_T_OK((vap)->va_atime.tv_sec) &&	\
    343 		NFS_PREEPOCH_TIME_T_OK((vap)->va_mtime.tv_sec) &&	\
    344 		NFS_PREEPOCH_TIME_T_OK((vap)->va_ctime.tv_sec)) :	\
    345 		(NFS_NO_PREEPOCH_TIME_T_OK((vap)->va_atime.tv_sec) &&	\
    346 		NFS_NO_PREEPOCH_TIME_T_OK((vap)->va_mtime.tv_sec) &&	\
    347 		NFS_NO_PREEPOCH_TIME_T_OK((vap)->va_ctime.tv_sec)))
    348 
    349 #define	NFS4_VAP_TIME_OK(vap)			TRUE
    350 
    351 /*
    352  * To extend the sign or not extend the sign, that is the question.
    353  * Note: The correct way is to code a macro:
    354  * #define	NFS_TIME_T_CONVERT(tt)					\
    355  *	(nfs_allow_preepoch_time ? (int32_t)(tt) : (uint32_t)(tt))
    356  * But the 64-bit compiler does not extend the sign in that case (why?)
    357  * so we'll do it the ugly way...
    358  */
    359 #define	NFS_TIME_T_CONVERT(systt, tt)		\
    360 	if (nfs_allow_preepoch_time) {		\
    361 		systt = (int32_t)(tt);		\
    362 	} else {				\
    363 		systt = (uint32_t)(tt);		\
    364 	}
    365 
    366 /* macro to check for overflowed time attribute fields - version 3 */
    367 #define	NFS3_FATTR_TIME_OK(attrs)			\
    368 	(NFS3_TIME_OK((attrs)->atime.seconds) &&	\
    369 	NFS3_TIME_OK((attrs)->mtime.seconds) &&		\
    370 	NFS3_TIME_OK((attrs)->ctime.seconds))
    371 
    372 /* macro to check for overflowed time attribute fields - version 2 */
    373 #define	NFS2_FATTR_TIME_OK(attrs)			\
    374 	(NFS2_TIME_OK((attrs)->na_atime.tv_sec) &&	\
    375 	NFS2_TIME_OK((attrs)->na_mtime.tv_sec) &&	\
    376 	NFS2_TIME_OK((attrs)->na_ctime.tv_sec))
    377 
    378 /* Check that a size3 value is not overflowed */
    379 #define	NFS3_SIZE_OK(size)	((size) <= MAXOFFSET_T)
    380 
    381 #endif /* _KERNEL */
    382 
    383 /*
    384  * Size of an fhandle in bytes
    385  */
    386 #define	NFS_FHSIZE	32
    387 
    388 struct nfs_fid {
    389 	ushort_t nf_len;
    390 	ushort_t nf_pad;
    391 	char	nf_data[NFS_FHSIZE];
    392 };
    393 
    394 /*
    395  * "Legacy" filehandles use NFS_FHMAXDATA (10) byte fids. Filesystems that
    396  * return a larger fid than NFS_FHMAXDATA, such as ZFS's .zfs snapshot
    397  * directory, can use up to (((64 - 8) / 2) - 2) bytes for their fid.
    398  * This currently holds for both NFSv3 and NFSv4.
    399  */
    400 #define	NFS_FHMAXDATA		10
    401 #define	NFS_FH3MAXDATA		26
    402 #define	NFS_FH4MAXDATA		26
    403 
    404 /*
    405  * The original nfs file handle size for version 3 was 32 which was
    406  * the same in version 2; now we're making it bigger to to deal with
    407  * ZFS snapshot FIDs.
    408  *
    409  * If the size of fhandle3_t changes or if Version 3 uses some other
    410  * filehandle format, this constant may need to change.
    411  */
    412 
    413 #define	NFS3_OLDFHSIZE	32
    414 #define	NFS3_MAXFHSIZE	64
    415 
    416 /*
    417  * This is the actual definition of a legacy filehandle.  There is some
    418  * dependence on this layout in NFS-related code, particularly in the
    419  * user-level lock manager, so be careful about changing it.
    420  *
    421  * Currently only NFSv2 uses this structure.
    422  */
    423 
    424 typedef struct svcfh {
    425 	fsid_t	fh_fsid;			/* filesystem id */
    426 	ushort_t fh_len;			/* file number length */
    427 	char	fh_data[NFS_FHMAXDATA];		/* and data */
    428 	ushort_t fh_xlen;			/* export file number length */
    429 	char	fh_xdata[NFS_FHMAXDATA];	/* and data */
    430 } fhandle_t;
    431 
    432 /*
    433  * This is the in-memory structure for an NFSv3 extended filehandle.
    434  */
    435 typedef struct {
    436 	fsid_t	_fh3_fsid;			/* filesystem id */
    437 	ushort_t _fh3_len;			/* file number length */
    438 	char	_fh3_data[NFS_FH3MAXDATA];		/* and data */
    439 	ushort_t _fh3_xlen;			/* export file number length */
    440 	char	_fh3_xdata[NFS_FH3MAXDATA];	/* and data */
    441 } fhandle3_t;
    442 
    443 /*
    444  * This is the in-memory structure for an NFSv4 extended filehandle.
    445  */
    446 typedef struct {
    447 	fsid_t	fhx_fsid;			/* filesystem id */
    448 	ushort_t fhx_len;			/* file number length */
    449 	char	fhx_data[NFS_FH4MAXDATA];	/* and data */
    450 	ushort_t fhx_xlen;			/* export file number length */
    451 	char	fhx_xdata[NFS_FH4MAXDATA];	/* and data */
    452 } fhandle4_t;
    453 
    454 /*
    455  * Arguments to remote write and writecache
    456  */
    457 /*
    458  * The `over the wire' representation of the first four arguments.
    459  */
    460 struct otw_nfswriteargs {
    461 	fhandle_t	otw_wa_fhandle;
    462 	uint32_t	otw_wa_begoff;
    463 	uint32_t	otw_wa_offset;
    464 	uint32_t	otw_wa_totcount;
    465 };
    466 
    467 struct nfswriteargs {
    468 	struct otw_nfswriteargs *wa_args;	/* ptr to the otw arguments */
    469 	struct otw_nfswriteargs wa_args_buf;	/* space for otw arguments */
    470 	uint32_t	wa_count;
    471 	char		*wa_data;	/* data to write (up to NFS_MAXDATA) */
    472 	mblk_t		*wa_mblk;	/* pointer to mblks containing data */
    473 #ifdef _KERNEL
    474 	/* rdma related info */
    475 	struct clist	*wa_rlist;
    476 	CONN		*wa_conn;
    477 #endif /* _KERNEL */
    478 };
    479 #define	wa_fhandle	wa_args->otw_wa_fhandle
    480 #define	wa_begoff	wa_args->otw_wa_begoff
    481 #define	wa_offset	wa_args->otw_wa_offset
    482 #define	wa_totcount	wa_args->otw_wa_totcount
    483 
    484 /*
    485  * NFS timeval struct using unsigned int as specified in V2 protocol.
    486  * tv_sec and tv_usec used to match existing code.
    487  */
    488 struct nfs2_timeval {
    489 	uint32_t tv_sec;
    490 	uint32_t tv_usec;
    491 };
    492 typedef struct nfs2_timeval nfs2_timeval;
    493 
    494 /*
    495  * File attributes
    496  */
    497 struct nfsfattr {
    498 	enum nfsftype	na_type;	/* file type */
    499 	uint32_t	na_mode;	/* protection mode bits */
    500 	uint32_t	na_nlink;	/* # hard links */
    501 	uint32_t	na_uid;		/* owner user id */
    502 	uint32_t	na_gid;		/* owner group id */
    503 	uint32_t	na_size;	/* file size in bytes */
    504 	uint32_t	na_blocksize;	/* preferred block size */
    505 	uint32_t	na_rdev;	/* special device # */
    506 	uint32_t	na_blocks;	/* Kb of disk used by file */
    507 	uint32_t	na_fsid;	/* device # */
    508 	uint32_t	na_nodeid;	/* inode # */
    509 	struct nfs2_timeval na_atime;	/* time of last access */
    510 	struct nfs2_timeval na_mtime;	/* time of last modification */
    511 	struct nfs2_timeval na_ctime;	/* time of last change */
    512 };
    513 
    514 #define	n2v_type(x)	(NA_ISFIFO(x) ? VFIFO : nf_to_vt[(x)->na_type])
    515 #define	n2v_rdev(x)	(NA_ISFIFO(x) ? 0 : (x)->na_rdev)
    516 
    517 /*
    518  * Arguments to remote read
    519  */
    520 struct nfsreadargs {
    521 	fhandle_t	ra_fhandle;	/* handle for file */
    522 	uint32_t	ra_offset;	/* byte offset in file */
    523 	uint32_t	ra_count;	/* immediate read count */
    524 	uint32_t	ra_totcount;	/* total read cnt (from this offset) */
    525 #ifdef _KERNEL
    526 	/* used in rdma transports */
    527 	caddr_t		ra_data;	/* destination for read data */
    528 	struct clist	*ra_wlist;
    529 	CONN		*ra_conn;
    530 #endif
    531 };
    532 
    533 /*
    534  * Status OK portion of remote read reply
    535  */
    536 struct nfsrrok {
    537 	struct nfsfattr	rrok_attr;	/* attributes, need for pagin */
    538 	uint32_t	rrok_count;	/* bytes of data */
    539 	char		*rrok_data;	/* data (up to NFS_MAXDATA bytes) */
    540 	uint_t		rrok_bufsize;	/* size of kmem_alloc'd buffer */
    541 	mblk_t		*rrok_mp;	/* mblk_t contains data for reply */
    542 #ifdef _KERNEL
    543 	uint_t		rrok_wlist_len;
    544 	struct clist    *rrok_wlist;
    545 #endif
    546 };
    547 
    548 /*
    549  * Reply from remote read
    550  */
    551 struct nfsrdresult {
    552 	nfsstat	rr_status;			/* status of read */
    553 	union {
    554 		struct nfsrrok	rr_ok_u;	/* attributes, need for pagin */
    555 	} rr_u;
    556 };
    557 #define	rr_ok		rr_u.rr_ok_u
    558 #define	rr_attr		rr_u.rr_ok_u.rrok_attr
    559 #define	rr_count	rr_u.rr_ok_u.rrok_count
    560 #define	rr_bufsize	rr_u.rr_ok_u.rrok_bufsize
    561 #define	rr_data		rr_u.rr_ok_u.rrok_data
    562 #define	rr_mp		rr_u.rr_ok_u.rrok_mp
    563 
    564 /*
    565  * File attributes which can be set
    566  */
    567 struct nfssattr {
    568 	uint32_t	sa_mode;	/* protection mode bits */
    569 	uint32_t	sa_uid;		/* owner user id */
    570 	uint32_t	sa_gid;		/* owner group id */
    571 	uint32_t	sa_size;	/* file size in bytes */
    572 	struct nfs2_timeval sa_atime;	/* time of last access */
    573 	struct nfs2_timeval sa_mtime;	/* time of last modification */
    574 };
    575 
    576 
    577 /*
    578  * Reply status with file attributes
    579  */
    580 struct nfsattrstat {
    581 	nfsstat	ns_status;			/* reply status */
    582 	union {
    583 		struct nfsfattr ns_attr_u;	/* NFS_OK: file attributes */
    584 	} ns_u;
    585 };
    586 #define	ns_attr	ns_u.ns_attr_u
    587 
    588 
    589 /*
    590  * NFS_OK part of read sym link reply union
    591  */
    592 struct nfssrok {
    593 	uint32_t srok_count;	/* size of string */
    594 	char	*srok_data;	/* string (up to NFS_MAXPATHLEN bytes) */
    595 };
    596 
    597 /*
    598  * Result of reading symbolic link
    599  */
    600 struct nfsrdlnres {
    601 	nfsstat	rl_status;			/* status of symlink read */
    602 	union {
    603 		struct nfssrok	rl_srok_u;	/* name of linked to */
    604 	} rl_u;
    605 };
    606 #define	rl_srok		rl_u.rl_srok_u
    607 #define	rl_count	rl_u.rl_srok_u.srok_count
    608 #define	rl_data		rl_u.rl_srok_u.srok_data
    609 
    610 
    611 /*
    612  * Arguments to readdir
    613  */
    614 struct nfsrddirargs {
    615 	fhandle_t rda_fh;	/* directory handle */
    616 	uint32_t rda_offset;	/* offset in directory (opaque) */
    617 	uint32_t rda_count;	/* number of directory bytes to read */
    618 };
    619 
    620 /*
    621  * NFS_OK part of readdir result
    622  */
    623 struct nfsrdok {
    624 	uint32_t rdok_offset;		/* next offset (opaque) */
    625 	uint32_t rdok_size;		/* size in bytes of entries */
    626 	bool_t	rdok_eof;		/* true if last entry is in result */
    627 	struct dirent64 *rdok_entries;	/* variable number of entries */
    628 };
    629 
    630 /*
    631  * Readdir result
    632  */
    633 struct nfsrddirres {
    634 	nfsstat	rd_status;
    635 	uint_t		rd_bufsize;	/* client request size (not xdr'ed) */
    636 	union {
    637 		struct nfsrdok rd_rdok_u;
    638 	} rd_u;
    639 };
    640 #define	rd_rdok		rd_u.rd_rdok_u
    641 #define	rd_offset	rd_u.rd_rdok_u.rdok_offset
    642 #define	rd_size		rd_u.rd_rdok_u.rdok_size
    643 #define	rd_eof		rd_u.rd_rdok_u.rdok_eof
    644 #define	rd_entries	rd_u.rd_rdok_u.rdok_entries
    645 
    646 
    647 /*
    648  * Arguments for directory operations
    649  */
    650 struct nfsdiropargs {
    651 	fhandle_t	*da_fhandle;	/* pointer to directory file handle */
    652 	char		*da_name;	/* name (up to NFS_MAXNAMLEN bytes) */
    653 	fhandle_t	da_fhandle_buf;	/* directory file handle */
    654 	int		da_flags;	/* flags, see below */
    655 };
    656 #define	DA_FREENAME	1
    657 
    658 /*
    659  * NFS_OK part of directory operation result
    660  */
    661 struct  nfsdrok {
    662 	fhandle_t	drok_fhandle;	/* result file handle */
    663 	struct nfsfattr	drok_attr;	/* result file attributes */
    664 };
    665 
    666 /*
    667  * Results from directory operation
    668  */
    669 struct  nfsdiropres {
    670 	nfsstat	dr_status;			/* result status */
    671 	union {
    672 		struct  nfsdrok	dr_drok_u;	/* NFS_OK result */
    673 	} dr_u;
    674 };
    675 #define	dr_drok		dr_u.dr_drok_u
    676 #define	dr_fhandle	dr_u.dr_drok_u.drok_fhandle
    677 #define	dr_attr		dr_u.dr_drok_u.drok_attr
    678 
    679 /*
    680  * arguments to setattr
    681  */
    682 struct nfssaargs {
    683 	fhandle_t	saa_fh;		/* fhandle of file to be set */
    684 	struct nfssattr	saa_sa;		/* new attributes */
    685 };
    686 
    687 /*
    688  * arguments to create and mkdir
    689  */
    690 struct nfscreatargs {
    691 	struct nfsdiropargs	ca_da;	/* file name to create and parent dir */
    692 	struct nfssattr		*ca_sa;	/* initial attributes */
    693 	struct nfssattr		ca_sa_buf;	/* space to store attributes */
    694 };
    695 
    696 /*
    697  * arguments to link
    698  */
    699 struct nfslinkargs {
    700 	fhandle_t		*la_from;	/* old file */
    701 	fhandle_t		la_from_buf;	/* old file */
    702 	struct nfsdiropargs	la_to;		/* new file and parent dir */
    703 };
    704 
    705 /*
    706  * arguments to rename
    707  */
    708 struct nfsrnmargs {
    709 	struct nfsdiropargs rna_from;	/* old file and parent dir */
    710 	struct nfsdiropargs rna_to;	/* new file and parent dir */
    711 };
    712 
    713 /*
    714  * arguments to symlink
    715  */
    716 struct nfsslargs {
    717 	struct nfsdiropargs	sla_from;	/* old file and parent dir */
    718 	char			*sla_tnm;	/* new name */
    719 	int			sla_tnm_flags;	/* flags for name */
    720 	struct nfssattr		*sla_sa;	/* attributes */
    721 	struct nfssattr		sla_sa_buf;	/* attributes buffer */
    722 };
    723 #define	SLA_FREETNM	1
    724 
    725 /*
    726  * NFS_OK part of statfs operation
    727  */
    728 struct nfsstatfsok {
    729 	uint32_t fsok_tsize;	/* preferred transfer size in bytes */
    730 	uint32_t fsok_bsize;	/* fundamental file system block size */
    731 	uint32_t fsok_blocks;	/* total blocks in file system */
    732 	uint32_t fsok_bfree;	/* free blocks in fs */
    733 	uint32_t fsok_bavail;	/* free blocks avail to non-superuser */
    734 };
    735 
    736 /*
    737  * Results of statfs operation
    738  */
    739 struct nfsstatfs {
    740 	nfsstat	fs_status;			/* result status */
    741 	union {
    742 		struct	nfsstatfsok fs_fsok_u;	/* NFS_OK result */
    743 	} fs_u;
    744 };
    745 #define	fs_fsok		fs_u.fs_fsok_u
    746 #define	fs_tsize	fs_u.fs_fsok_u.fsok_tsize
    747 #define	fs_bsize	fs_u.fs_fsok_u.fsok_bsize
    748 #define	fs_blocks	fs_u.fs_fsok_u.fsok_blocks
    749 #define	fs_bfree	fs_u.fs_fsok_u.fsok_bfree
    750 #define	fs_bavail	fs_u.fs_fsok_u.fsok_bavail
    751 
    752 #ifdef _KERNEL
    753 /*
    754  * XDR routines for handling structures defined above
    755  */
    756 extern bool_t	xdr_attrstat(XDR *, struct nfsattrstat *);
    757 extern bool_t	xdr_fastattrstat(XDR *, struct nfsattrstat *);
    758 extern bool_t	xdr_creatargs(XDR *, struct nfscreatargs *);
    759 extern bool_t	xdr_diropargs(XDR *, struct nfsdiropargs *);
    760 extern bool_t	xdr_diropres(XDR *, struct nfsdiropres *);
    761 extern bool_t	xdr_fastdiropres(XDR *, struct nfsdiropres *);
    762 extern bool_t	xdr_drok(XDR *, struct nfsdrok *);
    763 #ifdef _LITTLE_ENDIAN
    764 extern bool_t	xdr_fastdrok(XDR *, struct nfsdrok *);
    765 extern bool_t	xdr_fastfattr(XDR *, struct nfsfattr *);
    766 #endif
    767 extern bool_t	xdr_fattr(XDR *, struct nfsfattr *);
    768 extern bool_t	xdr_fhandle(XDR *, fhandle_t *);
    769 extern bool_t	xdr_fastfhandle(XDR *, fhandle_t **);
    770 extern bool_t	xdr_linkargs(XDR *, struct nfslinkargs *);
    771 extern bool_t	xdr_rddirargs(XDR *, struct nfsrddirargs *);
    772 extern bool_t	xdr_putrddirres(XDR *, struct nfsrddirres *);
    773 extern bool_t	xdr_getrddirres(XDR *, struct nfsrddirres *);
    774 extern bool_t	xdr_rdlnres(XDR *, struct nfsrdlnres *);
    775 extern bool_t	xdr_rdresult(XDR *, struct nfsrdresult *);
    776 extern bool_t	xdr_readargs(XDR *, struct nfsreadargs *);
    777 extern bool_t	xdr_readlink(XDR *, fhandle_t *);
    778 extern bool_t	xdr_rnmargs(XDR *, struct nfsrnmargs *);
    779 extern bool_t	xdr_rrok(XDR *, struct nfsrrok *);
    780 extern bool_t	xdr_saargs(XDR *, struct nfssaargs *);
    781 extern bool_t	xdr_sattr(XDR *, struct nfssattr *);
    782 extern bool_t	xdr_slargs(XDR *, struct nfsslargs *);
    783 extern bool_t	xdr_srok(XDR *, struct nfssrok *);
    784 extern bool_t	xdr_nfs2_timeval(XDR *, struct nfs2_timeval *);
    785 extern bool_t	xdr_writeargs(XDR *, struct nfswriteargs *);
    786 extern bool_t	xdr_fsok(XDR *, struct nfsstatfsok *);
    787 #ifdef _LITTLE_ENDIAN
    788 extern bool_t	xdr_fastfsok(XDR *, struct nfsstatfsok *);
    789 extern bool_t	xdr_fastenum(XDR *, enum_t *);
    790 #endif
    791 extern bool_t	xdr_statfs(XDR *, struct nfsstatfs *);
    792 extern bool_t	xdr_faststatfs(XDR *, struct nfsstatfs *);
    793 #endif
    794 
    795 /*
    796  * Remote file service routines
    797  */
    798 #define	RFS_NULL	0
    799 #define	RFS_GETATTR	1
    800 #define	RFS_SETATTR	2
    801 #define	RFS_ROOT	3
    802 #define	RFS_LOOKUP	4
    803 #define	RFS_READLINK	5
    804 #define	RFS_READ	6
    805 #define	RFS_WRITECACHE	7
    806 #define	RFS_WRITE	8
    807 #define	RFS_CREATE	9
    808 #define	RFS_REMOVE	10
    809 #define	RFS_RENAME	11
    810 #define	RFS_LINK	12
    811 #define	RFS_SYMLINK	13
    812 #define	RFS_MKDIR	14
    813 #define	RFS_RMDIR	15
    814 #define	RFS_READDIR	16
    815 #define	RFS_STATFS	17
    816 #define	RFS_NPROC	18
    817 
    818 #ifdef _KERNEL
    819 /*
    820  * The NFS Version 2 service procedures
    821  */
    822 struct exportinfo;	/* defined in nfs/export.h */
    823 struct servinfo;	/* defined in nfs/nfs_clnt.h */
    824 struct mntinfo;		/* defined in nfs/nfs_clnt.h */
    825 
    826 extern void rfs_getattr(fhandle_t *, struct nfsattrstat *,
    827 			struct exportinfo *, struct svc_req *, cred_t *);
    828 extern void *rfs_getattr_getfh(fhandle_t *);
    829 extern void rfs_setattr(struct nfssaargs *, struct nfsattrstat *,
    830 			struct exportinfo *, struct svc_req *, cred_t *);
    831 extern void *rfs_setattr_getfh(struct nfssaargs *);
    832 extern void rfs_lookup(struct nfsdiropargs *, struct nfsdiropres *,
    833 			struct exportinfo *, struct svc_req *, cred_t *);
    834 extern void *rfs_lookup_getfh(struct nfsdiropargs *);
    835 extern void rfs_readlink(fhandle_t *, struct nfsrdlnres *,
    836 			struct exportinfo *, struct svc_req *, cred_t *);
    837 extern void *rfs_readlink_getfh(fhandle_t *);
    838 extern void rfs_rlfree(struct nfsrdlnres *);
    839 extern void rfs_read(struct nfsreadargs *, struct nfsrdresult *,
    840 			struct exportinfo *, struct svc_req *, cred_t *);
    841 extern void *rfs_read_getfh(struct nfsreadargs *);
    842 extern void rfs_rdfree(struct nfsrdresult *);
    843 extern void rfs_write_sync(struct nfswriteargs *, struct nfsattrstat *,
    844 			struct exportinfo *, struct svc_req *, cred_t *);
    845 extern void rfs_write(struct nfswriteargs *, struct nfsattrstat *,
    846 			struct exportinfo *, struct svc_req *, cred_t *);
    847 extern void *rfs_write_getfh(struct nfswriteargs *);
    848 extern void rfs_create(struct nfscreatargs *, struct nfsdiropres *,
    849 			struct exportinfo *, struct svc_req *, cred_t *);
    850 extern void *rfs_create_getfh(struct nfscreatargs *);
    851 extern void rfs_remove(struct nfsdiropargs *, enum nfsstat *,
    852 			struct exportinfo *, struct svc_req *, cred_t *);
    853 extern void *rfs_remove_getfh(struct nfsdiropargs *);
    854 extern void rfs_rename(struct nfsrnmargs *, enum nfsstat *,
    855 			struct exportinfo *, struct svc_req *, cred_t *);
    856 extern void *rfs_rename_getfh(struct nfsrnmargs *);
    857 extern void rfs_link(struct nfslinkargs *, enum nfsstat *,
    858 			struct exportinfo *, struct svc_req *, cred_t *);
    859 extern void *rfs_link_getfh(struct nfslinkargs *);
    860 extern void rfs_symlink(struct nfsslargs *, enum nfsstat *,
    861 			struct exportinfo *, struct svc_req *, cred_t *);
    862 extern void *rfs_symlink_getfh(struct nfsslargs *);
    863 extern void rfs_mkdir(struct nfscreatargs *, struct nfsdiropres *,
    864 			struct exportinfo *, struct svc_req *, cred_t *);
    865 extern void *rfs_mkdir_getfh(struct nfscreatargs *);
    866 extern void rfs_rmdir(struct nfsdiropargs *, enum nfsstat *,
    867 			struct exportinfo *, struct svc_req *, cred_t *);
    868 extern void *rfs_rmdir_getfh(struct nfsdiropargs *);
    869 extern void rfs_readdir(struct nfsrddirargs *, struct nfsrddirres *,
    870 			struct exportinfo *, struct svc_req *, cred_t *);
    871 extern void *rfs_readdir_getfh(struct nfsrddirargs *);
    872 extern void rfs_rddirfree(struct nfsrddirres *);
    873 extern void rfs_statfs(fhandle_t *, struct nfsstatfs *,
    874 			struct exportinfo *, struct svc_req *, cred_t *);
    875 extern void *rfs_statfs_getfh(fhandle_t *);
    876 extern void rfs_srvrinit(void);
    877 extern void rfs_srvrfini(void);
    878 
    879 /*
    880  * flags to define path types during Multi Component Lookups
    881  * using the public filehandle
    882  */
    883 #define	URLPATH		0x01	/* Universal Resource Locator path */
    884 #define	NATIVEPATH	0x02	/* Native path, i.e., via mount protocol */
    885 #define	SECURITY_QUERY	0x04	/* Security query */
    886 
    887 enum nfs_svccounts {NFS_CALLS, NFS_BADCALLS}; /* index for svstat_ptr */
    888 
    889 /*	function defs for NFS kernel */
    890 extern int	nfs_waitfor_purge_complete(vnode_t *);
    891 extern int	nfs_validate_caches(vnode_t *, cred_t *);
    892 extern void	nfs_purge_caches(vnode_t *, int, cred_t *);
    893 extern void	nfs_purge_rddir_cache(vnode_t *);
    894 extern void	nfs_attrcache(vnode_t *, struct nfsfattr *, hrtime_t);
    895 extern int	nfs_cache_fattr(vnode_t *, struct nfsfattr *, vattr_t *,
    896 				hrtime_t, cred_t *);
    897 extern void	nfs_attr_cache(vnode_t *, vattr_t *, hrtime_t, cred_t *);
    898 extern void	nfs_attrcache_va(vnode_t *, struct vattr *);
    899 extern int	nfs_getattr_otw(vnode_t *, struct vattr *, cred_t *);
    900 extern int	nfsgetattr(vnode_t *, struct vattr *, cred_t *);
    901 extern int	nattr_to_vattr(vnode_t *, struct nfsfattr *, struct vattr *);
    902 extern void	nfs_async_manager(struct vfs *);
    903 extern void	nfs_async_manager_stop(struct vfs *);
    904 extern void	nfs_async_stop(struct vfs *);
    905 extern int	nfs_async_stop_sig(struct vfs *);
    906 extern int	nfs_clntinit(void);
    907 extern void	nfs_clntfini(void);
    908 extern int	nfstsize(void);
    909 extern int	nfs_srvinit(void);
    910 extern void	nfs_srvfini(void);
    911 extern int	vattr_to_sattr(struct vattr *, struct nfssattr *);
    912 extern void	setdiropargs(struct nfsdiropargs *, char *, vnode_t *);
    913 extern int	setdirgid(vnode_t *, gid_t *, cred_t *);
    914 extern int	setdirmode(vnode_t *, mode_t *, cred_t *);
    915 extern int	newnum(void);
    916 extern char	*newname(void);
    917 extern int	nfs_subrinit(void);
    918 extern void	nfs_subrfini(void);
    919 extern enum nfsstat puterrno(int);
    920 extern int	geterrno(enum nfsstat);
    921 extern int	nfsinit(int, char *);
    922 extern void	nfsfini(void);
    923 extern int	nfs_vfsinit(void);
    924 extern void	nfs_vfsfini(void);
    925 extern int	nfs_dump(vnode_t *, caddr_t, offset_t, offset_t,
    926     caller_context_t *);
    927 extern void	nfs_perror(int error, char *fmt, ...);
    928 extern void	nfs_cmn_err(int error, int level, char *fmt, ...);
    929 extern int	nfs_addcllock(vnode_t *vp, struct flock64 *bfp);
    930 extern void	nfs_rmcllock(vnode_t *vp, struct flock64 *bfp);
    931 extern void	nfs_lockrelease(vnode_t *vp, int flag,
    932 		    offset_t offset, cred_t *credp);
    933 extern int	vattr_to_nattr(struct vattr *, struct nfsfattr *);
    934 extern int	mount_root(char *, char *, int, struct nfs_args *, int *);
    935 extern void	nfs_lockcompletion(vnode_t *vp, int cmd);
    936 extern void	nfs_add_locking_id(vnode_t *, pid_t, int, char *, int);
    937 extern void	nfs3copyfh(caddr_t, vnode_t *);
    938 extern void	nfscopyfh(caddr_t, vnode_t *);
    939 extern int	nfs3lookup(vnode_t *, char *, vnode_t **, struct pathname *,
    940 				int, vnode_t *, cred_t *, int);
    941 extern int	nfslookup(vnode_t *, char *, vnode_t **, struct pathname *,
    942 				int, vnode_t *, cred_t *, int);
    943 extern void	sv_free(struct servinfo *);
    944 extern int	nfsauth_access(struct exportinfo *exi, struct svc_req *req);
    945 extern void	nfsauth_init();
    946 extern void	nfsauth_fini();
    947 extern int	nfs_setopts(vnode_t *vp, model_t model, struct nfs_args *args);
    948 extern int	nfs_mount_label_policy(vfs_t *vfsp, struct netbuf *addr,
    949 		    struct knetconfig *knconf, cred_t *cr);
    950 extern boolean_t	nfs_has_ctty(void);
    951 extern void	nfs_srv_stop_all(void);
    952 extern void	nfs_srv_quiesce_all(void);
    953 extern void	(*nfs_srv_quiesce_func)(void);
    954 extern int	rfs4_dss_setpaths(char *, size_t);
    955 extern int	(*nfs_srv_dss_func)(char *, size_t);
    956 extern time_t	rfs4_lease_time;
    957 extern time_t	rfs4_grace_period;
    958 extern nvlist_t	*rfs4_dss_paths, *rfs4_dss_oldpaths;
    959 
    960 
    961 extern kstat_named_t	*global_svstat_ptr[];
    962 
    963 extern krwlock_t	rroklock;
    964 extern vtype_t		nf_to_vt[];
    965 extern kstat_named_t	*rfsproccnt_v2_ptr;
    966 extern kmutex_t		nfs_minor_lock;
    967 extern int		nfs_major;
    968 extern int		nfs_minor;
    969 extern vfsops_t		*nfs_vfsops;
    970 extern struct vnodeops	*nfs_vnodeops;
    971 extern const struct fs_operation_def nfs_vnodeops_template[];
    972 extern int		nfsfstyp;
    973 
    974 /*
    975  * Per-zone stats as consumed by nfsstat(1m)
    976  */
    977 struct nfs_version_stats {
    978 	kstat_named_t	*aclreqcnt_ptr;		/* nfs_acl:0:aclreqcnt_v? */
    979 	kstat_named_t	*aclproccnt_ptr;	/* nfs_acl:0:aclproccnt_v? */
    980 	kstat_named_t	*rfsreqcnt_ptr;		/* nfs:0:rfsreqcnt_v? */
    981 	kstat_named_t	*rfsproccnt_ptr;	/* nfs:0:rfsproccnt_v? */
    982 };
    983 
    984 /*
    985  * A bit of asymmetry: nfs:0:nfs_client isn't part of this structure.
    986  */
    987 struct nfs_stats {
    988 	kstat_named_t		*nfs_stats_svstat_ptr[NFS_VERSMAX + 1];
    989 	struct nfs_version_stats	nfs_stats_v2;
    990 	struct nfs_version_stats	nfs_stats_v3;
    991 	struct nfs_version_stats	nfs_stats_v4;
    992 };
    993 
    994 /*
    995  * Key used to retrieve counters.
    996  */
    997 extern zone_key_t nfsstat_zone_key;
    998 
    999 /*
   1000  * Zone callback functions.
   1001  */
   1002 extern void *nfsstat_zone_init(zoneid_t);
   1003 extern void nfsstat_zone_fini(zoneid_t, void *);
   1004 
   1005 #endif	/* _KERNEL */
   1006 
   1007 /*
   1008  * Version 3 declarations and definitions.
   1009  */
   1010 
   1011 #define	NFS3_FHSIZE 64
   1012 #define	NFS3_COOKIEVERFSIZE 8
   1013 #define	NFS3_CREATEVERFSIZE 8
   1014 #define	NFS3_WRITEVERFSIZE 8
   1015 
   1016 typedef char *filename3;
   1017 
   1018 typedef char *nfspath3;
   1019 
   1020 #define	nfs3nametoolong	((char *)-1)
   1021 
   1022 typedef uint64 fileid3;
   1023 
   1024 typedef uint64 cookie3;
   1025 
   1026 typedef uint32 uid3;
   1027 
   1028 typedef uint32 gid3;
   1029 
   1030 typedef uint64 size3;
   1031 
   1032 typedef uint64 offset3;
   1033 
   1034 typedef uint32 mode3;
   1035 
   1036 typedef uint32 count3;
   1037 
   1038 /*
   1039  * These three are really opaque arrays, but we treat them as
   1040  * uint64 for efficiency sake
   1041  */
   1042 typedef uint64 cookieverf3;
   1043 
   1044 typedef uint64 createverf3;
   1045 
   1046 typedef uint64 writeverf3;
   1047 
   1048 typedef struct nfs_fh3 {
   1049 	uint_t fh3_length;
   1050 	union nfs_fh3_u {
   1051 		struct nfs_fh3_i {
   1052 			fhandle3_t fh3_i;
   1053 		} nfs_fh3_i;
   1054 		char data[NFS3_FHSIZE];
   1055 	} fh3_u;
   1056 	uint_t fh3_flags;
   1057 } nfs_fh3;
   1058 #define	fh3_fsid	fh3_u.nfs_fh3_i.fh3_i._fh3_fsid
   1059 #define	fh3_len		fh3_u.nfs_fh3_i.fh3_i._fh3_len
   1060 #define	fh3_data	fh3_u.nfs_fh3_i.fh3_i._fh3_data
   1061 #define	fh3_xlen	fh3_u.nfs_fh3_i.fh3_i._fh3_xlen
   1062 #define	fh3_xdata	fh3_u.nfs_fh3_i.fh3_i._fh3_xdata
   1063 #define	FH3TOFIDP(fh)	((fid_t *)&((fh)->fh3_len))
   1064 #define	FH3TOXFIDP(fh)	((fid_t *)&((fh)->fh3_xlen))
   1065 
   1066 /*
   1067  * nfs_fh3.fh3_flags values
   1068  */
   1069 #define	FH_WEBNFS	0x1	/* fh is WebNFS overloaded - see makefh3_ol() */
   1070 
   1071 /*
   1072  * Two elements were added to the
   1073  * diropargs3 structure for performance (xdr-inlining).
   1074  * They are not included as part of the args
   1075  * that are encoded or decoded:
   1076  * dirp - ptr to the nfs_fh3
   1077  * flag indicating when to free the name that was
   1078  * allocated during decode.
   1079  */
   1080 struct diropargs3 {
   1081 	nfs_fh3 *dirp;
   1082 	nfs_fh3 dir;
   1083 	filename3 name;
   1084 	int flags;
   1085 };
   1086 typedef struct diropargs3 diropargs3;
   1087 
   1088 struct nfstime3 {
   1089 	uint32 seconds;
   1090 	uint32 nseconds;
   1091 };
   1092 typedef struct nfstime3 nfstime3;
   1093 
   1094 struct specdata3 {
   1095 	uint32 specdata1;
   1096 	uint32 specdata2;
   1097 };
   1098 typedef struct specdata3 specdata3;
   1099 
   1100 enum nfsstat3 {
   1101 	NFS3_OK = 0,
   1102 	NFS3ERR_PERM = 1,
   1103 	NFS3ERR_NOENT = 2,
   1104 	NFS3ERR_IO = 5,
   1105 	NFS3ERR_NXIO = 6,
   1106 	NFS3ERR_ACCES = 13,
   1107 	NFS3ERR_EXIST = 17,
   1108 	NFS3ERR_XDEV = 18,
   1109 	NFS3ERR_NODEV = 19,
   1110 	NFS3ERR_NOTDIR = 20,
   1111 	NFS3ERR_ISDIR = 21,
   1112 	NFS3ERR_INVAL = 22,
   1113 	NFS3ERR_FBIG = 27,
   1114 	NFS3ERR_NOSPC = 28,
   1115 	NFS3ERR_ROFS = 30,
   1116 	NFS3ERR_MLINK = 31,
   1117 	NFS3ERR_NAMETOOLONG = 63,
   1118 	NFS3ERR_NOTEMPTY = 66,
   1119 	NFS3ERR_DQUOT = 69,
   1120 	NFS3ERR_STALE = 70,
   1121 	NFS3ERR_REMOTE = 71,
   1122 	NFS3ERR_BADHANDLE = 10001,
   1123 	NFS3ERR_NOT_SYNC = 10002,
   1124 	NFS3ERR_BAD_COOKIE = 10003,
   1125 	NFS3ERR_NOTSUPP = 10004,
   1126 	NFS3ERR_TOOSMALL = 10005,
   1127 	NFS3ERR_SERVERFAULT = 10006,
   1128 	NFS3ERR_BADTYPE = 10007,
   1129 	NFS3ERR_JUKEBOX = 10008
   1130 };
   1131 typedef enum nfsstat3 nfsstat3;
   1132 
   1133 enum ftype3 {
   1134 	NF3REG = 1,
   1135 	NF3DIR = 2,
   1136 	NF3BLK = 3,
   1137 	NF3CHR = 4,
   1138 	NF3LNK = 5,
   1139 	NF3SOCK = 6,
   1140 	NF3FIFO = 7
   1141 };
   1142 typedef enum ftype3 ftype3;
   1143 
   1144 struct fattr3 {
   1145 	ftype3 type;
   1146 	mode3 mode;
   1147 	uint32 nlink;
   1148 	uid3 uid;
   1149 	gid3 gid;
   1150 	size3 size;
   1151 	size3 used;
   1152 	specdata3 rdev;
   1153 	uint64 fsid;
   1154 	fileid3 fileid;
   1155 	nfstime3 atime;
   1156 	nfstime3 mtime;
   1157 	nfstime3 ctime;
   1158 };
   1159 typedef struct fattr3 fattr3;
   1160 
   1161 #define	NFS3_SIZEOF_FATTR3	(21)
   1162 
   1163 #ifdef _KERNEL
   1164 struct fattr3_res {
   1165 	nfsstat3 status;
   1166 	vattr_t *vap;
   1167 	vnode_t *vp;
   1168 };
   1169 typedef struct fattr3_res fattr3_res;
   1170 #endif /* _KERNEL */
   1171 
   1172 struct post_op_attr {
   1173 	bool_t attributes;
   1174 	fattr3 attr;
   1175 };
   1176 typedef struct post_op_attr post_op_attr;
   1177 
   1178 #ifdef _KERNEL
   1179 struct post_op_vattr {
   1180 	bool_t		attributes;
   1181 	fattr3_res	fres;
   1182 };
   1183 typedef struct post_op_vattr post_op_vattr;
   1184 #endif /* _KERNEL */
   1185 
   1186 struct wcc_attr {
   1187 	size3 size;
   1188 	nfstime3 mtime;
   1189 	nfstime3 ctime;
   1190 };
   1191 typedef struct wcc_attr wcc_attr;
   1192 
   1193 struct pre_op_attr {
   1194 	bool_t attributes;
   1195 	wcc_attr attr;
   1196 };
   1197 typedef struct pre_op_attr pre_op_attr;
   1198 
   1199 struct wcc_data {
   1200 	pre_op_attr before;
   1201 	post_op_attr after;
   1202 };
   1203 typedef struct wcc_data wcc_data;
   1204 
   1205 struct post_op_fh3 {
   1206 	bool_t handle_follows;
   1207 	nfs_fh3 handle;
   1208 };
   1209 typedef struct post_op_fh3 post_op_fh3;
   1210 
   1211 enum time_how {
   1212 	DONT_CHANGE = 0,
   1213 	SET_TO_SERVER_TIME = 1,
   1214 	SET_TO_CLIENT_TIME = 2
   1215 };
   1216 typedef enum time_how time_how;
   1217 
   1218 struct set_mode3 {
   1219 	bool_t set_it;
   1220 	mode3 mode;
   1221 };
   1222 typedef struct set_mode3 set_mode3;
   1223 
   1224 struct set_uid3 {
   1225 	bool_t set_it;
   1226 	uid3 uid;
   1227 };
   1228 typedef struct set_uid3 set_uid3;
   1229 
   1230 struct set_gid3 {
   1231 	bool_t set_it;
   1232 	gid3 gid;
   1233 };
   1234 typedef struct set_gid3 set_gid3;
   1235 
   1236 struct set_size3 {
   1237 	bool_t set_it;
   1238 	size3 size;
   1239 };
   1240 typedef struct set_size3 set_size3;
   1241 
   1242 struct set_atime {
   1243 	time_how set_it;
   1244 	nfstime3 atime;
   1245 };
   1246 typedef struct set_atime set_atime;
   1247 
   1248 struct set_mtime {
   1249 	time_how set_it;
   1250 	nfstime3 mtime;
   1251 };
   1252 typedef struct set_mtime set_mtime;
   1253 
   1254 struct sattr3 {
   1255 	set_mode3 mode;
   1256 	set_uid3 uid;
   1257 	set_gid3 gid;
   1258 	set_size3 size;
   1259 	set_atime atime;
   1260 	set_mtime mtime;
   1261 };
   1262 typedef struct sattr3 sattr3;
   1263 
   1264 /*
   1265  * A couple of defines to make resok and resfail look like the
   1266  * correct things in a response type independent manner.
   1267  */
   1268 #define	resok	res_u.ok
   1269 #define	resfail	res_u.fail
   1270 
   1271 struct GETATTR3args {
   1272 	nfs_fh3 object;
   1273 };
   1274 typedef struct GETATTR3args GETATTR3args;
   1275 
   1276 struct GETATTR3resok {
   1277 	fattr3 obj_attributes;
   1278 };
   1279 typedef struct GETATTR3resok GETATTR3resok;
   1280 
   1281 struct GETATTR3res {
   1282 	nfsstat3 status;
   1283 	union {
   1284 		GETATTR3resok ok;
   1285 	} res_u;
   1286 };
   1287 typedef struct GETATTR3res GETATTR3res;
   1288 
   1289 #ifdef _KERNEL
   1290 struct GETATTR3vres {
   1291 	nfsstat3 status;
   1292 	fattr3_res fres;
   1293 };
   1294 typedef struct GETATTR3vres GETATTR3vres;
   1295 #endif /* _KERNEL */
   1296 
   1297 struct sattrguard3 {
   1298 	bool_t check;
   1299 	nfstime3 obj_ctime;
   1300 };
   1301 typedef struct sattrguard3 sattrguard3;
   1302 
   1303 struct SETATTR3args {
   1304 	nfs_fh3 object;
   1305 	sattr3 new_attributes;
   1306 	sattrguard3 guard;
   1307 };
   1308 typedef struct SETATTR3args SETATTR3args;
   1309 
   1310 struct SETATTR3resok {
   1311 	wcc_data obj_wcc;
   1312 };
   1313 typedef struct SETATTR3resok SETATTR3resok;
   1314 
   1315 struct SETATTR3resfail {
   1316 	wcc_data obj_wcc;
   1317 };
   1318 typedef struct SETATTR3resfail SETATTR3resfail;
   1319 
   1320 struct SETATTR3res {
   1321 	nfsstat3 status;
   1322 	union {
   1323 		SETATTR3resok ok;
   1324 		SETATTR3resfail fail;
   1325 	} res_u;
   1326 };
   1327 typedef struct SETATTR3res SETATTR3res;
   1328 
   1329 struct LOOKUP3args {
   1330 	diropargs3 what;
   1331 };
   1332 typedef struct LOOKUP3args LOOKUP3args;
   1333 
   1334 struct LOOKUP3resok {
   1335 	nfs_fh3 object;
   1336 	post_op_attr obj_attributes;
   1337 	post_op_attr dir_attributes;
   1338 };
   1339 typedef struct LOOKUP3resok LOOKUP3resok;
   1340 
   1341 struct LOOKUP3resfail {
   1342 	post_op_attr dir_attributes;
   1343 };
   1344 typedef struct LOOKUP3resfail LOOKUP3resfail;
   1345 
   1346 struct LOOKUP3res {
   1347 	nfsstat3 status;
   1348 	union {
   1349 		LOOKUP3resok ok;
   1350 		LOOKUP3resfail fail;
   1351 	} res_u;
   1352 };
   1353 typedef struct LOOKUP3res LOOKUP3res;
   1354 
   1355 #ifdef _KERNEL
   1356 struct LOOKUP3vres {
   1357 	nfsstat3 status;
   1358 	nfs_fh3 object;
   1359 	post_op_vattr dir_attributes;
   1360 	post_op_vattr obj_attributes;
   1361 };
   1362 typedef struct LOOKUP3vres LOOKUP3vres;
   1363 #endif /* _KERNEL */
   1364 
   1365 struct ACCESS3args {
   1366 	nfs_fh3 object;
   1367 	uint32 access;
   1368 };
   1369 typedef struct ACCESS3args ACCESS3args;
   1370 #define	ACCESS3_READ 0x1
   1371 #define	ACCESS3_LOOKUP 0x2
   1372 #define	ACCESS3_MODIFY 0x4
   1373 #define	ACCESS3_EXTEND 0x8
   1374 #define	ACCESS3_DELETE 0x10
   1375 #define	ACCESS3_EXECUTE 0x20
   1376 
   1377 struct ACCESS3resok {
   1378 	post_op_attr obj_attributes;
   1379 	uint32 access;
   1380 };
   1381 typedef struct ACCESS3resok ACCESS3resok;
   1382 
   1383 struct ACCESS3resfail {
   1384 	post_op_attr obj_attributes;
   1385 };
   1386 typedef struct ACCESS3resfail ACCESS3resfail;
   1387 
   1388 struct ACCESS3res {
   1389 	nfsstat3 status;
   1390 	union {
   1391 		ACCESS3resok ok;
   1392 		ACCESS3resfail fail;
   1393 	} res_u;
   1394 };
   1395 typedef struct ACCESS3res ACCESS3res;
   1396 
   1397 struct READLINK3args {
   1398 	nfs_fh3 symlink;
   1399 };
   1400 typedef struct READLINK3args READLINK3args;
   1401 
   1402 struct READLINK3resok {
   1403 	post_op_attr symlink_attributes;
   1404 	nfspath3 data;
   1405 };
   1406 typedef struct READLINK3resok READLINK3resok;
   1407 
   1408 struct READLINK3resfail {
   1409 	post_op_attr symlink_attributes;
   1410 };
   1411 typedef struct READLINK3resfail READLINK3resfail;
   1412 
   1413 struct READLINK3res {
   1414 	nfsstat3 status;
   1415 	union {
   1416 		READLINK3resok ok;
   1417 		READLINK3resfail fail;
   1418 	} res_u;
   1419 };
   1420 typedef struct READLINK3res READLINK3res;
   1421 
   1422 struct READ3args {
   1423 	nfs_fh3 file;
   1424 	offset3 offset;
   1425 	count3 count;
   1426 #ifdef _KERNEL
   1427 	/* for read using rdma */
   1428 	char *res_data_val_alt;
   1429 	struct uio *res_uiop;
   1430 	struct clist *wlist;
   1431 	CONN *conn;
   1432 #endif
   1433 };
   1434 typedef struct READ3args READ3args;
   1435 
   1436 struct READ3resok {
   1437 	post_op_attr file_attributes;
   1438 	count3 count;
   1439 	bool_t eof;
   1440 	struct {
   1441 		uint_t data_len;
   1442 		char *data_val;
   1443 		mblk_t *mp;
   1444 	} data;
   1445 	uint_t size;
   1446 #ifdef _KERNEL
   1447 	uint_t wlist_len;
   1448 	struct clist *wlist;
   1449 #endif
   1450 };
   1451 typedef struct READ3resok READ3resok;
   1452 
   1453 struct READ3resfail {
   1454 	post_op_attr file_attributes;
   1455 };
   1456 typedef struct READ3resfail READ3resfail;
   1457 
   1458 struct READ3res {
   1459 	nfsstat3 status;
   1460 	union {
   1461 		READ3resok ok;
   1462 		READ3resfail fail;
   1463 	} res_u;
   1464 };
   1465 typedef struct READ3res READ3res;
   1466 
   1467 #ifdef _KERNEL
   1468 /*
   1469  * READ3 reply that directly decodes fattr3 directly into vattr
   1470  */
   1471 struct READ3vres {
   1472 	nfsstat3 status;
   1473 	struct post_op_vattr pov;
   1474 	count3 count;
   1475 	bool_t eof;
   1476 	struct {
   1477 		uint_t data_len;
   1478 		char *data_val;
   1479 	} data;
   1480 	uint_t size;
   1481 
   1482 	uint_t wlist_len;
   1483 	struct clist *wlist;
   1484 };
   1485 typedef struct READ3vres READ3vres;
   1486 #endif /* _KERNEL */
   1487 
   1488 /*
   1489  * READ3 reply that uiomoves data directly into a struct uio
   1490  * ignores any attributes returned
   1491  */
   1492 struct READ3uiores {
   1493 	nfsstat3 status;
   1494 	count3 count;
   1495 	bool_t eof;
   1496 	struct uio *uiop;
   1497 	uint_t size;		/* maximum reply size */
   1498 #ifdef _KERNEL
   1499 	uint_t wlist_len;
   1500 	struct clist *wlist;
   1501 #endif
   1502 };
   1503 typedef struct READ3uiores READ3uiores;
   1504 
   1505 enum stable_how {
   1506 	UNSTABLE = 0,
   1507 	DATA_SYNC = 1,
   1508 	FILE_SYNC = 2
   1509 };
   1510 typedef enum stable_how stable_how;
   1511 
   1512 struct WRITE3args {
   1513 	nfs_fh3 file;
   1514 	offset3 offset;
   1515 	count3 count;
   1516 	stable_how stable;
   1517 	struct {
   1518 		uint_t data_len;
   1519 		char *data_val;
   1520 	} data;
   1521 	mblk_t *mblk;
   1522 #ifdef _KERNEL
   1523 	struct clist *rlist;
   1524 	CONN *conn;
   1525 #endif
   1526 };
   1527 typedef struct WRITE3args WRITE3args;
   1528 
   1529 struct WRITE3resok {
   1530 	wcc_data file_wcc;
   1531 	count3 count;
   1532 	stable_how committed;
   1533 	writeverf3 verf;
   1534 };
   1535 typedef struct WRITE3resok WRITE3resok;
   1536 
   1537 struct WRITE3resfail {
   1538 	wcc_data file_wcc;
   1539 };
   1540 typedef struct WRITE3resfail WRITE3resfail;
   1541 
   1542 struct WRITE3res {
   1543 	nfsstat3 status;
   1544 	union {
   1545 		WRITE3resok ok;
   1546 		WRITE3resfail fail;
   1547 	} res_u;
   1548 };
   1549 typedef struct WRITE3res WRITE3res;
   1550 
   1551 enum createmode3 {
   1552 	UNCHECKED = 0,
   1553 	GUARDED = 1,
   1554 	EXCLUSIVE = 2
   1555 };
   1556 typedef enum createmode3 createmode3;
   1557 
   1558 struct createhow3 {
   1559 	createmode3 mode;
   1560 	union {
   1561 		sattr3 obj_attributes;
   1562 		createverf3 verf;
   1563 	} createhow3_u;
   1564 };
   1565 typedef struct createhow3 createhow3;
   1566 
   1567 struct CREATE3args {
   1568 	diropargs3 where;
   1569 	createhow3 how;
   1570 };
   1571 typedef struct CREATE3args CREATE3args;
   1572 
   1573 struct CREATE3resok {
   1574 	post_op_fh3 obj;
   1575 	post_op_attr obj_attributes;
   1576 	wcc_data dir_wcc;
   1577 };
   1578 typedef struct CREATE3resok CREATE3resok;
   1579 
   1580 struct CREATE3resfail {
   1581 	wcc_data dir_wcc;
   1582 };
   1583 typedef struct CREATE3resfail CREATE3resfail;
   1584 
   1585 struct CREATE3res {
   1586 	nfsstat3 status;
   1587 	union {
   1588 		CREATE3resok ok;
   1589 		CREATE3resfail fail;
   1590 	} res_u;
   1591 };
   1592 typedef struct CREATE3res CREATE3res;
   1593 
   1594 struct MKDIR3args {
   1595 	diropargs3 where;
   1596 	sattr3 attributes;
   1597 };
   1598 typedef struct MKDIR3args MKDIR3args;
   1599 
   1600 struct MKDIR3resok {
   1601 	post_op_fh3 obj;
   1602 	post_op_attr obj_attributes;
   1603 	wcc_data dir_wcc;
   1604 };
   1605 typedef struct MKDIR3resok MKDIR3resok;
   1606 
   1607 struct MKDIR3resfail {
   1608 	wcc_data dir_wcc;
   1609 };
   1610 typedef struct MKDIR3resfail MKDIR3resfail;
   1611 
   1612 struct MKDIR3res {
   1613 	nfsstat3 status;
   1614 	union {
   1615 		MKDIR3resok ok;
   1616 		MKDIR3resfail fail;
   1617 	} res_u;
   1618 };
   1619 typedef struct MKDIR3res MKDIR3res;
   1620 
   1621 struct symlinkdata3 {
   1622 	sattr3 symlink_attributes;
   1623 	nfspath3 symlink_data;
   1624 };
   1625 typedef struct symlinkdata3 symlinkdata3;
   1626 
   1627 struct SYMLINK3args {
   1628 	diropargs3 where;
   1629 	symlinkdata3 symlink;
   1630 };
   1631 typedef struct SYMLINK3args SYMLINK3args;
   1632 
   1633 struct SYMLINK3resok {
   1634 	post_op_fh3 obj;
   1635 	post_op_attr obj_attributes;
   1636 	wcc_data dir_wcc;
   1637 };
   1638 typedef struct SYMLINK3resok SYMLINK3resok;
   1639 
   1640 struct SYMLINK3resfail {
   1641 	wcc_data dir_wcc;
   1642 };
   1643 typedef struct SYMLINK3resfail SYMLINK3resfail;
   1644 
   1645 struct SYMLINK3res {
   1646 	nfsstat3 status;
   1647 	union {
   1648 		SYMLINK3resok ok;
   1649 		SYMLINK3resfail fail;
   1650 	} res_u;
   1651 };
   1652 typedef struct SYMLINK3res SYMLINK3res;
   1653 
   1654 struct devicedata3 {
   1655 	sattr3 dev_attributes;
   1656 	specdata3 spec;
   1657 };
   1658 typedef struct devicedata3 devicedata3;
   1659 
   1660 struct mknoddata3 {
   1661 	ftype3 type;
   1662 	union {
   1663 		devicedata3 device;
   1664 		sattr3 pipe_attributes;
   1665 	} mknoddata3_u;
   1666 };
   1667 typedef struct mknoddata3 mknoddata3;
   1668 
   1669 struct MKNOD3args {
   1670 	diropargs3 where;
   1671 	mknoddata3 what;
   1672 };
   1673 typedef struct MKNOD3args MKNOD3args;
   1674 
   1675 struct MKNOD3resok {
   1676 	post_op_fh3 obj;
   1677 	post_op_attr obj_attributes;
   1678 	wcc_data dir_wcc;
   1679 };
   1680 typedef struct MKNOD3resok MKNOD3resok;
   1681 
   1682 struct MKNOD3resfail {
   1683 	wcc_data dir_wcc;
   1684 };
   1685 typedef struct MKNOD3resfail MKNOD3resfail;
   1686 
   1687 struct MKNOD3res {
   1688 	nfsstat3 status;
   1689 	union {
   1690 		MKNOD3resok ok;
   1691 		MKNOD3resfail fail;
   1692 	} res_u;
   1693 };
   1694 typedef struct MKNOD3res MKNOD3res;
   1695 
   1696 struct REMOVE3args {
   1697 	diropargs3 object;
   1698 };
   1699 typedef struct REMOVE3args REMOVE3args;
   1700 
   1701 struct REMOVE3resok {
   1702 	wcc_data dir_wcc;
   1703 };
   1704 typedef struct REMOVE3resok REMOVE3resok;
   1705 
   1706 struct REMOVE3resfail {
   1707 	wcc_data dir_wcc;
   1708 };
   1709 typedef struct REMOVE3resfail REMOVE3resfail;
   1710 
   1711 struct REMOVE3res {
   1712 	nfsstat3 status;
   1713 	union {
   1714 		REMOVE3resok ok;
   1715 		REMOVE3resfail fail;
   1716 	} res_u;
   1717 };
   1718 typedef struct REMOVE3res REMOVE3res;
   1719 
   1720 struct RMDIR3args {
   1721 	diropargs3 object;
   1722 };
   1723 typedef struct RMDIR3args RMDIR3args;
   1724 
   1725 struct RMDIR3resok {
   1726 	wcc_data dir_wcc;
   1727 };
   1728 typedef struct RMDIR3resok RMDIR3resok;
   1729 
   1730 struct RMDIR3resfail {
   1731 	wcc_data dir_wcc;
   1732 };
   1733 typedef struct RMDIR3resfail RMDIR3resfail;
   1734 
   1735 struct RMDIR3res {
   1736 	nfsstat3 status;
   1737 	union {
   1738 		RMDIR3resok ok;
   1739 		RMDIR3resfail fail;
   1740 	} res_u;
   1741 };
   1742 typedef struct RMDIR3res RMDIR3res;
   1743 
   1744 struct RENAME3args {
   1745 	diropargs3 from;
   1746 	diropargs3 to;
   1747 };
   1748 typedef struct RENAME3args RENAME3args;
   1749 
   1750 struct RENAME3resok {
   1751 	wcc_data fromdir_wcc;
   1752 	wcc_data todir_wcc;
   1753 };
   1754 typedef struct RENAME3resok RENAME3resok;
   1755 
   1756 struct RENAME3resfail {
   1757 	wcc_data fromdir_wcc;
   1758 	wcc_data todir_wcc;
   1759 };
   1760 typedef struct RENAME3resfail RENAME3resfail;
   1761 
   1762 struct RENAME3res {
   1763 	nfsstat3 status;
   1764 	union {
   1765 		RENAME3resok ok;
   1766 		RENAME3resfail fail;
   1767 	} res_u;
   1768 };
   1769 typedef struct RENAME3res RENAME3res;
   1770 
   1771 struct LINK3args {
   1772 	nfs_fh3 file;
   1773 	diropargs3 link;
   1774 };
   1775 typedef struct LINK3args LINK3args;
   1776 
   1777 struct LINK3resok {
   1778 	post_op_attr file_attributes;
   1779 	wcc_data linkdir_wcc;
   1780 };
   1781 typedef struct LINK3resok LINK3resok;
   1782 
   1783 struct LINK3resfail {
   1784 	post_op_attr file_attributes;
   1785 	wcc_data linkdir_wcc;
   1786 };
   1787 typedef struct LINK3resfail LINK3resfail;
   1788 
   1789 struct LINK3res {
   1790 	nfsstat3 status;
   1791 	union {
   1792 		LINK3resok ok;
   1793 		LINK3resfail fail;
   1794 	} res_u;
   1795 };
   1796 typedef struct LINK3res LINK3res;
   1797 
   1798 struct READDIR3args {
   1799 	nfs_fh3 dir;
   1800 	cookie3 cookie;
   1801 	cookieverf3 cookieverf;
   1802 	count3 count;
   1803 };
   1804 typedef struct READDIR3args READDIR3args;
   1805 
   1806 struct entry3 {
   1807 	fileid3 fileid;
   1808 	filename3 name;
   1809 	cookie3 cookie;
   1810 	struct entry3 *nextentry;
   1811 };
   1812 typedef struct entry3 entry3;
   1813 
   1814 struct dirlist3 {
   1815 	entry3 *entries;
   1816 	bool_t eof;
   1817 };
   1818 typedef struct dirlist3 dirlist3;
   1819 
   1820 struct READDIR3resok {
   1821 	post_op_attr dir_attributes;
   1822 	cookieverf3 cookieverf;
   1823 	dirlist3 reply;
   1824 	uint_t size;
   1825 	uint_t count;
   1826 	uint_t freecount;
   1827 	cookie3 cookie;
   1828 };
   1829 typedef struct READDIR3resok READDIR3resok;
   1830 
   1831 struct READDIR3resfail {
   1832 	post_op_attr dir_attributes;
   1833 };
   1834 typedef struct READDIR3resfail READDIR3resfail;
   1835 
   1836 struct READDIR3res {
   1837 	nfsstat3 status;
   1838 	union {
   1839 		READDIR3resok ok;
   1840 		READDIR3resfail fail;
   1841 	} res_u;
   1842 };
   1843 typedef struct READDIR3res READDIR3res;
   1844 
   1845 #ifdef _KERNEL
   1846 struct READDIR3vres {
   1847 	nfsstat3 status;
   1848 	post_op_vattr dir_attributes;
   1849 	cookieverf3 cookieverf;
   1850 	dirent64_t *entries;			/* decoded dirent64s */
   1851 	uint_t size;				/* actual size of entries */
   1852 	uint_t entries_size;			/* max size of entries */
   1853 	off64_t loff;				/* last offset/cookie */
   1854 	bool_t eof;				/* End of directory */
   1855 };
   1856 typedef struct READDIR3vres READDIR3vres;
   1857 #endif /* _KERNEL */
   1858 
   1859 struct READDIRPLUS3args {
   1860 	nfs_fh3 dir;
   1861 	cookie3 cookie;
   1862 	cookieverf3 cookieverf;
   1863 	count3 dircount;
   1864 	count3 maxcount;
   1865 };
   1866 typedef struct READDIRPLUS3args READDIRPLUS3args;
   1867 
   1868 struct entryplus3 {
   1869 	fileid3 fileid;
   1870 	filename3 name;
   1871 	cookie3 cookie;
   1872 	post_op_attr name_attributes;
   1873 	post_op_fh3 name_handle;
   1874 	struct entryplus3 *nextentry;
   1875 };
   1876 typedef struct entryplus3 entryplus3;
   1877 
   1878 struct dirlistplus3 {
   1879 	entryplus3 *entries;
   1880 	bool_t eof;
   1881 };
   1882 typedef struct dirlistplus3 dirlistplus3;
   1883 
   1884 struct entryplus3_info {
   1885 	post_op_attr attr;
   1886 	post_op_fh3 fh;
   1887 	uint_t namelen;
   1888 };
   1889 typedef struct entryplus3_info entryplus3_info;
   1890 
   1891 struct READDIRPLUS3resok {
   1892 	post_op_attr dir_attributes;
   1893 	cookieverf3 cookieverf;
   1894 	dirlistplus3 reply;
   1895 	uint_t size;
   1896 	uint_t count;
   1897 	uint_t maxcount;
   1898 	entryplus3_info *infop;
   1899 };
   1900 typedef struct READDIRPLUS3resok READDIRPLUS3resok;
   1901 
   1902 struct READDIRPLUS3resfail {
   1903 	post_op_attr dir_attributes;
   1904 };
   1905 typedef struct READDIRPLUS3resfail READDIRPLUS3resfail;
   1906 
   1907 struct READDIRPLUS3res {
   1908 	nfsstat3 status;
   1909 	union {
   1910 		READDIRPLUS3resok ok;
   1911 		READDIRPLUS3resfail fail;
   1912 	} res_u;
   1913 };
   1914 typedef struct READDIRPLUS3res READDIRPLUS3res;
   1915 
   1916 #ifdef _KERNEL
   1917 struct entryplus3_va_fh {
   1918 	int va_valid;
   1919 	int fh_valid;
   1920 	vattr_t va;
   1921 	nfs_fh3 fh;
   1922 	char *d_name;		/* back pointer into entries */
   1923 };
   1924 
   1925 struct READDIRPLUS3vres {
   1926 	nfsstat3 status;
   1927 	post_op_vattr dir_attributes;
   1928 	cookieverf3 cookieverf;
   1929 	dirent64_t *entries;			/* decoded dirent64s */
   1930 	uint_t size;				/* actual size of entries */
   1931 	uint_t entries_size;			/* max size of entries */
   1932 	bool_t eof;				/* End of directory */
   1933 	off64_t loff;				/* last offset/cookie */
   1934 	cred_t *credentials;			/* caller's credentials */
   1935 	hrtime_t time;				/* time of READDIRPLUS call */
   1936 };
   1937 typedef struct READDIRPLUS3vres READDIRPLUS3vres;
   1938 #endif /* _KERNEL */
   1939 
   1940 struct FSSTAT3args {
   1941 	nfs_fh3 fsroot;
   1942 };
   1943 typedef struct FSSTAT3args FSSTAT3args;
   1944 
   1945 struct FSSTAT3resok {
   1946 	post_op_attr obj_attributes;
   1947 	size3 tbytes;
   1948 	size3 fbytes;
   1949 	size3 abytes;
   1950 	size3 tfiles;
   1951 	size3 ffiles;
   1952 	size3 afiles;
   1953 	uint32 invarsec;
   1954 };
   1955 typedef struct FSSTAT3resok FSSTAT3resok;
   1956 
   1957 struct FSSTAT3resfail {
   1958 	post_op_attr obj_attributes;
   1959 };
   1960 typedef struct FSSTAT3resfail FSSTAT3resfail;
   1961 
   1962 struct FSSTAT3res {
   1963 	nfsstat3 status;
   1964 	union {
   1965 		FSSTAT3resok ok;
   1966 		FSSTAT3resfail fail;
   1967 	} res_u;
   1968 };
   1969 typedef struct FSSTAT3res FSSTAT3res;
   1970 
   1971 struct FSINFO3args {
   1972 	nfs_fh3 fsroot;
   1973 };
   1974 typedef struct FSINFO3args FSINFO3args;
   1975 
   1976 struct FSINFO3resok {
   1977 	post_op_attr obj_attributes;
   1978 	uint32 rtmax;
   1979 	uint32 rtpref;
   1980 	uint32 rtmult;
   1981 	uint32 wtmax;
   1982 	uint32 wtpref;
   1983 	uint32 wtmult;
   1984 	uint32 dtpref;
   1985 	size3 maxfilesize;
   1986 	nfstime3 time_delta;
   1987 	uint32 properties;
   1988 };
   1989 typedef struct FSINFO3resok FSINFO3resok;
   1990 
   1991 struct FSINFO3resfail {
   1992 	post_op_attr obj_attributes;
   1993 };
   1994 typedef struct FSINFO3resfail FSINFO3resfail;
   1995 #define	FSF3_LINK 0x1
   1996 #define	FSF3_SYMLINK 0x2
   1997 #define	FSF3_HOMOGENEOUS 0x8
   1998 #define	FSF3_CANSETTIME 0x10
   1999 
   2000 struct FSINFO3res {
   2001 	nfsstat3 status;
   2002 	union {
   2003 		FSINFO3resok ok;
   2004 		FSINFO3resfail fail;
   2005 	} res_u;
   2006 };
   2007 typedef struct FSINFO3res FSINFO3res;
   2008 
   2009 struct PATHCONF3args {
   2010 	nfs_fh3 object;
   2011 };
   2012 typedef struct PATHCONF3args PATHCONF3args;
   2013 
   2014 struct nfs3_pathconf_info {
   2015 	uint32 link_max;
   2016 	uint32 name_max;
   2017 	bool_t no_trunc;
   2018 	bool_t chown_restricted;
   2019 	bool_t case_insensitive;
   2020 	bool_t case_preserving;
   2021 };
   2022 typedef struct nfs3_pathconf_info nfs3_pathconf_info;
   2023 
   2024 struct PATHCONF3resok {
   2025 	post_op_attr obj_attributes;
   2026 	nfs3_pathconf_info info;
   2027 };
   2028 typedef struct PATHCONF3resok PATHCONF3resok;
   2029 
   2030 struct PATHCONF3resfail {
   2031 	post_op_attr obj_attributes;
   2032 };
   2033 typedef struct PATHCONF3resfail PATHCONF3resfail;
   2034 
   2035 struct PATHCONF3res {
   2036 	nfsstat3 status;
   2037 	union {
   2038 		PATHCONF3resok ok;
   2039 		PATHCONF3resfail fail;
   2040 	} res_u;
   2041 };
   2042 typedef struct PATHCONF3res PATHCONF3res;
   2043 
   2044 struct COMMIT3args {
   2045 	nfs_fh3 file;
   2046 	offset3 offset;
   2047 	count3 count;
   2048 };
   2049 typedef struct COMMIT3args COMMIT3args;
   2050 
   2051 struct COMMIT3resok {
   2052 	wcc_data file_wcc;
   2053 	writeverf3 verf;
   2054 };
   2055 typedef struct COMMIT3resok COMMIT3resok;
   2056 
   2057 struct COMMIT3resfail {
   2058 	wcc_data file_wcc;
   2059 };
   2060 typedef struct COMMIT3resfail COMMIT3resfail;
   2061 
   2062 struct COMMIT3res {
   2063 	nfsstat3 status;
   2064 	union {
   2065 		COMMIT3resok ok;
   2066 		COMMIT3resfail fail;
   2067 	} res_u;
   2068 };
   2069 typedef struct COMMIT3res COMMIT3res;
   2070 
   2071 #define	NFS3_PROGRAM ((rpcprog_t)100003)
   2072 #define	NFS_V3 ((rpcvers_t)3)
   2073 #define	NFSPROC3_NULL ((rpcproc_t)0)
   2074 #define	NFSPROC3_GETATTR ((rpcproc_t)1)
   2075 #define	NFSPROC3_SETATTR ((rpcproc_t)2)
   2076 #define	NFSPROC3_LOOKUP ((rpcproc_t)3)
   2077 #define	NFSPROC3_ACCESS ((rpcproc_t)4)
   2078 #define	NFSPROC3_READLINK ((rpcproc_t)5)
   2079 #define	NFSPROC3_READ ((rpcproc_t)6)
   2080 #define	NFSPROC3_WRITE ((rpcproc_t)7)
   2081 #define	NFSPROC3_CREATE ((rpcproc_t)8)
   2082 #define	NFSPROC3_MKDIR ((rpcproc_t)9)
   2083 #define	NFSPROC3_SYMLINK ((rpcproc_t)10)
   2084 #define	NFSPROC3_MKNOD ((rpcproc_t)11)
   2085 #define	NFSPROC3_REMOVE ((rpcproc_t)12)
   2086 #define	NFSPROC3_RMDIR ((rpcproc_t)13)
   2087 #define	NFSPROC3_RENAME ((rpcproc_t)14)
   2088 #define	NFSPROC3_LINK ((rpcproc_t)15)
   2089 #define	NFSPROC3_READDIR ((rpcproc_t)16)
   2090 #define	NFSPROC3_READDIRPLUS ((rpcproc_t)17)
   2091 #define	NFSPROC3_FSSTAT ((rpcproc_t)18)
   2092 #define	NFSPROC3_FSINFO ((rpcproc_t)19)
   2093 #define	NFSPROC3_PATHCONF ((rpcproc_t)20)
   2094 #define	NFSPROC3_COMMIT ((rpcproc_t)21)
   2095 
   2096 #ifndef _KERNEL
   2097 extern  void * nfsproc3_null_3();
   2098 extern  GETATTR3res * nfsproc3_getattr_3();
   2099 extern  SETATTR3res * nfsproc3_setattr_3();
   2100 extern  LOOKUP3res * nfsproc3_lookup_3();
   2101 extern  ACCESS3res * nfsproc3_access_3();
   2102 extern  READLINK3res * nfsproc3_readlink_3();
   2103 extern  READ3res * nfsproc3_read_3();
   2104 extern  WRITE3res * nfsproc3_write_3();
   2105 extern  CREATE3res * nfsproc3_create_3();
   2106 extern  MKDIR3res * nfsproc3_mkdir_3();
   2107 extern  SYMLINK3res * nfsproc3_symlink_3();
   2108 extern  MKNOD3res * nfsproc3_mknod_3();
   2109 extern  REMOVE3res * nfsproc3_remove_3();
   2110 extern  RMDIR3res * nfsproc3_rmdir_3();
   2111 extern  RENAME3res * nfsproc3_rename_3();
   2112 extern  LINK3res * nfsproc3_link_3();
   2113 extern  READDIR3res * nfsproc3_readdir_3();
   2114 extern  READDIRPLUS3res * nfsproc3_readdirplus_3();
   2115 extern  FSSTAT3res * nfsproc3_fsstat_3();
   2116 extern  FSINFO3res * nfsproc3_fsinfo_3();
   2117 extern  PATHCONF3res * nfsproc3_pathconf_3();
   2118 extern  COMMIT3res * nfsproc3_commit_3();
   2119 #endif	/* !_KERNEL */
   2120 
   2121 #ifdef _KERNEL
   2122 /* the NFS Version 3 XDR functions */
   2123 
   2124 extern bool_t xdr_nfs_fh3(XDR *, nfs_fh3 *);
   2125 extern bool_t xdr_nfslog_nfs_fh3(XDR *, nfs_fh3 *);
   2126 extern bool_t xdr_nfs_fh3_server(XDR *, nfs_fh3 *);
   2127 extern bool_t xdr_diropargs3(XDR *, diropargs3 *);
   2128 extern bool_t xdr_post_op_attr(XDR *, post_op_attr *);
   2129 extern bool_t xdr_post_op_fh3(XDR *, post_op_fh3 *);
   2130 extern bool_t xdr_GETATTR3res(XDR *, GETATTR3res *);
   2131 extern bool_t xdr_GETATTR3vres(XDR *, GETATTR3vres *);
   2132 extern bool_t xdr_SETATTR3args(XDR *, SETATTR3args *);
   2133 extern bool_t xdr_SETATTR3res(XDR *, SETATTR3res *);
   2134 extern bool_t xdr_LOOKUP3res(XDR *, LOOKUP3res *);
   2135 extern bool_t xdr_LOOKUP3vres(XDR *, LOOKUP3vres *);
   2136 extern bool_t xdr_ACCESS3args(XDR *, ACCESS3args *);
   2137 extern bool_t xdr_ACCESS3res(XDR *, ACCESS3res *);
   2138 extern bool_t xdr_READLINK3args(XDR *, READLINK3args *);
   2139 extern bool_t xdr_READLINK3res(XDR *, READLINK3res *);
   2140 extern bool_t xdr_READ3args(XDR *, READ3args *);
   2141 extern bool_t xdr_READ3res(XDR *, READ3res *);
   2142 extern bool_t xdr_READ3vres(XDR *, READ3vres *);
   2143 extern bool_t xdr_READ3uiores(XDR *, READ3uiores *);
   2144 extern bool_t xdr_WRITE3args(XDR *, WRITE3args *);
   2145 extern bool_t xdr_WRITE3res(XDR *, WRITE3res *);
   2146 extern bool_t xdr_CREATE3args(XDR *, CREATE3args *);
   2147 extern bool_t xdr_CREATE3res(XDR *, CREATE3res *);
   2148 extern bool_t xdr_MKDIR3args(XDR *, MKDIR3args *);
   2149 extern bool_t xdr_MKDIR3res(XDR *, MKDIR3res *);
   2150 extern bool_t xdr_SYMLINK3args(XDR *, SYMLINK3args *);
   2151 extern bool_t xdr_SYMLINK3res(XDR *, SYMLINK3res *);
   2152 extern bool_t xdr_MKNOD3args(XDR *, MKNOD3args *);
   2153 extern bool_t xdr_MKNOD3res(XDR *, MKNOD3res *);
   2154 extern bool_t xdr_REMOVE3res(XDR *, REMOVE3res *);
   2155 extern bool_t xdr_RMDIR3resfail(XDR *, RMDIR3resfail *);
   2156 extern bool_t xdr_RMDIR3res(XDR *, RMDIR3res *);
   2157 extern bool_t xdr_RENAME3args(XDR *, RENAME3args *);
   2158 extern bool_t xdr_RENAME3res(XDR *, RENAME3res *);
   2159 extern bool_t xdr_LINK3args(XDR *, LINK3args *);
   2160 extern bool_t xdr_LINK3res(XDR *, LINK3res *);
   2161 extern bool_t xdr_READDIR3args(XDR *, READDIR3args *);
   2162 extern bool_t xdr_READDIR3res(XDR *, READDIR3res *);
   2163 extern bool_t xdr_READDIR3vres(XDR *, READDIR3vres *);
   2164 extern bool_t xdr_READDIRPLUS3args(XDR *, READDIRPLUS3args *);
   2165 extern bool_t xdr_READDIRPLUS3res(XDR *, READDIRPLUS3res *);
   2166 extern bool_t xdr_READDIRPLUS3vres(XDR *, READDIRPLUS3vres *);
   2167 extern bool_t xdr_FSSTAT3res(XDR *, FSSTAT3res *);
   2168 extern bool_t xdr_FSINFO3res(XDR *, FSINFO3res *);
   2169 extern bool_t xdr_PATHCONF3res(XDR *, PATHCONF3res *);
   2170 extern bool_t xdr_COMMIT3args(XDR *, COMMIT3args *);
   2171 extern bool_t xdr_COMMIT3res(XDR *, COMMIT3res *);
   2172 extern bool_t xdr_fastnfs_fh3(XDR *, nfs_fh3 **);
   2173 
   2174 /*
   2175  * The NFS Version 3 service procedures.
   2176  */
   2177 struct exportinfo;	/* defined in nfs/export.h */
   2178 struct servinfo;	/* defined in nfs/nfs_clnt.h */
   2179 struct mntinfo;		/* defined in nfs/nfs_clnt.h */
   2180 struct sec_ol;		/* defined in nfs/export.h */
   2181 
   2182 extern void rfs3_getattr(GETATTR3args *, GETATTR3res *,
   2183 			struct exportinfo *, struct svc_req *, cred_t *);
   2184 extern void *rfs3_getattr_getfh(GETATTR3args *);
   2185 extern void rfs3_setattr(SETATTR3args *, SETATTR3res *,
   2186 			struct exportinfo *, struct svc_req *, cred_t *);
   2187 extern void *rfs3_setattr_getfh(SETATTR3args *);
   2188 extern void rfs3_lookup(LOOKUP3args *, LOOKUP3res *,
   2189 			struct exportinfo *, struct svc_req *, cred_t *);
   2190 extern void *rfs3_lookup_getfh(LOOKUP3args *);
   2191 extern void rfs3_access(ACCESS3args *, ACCESS3res *,
   2192 			struct exportinfo *, struct svc_req *, cred_t *);
   2193 extern void *rfs3_access_getfh(ACCESS3args *);
   2194 extern void rfs3_readlink(READLINK3args *, READLINK3res *,
   2195 			struct exportinfo *, struct svc_req *, cred_t *);
   2196 extern void *rfs3_readlink_getfh(READLINK3args *);
   2197 extern void rfs3_readlink_free(READLINK3res *);
   2198 extern void rfs3_read(READ3args *, READ3res *,
   2199 			struct exportinfo *, struct svc_req *, cred_t *);
   2200 extern void *rfs3_read_getfh(READ3args *);
   2201 extern void rfs3_read_free(READ3res *);
   2202 extern void rfs3_write(WRITE3args *, WRITE3res *,
   2203 			struct exportinfo *, struct svc_req *, cred_t *);
   2204 extern void *rfs3_write_getfh(WRITE3args *);
   2205 extern void rfs3_create(CREATE3args *, CREATE3res *,
   2206 			struct exportinfo *, struct svc_req *, cred_t *);
   2207 extern void *rfs3_create_getfh(CREATE3args *);
   2208 extern void rfs3_mkdir(MKDIR3args *, MKDIR3res *,
   2209 			struct exportinfo *, struct svc_req *, cred_t *);
   2210 extern void *rfs3_mkdir_getfh(MKDIR3args *);
   2211 extern void rfs3_symlink(SYMLINK3args *, SYMLINK3res *,
   2212 			struct exportinfo *, struct svc_req *, cred_t *);
   2213 extern void *rfs3_symlink_getfh(SYMLINK3args *);
   2214 extern void rfs3_mknod(MKNOD3args *, MKNOD3res *,
   2215 			struct exportinfo *, struct svc_req *, cred_t *);
   2216 extern void *rfs3_mknod_getfh(MKNOD3args *);
   2217 extern void rfs3_remove(REMOVE3args *, REMOVE3res *,
   2218 			struct exportinfo *, struct svc_req *, cred_t *);
   2219 extern void *rfs3_remove_getfh(REMOVE3args *);
   2220 extern void rfs3_rmdir(RMDIR3args *, RMDIR3res *,
   2221 			struct exportinfo *, struct svc_req *, cred_t *);
   2222 extern void *rfs3_rmdir_getfh(RMDIR3args *);
   2223 extern void rfs3_rename(RENAME3args *, RENAME3res *,
   2224 			struct exportinfo *, struct svc_req *, cred_t *);
   2225 extern void *rfs3_rename_getfh(RENAME3args *);
   2226 extern void rfs3_link(LINK3args *, LINK3res *,
   2227 			struct exportinfo *, struct svc_req *, cred_t *);
   2228 extern void *rfs3_link_getfh(LINK3args *);
   2229 extern void rfs3_readdir(READDIR3args *, READDIR3res *,
   2230 			struct exportinfo *, struct svc_req *, cred_t *);
   2231 extern void *rfs3_readdir_getfh(READDIR3args *);
   2232 extern void rfs3_readdir_free(READDIR3res *);
   2233 extern void rfs3_readdirplus(READDIRPLUS3args *, READDIRPLUS3res *,
   2234 			struct exportinfo *, struct svc_req *, cred_t *);
   2235 extern void *rfs3_readdirplus_getfh(READDIRPLUS3args *);
   2236 extern void rfs3_readdirplus_free(READDIRPLUS3res *);
   2237 extern void rfs3_fsstat(FSSTAT3args *, FSSTAT3res *,
   2238 			struct exportinfo *, struct svc_req *, cred_t *);
   2239 extern void *rfs3_fsstat_getfh(FSSTAT3args *);
   2240 extern void rfs3_fsinfo(FSINFO3args *, FSINFO3res *,
   2241 			struct exportinfo *, struct svc_req *, cred_t *);
   2242 extern void *rfs3_fsinfo_getfh(FSINFO3args *);
   2243 extern void rfs3_pathconf(PATHCONF3args *, PATHCONF3res *,
   2244 			struct exportinfo *, struct svc_req *, cred_t *);
   2245 extern void *rfs3_pathconf_getfh(PATHCONF3args *);
   2246 extern void rfs3_commit(COMMIT3args *, COMMIT3res *,
   2247 			struct exportinfo *, struct svc_req *, cred_t *);
   2248 extern void *rfs3_commit_getfh(COMMIT3args *);
   2249 extern void rfs3_srvrinit(void);
   2250 extern void rfs3_srvrfini(void);
   2251 
   2252 extern int	nfs3_validate_caches(vnode_t *, cred_t *);
   2253 extern void	nfs3_cache_post_op_attr(vnode_t *, post_op_attr *, hrtime_t,
   2254 			cred_t *);
   2255 extern void	nfs3_cache_post_op_vattr(vnode_t *, post_op_vattr *, hrtime_t,
   2256 			cred_t *);
   2257 extern void	nfs3_cache_wcc_data(vnode_t *, wcc_data *, hrtime_t, cred_t *);
   2258 extern void	nfs3_attrcache(vnode_t *, fattr3 *, hrtime_t);
   2259 extern int	nfs3_cache_fattr3(vnode_t *, fattr3 *, vattr_t *, hrtime_t,
   2260 			cred_t *);
   2261 extern int	nfs3_getattr_otw(vnode_t *, struct vattr *, cred_t *);
   2262 extern int	nfs3getattr(vnode_t *, struct vattr *, cred_t *);
   2263 extern int	fattr3_to_vattr(vnode_t *, fattr3 *, struct vattr *);
   2264 extern int	nfs3tsize(void);
   2265 extern uint_t	nfs3_tsize(struct knetconfig *);
   2266 extern uint_t	rfs3_tsize(struct svc_req *);
   2267 extern int	vattr_to_sattr3(struct vattr *, sattr3 *);
   2268 extern void	setdiropargs3(diropargs3 *, char *, vnode_t *);
   2269 extern enum nfsstat3 puterrno3(int);
   2270 extern int	geterrno3(enum nfsstat3);
   2271 extern int	nfs3init(int, char *);
   2272 extern void	nfs3fini(void);
   2273 extern int	nfs3_vfsinit(void);
   2274 extern void	nfs3_vfsfini(void);
   2275 extern void	vattr_to_post_op_attr(struct vattr *, post_op_attr *);
   2276 extern void	mblk_to_iov(mblk_t *, int, struct iovec *);
   2277 extern int	rfs_publicfh_mclookup(char *, vnode_t *, cred_t *,
   2278 			vnode_t **, struct exportinfo **, struct sec_ol *);
   2279 extern int	rfs_pathname(char *, vnode_t **, vnode_t **,
   2280 			vnode_t *, cred_t *, int);
   2281 extern vtype_t		nf3_to_vt[];
   2282 extern kstat_named_t	*rfsproccnt_v3_ptr;
   2283 extern vfsops_t		*nfs3_vfsops;
   2284 extern struct vnodeops	*nfs3_vnodeops;
   2285 extern const struct fs_operation_def nfs3_vnodeops_template[];
   2286 #ifdef DEBUG
   2287 extern int		rfs3_do_pre_op_attr;
   2288 extern int		rfs3_do_post_op_attr;
   2289 extern int		rfs3_do_post_op_fh3;
   2290 #endif
   2291 /*
   2292  * Some servers do not properly update the attributes of the
   2293  * directory when changes are made.  To allow interoperability
   2294  * with these broken servers, the nfs_disable_rddir_cache
   2295  * parameter can be used to disable readdir response caching.
   2296  */
   2297 extern int		nfs_disable_rddir_cache;
   2298 
   2299 /*
   2300  * External functions called by the v2/v3 code into the v4 code
   2301  */
   2302 extern void		nfs4_clnt_init(void);
   2303 extern void		nfs4_clnt_fini(void);
   2304 
   2305 /*
   2306  * Does NFS4 server have a vnode delegated?  TRUE if so, FALSE if not.
   2307  */
   2308 extern bool_t rfs4_check_delegated(int mode, vnode_t *, bool_t trunc);
   2309 /*
   2310  * VOP_GETATTR call. If a NFS4 delegation is present on the supplied vnode
   2311  * call back to the delegated client to get attributes for AT_MTIME and
   2312  * AT_SIZE. Invoke VOP_GETATTR to get all other attributes or all attributes
   2313  * if no delegation is present.
   2314  */
   2315 extern int rfs4_delegated_getattr(vnode_t *, vattr_t *, int, cred_t *);
   2316 extern void rfs4_hold_deleg_policy(void);
   2317 extern void rfs4_rele_deleg_policy(void);
   2318 
   2319 extern int do_xattr_exists_check(vnode_t *, ulong_t *, cred_t *);
   2320 
   2321 extern ts_label_t	*nfs_getflabel(vnode_t *, struct exportinfo *);
   2322 extern boolean_t	do_rfs_label_check(bslabel_t *, vnode_t *, int,
   2323 			    struct exportinfo *);
   2324 #endif	/* _KERNEL */
   2325 
   2326 #ifdef	__cplusplus
   2327 }
   2328 #endif
   2329 
   2330 #endif	/* _NFS_NFS_H */
   2331