nfsproto.h revision 320617
11556Srgrimes/*-
21556Srgrimes * Copyright (c) 1989, 1993
31556Srgrimes *	The Regents of the University of California.  All rights reserved.
41556Srgrimes *
51556Srgrimes * This code is derived from software contributed to Berkeley by
61556Srgrimes * Rick Macklem at The University of Guelph.
71556Srgrimes *
81556Srgrimes * Redistribution and use in source and binary forms, with or without
91556Srgrimes * modification, are permitted provided that the following conditions
101556Srgrimes * are met:
111556Srgrimes * 1. Redistributions of source code must retain the above copyright
121556Srgrimes *    notice, this list of conditions and the following disclaimer.
131556Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
141556Srgrimes *    notice, this list of conditions and the following disclaimer in the
151556Srgrimes *    documentation and/or other materials provided with the distribution.
161556Srgrimes * 4. Neither the name of the University nor the names of its contributors
171556Srgrimes *    may be used to endorse or promote products derived from this software
181556Srgrimes *    without specific prior written permission.
191556Srgrimes *
201556Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
211556Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
221556Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
231556Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
241556Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
251556Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
261556Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
271556Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
281556Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
291556Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
301556Srgrimes * SUCH DAMAGE.
311556Srgrimes *
321556Srgrimes * $FreeBSD: stable/10/sys/fs/nfs/nfsproto.h 320617 2017-07-03 20:12:31Z rmacklem $
33114433Sobrien */
341556Srgrimes
3520425Ssteve#ifndef _NFS_NFSPROTO_H_
361556Srgrimes#define	_NFS_NFSPROTO_H_
371556Srgrimes
381556Srgrimes/*
391556Srgrimes * nfs definitions as per the Version 2, 3 and 4 specs
401556Srgrimes */
4136150Scharnier
42114433Sobrien/*
4336150Scharnier * Constants as defined in the NFS Version 2, 3 and 4 specs.
4499110Sobrien * "NFS: Network File System Protocol Specification" RFC1094
4599110Sobrien * and in the "NFS: Network File System Version 3 Protocol
461556Srgrimes * Specification"
471556Srgrimes */
481556Srgrimes
491556Srgrimes#define	NFS_PORT	2049
501556Srgrimes#define	NFS_PROG	100003
511556Srgrimes#define	NFS_CALLBCKPROG	0x40000000	/* V4 only */
521556Srgrimes#define	NFS_VER2	2
5317987Speter#define	NFS_VER3	3
5417987Speter#define	NFS_VER4	4
5553891Scracauer#define	NFS_V2MAXDATA	8192
5617987Speter#define	NFS_MAXDGRAMDATA 16384
571556Srgrimes#define	NFS_MAXPATHLEN	1024
581556Srgrimes#define	NFS_MAXNAMLEN	255
591556Srgrimes/*
601556Srgrimes * Calculating the maximum XDR overhead for an NFS RPC isn't easy.
611556Srgrimes * NFS_MAXPKTHDR is antiquated and assumes AUTH_SYS over UDP.
621556Srgrimes * NFS_MAXXDR should be sufficient for all NFS versions over TCP.
631556Srgrimes * It includes:
641556Srgrimes * - Maximum RPC message header. It can include 2 400byte authenticators plus
651556Srgrimes *   a machine name of unlimited length, although it is usually relatively
661556Srgrimes *   small.
671556Srgrimes * - XDR overheads for the NFSv4 compound. This can include Owner and
681556Srgrimes *   Owner_group strings, which are usually fairly small, but are allowed
691556Srgrimes *   to be up to 1024 bytes each.
701556Srgrimes * 4096 is overkill, but should always be sufficient.
711556Srgrimes */
721556Srgrimes#define	NFS_MAXPKTHDR	404
731556Srgrimes#define	NFS_MAXXDR	4096
741556Srgrimes#define	NFS_MAXPACKET	(NFS_SRVMAXIO + NFS_MAXXDR)
751556Srgrimes#define	NFS_MINPACKET	20
761556Srgrimes#define	NFS_FABLKSIZE	512	/* Size in bytes of a block wrt fa_blocks */
771556Srgrimes#define	NFSV4_MINORVERSION	0	/* V4 Minor version */
781556Srgrimes#define	NFSV41_MINORVERSION	1	/* V4 Minor version */
791556Srgrimes#define	NFSV4_CBVERS		1	/* V4 CB Version */
801556Srgrimes#define	NFSV41_CBVERS		4	/* V4.1 CB Version */
811556Srgrimes#define	NFSV4_SMALLSTR	50		/* Strings small enough for stack */
821556Srgrimes
831556Srgrimes/*
841556Srgrimes * This value isn't a fixed value in the RFCs.
851556Srgrimes * It is the maximum data size supported by NFSv3 or NFSv4 over TCP for
8617987Speter * the server.  It should be set to the I/O size preferred by ZFS or
8717987Speter * MAXBSIZE, whichever is greater.
8817987Speter * ZFS currently prefers 128K.
8917987Speter * It used to be called NFS_MAXDATA, but has been renamed to clarify that
9017987Speter * it refers to server side only and doesn't conflict with the NFS_MAXDATA
9117987Speter * defined in rpcsvc/nfs_prot.h for userland.
9281602Speter */
9317987Speter#define	NFS_SRVMAXIO	(128 * 1024)
9417987Speter
9517987Speter/* Stat numbers for rpc returns (version 2, 3 and 4) */
961556Srgrimes/*
9790111Simp * These numbers are hard-wired in the RFCs, so they can't be changed.
9890111Simp * The code currently assumes that the ones < 10000 are the same as
9990111Simp * sys/errno.h and that sys/errno.h will never go as high as 10000.
10090111Simp * If the value in sys/errno.h of any entry listed below is changed,
10190111Simp * the NFS code must be modified to do the mapping between them.
10290111Simp * (You can ignore NFSERR_WFLUSH, since it is never actually used.)
10390111Simp */
10490111Simp#define	NFSERR_OK		0
10590111Simp#define	NFSERR_PERM		1
106181269Scperciva#define	NFSERR_NOENT		2
10790111Simp#define	NFSERR_IO		5
1081556Srgrimes#define	NFSERR_NXIO		6
1091556Srgrimes#define	NFSERR_ACCES		13
11017987Speter#define	NFSERR_EXIST		17
11190111Simp#define	NFSERR_XDEV		18	/* Version 3, 4 only */
11217987Speter#define	NFSERR_NODEV		19
1131556Srgrimes#define	NFSERR_NOTDIR		20
11418016Speter#define	NFSERR_ISDIR		21
11581602Speter#define	NFSERR_INVAL		22	/* Version 3, 4 only */
1161556Srgrimes#define	NFSERR_FBIG		27
11753891Scracauer#define	NFSERR_NOSPC		28
1181556Srgrimes#define	NFSERR_ROFS		30
1191556Srgrimes#define	NFSERR_MLINK		31	/* Version 3, 4 only */
1201556Srgrimes#define	NFSERR_NAMETOL		63
1211556Srgrimes#define	NFSERR_NOTEMPTY		66
1221556Srgrimes#define	NFSERR_DQUOT		69
1231556Srgrimes#define	NFSERR_STALE		70
1241556Srgrimes#define	NFSERR_REMOTE		71	/* Version 3 only */
1251556Srgrimes#define	NFSERR_WFLUSH		99	/* Version 2 only */
1261556Srgrimes#define	NFSERR_BADHANDLE	10001	/* These are Version 3, 4 only */
1271556Srgrimes#define	NFSERR_NOT_SYNC		10002	/* Version 3 Only */
1281556Srgrimes#define	NFSERR_BAD_COOKIE	10003
1291556Srgrimes#define	NFSERR_NOTSUPP		10004
13017987Speter#define	NFSERR_TOOSMALL		10005
13190111Simp#define	NFSERR_SERVERFAULT	10006
13217987Speter#define	NFSERR_BADTYPE		10007
1331556Srgrimes#define	NFSERR_DELAY		10008	/* Called NFSERR_JUKEBOX for V3 */
1341556Srgrimes#define	NFSERR_SAME		10009	/* These are Version 4 only */
1351556Srgrimes#define	NFSERR_DENIED		10010
1361556Srgrimes#define	NFSERR_EXPIRED		10011
1371556Srgrimes#define	NFSERR_LOCKED		10012
1381556Srgrimes#define	NFSERR_GRACE		10013
1391556Srgrimes#define	NFSERR_FHEXPIRED	10014
1401556Srgrimes#define	NFSERR_SHAREDENIED	10015
1411556Srgrimes#define	NFSERR_WRONGSEC		10016
1421556Srgrimes#define	NFSERR_CLIDINUSE	10017
1431556Srgrimes#define	NFSERR_RESOURCE		10018
1441556Srgrimes#define	NFSERR_MOVED		10019
1451556Srgrimes#define	NFSERR_NOFILEHANDLE	10020
14617987Speter#define	NFSERR_MINORVERMISMATCH	10021
1471556Srgrimes#define	NFSERR_STALECLIENTID	10022
1481556Srgrimes#define	NFSERR_STALESTATEID	10023
1491556Srgrimes#define	NFSERR_OLDSTATEID	10024
1501556Srgrimes#define	NFSERR_BADSTATEID	10025
1511556Srgrimes#define	NFSERR_BADSEQID		10026
1521556Srgrimes#define	NFSERR_NOTSAME		10027
1531556Srgrimes#define	NFSERR_LOCKRANGE	10028
1541556Srgrimes#define	NFSERR_SYMLINK		10029
1551556Srgrimes#define	NFSERR_RESTOREFH	10030
1561556Srgrimes#define	NFSERR_LEASEMOVED	10031
1571556Srgrimes#define	NFSERR_ATTRNOTSUPP	10032
1581556Srgrimes#define	NFSERR_NOGRACE		10033
1591556Srgrimes#define	NFSERR_RECLAIMBAD	10034
16017987Speter#define	NFSERR_RECLAIMCONFLICT	10035
16190111Simp#define	NFSERR_BADXDR		10036
16217987Speter#define	NFSERR_LOCKSHELD	10037
1631556Srgrimes#define	NFSERR_OPENMODE		10038
1641556Srgrimes#define	NFSERR_BADOWNER		10039
1651556Srgrimes#define	NFSERR_BADCHAR		10040
1661556Srgrimes#define	NFSERR_BADNAME		10041
1671556Srgrimes#define	NFSERR_BADRANGE		10042
1681556Srgrimes#define	NFSERR_LOCKNOTSUPP	10043
1691556Srgrimes#define	NFSERR_OPILLEGAL	10044
1701556Srgrimes#define	NFSERR_DEADLOCK		10045
1711556Srgrimes#define	NFSERR_FILEOPEN		10046
1721556Srgrimes#define	NFSERR_ADMINREVOKED	10047
1731556Srgrimes#define	NFSERR_CBPATHDOWN	10048
1741556Srgrimes
1751556Srgrimes/* NFSv4.1 specific errors. */
17617987Speter#define	NFSERR_BADIOMODE	10049
1771556Srgrimes#define	NFSERR_BADLAYOUT	10050
1781556Srgrimes#define	NFSERR_BADSESSIONDIGEST	10051
17917987Speter#define	NFSERR_BADSESSION	10052
1801556Srgrimes#define	NFSERR_BADSLOT		10053
1811556Srgrimes#define	NFSERR_COMPLETEALREADY	10054
18217987Speter#define	NFSERR_NOTBNDTOSESS	10055
1831556Srgrimes#define	NFSERR_DELEGALREADYWANT	10056
1841556Srgrimes#define	NFSERR_BACKCHANBUSY	10057
18517987Speter#define	NFSERR_LAYOUTTRYLATER	10058
1861556Srgrimes#define	NFSERR_LAYOUTUNAVAIL	10059
1871556Srgrimes#define	NFSERR_NOMATCHLAYOUT	10060
18817987Speter#define	NFSERR_RECALLCONFLICT	10061
1891556Srgrimes#define	NFSERR_UNKNLAYOUTTYPE	10062
19017987Speter#define	NFSERR_SEQMISORDERED	10063
1911556Srgrimes#define	NFSERR_SEQUENCEPOS	10064
1921556Srgrimes#define	NFSERR_REQTOOBIG	10065
1931556Srgrimes#define	NFSERR_REPTOOBIG	10066
1941556Srgrimes#define	NFSERR_REPTOOBIGTOCACHE	10067
1951556Srgrimes#define	NFSERR_RETRYUNCACHEDREP	10068
1961556Srgrimes#define	NFSERR_UNSAFECOMPOUND	10069
1971556Srgrimes#define	NFSERR_TOOMANYOPS	10070
1981556Srgrimes#define	NFSERR_OPNOTINSESS	10071
1991556Srgrimes#define	NFSERR_HASHALGUNSUPP	10072
2001556Srgrimes#define	NFSERR_CLIENTIDBUSY	10074
2011556Srgrimes#define	NFSERR_PNFSIOHOLE	10075
2021556Srgrimes#define	NFSERR_SEQFALSERETRY	10076
2031556Srgrimes#define	NFSERR_BADHIGHSLOT	10077
2041556Srgrimes#define	NFSERR_DEADSESSION	10078
2051556Srgrimes#define	NFSERR_ENCRALGUNSUPP	10079
2061556Srgrimes#define	NFSERR_PNFSNOLAYOUT	10080
2071556Srgrimes#define	NFSERR_NOTONLYOP	10081
2081556Srgrimes#define	NFSERR_WRONGCRED	10082
2091556Srgrimes#define	NFSERR_WRONGTYPE	10083
2101556Srgrimes#define	NFSERR_DIRDELEGUNAVAIL	10084
2111556Srgrimes#define	NFSERR_REJECTDELEG	10085
2121556Srgrimes#define	NFSERR_RETURNCONFLICT	10086
21317987Speter#define	NFSERR_DELEGREVOKED	10087
21490111Simp
21517987Speter#define	NFSERR_STALEWRITEVERF	30001	/* Fake return for nfs_commit() */
2161556Srgrimes#define	NFSERR_DONTREPLY	30003	/* Don't process request */
2171556Srgrimes#define	NFSERR_RETVOID		30004	/* Return void, not error */
2181556Srgrimes#define	NFSERR_REPLYFROMCACHE	30005	/* Reply from recent request cache */
2191556Srgrimes#define	NFSERR_STALEDONTRECOVER	30006	/* Don't initiate recovery */
2201556Srgrimes
2211556Srgrimes#define	NFSERR_RPCERR		0x40000000 /* Mark an RPC layer error */
2221556Srgrimes#define	NFSERR_AUTHERR		0x80000000 /* Mark an authentication error */
2231556Srgrimes
2241556Srgrimes#define	NFSERR_RPCMISMATCH	(NFSERR_RPCERR | RPC_MISMATCH)
22553891Scracauer#define	NFSERR_PROGUNAVAIL	(NFSERR_RPCERR | RPC_PROGUNAVAIL)
2261556Srgrimes#define	NFSERR_PROGMISMATCH	(NFSERR_RPCERR | RPC_PROGMISMATCH)
22753891Scracauer#define	NFSERR_PROGNOTV4	(NFSERR_RPCERR | 0xffff)
2281556Srgrimes#define	NFSERR_PROCUNAVAIL	(NFSERR_RPCERR | RPC_PROCUNAVAIL)
2291556Srgrimes#define	NFSERR_GARBAGE		(NFSERR_RPCERR | RPC_GARBAGE)
2301556Srgrimes
2311556Srgrimes/* Sizes in bytes of various nfs rpc components */
2321556Srgrimes#define	NFSX_UNSIGNED	4
2331556Srgrimes#define	NFSX_HYPER	(2 * NFSX_UNSIGNED)
2341556Srgrimes
2351556Srgrimes/* specific to NFS Version 2 */
2361556Srgrimes#define	NFSX_V2FH	32
2371556Srgrimes#define	NFSX_V2FATTR	68
2381556Srgrimes#define	NFSX_V2SATTR	32
2391556Srgrimes#define	NFSX_V2COOKIE	4
2401556Srgrimes#define	NFSX_V2STATFS	20
2411556Srgrimes
2421556Srgrimes/* specific to NFS Version 3 */
2431556Srgrimes#define	NFSX_V3FHMAX		64	/* max. allowed by protocol */
2441556Srgrimes#define	NFSX_V3FATTR		84
2451556Srgrimes#define	NFSX_V3SATTR		60	/* max. all fields filled in */
2461556Srgrimes#define	NFSX_V3SRVSATTR		(sizeof (struct nfsv3_sattr))
2471556Srgrimes#define	NFSX_V3POSTOPATTR	(NFSX_V3FATTR + NFSX_UNSIGNED)
2481556Srgrimes#define	NFSX_V3WCCDATA		(NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
2491556Srgrimes#define	NFSX_V3STATFS		52
2501556Srgrimes#define	NFSX_V3FSINFO		48
251196483Sjilles#define	NFSX_V3PATHCONF		24
252196483Sjilles
253196483Sjilles/* specific to NFS Version 4 */
254196483Sjilles#define	NFSX_V4FHMAX		128
255196483Sjilles#define	NFSX_V4FSID		(2 * NFSX_HYPER)
256196483Sjilles#define	NFSX_V4SPECDATA		(2 * NFSX_UNSIGNED)
257196483Sjilles#define	NFSX_V4TIME		(NFSX_HYPER + NFSX_UNSIGNED)
2581556Srgrimes#define	NFSX_V4SETTIME		(NFSX_UNSIGNED + NFSX_V4TIME)
2591556Srgrimes#define	NFSX_V4SESSIONID	16
2601556Srgrimes#define	NFSX_V4DEVICEID		16
2611556Srgrimes
26217987Speter/* sizes common to multiple NFS versions */
2631556Srgrimes#define	NFSX_FHMAX		(NFSX_V4FHMAX)
26417987Speter#define	NFSX_MYFH		(sizeof (fhandle_t)) /* size this server uses */
2651556Srgrimes#define	NFSX_VERF 		8
26617987Speter#define	NFSX_STATEIDOTHER	12
2671556Srgrimes#define	NFSX_STATEID		(NFSX_UNSIGNED + NFSX_STATEIDOTHER)
2681556Srgrimes#define	NFSX_GSSH		12
2691556Srgrimes
2701556Srgrimes/* variants for multiple versions */
2711556Srgrimes#define	NFSX_STATFS(v3)		((v3) ? NFSX_V3STATFS : NFSX_V2STATFS)
2721556Srgrimes
2731556Srgrimes/* nfs rpc procedure numbers (before version mapping) */
2741556Srgrimes#define	NFSPROC_NULL		0
27517987Speter#define	NFSPROC_GETATTR		1
27690111Simp#define	NFSPROC_SETATTR		2
27717987Speter#define	NFSPROC_LOOKUP		3
2781556Srgrimes#define	NFSPROC_ACCESS		4
2791556Srgrimes#define	NFSPROC_READLINK	5
2801556Srgrimes#define	NFSPROC_READ		6
2811556Srgrimes#define	NFSPROC_WRITE		7
2821556Srgrimes#define	NFSPROC_CREATE		8
2831556Srgrimes#define	NFSPROC_MKDIR		9
2841556Srgrimes#define	NFSPROC_SYMLINK		10
2851556Srgrimes#define	NFSPROC_MKNOD		11
2861556Srgrimes#define	NFSPROC_REMOVE		12
2871556Srgrimes#define	NFSPROC_RMDIR		13
28817987Speter#define	NFSPROC_RENAME		14
28990111Simp#define	NFSPROC_LINK		15
29017987Speter#define	NFSPROC_READDIR		16
2911556Srgrimes#define	NFSPROC_READDIRPLUS	17
2921556Srgrimes#define	NFSPROC_FSSTAT		18
2931556Srgrimes#define	NFSPROC_FSINFO		19
2941556Srgrimes#define	NFSPROC_PATHCONF	20
2951556Srgrimes#define	NFSPROC_COMMIT		21
2961556Srgrimes
2971556Srgrimes/*
2981556Srgrimes * The lower numbers -> 21 are used by NFSv2 and v3. These define higher
2991556Srgrimes * numbers used by NFSv4.
3001556Srgrimes * NFS_V3NPROCS is one greater than the last V3 op and NFS_NPROCS is
3011556Srgrimes * one greater than the last number.
3021556Srgrimes */
3031556Srgrimes#ifndef	NFS_V3NPROCS
30425226Ssteve#define	NFS_V3NPROCS		22
3051556Srgrimes
3061556Srgrimes#define	NFSPROC_LOOKUPP		22
3071556Srgrimes#define	NFSPROC_SETCLIENTID	23
3081556Srgrimes#define	NFSPROC_SETCLIENTIDCFRM	24
3091556Srgrimes#define	NFSPROC_LOCK		25
3101556Srgrimes#define	NFSPROC_LOCKU		26
3111556Srgrimes#define	NFSPROC_OPEN		27
3121556Srgrimes#define	NFSPROC_CLOSE		28
3131556Srgrimes#define	NFSPROC_OPENCONFIRM	29
3141556Srgrimes#define	NFSPROC_LOCKT		30
3151556Srgrimes#define	NFSPROC_OPENDOWNGRADE	31
3161556Srgrimes#define	NFSPROC_RENEW		32
3171556Srgrimes#define	NFSPROC_PUTROOTFH	33
3181556Srgrimes#define	NFSPROC_RELEASELCKOWN	34
3191556Srgrimes#define	NFSPROC_DELEGRETURN	35
3201556Srgrimes#define	NFSPROC_RETDELEGREMOVE	36
3211556Srgrimes#define	NFSPROC_RETDELEGRENAME1	37
3221556Srgrimes#define	NFSPROC_RETDELEGRENAME2	38
3231556Srgrimes#define	NFSPROC_GETACL		39
3241556Srgrimes#define	NFSPROC_SETACL		40
3251556Srgrimes
3261556Srgrimes/*
3271556Srgrimes * Must be defined as one higher than the last Proc# above.
3281556Srgrimes */
3291556Srgrimes#define	NFSV4_NPROCS		41
3301556Srgrimes
3311556Srgrimes/* Additional procedures for NFSv4.1. */
3321556Srgrimes#define	NFSPROC_EXCHANGEID	41
3331556Srgrimes#define	NFSPROC_CREATESESSION	42
3341556Srgrimes#define	NFSPROC_DESTROYSESSION	43
3351556Srgrimes#define	NFSPROC_DESTROYCLIENT	44
3361556Srgrimes#define	NFSPROC_FREESTATEID	45
3371556Srgrimes#define	NFSPROC_LAYOUTGET	46
3381556Srgrimes#define	NFSPROC_GETDEVICEINFO	47
3391556Srgrimes#define	NFSPROC_LAYOUTCOMMIT	48
3401556Srgrimes#define	NFSPROC_LAYOUTRETURN	49
3411556Srgrimes#define	NFSPROC_RECLAIMCOMPL	50
3421556Srgrimes#define	NFSPROC_WRITEDS		51
3431556Srgrimes#define	NFSPROC_READDS		52
3441556Srgrimes#define	NFSPROC_COMMITDS	53
3451556Srgrimes
3461556Srgrimes/*
3471556Srgrimes * Must be defined as one higher than the last NFSv4.1 Proc# above.
3481556Srgrimes */
3491556Srgrimes#define	NFSV41_NPROCS		54
3501556Srgrimes
3511556Srgrimes#endif	/* NFS_V3NPROCS */
3521556Srgrimes
3531556Srgrimes/*
3541556Srgrimes * Define NFS_NPROCS as NFSV4_NPROCS for the experimental kernel code.
3551556Srgrimes */
3561556Srgrimes#ifndef	NFS_NPROCS
3571556Srgrimes#define	NFS_NPROCS		NFSV4_NPROCS
3581556Srgrimes#endif
3591556Srgrimes
3601556Srgrimes/*
3611556Srgrimes * NFSPROC_NOOP is a fake op# that can't be the same as any V2/3/4 Procedure
3621556Srgrimes * or Operation#. Since the NFS V4 Op #s go higher, use NFSV41_NOPS, which
3631556Srgrimes * is one greater than the highest Op#.
3641556Srgrimes */
3651556Srgrimes#define	NFSPROC_NOOP		NFSV41_NOPS
3661556Srgrimes
36717987Speter/* Actual Version 2 procedure numbers */
36890111Simp#define	NFSV2PROC_NULL		0
36917987Speter#define	NFSV2PROC_GETATTR	1
3701556Srgrimes#define	NFSV2PROC_SETATTR	2
3711556Srgrimes#define	NFSV2PROC_NOOP		3
3721556Srgrimes#define	NFSV2PROC_ROOT		NFSV2PROC_NOOP	/* Obsolete */
3731556Srgrimes#define	NFSV2PROC_LOOKUP	4
3741556Srgrimes#define	NFSV2PROC_READLINK	5
3751556Srgrimes#define	NFSV2PROC_READ		6
3761556Srgrimes#define	NFSV2PROC_WRITECACHE	NFSV2PROC_NOOP	/* Obsolete */
3771556Srgrimes#define	NFSV2PROC_WRITE		8
3781556Srgrimes#define	NFSV2PROC_CREATE	9
3791556Srgrimes#define	NFSV2PROC_REMOVE	10
38017987Speter#define	NFSV2PROC_RENAME	11
38190111Simp#define	NFSV2PROC_LINK		12
38217987Speter#define	NFSV2PROC_SYMLINK	13
38325226Ssteve#define	NFSV2PROC_MKDIR		14
3841556Srgrimes#define	NFSV2PROC_RMDIR		15
3851556Srgrimes#define	NFSV2PROC_READDIR	16
3861556Srgrimes#define	NFSV2PROC_STATFS	17
3871556Srgrimes
3881556Srgrimes/*
3891556Srgrimes * V4 Procedure numbers
3901556Srgrimes */
3911556Srgrimes#define	NFSV4PROC_COMPOUND	1
3921556Srgrimes#define	NFSV4PROC_CBNULL	0
3931556Srgrimes#define	NFSV4PROC_CBCOMPOUND	1
3941556Srgrimes
3951556Srgrimes/*
3961556Srgrimes * Constants used by the Version 3 and 4 protocols for various RPCs
39717987Speter */
39890111Simp#define	NFSV3SATTRTIME_DONTCHANGE	0
39917987Speter#define	NFSV3SATTRTIME_TOSERVER		1
4001556Srgrimes#define	NFSV3SATTRTIME_TOCLIENT		2
4011556Srgrimes
4021556Srgrimes#define	NFSV4SATTRTIME_TOSERVER		0
4031556Srgrimes#define	NFSV4SATTRTIME_TOCLIENT		1
4041556Srgrimes
40517987Speter#define	NFSV4LOCKT_READ			1
40690111Simp#define	NFSV4LOCKT_WRITE		2
40717987Speter#define	NFSV4LOCKT_READW		3
40825226Ssteve#define	NFSV4LOCKT_WRITEW		4
4091556Srgrimes#define	NFSV4LOCKT_RELEASE		5
4101556Srgrimes
4111556Srgrimes#define	NFSV4OPEN_NOCREATE		0
4121556Srgrimes#define	NFSV4OPEN_CREATE		1
4131556Srgrimes#define	NFSV4OPEN_CLAIMNULL		0
4141556Srgrimes#define	NFSV4OPEN_CLAIMPREVIOUS		1
4151556Srgrimes#define	NFSV4OPEN_CLAIMDELEGATECUR	2
4161556Srgrimes#define	NFSV4OPEN_CLAIMDELEGATEPREV	3
4171556Srgrimes#define	NFSV4OPEN_CLAIMFH		4
4181556Srgrimes#define	NFSV4OPEN_CLAIMDELEGATECURFH	5
4191556Srgrimes#define	NFSV4OPEN_CLAIMDELEGATEPREVFH	6
4201556Srgrimes#define	NFSV4OPEN_DELEGATENONE		0
4211556Srgrimes#define	NFSV4OPEN_DELEGATEREAD		1
4221556Srgrimes#define	NFSV4OPEN_DELEGATEWRITE		2
4231556Srgrimes#define	NFSV4OPEN_DELEGATENONEEXT	3
4241556Srgrimes#define	NFSV4OPEN_LIMITSIZE		1
42517987Speter#define	NFSV4OPEN_LIMITBLOCKS		2
42617987Speter
42717987Speter/*
42817987Speter * Nfs V4 ACE stuff
42917987Speter */
43017987Speter#define	NFSV4ACE_ALLOWEDTYPE		0x00000000
43117987Speter#define	NFSV4ACE_DENIEDTYPE		0x00000001
43217987Speter#define	NFSV4ACE_AUDITTYPE		0x00000002
43317987Speter#define	NFSV4ACE_ALARMTYPE		0x00000003
43417987Speter
43517987Speter#define	NFSV4ACE_SUPALLOWED		0x00000001
43617987Speter#define	NFSV4ACE_SUPDENIED		0x00000002
4371556Srgrimes#define	NFSV4ACE_SUPAUDIT		0x00000004
4381556Srgrimes#define	NFSV4ACE_SUPALARM		0x00000008
4391556Srgrimes
4401556Srgrimes#define	NFSV4ACE_SUPTYPES	(NFSV4ACE_SUPALLOWED | NFSV4ACE_SUPDENIED)
4411556Srgrimes
44217987Speter#define	NFSV4ACE_FILEINHERIT		0x00000001
44390111Simp#define	NFSV4ACE_DIRECTORYINHERIT	0x00000002
44417987Speter#define	NFSV4ACE_NOPROPAGATEINHERIT	0x00000004
44525226Ssteve#define	NFSV4ACE_INHERITONLY		0x00000008
4461556Srgrimes#define	NFSV4ACE_SUCCESSFULACCESS	0x00000010
4471556Srgrimes#define	NFSV4ACE_FAILEDACCESS		0x00000020
4481556Srgrimes#define	NFSV4ACE_IDENTIFIERGROUP	0x00000040
44917987Speter
4501556Srgrimes#define	NFSV4ACE_READDATA		0x00000001
4511556Srgrimes#define	NFSV4ACE_LISTDIRECTORY		0x00000001
452#define	NFSV4ACE_WRITEDATA		0x00000002
453#define	NFSV4ACE_ADDFILE		0x00000002
454#define	NFSV4ACE_APPENDDATA		0x00000004
455#define	NFSV4ACE_ADDSUBDIRECTORY	0x00000004
456#define	NFSV4ACE_READNAMEDATTR		0x00000008
457#define	NFSV4ACE_WRITENAMEDATTR		0x00000010
458#define	NFSV4ACE_EXECUTE		0x00000020
459#define	NFSV4ACE_SEARCH			0x00000020
460#define	NFSV4ACE_DELETECHILD		0x00000040
461#define	NFSV4ACE_READATTRIBUTES		0x00000080
462#define	NFSV4ACE_WRITEATTRIBUTES	0x00000100
463#define	NFSV4ACE_DELETE			0x00010000
464#define	NFSV4ACE_READACL		0x00020000
465#define	NFSV4ACE_WRITEACL		0x00040000
466#define	NFSV4ACE_WRITEOWNER		0x00080000
467#define	NFSV4ACE_SYNCHRONIZE		0x00100000
468
469/*
470 * Here are the mappings between mode bits and acl mask bits for
471 * directories and other files.
472 * (Named attributes have not been included, since named attributes are
473 *  not yet supported.)
474 * The mailing list seems to indicate that NFSV4ACE_EXECUTE refers to
475 * searching a directory, although I can't find a statement of that in
476 * the RFC.
477 */
478#define	NFSV4ACE_ALLFILESMASK	(NFSV4ACE_READATTRIBUTES | NFSV4ACE_READACL)
479#define	NFSV4ACE_OWNERMASK	(NFSV4ACE_WRITEATTRIBUTES | NFSV4ACE_WRITEACL)
480#define	NFSV4ACE_DIRREADMASK	NFSV4ACE_LISTDIRECTORY
481#define	NFSV4ACE_DIREXECUTEMASK	NFSV4ACE_EXECUTE
482#define	NFSV4ACE_DIRWRITEMASK	(NFSV4ACE_ADDFILE | 			\
483		NFSV4ACE_ADDSUBDIRECTORY | NFSV4ACE_DELETECHILD)
484#define	NFSV4ACE_READMASK	NFSV4ACE_READDATA
485#define	NFSV4ACE_WRITEMASK	(NFSV4ACE_WRITEDATA | NFSV4ACE_APPENDDATA)
486#define	NFSV4ACE_EXECUTEMASK	NFSV4ACE_EXECUTE
487#define	NFSV4ACE_ALLFILEBITS	(NFSV4ACE_READMASK | NFSV4ACE_WRITEMASK | \
488	NFSV4ACE_EXECUTEMASK | NFSV4ACE_SYNCHRONIZE)
489#define	NFSV4ACE_ALLDIRBITS	(NFSV4ACE_DIRREADMASK | 		\
490	NFSV4ACE_DIRWRITEMASK | NFSV4ACE_DIREXECUTEMASK)
491#define	NFSV4ACE_AUDITMASK	0x0
492
493/*
494 * These GENERIC masks are not used and are no longer believed to be useful.
495 */
496#define	NFSV4ACE_GENERICREAD		0x00120081
497#define	NFSV4ACE_GENERICWRITE		0x00160106
498#define	NFSV4ACE_GENERICEXECUTE		0x001200a0
499
500#define	NFSSTATEID_PUTALLZERO		0
501#define	NFSSTATEID_PUTALLONE		1
502#define	NFSSTATEID_PUTSTATEID		2
503#define	NFSSTATEID_PUTSEQIDZERO		3
504
505/*
506 * Bits for share access and deny.
507 */
508#define	NFSV4OPEN_ACCESSREAD		0x00000001
509#define	NFSV4OPEN_ACCESSWRITE		0x00000002
510#define	NFSV4OPEN_ACCESSBOTH		0x00000003
511#define	NFSV4OPEN_WANTDELEGMASK		0x0000ff00
512#define	NFSV4OPEN_WANTREADDELEG		0x00000100
513#define	NFSV4OPEN_WANTWRITEDELEG	0x00000200
514#define	NFSV4OPEN_WANTANYDELEG		0x00000300
515#define	NFSV4OPEN_WANTNODELEG		0x00000400
516#define	NFSV4OPEN_WANTCANCEL		0x00000500
517#define	NFSV4OPEN_WANTSIGNALDELEG	0x00010000
518#define	NFSV4OPEN_WANTPUSHDELEG		0x00020000
519
520#define	NFSV4OPEN_DENYNONE		0x00000000
521#define	NFSV4OPEN_DENYREAD		0x00000001
522#define	NFSV4OPEN_DENYWRITE		0x00000002
523#define	NFSV4OPEN_DENYBOTH		0x00000003
524
525/*
526 * Delegate_none_ext reply values.
527 */
528#define	NFSV4OPEN_NOTWANTED		0
529#define	NFSV4OPEN_CONTENTION		1
530#define	NFSV4OPEN_RESOURCE		2
531#define	NFSV4OPEN_NOTSUPPFTYPE		3
532#define	NFSV4OPEN_NOTSUPPWRITEFTYPE	4
533#define	NFSV4OPEN_NOTSUPPUPGRADE	5
534#define	NFSV4OPEN_NOTSUPPDOWNGRADE	6
535#define	NFSV4OPEN_CANCELLED		7
536#define	NFSV4OPEN_ISDIR			8
537
538/*
539 * Open result flags
540 * (The first four are in the spec. The rest are used internally.)
541 */
542#define	NFSV4OPEN_RESULTCONFIRM		0x00000002
543#define	NFSV4OPEN_LOCKTYPEPOSIX		0x00000004
544#define	NFSV4OPEN_PRESERVEUNLINKED	0x00000008
545#define	NFSV4OPEN_MAYNOTIFYLOCK		0x00000020
546#define	NFSV4OPEN_RFLAGS 						\
547    (NFSV4OPEN_RESULTCONFIRM | NFSV4OPEN_LOCKTYPEPOSIX |		\
548    NFSV4OPEN_PRESERVEUNLINKED | NFSV4OPEN_MAYNOTIFYLOCK)
549#define	NFSV4OPEN_RECALL		0x00010000
550#define	NFSV4OPEN_READDELEGATE		0x00020000
551#define	NFSV4OPEN_WRITEDELEGATE		0x00040000
552#define	NFSV4OPEN_WDRESOURCE		0x00080000
553#define	NFSV4OPEN_WDCONTENTION		0x00100000
554#define	NFSV4OPEN_WDNOTWANTED		0x00200000
555
556/*
557 * NFS V4 File Handle types
558 */
559#define	NFSV4FHTYPE_PERSISTENT		0x0
560#define	NFSV4FHTYPE_NOEXPIREWITHOPEN	0x1
561#define	NFSV4FHTYPE_VOLATILEANY		0x2
562#define	NFSV4FHTYPE_VOLATILEMIGRATE	0x4
563#define	NFSV4FHTYPE_VOLATILERENAME	0x8
564
565/*
566 * Maximum size of V4 opaque strings.
567 */
568#define	NFSV4_OPAQUELIMIT	1024
569
570/*
571 * These are the same for V3 and V4.
572 */
573#define	NFSACCESS_READ			0x01
574#define	NFSACCESS_LOOKUP		0x02
575#define	NFSACCESS_MODIFY		0x04
576#define	NFSACCESS_EXTEND		0x08
577#define	NFSACCESS_DELETE		0x10
578#define	NFSACCESS_EXECUTE		0x20
579
580#define	NFSWRITE_UNSTABLE		0
581#define	NFSWRITE_DATASYNC		1
582#define	NFSWRITE_FILESYNC		2
583
584#define	NFSCREATE_UNCHECKED		0
585#define	NFSCREATE_GUARDED		1
586#define	NFSCREATE_EXCLUSIVE		2
587#define	NFSCREATE_EXCLUSIVE41		3
588
589#define	NFSV3FSINFO_LINK		0x01
590#define	NFSV3FSINFO_SYMLINK		0x02
591#define	NFSV3FSINFO_HOMOGENEOUS		0x08
592#define	NFSV3FSINFO_CANSETTIME		0x10
593
594/* Flags for Exchange ID */
595#define	NFSV4EXCH_SUPPMOVEDREFER	0x00000001
596#define	NFSV4EXCH_SUPPMOVEDMIGR	0x00000002
597#define	NFSV4EXCH_BINDPRINCSTATEID	0x00000100
598#define	NFSV4EXCH_USENONPNFS		0x00010000
599#define	NFSV4EXCH_USEPNFSMDS		0x00020000
600#define	NFSV4EXCH_USEPNFSDS		0x00040000
601#define	NFSV4EXCH_MASKPNFS		0x00070000
602#define	NFSV4EXCH_UPDCONFIRMEDRECA	0x40000000
603#define	NFSV4EXCH_CONFIRMEDR		0x80000000
604
605/* State Protects */
606#define	NFSV4EXCH_SP4NONE		0
607#define	NFSV4EXCH_SP4MACHCRED		1
608#define	NFSV4EXCH_SP4SSV		2
609
610/* Flags for Create Session */
611#define	NFSV4CRSESS_PERSIST		0x00000001
612#define	NFSV4CRSESS_CONNBACKCHAN	0x00000002
613#define	NFSV4CRSESS_CONNRDMA		0x00000004
614
615/* Flags for Sequence */
616#define	NFSV4SEQ_CBPATHDOWN		0x00000001
617#define	NFSV4SEQ_CBGSSCONTEXPIRING	0x00000002
618#define	NFSV4SEQ_CBGSSCONTEXPIRED	0x00000004
619#define	NFSV4SEQ_EXPIREDALLSTATEREVOKED	0x00000008
620#define	NFSV4SEQ_EXPIREDSOMESTATEREVOKED 0x00000010
621#define	NFSV4SEQ_ADMINSTATEREVOKED	0x00000020
622#define	NFSV4SEQ_RECALLABLESTATEREVOKED	0x00000040
623#define	NFSV4SEQ_LEASEMOVED		0x00000080
624#define	NFSV4SEQ_RESTARTRECLAIMNEEDED	0x00000100
625#define	NFSV4SEQ_CBPATHDOWNSESSION	0x00000200
626#define	NFSV4SEQ_BACKCHANNELFAULT	0x00000400
627#define	NFSV4SEQ_DEVIDCHANGED		0x00000800
628#define	NFSV4SEQ_DEVIDDELETED		0x00001000
629
630/* Flags for Layout. */
631#define	NFSLAYOUTRETURN_FILE		1
632#define	NFSLAYOUTRETURN_FSID		2
633#define	NFSLAYOUTRETURN_ALL		3
634
635#define	NFSLAYOUT_NFSV4_1_FILES		0x1
636#define	NFSLAYOUT_OSD2_OBJECTS		0x2
637#define	NFSLAYOUT_BLOCK_VOLUME		0x3
638
639#define	NFSLAYOUTIOMODE_READ		1
640#define	NFSLAYOUTIOMODE_RW		2
641#define	NFSLAYOUTIOMODE_ANY		3
642
643/* Flags for Get Device Info. */
644#define	NFSDEVICEIDNOTIFY_CHANGEBIT	0x1
645#define	NFSDEVICEIDNOTIFY_DELETEBIT	0x2
646
647/* Flags for File Layout. */
648#define	NFSFLAYUTIL_DENSE		0x1
649#define	NFSFLAYUTIL_COMMIT_THRU_MDS	0x2
650
651/* Conversion macros */
652#define	vtonfsv2_mode(t,m) 						\
653		txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : 	\
654				MAKEIMODE((t), (m)))
655#define	vtonfsv34_mode(m)	txdr_unsigned((m) & 07777)
656#define	nfstov_mode(a)		(fxdr_unsigned(u_int16_t, (a))&07777)
657#define	vtonfsv2_type(a)  (((u_int32_t)(a)) >= 9 ? txdr_unsigned(NFNON) : \
658		txdr_unsigned(newnfsv2_type[((u_int32_t)(a))]))
659#define	vtonfsv34_type(a)  (((u_int32_t)(a)) >= 9 ? txdr_unsigned(NFNON) : \
660		txdr_unsigned(nfsv34_type[((u_int32_t)(a))]))
661#define	nfsv2tov_type(a)	newnv2tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
662#define	nfsv34tov_type(a)	nv34tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
663#define	vtonfs_dtype(a)	(((u_int32_t)(a)) >= 9 ? IFTODT(VTTOIF(VNON)) : \
664			 IFTODT(VTTOIF(a)))
665
666/* File types */
667typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5,
668	NFSOCK=6, NFFIFO=7, NFATTRDIR=8, NFNAMEDATTR=9 } nfstype;
669
670/* Structs for common parts of the rpc's */
671
672struct nfsv2_time {
673	u_int32_t nfsv2_sec;
674	u_int32_t nfsv2_usec;
675};
676typedef struct nfsv2_time	nfstime2;
677
678struct nfsv3_time {
679	u_int32_t nfsv3_sec;
680	u_int32_t nfsv3_nsec;
681};
682typedef struct nfsv3_time	nfstime3;
683
684struct nfsv4_time {
685	u_int32_t nfsv4_highsec;
686	u_int32_t nfsv4_sec;
687	u_int32_t nfsv4_nsec;
688};
689typedef struct nfsv4_time	nfstime4;
690
691/*
692 * Quads are defined as arrays of 2 longs to ensure dense packing for the
693 * protocol and to facilitate xdr conversion.
694 */
695struct nfs_uquad {
696	u_int32_t nfsuquad[2];
697};
698typedef	struct nfs_uquad	nfsuint64;
699
700/*
701 * Used to convert between two u_longs and a u_quad_t.
702 */
703union nfs_quadconvert {
704	u_int32_t lval[2];
705	u_quad_t  qval;
706};
707typedef union nfs_quadconvert	nfsquad_t;
708
709/*
710 * NFS Version 3 special file number.
711 */
712struct nfsv3_spec {
713	u_int32_t specdata1;
714	u_int32_t specdata2;
715};
716typedef	struct nfsv3_spec	nfsv3spec;
717
718/*
719 * File attributes and setable attributes. These structures cover both
720 * NFS version 2 and the version 3 protocol. Note that the union is only
721 * used so that one pointer can refer to both variants. These structures
722 * go out on the wire and must be densely packed, so no quad data types
723 * are used. (all fields are longs or u_longs or structures of same)
724 * NB: You can't do sizeof(struct nfs_fattr), you must use the
725 *     NFSX_FATTR(v3) macro.
726 */
727struct nfs_fattr {
728	u_int32_t fa_type;
729	u_int32_t fa_mode;
730	u_int32_t fa_nlink;
731	u_int32_t fa_uid;
732	u_int32_t fa_gid;
733	union {
734		struct {
735			u_int32_t nfsv2fa_size;
736			u_int32_t nfsv2fa_blocksize;
737			u_int32_t nfsv2fa_rdev;
738			u_int32_t nfsv2fa_blocks;
739			u_int32_t nfsv2fa_fsid;
740			u_int32_t nfsv2fa_fileid;
741			nfstime2  nfsv2fa_atime;
742			nfstime2  nfsv2fa_mtime;
743			nfstime2  nfsv2fa_ctime;
744		} fa_nfsv2;
745		struct {
746			nfsuint64 nfsv3fa_size;
747			nfsuint64 nfsv3fa_used;
748			nfsv3spec nfsv3fa_rdev;
749			nfsuint64 nfsv3fa_fsid;
750			nfsuint64 nfsv3fa_fileid;
751			nfstime3  nfsv3fa_atime;
752			nfstime3  nfsv3fa_mtime;
753			nfstime3  nfsv3fa_ctime;
754		} fa_nfsv3;
755	} fa_un;
756};
757
758/* and some ugly defines for accessing union components */
759#define	fa2_size		fa_un.fa_nfsv2.nfsv2fa_size
760#define	fa2_blocksize		fa_un.fa_nfsv2.nfsv2fa_blocksize
761#define	fa2_rdev		fa_un.fa_nfsv2.nfsv2fa_rdev
762#define	fa2_blocks		fa_un.fa_nfsv2.nfsv2fa_blocks
763#define	fa2_fsid		fa_un.fa_nfsv2.nfsv2fa_fsid
764#define	fa2_fileid		fa_un.fa_nfsv2.nfsv2fa_fileid
765#define	fa2_atime		fa_un.fa_nfsv2.nfsv2fa_atime
766#define	fa2_mtime		fa_un.fa_nfsv2.nfsv2fa_mtime
767#define	fa2_ctime		fa_un.fa_nfsv2.nfsv2fa_ctime
768#define	fa3_size		fa_un.fa_nfsv3.nfsv3fa_size
769#define	fa3_used		fa_un.fa_nfsv3.nfsv3fa_used
770#define	fa3_rdev		fa_un.fa_nfsv3.nfsv3fa_rdev
771#define	fa3_fsid		fa_un.fa_nfsv3.nfsv3fa_fsid
772#define	fa3_fileid		fa_un.fa_nfsv3.nfsv3fa_fileid
773#define	fa3_atime		fa_un.fa_nfsv3.nfsv3fa_atime
774#define	fa3_mtime		fa_un.fa_nfsv3.nfsv3fa_mtime
775#define	fa3_ctime		fa_un.fa_nfsv3.nfsv3fa_ctime
776
777struct nfsv2_sattr {
778	u_int32_t sa_mode;
779	u_int32_t sa_uid;
780	u_int32_t sa_gid;
781	u_int32_t sa_size;
782	nfstime2  sa_atime;
783	nfstime2  sa_mtime;
784};
785
786/*
787 * NFS Version 3 sattr structure for the new node creation case.
788 */
789struct nfsv3_sattr {
790	u_int32_t sa_modetrue;
791	u_int32_t sa_mode;
792	u_int32_t sa_uidfalse;
793	u_int32_t sa_gidfalse;
794	u_int32_t sa_sizefalse;
795	u_int32_t sa_atimetype;
796	nfstime3  sa_atime;
797	u_int32_t sa_mtimetype;
798	nfstime3  sa_mtime;
799};
800
801/*
802 * The attribute bits used for V4.
803 * NFSATTRBIT_xxx defines the attribute# (and its bit position)
804 * NFSATTRBM_xxx is a 32bit mask with the correct bit set within the
805 *	appropriate 32bit word.
806 * NFSATTRBIT_MAX is one greater than the largest NFSATTRBIT_xxx
807 */
808#define	NFSATTRBIT_SUPPORTEDATTRS	0
809#define	NFSATTRBIT_TYPE			1
810#define	NFSATTRBIT_FHEXPIRETYPE		2
811#define	NFSATTRBIT_CHANGE		3
812#define	NFSATTRBIT_SIZE			4
813#define	NFSATTRBIT_LINKSUPPORT		5
814#define	NFSATTRBIT_SYMLINKSUPPORT	6
815#define	NFSATTRBIT_NAMEDATTR		7
816#define	NFSATTRBIT_FSID			8
817#define	NFSATTRBIT_UNIQUEHANDLES	9
818#define	NFSATTRBIT_LEASETIME		10
819#define	NFSATTRBIT_RDATTRERROR		11
820#define	NFSATTRBIT_ACL			12
821#define	NFSATTRBIT_ACLSUPPORT		13
822#define	NFSATTRBIT_ARCHIVE		14
823#define	NFSATTRBIT_CANSETTIME		15
824#define	NFSATTRBIT_CASEINSENSITIVE	16
825#define	NFSATTRBIT_CASEPRESERVING	17
826#define	NFSATTRBIT_CHOWNRESTRICTED	18
827#define	NFSATTRBIT_FILEHANDLE		19
828#define	NFSATTRBIT_FILEID		20
829#define	NFSATTRBIT_FILESAVAIL		21
830#define	NFSATTRBIT_FILESFREE		22
831#define	NFSATTRBIT_FILESTOTAL		23
832#define	NFSATTRBIT_FSLOCATIONS		24
833#define	NFSATTRBIT_HIDDEN		25
834#define	NFSATTRBIT_HOMOGENEOUS		26
835#define	NFSATTRBIT_MAXFILESIZE		27
836#define	NFSATTRBIT_MAXLINK		28
837#define	NFSATTRBIT_MAXNAME		29
838#define	NFSATTRBIT_MAXREAD		30
839#define	NFSATTRBIT_MAXWRITE		31
840#define	NFSATTRBIT_MIMETYPE		32
841#define	NFSATTRBIT_MODE			33
842#define	NFSATTRBIT_NOTRUNC		34
843#define	NFSATTRBIT_NUMLINKS		35
844#define	NFSATTRBIT_OWNER		36
845#define	NFSATTRBIT_OWNERGROUP		37
846#define	NFSATTRBIT_QUOTAHARD		38
847#define	NFSATTRBIT_QUOTASOFT		39
848#define	NFSATTRBIT_QUOTAUSED		40
849#define	NFSATTRBIT_RAWDEV		41
850#define	NFSATTRBIT_SPACEAVAIL		42
851#define	NFSATTRBIT_SPACEFREE		43
852#define	NFSATTRBIT_SPACETOTAL		44
853#define	NFSATTRBIT_SPACEUSED		45
854#define	NFSATTRBIT_SYSTEM		46
855#define	NFSATTRBIT_TIMEACCESS		47
856#define	NFSATTRBIT_TIMEACCESSSET	48
857#define	NFSATTRBIT_TIMEBACKUP		49
858#define	NFSATTRBIT_TIMECREATE		50
859#define	NFSATTRBIT_TIMEDELTA		51
860#define	NFSATTRBIT_TIMEMETADATA		52
861#define	NFSATTRBIT_TIMEMODIFY		53
862#define	NFSATTRBIT_TIMEMODIFYSET	54
863#define	NFSATTRBIT_MOUNTEDONFILEID	55
864#define	NFSATTRBIT_DIRNOTIFDELAY	56
865#define	NFSATTRBIT_DIRENTNOTIFDELAY	57
866#define	NFSATTRBIT_DACL			58
867#define	NFSATTRBIT_SACL			59
868#define	NFSATTRBIT_CHANGEPOLICY		60
869#define	NFSATTRBIT_FSSTATUS		61
870#define	NFSATTRBIT_FSLAYOUTTYPE		62
871#define	NFSATTRBIT_LAYOUTHINT		63
872#define	NFSATTRBIT_LAYOUTTYPE		64
873#define	NFSATTRBIT_LAYOUTBLKSIZE	65
874#define	NFSATTRBIT_LAYOUTALIGNMENT	66
875#define	NFSATTRBIT_FSLOCATIONSINFO	67
876#define	NFSATTRBIT_MDSTHRESHOLD		68
877#define	NFSATTRBIT_RETENTIONGET		69
878#define	NFSATTRBIT_RETENTIONSET		70
879#define	NFSATTRBIT_RETENTEVTGET		71
880#define	NFSATTRBIT_RETENTEVTSET		72
881#define	NFSATTRBIT_RETENTIONHOLD	73
882#define	NFSATTRBIT_MODESETMASKED	74
883#define	NFSATTRBIT_SUPPATTREXCLCREAT	75
884#define	NFSATTRBIT_FSCHARSETCAP		76
885
886#define	NFSATTRBM_SUPPORTEDATTRS	0x00000001
887#define	NFSATTRBM_TYPE			0x00000002
888#define	NFSATTRBM_FHEXPIRETYPE		0x00000004
889#define	NFSATTRBM_CHANGE		0x00000008
890#define	NFSATTRBM_SIZE			0x00000010
891#define	NFSATTRBM_LINKSUPPORT		0x00000020
892#define	NFSATTRBM_SYMLINKSUPPORT	0x00000040
893#define	NFSATTRBM_NAMEDATTR		0x00000080
894#define	NFSATTRBM_FSID			0x00000100
895#define	NFSATTRBM_UNIQUEHANDLES		0x00000200
896#define	NFSATTRBM_LEASETIME		0x00000400
897#define	NFSATTRBM_RDATTRERROR		0x00000800
898#define	NFSATTRBM_ACL			0x00001000
899#define	NFSATTRBM_ACLSUPPORT		0x00002000
900#define	NFSATTRBM_ARCHIVE		0x00004000
901#define	NFSATTRBM_CANSETTIME		0x00008000
902#define	NFSATTRBM_CASEINSENSITIVE	0x00010000
903#define	NFSATTRBM_CASEPRESERVING	0x00020000
904#define	NFSATTRBM_CHOWNRESTRICTED	0x00040000
905#define	NFSATTRBM_FILEHANDLE		0x00080000
906#define	NFSATTRBM_FILEID		0x00100000
907#define	NFSATTRBM_FILESAVAIL		0x00200000
908#define	NFSATTRBM_FILESFREE		0x00400000
909#define	NFSATTRBM_FILESTOTAL		0x00800000
910#define	NFSATTRBM_FSLOCATIONS		0x01000000
911#define	NFSATTRBM_HIDDEN		0x02000000
912#define	NFSATTRBM_HOMOGENEOUS		0x04000000
913#define	NFSATTRBM_MAXFILESIZE		0x08000000
914#define	NFSATTRBM_MAXLINK		0x10000000
915#define	NFSATTRBM_MAXNAME		0x20000000
916#define	NFSATTRBM_MAXREAD		0x40000000
917#define	NFSATTRBM_MAXWRITE		0x80000000
918#define	NFSATTRBM_MIMETYPE		0x00000001
919#define	NFSATTRBM_MODE			0x00000002
920#define	NFSATTRBM_NOTRUNC		0x00000004
921#define	NFSATTRBM_NUMLINKS		0x00000008
922#define	NFSATTRBM_OWNER			0x00000010
923#define	NFSATTRBM_OWNERGROUP		0x00000020
924#define	NFSATTRBM_QUOTAHARD		0x00000040
925#define	NFSATTRBM_QUOTASOFT		0x00000080
926#define	NFSATTRBM_QUOTAUSED		0x00000100
927#define	NFSATTRBM_RAWDEV		0x00000200
928#define	NFSATTRBM_SPACEAVAIL		0x00000400
929#define	NFSATTRBM_SPACEFREE		0x00000800
930#define	NFSATTRBM_SPACETOTAL		0x00001000
931#define	NFSATTRBM_SPACEUSED		0x00002000
932#define	NFSATTRBM_SYSTEM		0x00004000
933#define	NFSATTRBM_TIMEACCESS		0x00008000
934#define	NFSATTRBM_TIMEACCESSSET		0x00010000
935#define	NFSATTRBM_TIMEBACKUP		0x00020000
936#define	NFSATTRBM_TIMECREATE		0x00040000
937#define	NFSATTRBM_TIMEDELTA		0x00080000
938#define	NFSATTRBM_TIMEMETADATA		0x00100000
939#define	NFSATTRBM_TIMEMODIFY		0x00200000
940#define	NFSATTRBM_TIMEMODIFYSET		0x00400000
941#define	NFSATTRBM_MOUNTEDONFILEID	0x00800000
942#define	NFSATTRBM_DIRNOTIFDELAY		0x01000000
943#define	NFSATTRBM_DIRENTNOTIFDELAY	0x02000000
944#define	NFSATTRBM_DACL			0x04000000
945#define	NFSATTRBM_SACL			0x08000000
946#define	NFSATTRBM_CHANGEPOLICY		0x10000000
947#define	NFSATTRBM_FSSTATUS		0x20000000
948#define	NFSATTRBM_FSLAYOUTTYPE		0x40000000
949#define	NFSATTRBM_LAYOUTHINT		0x80000000
950#define	NFSATTRBM_LAYOUTTYPE		0x00000001
951#define	NFSATTRBM_LAYOUTBLKSIZE		0x00000002
952#define	NFSATTRBM_LAYOUTALIGNMENT	0x00000004
953#define	NFSATTRBM_FSLOCATIONSINFO	0x00000008
954#define	NFSATTRBM_MDSTHRESHOLD		0x00000010
955#define	NFSATTRBM_RETENTIONGET		0x00000020
956#define	NFSATTRBM_RETENTIONSET		0x00000040
957#define	NFSATTRBM_RETENTEVTGET		0x00000080
958#define	NFSATTRBM_RETENTEVTSET		0x00000100
959#define	NFSATTRBM_RETENTIONHOLD		0x00000200
960#define	NFSATTRBM_MODESETMASKED		0x00000400
961#define	NFSATTRBM_SUPPATTREXCLCREAT	0x00000800
962#define	NFSATTRBM_FSCHARSETCAP		0x00001000
963
964#define	NFSATTRBIT_MAX			77
965
966/*
967 * Sets of attributes that are supported, by words in the bitmap.
968 */
969/*
970 * NFSATTRBIT_SUPPORTED - SUPP0 - bits 0<->31
971 *			  SUPP1 - bits 32<->63
972 *			  SUPP2 - bits 64<->95
973 */
974#define	NFSATTRBIT_SUPP0						\
975 	(NFSATTRBM_SUPPORTEDATTRS |					\
976 	NFSATTRBM_TYPE |						\
977 	NFSATTRBM_FHEXPIRETYPE |					\
978 	NFSATTRBM_CHANGE |						\
979 	NFSATTRBM_SIZE |						\
980 	NFSATTRBM_LINKSUPPORT |						\
981 	NFSATTRBM_SYMLINKSUPPORT |					\
982 	NFSATTRBM_NAMEDATTR |						\
983 	NFSATTRBM_FSID |						\
984 	NFSATTRBM_UNIQUEHANDLES |					\
985 	NFSATTRBM_LEASETIME |						\
986 	NFSATTRBM_RDATTRERROR |						\
987 	NFSATTRBM_ACL |							\
988 	NFSATTRBM_ACLSUPPORT |						\
989 	NFSATTRBM_CANSETTIME |						\
990 	NFSATTRBM_CASEINSENSITIVE |					\
991 	NFSATTRBM_CASEPRESERVING |					\
992 	NFSATTRBM_CHOWNRESTRICTED |					\
993 	NFSATTRBM_FILEHANDLE |						\
994 	NFSATTRBM_FILEID |						\
995 	NFSATTRBM_FILESAVAIL |						\
996 	NFSATTRBM_FILESFREE |						\
997 	NFSATTRBM_FILESTOTAL |						\
998	NFSATTRBM_FSLOCATIONS |						\
999 	NFSATTRBM_HOMOGENEOUS |						\
1000 	NFSATTRBM_MAXFILESIZE |						\
1001 	NFSATTRBM_MAXLINK |						\
1002 	NFSATTRBM_MAXNAME |						\
1003 	NFSATTRBM_MAXREAD |						\
1004 	NFSATTRBM_MAXWRITE)
1005
1006/*
1007 * NFSATTRBIT_S1 - subset of SUPP1 - OR of the following bits:
1008 */
1009#define	NFSATTRBIT_S1							\
1010 	(NFSATTRBM_MODE |						\
1011 	NFSATTRBM_NOTRUNC |						\
1012 	NFSATTRBM_NUMLINKS |						\
1013 	NFSATTRBM_OWNER |						\
1014 	NFSATTRBM_OWNERGROUP |						\
1015 	NFSATTRBM_RAWDEV |						\
1016 	NFSATTRBM_SPACEAVAIL |						\
1017 	NFSATTRBM_SPACEFREE |						\
1018 	NFSATTRBM_SPACETOTAL |						\
1019 	NFSATTRBM_SPACEUSED |						\
1020 	NFSATTRBM_TIMEACCESS |						\
1021 	NFSATTRBM_TIMEDELTA |						\
1022 	NFSATTRBM_TIMEMETADATA |					\
1023 	NFSATTRBM_TIMEMODIFY |						\
1024 	NFSATTRBM_MOUNTEDONFILEID)
1025
1026#ifdef QUOTA
1027/*
1028 * If QUOTA OR in NFSATTRBIT_QUOTAHARD, NFSATTRBIT_QUOTASOFT and
1029 * NFSATTRBIT_QUOTAUSED.
1030 */
1031#define	NFSATTRBIT_SUPP1	(NFSATTRBIT_S1 |			\
1032				NFSATTRBM_QUOTAHARD |			\
1033				NFSATTRBM_QUOTASOFT |			\
1034				NFSATTRBM_QUOTAUSED)
1035#else
1036#define	NFSATTRBIT_SUPP1	NFSATTRBIT_S1
1037#endif
1038
1039#define	NFSATTRBIT_SUPP2	NFSATTRBM_SUPPATTREXCLCREAT
1040
1041/*
1042 * NFSATTRBIT_SUPPSETONLY is the OR of NFSATTRBIT_TIMEACCESSSET and
1043 * NFSATTRBIT_TIMEMODIFYSET.
1044 */
1045#define	NFSATTRBIT_SUPPSETONLY	 (NFSATTRBM_TIMEACCESSSET |		\
1046				 NFSATTRBM_TIMEMODIFYSET)
1047
1048/*
1049 * NFSATTRBIT_SETABLE - SETABLE0 - bits 0<->31
1050 *			SETABLE1 - bits 32<->63
1051 *			SETABLE2 - bits 64<->95
1052 */
1053#define	NFSATTRBIT_SETABLE0						\
1054	(NFSATTRBM_SIZE |						\
1055	NFSATTRBM_ACL)
1056#define	NFSATTRBIT_SETABLE1						\
1057 	(NFSATTRBM_MODE |						\
1058 	NFSATTRBM_OWNER |						\
1059 	NFSATTRBM_OWNERGROUP |						\
1060 	NFSATTRBM_TIMEACCESSSET |					\
1061 	NFSATTRBM_TIMEMODIFYSET)
1062#define	NFSATTRBIT_SETABLE2		0
1063
1064/*
1065 * Set of attributes that the getattr vnode op needs.
1066 * OR of the following bits.
1067 * NFSATTRBIT_GETATTR0 - bits 0<->31
1068 */
1069#define	NFSATTRBIT_GETATTR0						\
1070 	(NFSATTRBM_SUPPORTEDATTRS |					\
1071 	NFSATTRBM_TYPE |						\
1072 	NFSATTRBM_CHANGE |						\
1073 	NFSATTRBM_SIZE |						\
1074 	NFSATTRBM_FSID |						\
1075 	NFSATTRBM_FILEID |						\
1076 	NFSATTRBM_MAXREAD)
1077
1078/*
1079 * NFSATTRBIT_GETATTR1 - bits 32<->63
1080 */
1081#define	NFSATTRBIT_GETATTR1						\
1082 	(NFSATTRBM_MODE |						\
1083 	NFSATTRBM_NUMLINKS |						\
1084 	NFSATTRBM_OWNER |						\
1085 	NFSATTRBM_OWNERGROUP |						\
1086 	NFSATTRBM_RAWDEV |						\
1087 	NFSATTRBM_SPACEUSED |						\
1088 	NFSATTRBM_TIMEACCESS |						\
1089 	NFSATTRBM_TIMEMETADATA |					\
1090 	NFSATTRBM_TIMEMODIFY)
1091
1092/*
1093 * NFSATTRBIT_GETATTR2 - bits 64<->95
1094 */
1095#define	NFSATTRBIT_GETATTR2		0
1096
1097/*
1098 * Subset of the above that the Write RPC gets.
1099 * OR of the following bits.
1100 * NFSATTRBIT_WRITEGETATTR0 - bits 0<->31
1101 */
1102#define	NFSATTRBIT_WRITEGETATTR0					\
1103 	(NFSATTRBM_SUPPORTEDATTRS |					\
1104 	NFSATTRBM_TYPE |						\
1105 	NFSATTRBM_CHANGE |						\
1106 	NFSATTRBM_SIZE |						\
1107 	NFSATTRBM_FSID |						\
1108 	NFSATTRBM_FILEID |						\
1109 	NFSATTRBM_MAXREAD)
1110
1111/*
1112 * NFSATTRBIT_WRITEGETATTR1 - bits 32<->63
1113 */
1114#define	NFSATTRBIT_WRITEGETATTR1					\
1115 	(NFSATTRBM_MODE |						\
1116 	NFSATTRBM_NUMLINKS |						\
1117 	NFSATTRBM_RAWDEV |						\
1118 	NFSATTRBM_SPACEUSED |						\
1119 	NFSATTRBM_TIMEACCESS |						\
1120 	NFSATTRBM_TIMEMETADATA |					\
1121 	NFSATTRBM_TIMEMODIFY)
1122
1123/*
1124 * NFSATTRBIT_WRITEGETATTR2 - bits 64<->95
1125 */
1126#define	NFSATTRBIT_WRITEGETATTR2	0
1127
1128/*
1129 * Set of attributes that the wccattr operation op needs.
1130 * OR of the following bits.
1131 * NFSATTRBIT_WCCATTR0 - bits 0<->31
1132 */
1133#define	NFSATTRBIT_WCCATTR0	0
1134
1135/*
1136 * NFSATTRBIT_WCCATTR1 - bits 32<->63
1137 */
1138#define	NFSATTRBIT_WCCATTR1						\
1139 	(NFSATTRBM_TIMEMODIFY)
1140
1141/*
1142 * NFSATTRBIT_WCCATTR2 - bits 64<->95
1143 */
1144#define	NFSATTRBIT_WCCATTR2		0
1145
1146/*
1147 * NFSATTRBIT_CBGETATTR0 - bits 0<->31
1148 */
1149#define	NFSATTRBIT_CBGETATTR0	(NFSATTRBM_CHANGE | NFSATTRBM_SIZE)
1150
1151/*
1152 * NFSATTRBIT_CBGETATTR1 - bits 32<->63
1153 */
1154#define	NFSATTRBIT_CBGETATTR1		0x0
1155
1156/*
1157 * NFSATTRBIT_CBGETATTR2 - bits 64<->95
1158 */
1159#define	NFSATTRBIT_CBGETATTR2		0x0
1160
1161/*
1162 * Sets of attributes that require a VFS_STATFS() call to get the
1163 * values of.
1164 * NFSATTRBIT_STATFS0 - bits 0<->31
1165 */
1166#define	NFSATTRBIT_STATFS0						\
1167	(NFSATTRBM_LINKSUPPORT |					\
1168	NFSATTRBM_SYMLINKSUPPORT |					\
1169	NFSATTRBM_CANSETTIME |						\
1170 	NFSATTRBM_FILESAVAIL |						\
1171 	NFSATTRBM_FILESFREE |						\
1172 	NFSATTRBM_FILESTOTAL |						\
1173 	NFSATTRBM_HOMOGENEOUS |						\
1174 	NFSATTRBM_MAXFILESIZE |						\
1175	NFSATTRBM_MAXNAME |						\
1176	NFSATTRBM_MAXREAD |						\
1177	NFSATTRBM_MAXWRITE)
1178
1179/*
1180 * NFSATTRBIT_STATFS1 - bits 32<->63
1181 */
1182#define	NFSATTRBIT_STATFS1						\
1183 	(NFSATTRBM_QUOTAHARD |						\
1184 	NFSATTRBM_QUOTASOFT |						\
1185 	NFSATTRBM_QUOTAUSED |						\
1186 	NFSATTRBM_SPACEAVAIL |						\
1187 	NFSATTRBM_SPACEFREE |						\
1188 	NFSATTRBM_SPACETOTAL |						\
1189 	NFSATTRBM_SPACEUSED |						\
1190	NFSATTRBM_TIMEDELTA)
1191
1192/*
1193 * NFSATTRBIT_STATFS2 - bits 64<->95
1194 */
1195#define	NFSATTRBIT_STATFS2		0
1196
1197/*
1198 * These are the bits that are needed by the nfs_statfs() call.
1199 * (The regular getattr bits are or'd in so the vnode gets the correct
1200 *  type, etc.)
1201 * NFSGETATTRBIT_STATFS0 - bits 0<->31
1202 */
1203#define	NFSGETATTRBIT_STATFS0	(NFSATTRBIT_GETATTR0 |			\
1204				NFSATTRBM_LINKSUPPORT |			\
1205				NFSATTRBM_SYMLINKSUPPORT |		\
1206				NFSATTRBM_CANSETTIME |			\
1207				NFSATTRBM_FILESFREE |			\
1208				NFSATTRBM_FILESTOTAL |			\
1209				NFSATTRBM_HOMOGENEOUS |			\
1210				NFSATTRBM_MAXFILESIZE |			\
1211				NFSATTRBM_MAXNAME |			\
1212				NFSATTRBM_MAXREAD |			\
1213				NFSATTRBM_MAXWRITE)
1214
1215/*
1216 * NFSGETATTRBIT_STATFS1 - bits 32<->63
1217 */
1218#define	NFSGETATTRBIT_STATFS1	(NFSATTRBIT_GETATTR1 |			\
1219				NFSATTRBM_SPACEAVAIL |			\
1220				NFSATTRBM_SPACEFREE |			\
1221				NFSATTRBM_SPACETOTAL |			\
1222				NFSATTRBM_TIMEDELTA)
1223
1224/*
1225 * NFSGETATTRBIT_STATFS2 - bits 64<->95
1226 */
1227#define	NFSGETATTRBIT_STATFS2		0
1228
1229/*
1230 * Set of attributes for the equivalent of an nfsv3 pathconf rpc.
1231 * NFSGETATTRBIT_PATHCONF0 - bits 0<->31
1232 */
1233#define	NFSGETATTRBIT_PATHCONF0	(NFSATTRBIT_GETATTR0 |			\
1234			 	NFSATTRBM_CASEINSENSITIVE |		\
1235			 	NFSATTRBM_CASEPRESERVING |		\
1236			 	NFSATTRBM_CHOWNRESTRICTED |		\
1237			 	NFSATTRBM_MAXLINK |			\
1238			 	NFSATTRBM_MAXNAME)
1239
1240/*
1241 * NFSGETATTRBIT_PATHCONF1 - bits 32<->63
1242 */
1243#define	NFSGETATTRBIT_PATHCONF1	(NFSATTRBIT_GETATTR1 |			\
1244				NFSATTRBM_NOTRUNC)
1245
1246/*
1247 * NFSGETATTRBIT_PATHCONF2 - bits 64<->95
1248 */
1249#define	NFSGETATTRBIT_PATHCONF2		0
1250
1251/*
1252 * Sets of attributes required by readdir and readdirplus.
1253 * NFSATTRBIT_READDIRPLUS0	(NFSATTRBIT_GETATTR0 | NFSATTRBIT_FILEHANDLE |
1254 *				 NFSATTRBIT_RDATTRERROR)
1255 */
1256#define	NFSATTRBIT_READDIRPLUS0	(NFSATTRBIT_GETATTR0 | NFSATTRBM_FILEHANDLE | \
1257				NFSATTRBM_RDATTRERROR)
1258#define	NFSATTRBIT_READDIRPLUS1	NFSATTRBIT_GETATTR1
1259#define	NFSATTRBIT_READDIRPLUS2		0
1260
1261/*
1262 * Set of attributes supported by Referral vnodes.
1263 */
1264#define	NFSATTRBIT_REFERRAL0	(NFSATTRBM_TYPE | NFSATTRBM_FSID |	\
1265	NFSATTRBM_RDATTRERROR | NFSATTRBM_FSLOCATIONS)
1266#define	NFSATTRBIT_REFERRAL1	NFSATTRBM_MOUNTEDONFILEID
1267#define	NFSATTRBIT_REFERRAL2		0
1268
1269/*
1270 * Structure for data handled by the statfs rpc. Since some fields are
1271 * u_int64_t, this cannot be used for copying data on/off the wire, due
1272 * to alignment concerns.
1273 */
1274struct nfsstatfs {
1275	union {
1276		struct {
1277			u_int32_t nfsv2sf_tsize;
1278			u_int32_t nfsv2sf_bsize;
1279			u_int32_t nfsv2sf_blocks;
1280			u_int32_t nfsv2sf_bfree;
1281			u_int32_t nfsv2sf_bavail;
1282		} sf_nfsv2;
1283		struct {
1284			u_int64_t nfsv3sf_tbytes;
1285			u_int64_t nfsv3sf_fbytes;
1286			u_int64_t nfsv3sf_abytes;
1287			u_int64_t nfsv3sf_tfiles;
1288			u_int64_t nfsv3sf_ffiles;
1289			u_int64_t nfsv3sf_afiles;
1290			u_int32_t nfsv3sf_invarsec;
1291		} sf_nfsv3;
1292	} sf_un;
1293};
1294
1295#define	sf_tsize	sf_un.sf_nfsv2.nfsv2sf_tsize
1296#define	sf_bsize	sf_un.sf_nfsv2.nfsv2sf_bsize
1297#define	sf_blocks	sf_un.sf_nfsv2.nfsv2sf_blocks
1298#define	sf_bfree	sf_un.sf_nfsv2.nfsv2sf_bfree
1299#define	sf_bavail	sf_un.sf_nfsv2.nfsv2sf_bavail
1300#define	sf_tbytes	sf_un.sf_nfsv3.nfsv3sf_tbytes
1301#define	sf_fbytes	sf_un.sf_nfsv3.nfsv3sf_fbytes
1302#define	sf_abytes	sf_un.sf_nfsv3.nfsv3sf_abytes
1303#define	sf_tfiles	sf_un.sf_nfsv3.nfsv3sf_tfiles
1304#define	sf_ffiles	sf_un.sf_nfsv3.nfsv3sf_ffiles
1305#define	sf_afiles	sf_un.sf_nfsv3.nfsv3sf_afiles
1306#define	sf_invarsec	sf_un.sf_nfsv3.nfsv3sf_invarsec
1307
1308/*
1309 * Now defined using u_int64_t for the 64 bit field(s).
1310 * (Cannot be used to move data on/off the wire, due to alignment concerns.)
1311 */
1312struct nfsfsinfo {
1313	u_int32_t fs_rtmax;
1314	u_int32_t fs_rtpref;
1315	u_int32_t fs_rtmult;
1316	u_int32_t fs_wtmax;
1317	u_int32_t fs_wtpref;
1318	u_int32_t fs_wtmult;
1319	u_int32_t fs_dtpref;
1320	u_int64_t fs_maxfilesize;
1321	struct timespec fs_timedelta;
1322	u_int32_t fs_properties;
1323};
1324
1325/*
1326 * Bits for fs_properties
1327 */
1328#define	NFSV3_FSFLINK		0x1
1329#define	NFSV3_FSFSYMLINK	0x2
1330#define	NFSV3_FSFHOMOGENEOUS	0x4
1331#define	NFSV3_FSFCANSETTIME	0x8
1332
1333/*
1334 * Yikes, overload fs_rtmult as fs_maxname for V4.
1335 */
1336#define	fs_maxname	fs_rtmult
1337
1338struct nfsv3_pathconf {
1339	u_int32_t pc_linkmax;
1340	u_int32_t pc_namemax;
1341	u_int32_t pc_notrunc;
1342	u_int32_t pc_chownrestricted;
1343	u_int32_t pc_caseinsensitive;
1344	u_int32_t pc_casepreserving;
1345};
1346
1347/*
1348 * NFS V4 data structures.
1349 */
1350struct nfsv4stateid {
1351	u_int32_t	seqid;
1352	u_int32_t	other[NFSX_STATEIDOTHER / NFSX_UNSIGNED];
1353};
1354typedef struct nfsv4stateid nfsv4stateid_t;
1355
1356#endif	/* _NFS_NFSPROTO_H_ */
1357