nfsproto.h revision 36541
19336Sdfr/*
29336Sdfr * Copyright (c) 1989, 1993
39336Sdfr *	The Regents of the University of California.  All rights reserved.
49336Sdfr *
59336Sdfr * This code is derived from software contributed to Berkeley by
69336Sdfr * Rick Macklem at The University of Guelph.
79336Sdfr *
89336Sdfr * Redistribution and use in source and binary forms, with or without
99336Sdfr * modification, are permitted provided that the following conditions
109336Sdfr * are met:
119336Sdfr * 1. Redistributions of source code must retain the above copyright
129336Sdfr *    notice, this list of conditions and the following disclaimer.
139336Sdfr * 2. Redistributions in binary form must reproduce the above copyright
149336Sdfr *    notice, this list of conditions and the following disclaimer in the
159336Sdfr *    documentation and/or other materials provided with the distribution.
169336Sdfr * 3. All advertising materials mentioning features or use of this software
179336Sdfr *    must display the following acknowledgement:
189336Sdfr *	This product includes software developed by the University of
199336Sdfr *	California, Berkeley and its contributors.
209336Sdfr * 4. Neither the name of the University nor the names of its contributors
219336Sdfr *    may be used to endorse or promote products derived from this software
229336Sdfr *    without specific prior written permission.
239336Sdfr *
249336Sdfr * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
259336Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
269336Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
279336Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
289336Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
299336Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
309336Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
319336Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
329336Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
339336Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
349336Sdfr * SUCH DAMAGE.
359336Sdfr *
3636503Speter *	@(#)nfsproto.h  8.2 (Berkeley) 3/30/95
3736541Speter * $Id: nfsproto.h,v 1.5 1998/05/31 19:00:19 peter Exp $
389336Sdfr */
399336Sdfr
409336Sdfr#ifndef _NFS_NFSPROTO_H_
419336Sdfr#define _NFS_NFSPROTO_H_
429336Sdfr
439336Sdfr/*
449336Sdfr * nfs definitions as per the Version 2 and 3 specs
459336Sdfr */
469336Sdfr
479336Sdfr/*
489336Sdfr * Constants as defined in the Sun NFS Version 2 and 3 specs.
499336Sdfr * "NFS: Network File System Protocol Specification" RFC1094
509336Sdfr * and in the "NFS: Network File System Version 3 Protocol
519336Sdfr * Specification"
529336Sdfr */
539336Sdfr
549336Sdfr#define NFS_PORT	2049
559336Sdfr#define	NFS_PROG	100003
569336Sdfr#define NFS_VER2	2
579336Sdfr#define	NFS_VER3	3
589336Sdfr#define NFS_V2MAXDATA	8192
599336Sdfr#define	NFS_MAXDGRAMDATA 16384
609336Sdfr#define	NFS_MAXDATA	32768
619336Sdfr#define	NFS_MAXPATHLEN	1024
629336Sdfr#define	NFS_MAXNAMLEN	255
639336Sdfr#define	NFS_MAXPKTHDR	404
649336Sdfr#define NFS_MAXPACKET	(NFS_MAXPKTHDR + NFS_MAXDATA)
659336Sdfr#define	NFS_MINPACKET	20
669336Sdfr#define	NFS_FABLKSIZE	512	/* Size in bytes of a block wrt fa_blocks */
679336Sdfr
689336Sdfr/* Stat numbers for rpc returns (version 2 and 3) */
699336Sdfr#define	NFS_OK			0
709336Sdfr#define	NFSERR_PERM		1
719336Sdfr#define	NFSERR_NOENT		2
729336Sdfr#define	NFSERR_IO		5
739336Sdfr#define	NFSERR_NXIO		6
749336Sdfr#define	NFSERR_ACCES		13
759336Sdfr#define	NFSERR_EXIST		17
769336Sdfr#define	NFSERR_XDEV		18	/* Version 3 only */
779336Sdfr#define	NFSERR_NODEV		19
789336Sdfr#define	NFSERR_NOTDIR		20
799336Sdfr#define	NFSERR_ISDIR		21
809336Sdfr#define	NFSERR_INVAL		22	/* Version 3 only */
819336Sdfr#define	NFSERR_FBIG		27
829336Sdfr#define	NFSERR_NOSPC		28
839336Sdfr#define	NFSERR_ROFS		30
849336Sdfr#define	NFSERR_MLINK		31	/* Version 3 only */
859336Sdfr#define	NFSERR_NAMETOL		63
869336Sdfr#define	NFSERR_NOTEMPTY		66
879336Sdfr#define	NFSERR_DQUOT		69
889336Sdfr#define	NFSERR_STALE		70
899336Sdfr#define	NFSERR_REMOTE		71	/* Version 3 only */
909336Sdfr#define	NFSERR_WFLUSH		99	/* Version 2 only */
919336Sdfr#define	NFSERR_BADHANDLE	10001	/* The rest Version 3 only */
929336Sdfr#define	NFSERR_NOT_SYNC		10002
939336Sdfr#define	NFSERR_BAD_COOKIE	10003
949336Sdfr#define	NFSERR_NOTSUPP		10004
959336Sdfr#define	NFSERR_TOOSMALL		10005
969336Sdfr#define	NFSERR_SERVERFAULT	10006
979336Sdfr#define	NFSERR_BADTYPE		10007
989336Sdfr#define	NFSERR_JUKEBOX		10008
999336Sdfr#define NFSERR_TRYLATER		NFSERR_JUKEBOX
1009336Sdfr#define	NFSERR_STALEWRITEVERF	30001	/* Fake return for nfs_commit() */
1019336Sdfr
1029336Sdfr#define NFSERR_RETVOID		0x20000000 /* Return void, not error */
1039336Sdfr#define NFSERR_AUTHERR		0x40000000 /* Mark an authentication error */
1049336Sdfr#define NFSERR_RETERR		0x80000000 /* Mark an error return for V3 */
1059336Sdfr
1069336Sdfr/* Sizes in bytes of various nfs rpc components */
1079336Sdfr#define	NFSX_UNSIGNED	4
1089336Sdfr
1099336Sdfr/* specific to NFS Version 2 */
1109336Sdfr#define	NFSX_V2FH	32
1119336Sdfr#define	NFSX_V2FATTR	68
1129336Sdfr#define	NFSX_V2SATTR	32
1139336Sdfr#define	NFSX_V2COOKIE	4
1149336Sdfr#define NFSX_V2STATFS	20
1159336Sdfr
1169336Sdfr/* specific to NFS Version 3 */
1179336Sdfr#define NFSX_V3FH		(sizeof (fhandle_t)) /* size this server uses */
1189336Sdfr#define	NFSX_V3FHMAX		64	/* max. allowed by protocol */
1199336Sdfr#define NFSX_V3FATTR		84
1209336Sdfr#define NFSX_V3SATTR		60	/* max. all fields filled in */
1219336Sdfr#define NFSX_V3SRVSATTR		(sizeof (struct nfsv3_sattr))
1229336Sdfr#define NFSX_V3POSTOPATTR	(NFSX_V3FATTR + NFSX_UNSIGNED)
1239336Sdfr#define NFSX_V3WCCDATA		(NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
1249336Sdfr#define NFSX_V3COOKIEVERF 	8
1259336Sdfr#define NFSX_V3WRITEVERF 	8
1269336Sdfr#define NFSX_V3CREATEVERF	8
1279336Sdfr#define NFSX_V3STATFS		52
1289336Sdfr#define NFSX_V3FSINFO		48
1299336Sdfr#define NFSX_V3PATHCONF		24
1309336Sdfr
1319336Sdfr/* variants for both versions */
1329336Sdfr#define NFSX_FH(v3)		((v3) ? (NFSX_V3FHMAX + NFSX_UNSIGNED) : \
1339336Sdfr					NFSX_V2FH)
1349336Sdfr#define NFSX_SRVFH(v3)		((v3) ? NFSX_V3FH : NFSX_V2FH)
1359336Sdfr#define	NFSX_FATTR(v3)		((v3) ? NFSX_V3FATTR : NFSX_V2FATTR)
1369336Sdfr#define NFSX_PREOPATTR(v3)	((v3) ? (7 * NFSX_UNSIGNED) : 0)
1379336Sdfr#define NFSX_POSTOPATTR(v3)	((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : 0)
1389336Sdfr#define NFSX_POSTOPORFATTR(v3)	((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : \
1399336Sdfr					NFSX_V2FATTR)
1409336Sdfr#define NFSX_WCCDATA(v3)	((v3) ? NFSX_V3WCCDATA : 0)
1419336Sdfr#define NFSX_WCCORFATTR(v3)	((v3) ? NFSX_V3WCCDATA : NFSX_V2FATTR)
1429336Sdfr#define	NFSX_SATTR(v3)		((v3) ? NFSX_V3SATTR : NFSX_V2SATTR)
1439336Sdfr#define	NFSX_COOKIEVERF(v3)	((v3) ? NFSX_V3COOKIEVERF : 0)
1449336Sdfr#define	NFSX_WRITEVERF(v3)	((v3) ? NFSX_V3WRITEVERF : 0)
1459336Sdfr#define NFSX_READDIR(v3)	((v3) ? (5 * NFSX_UNSIGNED) : \
1469336Sdfr					(2 * NFSX_UNSIGNED))
1479336Sdfr#define	NFSX_STATFS(v3)		((v3) ? NFSX_V3STATFS : NFSX_V2STATFS)
1489336Sdfr
1499336Sdfr/* nfs rpc procedure numbers (before version mapping) */
1509336Sdfr#define	NFSPROC_NULL		0
1519336Sdfr#define	NFSPROC_GETATTR		1
1529336Sdfr#define	NFSPROC_SETATTR		2
1539336Sdfr#define	NFSPROC_LOOKUP		3
1549336Sdfr#define	NFSPROC_ACCESS		4
1559336Sdfr#define	NFSPROC_READLINK	5
1569336Sdfr#define	NFSPROC_READ		6
1579336Sdfr#define	NFSPROC_WRITE		7
1589336Sdfr#define	NFSPROC_CREATE		8
1599336Sdfr#define	NFSPROC_MKDIR		9
1609336Sdfr#define	NFSPROC_SYMLINK		10
1619336Sdfr#define	NFSPROC_MKNOD		11
1629336Sdfr#define	NFSPROC_REMOVE		12
1639336Sdfr#define	NFSPROC_RMDIR		13
1649336Sdfr#define	NFSPROC_RENAME		14
1659336Sdfr#define	NFSPROC_LINK		15
1669336Sdfr#define	NFSPROC_READDIR		16
1679336Sdfr#define	NFSPROC_READDIRPLUS	17
1689336Sdfr#define	NFSPROC_FSSTAT		18
1699336Sdfr#define	NFSPROC_FSINFO		19
1709336Sdfr#define	NFSPROC_PATHCONF	20
1719336Sdfr#define	NFSPROC_COMMIT		21
1729336Sdfr
1739336Sdfr/* And leasing (nqnfs) procedure numbers (must be last) */
1749336Sdfr#define	NQNFSPROC_GETLEASE	22
1759336Sdfr#define	NQNFSPROC_VACATED	23
1769336Sdfr#define	NQNFSPROC_EVICTED	24
1779336Sdfr
1789336Sdfr#define NFSPROC_NOOP		25
1799336Sdfr#define	NFS_NPROCS		26
1809336Sdfr
1819336Sdfr/* Actual Version 2 procedure numbers */
1829336Sdfr#define	NFSV2PROC_NULL		0
1839336Sdfr#define	NFSV2PROC_GETATTR	1
1849336Sdfr#define	NFSV2PROC_SETATTR	2
1859336Sdfr#define	NFSV2PROC_NOOP		3
1869336Sdfr#define	NFSV2PROC_ROOT		NFSV2PROC_NOOP	/* Obsolete */
1879336Sdfr#define	NFSV2PROC_LOOKUP	4
1889336Sdfr#define	NFSV2PROC_READLINK	5
1899336Sdfr#define	NFSV2PROC_READ		6
1909336Sdfr#define	NFSV2PROC_WRITECACHE	NFSV2PROC_NOOP	/* Obsolete */
1919336Sdfr#define	NFSV2PROC_WRITE		8
1929336Sdfr#define	NFSV2PROC_CREATE	9
1939336Sdfr#define	NFSV2PROC_REMOVE	10
1949336Sdfr#define	NFSV2PROC_RENAME	11
1959336Sdfr#define	NFSV2PROC_LINK		12
1969336Sdfr#define	NFSV2PROC_SYMLINK	13
1979336Sdfr#define	NFSV2PROC_MKDIR		14
1989336Sdfr#define	NFSV2PROC_RMDIR		15
1999336Sdfr#define	NFSV2PROC_READDIR	16
2009336Sdfr#define	NFSV2PROC_STATFS	17
2019336Sdfr
2029336Sdfr/*
2039336Sdfr * Constants used by the Version 3 protocol for various RPCs
2049336Sdfr */
2059336Sdfr#define NFSV3SATTRTIME_DONTCHANGE	0
2069336Sdfr#define NFSV3SATTRTIME_TOSERVER		1
2079336Sdfr#define NFSV3SATTRTIME_TOCLIENT		2
2089336Sdfr
2099336Sdfr#define NFSV3ACCESS_READ		0x01
2109336Sdfr#define NFSV3ACCESS_LOOKUP		0x02
2119336Sdfr#define NFSV3ACCESS_MODIFY		0x04
2129336Sdfr#define NFSV3ACCESS_EXTEND		0x08
2139336Sdfr#define NFSV3ACCESS_DELETE		0x10
2149336Sdfr#define NFSV3ACCESS_EXECUTE		0x20
2159336Sdfr
2169336Sdfr#define NFSV3WRITE_UNSTABLE		0
2179336Sdfr#define NFSV3WRITE_DATASYNC		1
2189336Sdfr#define NFSV3WRITE_FILESYNC		2
2199336Sdfr
2209336Sdfr#define NFSV3CREATE_UNCHECKED		0
2219336Sdfr#define NFSV3CREATE_GUARDED		1
2229336Sdfr#define NFSV3CREATE_EXCLUSIVE		2
2239336Sdfr
2249336Sdfr#define NFSV3FSINFO_LINK		0x01
2259336Sdfr#define NFSV3FSINFO_SYMLINK		0x02
2269336Sdfr#define NFSV3FSINFO_HOMOGENEOUS		0x08
2279336Sdfr#define NFSV3FSINFO_CANSETTIME		0x10
2289336Sdfr
2299336Sdfr/* Conversion macros */
2309336Sdfr#define	vtonfsv2_mode(t,m) \
2319336Sdfr		txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \
2329336Sdfr				MAKEIMODE((t), (m)))
23336541Speter#define vtonfsv3_mode(m)	txdr_unsigned((m) & ALLPERMS)
23436541Speter#define	nfstov_mode(a)		(fxdr_unsigned(u_int32_t, (a)) & ALLPERMS)
23536541Speter#define	vtonfsv2_type(a)	txdr_unsigned(nfsv2_type[((int32_t)(a))])
23636541Speter#define	vtonfsv3_type(a)	txdr_unsigned(nfsv3_type[((int32_t)(a))])
23736541Speter#define	nfsv2tov_type(a)	nv2tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
23836541Speter#define	nfsv3tov_type(a)	nv3tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
2399336Sdfr
2409336Sdfr/* File types */
2419336Sdfrtypedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5,
2429336Sdfr	NFSOCK=6, NFFIFO=7 } nfstype;
2439336Sdfr
2449336Sdfr/* Structs for common parts of the rpc's */
2459336Sdfr/*
2469336Sdfr * File Handle (32 bytes for version 2), variable up to 64 for version 3.
2479336Sdfr * File Handles of up to NFS_SMALLFH in size are stored directly in the
2489336Sdfr * nfs node, whereas larger ones are malloc'd. (This never happens when
2499336Sdfr * NFS_SMALLFH is set to 64.)
2509336Sdfr * NFS_SMALLFH should be in the range of 32 to 64 and be divisible by 4.
2519336Sdfr */
2529336Sdfr#ifndef NFS_SMALLFH
2539336Sdfr#define NFS_SMALLFH	64
2549336Sdfr#endif
2559336Sdfrunion nfsfh {
2569336Sdfr	fhandle_t	fh_generic;
2579336Sdfr	u_char		fh_bytes[NFS_SMALLFH];
2589336Sdfr};
2599336Sdfrtypedef union nfsfh nfsfh_t;
2609336Sdfr
2619336Sdfrstruct nfsv2_time {
26236541Speter	u_int32_t	nfsv2_sec;
26336541Speter	u_int32_t	nfsv2_usec;
2649336Sdfr};
2659336Sdfrtypedef struct nfsv2_time	nfstime2;
2669336Sdfr
2679336Sdfrstruct nfsv3_time {
26836541Speter	u_int32_t	nfsv3_sec;
26936541Speter	u_int32_t	nfsv3_nsec;
2709336Sdfr};
2719336Sdfrtypedef struct nfsv3_time	nfstime3;
2729336Sdfr
2739336Sdfr/*
2749336Sdfr * Quads are defined as arrays of 2 longs to ensure dense packing for the
2759336Sdfr * protocol and to facilitate xdr conversion.
2769336Sdfr */
2779336Sdfrstruct nfs_uquad {
27836541Speter	u_int32_t	nfsuquad[2];
2799336Sdfr};
2809336Sdfrtypedef	struct nfs_uquad	nfsuint64;
2819336Sdfr
2829336Sdfr/*
2839336Sdfr * Used to convert between two u_longs and a u_quad_t.
2849336Sdfr */
2859336Sdfrunion nfs_quadconvert {
28636541Speter	u_int32_t	lval[2];
2879336Sdfr	u_quad_t	qval;
2889336Sdfr};
2899336Sdfrtypedef union nfs_quadconvert	nfsquad_t;
2909336Sdfr
2919336Sdfr/*
2929336Sdfr * NFS Version 3 special file number.
2939336Sdfr */
2949336Sdfrstruct nfsv3_spec {
29536541Speter	u_int32_t	specdata1;
29636541Speter	u_int32_t	specdata2;
2979336Sdfr};
2989336Sdfrtypedef	struct nfsv3_spec	nfsv3spec;
2999336Sdfr
3009336Sdfr/*
3019336Sdfr * File attributes and setable attributes. These structures cover both
3029336Sdfr * NFS version 2 and the version 3 protocol. Note that the union is only
3039336Sdfr * used so that one pointer can refer to both variants. These structures
3049336Sdfr * go out on the wire and must be densely packed, so no quad data types
3059336Sdfr * are used. (all fields are longs or u_longs or structures of same)
3069336Sdfr * NB: You can't do sizeof(struct nfs_fattr), you must use the
3079336Sdfr *     NFSX_FATTR(v3) macro.
3089336Sdfr */
3099336Sdfrstruct nfs_fattr {
31036541Speter	u_int32_t	fa_type;
31136541Speter	u_int32_t	fa_mode;
31236541Speter	u_int32_t	fa_nlink;
31336541Speter	u_int32_t	fa_uid;
31436541Speter	u_int32_t	fa_gid;
3159336Sdfr	union {
3169336Sdfr		struct {
31736541Speter			u_int32_t	nfsv2fa_size;
31836541Speter			u_int32_t	nfsv2fa_blocksize;
31936541Speter			u_int32_t	nfsv2fa_rdev;
32036541Speter			u_int32_t	nfsv2fa_blocks;
32136541Speter			u_int32_t	nfsv2fa_fsid;
32236541Speter			u_int32_t	nfsv2fa_fileid;
3239336Sdfr			nfstime2	nfsv2fa_atime;
3249336Sdfr			nfstime2	nfsv2fa_mtime;
3259336Sdfr			nfstime2	nfsv2fa_ctime;
3269336Sdfr		} fa_nfsv2;
3279336Sdfr		struct {
3289336Sdfr			nfsuint64	nfsv3fa_size;
3299336Sdfr			nfsuint64	nfsv3fa_used;
3309336Sdfr			nfsv3spec	nfsv3fa_rdev;
3319336Sdfr			nfsuint64	nfsv3fa_fsid;
3329336Sdfr			nfsuint64	nfsv3fa_fileid;
3339336Sdfr			nfstime3	nfsv3fa_atime;
3349336Sdfr			nfstime3	nfsv3fa_mtime;
3359336Sdfr			nfstime3	nfsv3fa_ctime;
3369336Sdfr		} fa_nfsv3;
3379336Sdfr	} fa_un;
3389336Sdfr};
3399336Sdfr
3409336Sdfr/* and some ugly defines for accessing union components */
3419336Sdfr#define	fa2_size		fa_un.fa_nfsv2.nfsv2fa_size
3429336Sdfr#define	fa2_blocksize		fa_un.fa_nfsv2.nfsv2fa_blocksize
3439336Sdfr#define	fa2_rdev		fa_un.fa_nfsv2.nfsv2fa_rdev
3449336Sdfr#define	fa2_blocks		fa_un.fa_nfsv2.nfsv2fa_blocks
3459336Sdfr#define	fa2_fsid		fa_un.fa_nfsv2.nfsv2fa_fsid
3469336Sdfr#define	fa2_fileid		fa_un.fa_nfsv2.nfsv2fa_fileid
3479336Sdfr#define	fa2_atime		fa_un.fa_nfsv2.nfsv2fa_atime
3489336Sdfr#define	fa2_mtime		fa_un.fa_nfsv2.nfsv2fa_mtime
3499336Sdfr#define	fa2_ctime		fa_un.fa_nfsv2.nfsv2fa_ctime
3509336Sdfr#define	fa3_size		fa_un.fa_nfsv3.nfsv3fa_size
3519336Sdfr#define	fa3_used		fa_un.fa_nfsv3.nfsv3fa_used
3529336Sdfr#define	fa3_rdev		fa_un.fa_nfsv3.nfsv3fa_rdev
3539336Sdfr#define	fa3_fsid		fa_un.fa_nfsv3.nfsv3fa_fsid
3549336Sdfr#define	fa3_fileid		fa_un.fa_nfsv3.nfsv3fa_fileid
3559336Sdfr#define	fa3_atime		fa_un.fa_nfsv3.nfsv3fa_atime
3569336Sdfr#define	fa3_mtime		fa_un.fa_nfsv3.nfsv3fa_mtime
3579336Sdfr#define	fa3_ctime		fa_un.fa_nfsv3.nfsv3fa_ctime
3589336Sdfr
3599336Sdfrstruct nfsv2_sattr {
36036541Speter	u_int32_t	sa_mode;
36136541Speter	u_int32_t	sa_uid;
36236541Speter	u_int32_t	sa_gid;
36336541Speter	u_int32_t	sa_size;
3649336Sdfr	nfstime2	sa_atime;
3659336Sdfr	nfstime2	sa_mtime;
3669336Sdfr};
3679336Sdfr
3689336Sdfr/*
3699336Sdfr * NFS Version 3 sattr structure for the new node creation case.
3709336Sdfr */
3719336Sdfrstruct nfsv3_sattr {
37236541Speter	u_int32_t	sa_modetrue;
37336541Speter	u_int32_t	sa_mode;
37436541Speter	u_int32_t	sa_uidfalse;
37536541Speter	u_int32_t	sa_gidfalse;
37636541Speter	u_int32_t	sa_sizefalse;
37736541Speter	u_int32_t	sa_atimetype;
3789336Sdfr	nfstime3	sa_atime;
37936541Speter	u_int32_t	sa_mtimetype;
3809336Sdfr	nfstime3	sa_mtime;
3819336Sdfr};
3829336Sdfr
3839336Sdfrstruct nfs_statfs {
3849336Sdfr	union {
3859336Sdfr		struct {
38636541Speter			u_int32_t	nfsv2sf_tsize;
38736541Speter			u_int32_t	nfsv2sf_bsize;
38836541Speter			u_int32_t	nfsv2sf_blocks;
38936541Speter			u_int32_t	nfsv2sf_bfree;
39036541Speter			u_int32_t	nfsv2sf_bavail;
3919336Sdfr		} sf_nfsv2;
3929336Sdfr		struct {
3939336Sdfr			nfsuint64	nfsv3sf_tbytes;
3949336Sdfr			nfsuint64	nfsv3sf_fbytes;
3959336Sdfr			nfsuint64	nfsv3sf_abytes;
3969336Sdfr			nfsuint64	nfsv3sf_tfiles;
3979336Sdfr			nfsuint64	nfsv3sf_ffiles;
3989336Sdfr			nfsuint64	nfsv3sf_afiles;
39936541Speter			u_int32_t	nfsv3sf_invarsec;
4009336Sdfr		} sf_nfsv3;
4019336Sdfr	} sf_un;
4029336Sdfr};
4039336Sdfr
4049336Sdfr#define sf_tsize	sf_un.sf_nfsv2.nfsv2sf_tsize
4059336Sdfr#define sf_bsize	sf_un.sf_nfsv2.nfsv2sf_bsize
4069336Sdfr#define sf_blocks	sf_un.sf_nfsv2.nfsv2sf_blocks
4079336Sdfr#define sf_bfree	sf_un.sf_nfsv2.nfsv2sf_bfree
4089336Sdfr#define sf_bavail	sf_un.sf_nfsv2.nfsv2sf_bavail
4099336Sdfr#define sf_tbytes	sf_un.sf_nfsv3.nfsv3sf_tbytes
4109336Sdfr#define sf_fbytes	sf_un.sf_nfsv3.nfsv3sf_fbytes
4119336Sdfr#define sf_abytes	sf_un.sf_nfsv3.nfsv3sf_abytes
4129336Sdfr#define sf_tfiles	sf_un.sf_nfsv3.nfsv3sf_tfiles
4139336Sdfr#define sf_ffiles	sf_un.sf_nfsv3.nfsv3sf_ffiles
4149336Sdfr#define sf_afiles	sf_un.sf_nfsv3.nfsv3sf_afiles
4159336Sdfr#define sf_invarsec	sf_un.sf_nfsv3.nfsv3sf_invarsec
4169336Sdfr
4179336Sdfrstruct nfsv3_fsinfo {
41836541Speter	u_int32_t	fs_rtmax;
41936541Speter	u_int32_t	fs_rtpref;
42036541Speter	u_int32_t	fs_rtmult;
42136541Speter	u_int32_t	fs_wtmax;
42236541Speter	u_int32_t	fs_wtpref;
42336541Speter	u_int32_t	fs_wtmult;
42436541Speter	u_int32_t	fs_dtpref;
4259336Sdfr	nfsuint64	fs_maxfilesize;
4269336Sdfr	nfstime3	fs_timedelta;
42736541Speter	u_int32_t	fs_properties;
4289336Sdfr};
4299336Sdfr
4309336Sdfrstruct nfsv3_pathconf {
43136541Speter	u_int32_t	pc_linkmax;
43236541Speter	u_int32_t	pc_namemax;
43336541Speter	u_int32_t	pc_notrunc;
43436541Speter	u_int32_t	pc_chownrestricted;
43536541Speter	u_int32_t	pc_caseinsensitive;
43636541Speter	u_int32_t	pc_casepreserving;
4379336Sdfr};
4389336Sdfr
4399336Sdfr#endif
440