master
   1/*-
   2 * SPDX-License-Identifier: BSD-3-Clause
   3 *
   4 * Copyright (c) 1989, 1993
   5 *	The Regents of the University of California.  All rights reserved.
   6 *
   7 * This code is derived from software contributed to Berkeley by
   8 * Rick Macklem at The University of Guelph.
   9 *
  10 * Redistribution and use in source and binary forms, with or without
  11 * modification, are permitted provided that the following conditions
  12 * are met:
  13 * 1. Redistributions of source code must retain the above copyright
  14 *    notice, this list of conditions and the following disclaimer.
  15 * 2. Redistributions in binary form must reproduce the above copyright
  16 *    notice, this list of conditions and the following disclaimer in the
  17 *    documentation and/or other materials provided with the distribution.
  18 * 3. Neither the name of the University nor the names of its contributors
  19 *    may be used to endorse or promote products derived from this software
  20 *    without specific prior written permission.
  21 *
  22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32 * SUCH DAMAGE.
  33 */
  34
  35#ifndef _NFS_NFSPROTO_H_
  36#define	_NFS_NFSPROTO_H_
  37
  38/*
  39 * nfs definitions as per the Version 2, 3 and 4 specs
  40 */
  41
  42/*
  43 * Constants as defined in the NFS Version 2, 3 and 4 specs.
  44 * "NFS: Network File System Protocol Specification" RFC1094
  45 * and in the "NFS: Network File System Version 3 Protocol
  46 * Specification"
  47 */
  48
  49#define	NFS_PORT	2049
  50#define	NFS_PROG	100003
  51#define	NFS_CALLBCKPROG	0x40000000	/* V4 only */
  52#define	NFS_VER2	2
  53#define	NFS_VER3	3
  54#define	NFS_VER4	4
  55#define	NFS_V2MAXDATA	8192
  56#define	NFS_MAXDGRAMDATA 16384
  57#define	NFS_MAXPATHLEN	1024
  58#define	NFS_MAXNAMLEN	255
  59/*
  60 * Calculating the maximum XDR overhead for an NFS RPC isn't easy.
  61 * NFS_MAXPKTHDR is antiquated and assumes AUTH_SYS over UDP.
  62 * NFS_MAXXDR should be sufficient for all NFS versions over TCP.
  63 * It includes:
  64 * - Maximum RPC message header. It can include 2 400byte authenticators plus
  65 *   a machine name of unlimited length, although it is usually relatively
  66 *   small.
  67 * - XDR overheads for the NFSv4 compound. This can include Owner and
  68 *   Owner_group strings, which are usually fairly small, but are allowed
  69 *   to be up to 1024 bytes each.
  70 * 4096 is overkill, but should always be sufficient.
  71 */
  72#define	NFS_MAXPKTHDR	404
  73#define	NFS_MAXXDR	4096
  74#define	NFS_MINPACKET	20
  75#define	NFS_FABLKSIZE	512	/* Size in bytes of a block wrt fa_blocks */
  76#define	NFSV4_MINORVERSION	0	/* V4 Minor version */
  77#define	NFSV41_MINORVERSION	1	/* V4 Minor version */
  78#define	NFSV42_MINORVERSION	2	/* V4 Minor version */
  79#define	NFSV4_CBVERS		1	/* V4 CB Version */
  80#define	NFSV41_CBVERS		4	/* V4.1 CB Version */
  81#define	NFSV4_SMALLSTR	50		/* Strings small enough for stack */
  82
  83/*
  84 * This value isn't a fixed value in the RFCs.
  85 * It is the maximum data size supported by NFSv3 or NFSv4 over TCP for
  86 * the server.  It should be set to the I/O size preferred by ZFS or
  87 * MAXBSIZE, whichever is greater.
  88 * ZFS currently prefers 128K.
  89 * It used to be called NFS_MAXDATA, but has been renamed to clarify that
  90 * it refers to server side only and doesn't conflict with the NFS_MAXDATA
  91 * defined in rpcsvc/nfs_prot.h for userland.
  92 */
  93#define	NFS_SRVMAXIO	(128 * 1024)
  94
  95/* Stat numbers for rpc returns (version 2, 3 and 4) */
  96/*
  97 * These numbers are hard-wired in the RFCs, so they can't be changed.
  98 * The code currently assumes that the ones < 10000 are the same as
  99 * sys/errno.h and that sys/errno.h will never go as high as 10000.
 100 * If the value in sys/errno.h of any entry listed below is changed,
 101 * the NFS code must be modified to do the mapping between them.
 102 * (You can ignore NFSERR_WFLUSH, since it is never actually used.)
 103 */
 104#define	NFSERR_OK		0
 105#define	NFSERR_PERM		1
 106#define	NFSERR_NOENT		2
 107#define	NFSERR_IO		5
 108#define	NFSERR_NXIO		6
 109#define	NFSERR_ACCES		13
 110#define	NFSERR_EXIST		17
 111#define	NFSERR_XDEV		18	/* Version 3, 4 only */
 112#define	NFSERR_NODEV		19
 113#define	NFSERR_NOTDIR		20
 114#define	NFSERR_ISDIR		21
 115#define	NFSERR_INVAL		22	/* Version 3, 4 only */
 116#define	NFSERR_FBIG		27
 117#define	NFSERR_NOSPC		28
 118#define	NFSERR_ROFS		30
 119#define	NFSERR_MLINK		31	/* Version 3, 4 only */
 120#define	NFSERR_NAMETOL		63
 121#define	NFSERR_NOTEMPTY		66
 122#define	NFSERR_DQUOT		69
 123#define	NFSERR_STALE		70
 124#define	NFSERR_REMOTE		71	/* Version 3 only */
 125#define	NFSERR_WFLUSH		99	/* Version 2 only */
 126#define	NFSERR_BADHANDLE	10001	/* These are Version 3, 4 only */
 127#define	NFSERR_NOT_SYNC		10002	/* Version 3 Only */
 128#define	NFSERR_BAD_COOKIE	10003
 129#define	NFSERR_NOTSUPP		10004
 130#define	NFSERR_TOOSMALL		10005
 131#define	NFSERR_SERVERFAULT	10006
 132#define	NFSERR_BADTYPE		10007
 133#define	NFSERR_DELAY		10008	/* Called NFSERR_JUKEBOX for V3 */
 134#define	NFSERR_SAME		10009	/* These are Version 4 only */
 135#define	NFSERR_DENIED		10010
 136#define	NFSERR_EXPIRED		10011
 137#define	NFSERR_LOCKED		10012
 138#define	NFSERR_GRACE		10013
 139#define	NFSERR_FHEXPIRED	10014
 140#define	NFSERR_SHAREDENIED	10015
 141#define	NFSERR_WRONGSEC		10016
 142#define	NFSERR_CLIDINUSE	10017
 143#define	NFSERR_RESOURCE		10018
 144#define	NFSERR_MOVED		10019
 145#define	NFSERR_NOFILEHANDLE	10020
 146#define	NFSERR_MINORVERMISMATCH	10021
 147#define	NFSERR_STALECLIENTID	10022
 148#define	NFSERR_STALESTATEID	10023
 149#define	NFSERR_OLDSTATEID	10024
 150#define	NFSERR_BADSTATEID	10025
 151#define	NFSERR_BADSEQID		10026
 152#define	NFSERR_NOTSAME		10027
 153#define	NFSERR_LOCKRANGE	10028
 154#define	NFSERR_SYMLINK		10029
 155#define	NFSERR_RESTOREFH	10030
 156#define	NFSERR_LEASEMOVED	10031
 157#define	NFSERR_ATTRNOTSUPP	10032
 158#define	NFSERR_NOGRACE		10033
 159#define	NFSERR_RECLAIMBAD	10034
 160#define	NFSERR_RECLAIMCONFLICT	10035
 161#define	NFSERR_BADXDR		10036
 162#define	NFSERR_LOCKSHELD	10037
 163#define	NFSERR_OPENMODE		10038
 164#define	NFSERR_BADOWNER		10039
 165#define	NFSERR_BADCHAR		10040
 166#define	NFSERR_BADNAME		10041
 167#define	NFSERR_BADRANGE		10042
 168#define	NFSERR_LOCKNOTSUPP	10043
 169#define	NFSERR_OPILLEGAL	10044
 170#define	NFSERR_DEADLOCK		10045
 171#define	NFSERR_FILEOPEN		10046
 172#define	NFSERR_ADMINREVOKED	10047
 173#define	NFSERR_CBPATHDOWN	10048
 174
 175/* NFSv4.1 specific errors. */
 176#define	NFSERR_BADIOMODE	10049
 177#define	NFSERR_BADLAYOUT	10050
 178#define	NFSERR_BADSESSIONDIGEST	10051
 179#define	NFSERR_BADSESSION	10052
 180#define	NFSERR_BADSLOT		10053
 181#define	NFSERR_COMPLETEALREADY	10054
 182#define	NFSERR_NOTBNDTOSESS	10055
 183#define	NFSERR_DELEGALREADYWANT	10056
 184#define	NFSERR_BACKCHANBUSY	10057
 185#define	NFSERR_LAYOUTTRYLATER	10058
 186#define	NFSERR_LAYOUTUNAVAIL	10059
 187#define	NFSERR_NOMATCHLAYOUT	10060
 188#define	NFSERR_RECALLCONFLICT	10061
 189#define	NFSERR_UNKNLAYOUTTYPE	10062
 190#define	NFSERR_SEQMISORDERED	10063
 191#define	NFSERR_SEQUENCEPOS	10064
 192#define	NFSERR_REQTOOBIG	10065
 193#define	NFSERR_REPTOOBIG	10066
 194#define	NFSERR_REPTOOBIGTOCACHE	10067
 195#define	NFSERR_RETRYUNCACHEDREP	10068
 196#define	NFSERR_UNSAFECOMPOUND	10069
 197#define	NFSERR_TOOMANYOPS	10070
 198#define	NFSERR_OPNOTINSESS	10071
 199#define	NFSERR_HASHALGUNSUPP	10072
 200#define	NFSERR_CLIENTIDBUSY	10074
 201#define	NFSERR_PNFSIOHOLE	10075
 202#define	NFSERR_SEQFALSERETRY	10076
 203#define	NFSERR_BADHIGHSLOT	10077
 204#define	NFSERR_DEADSESSION	10078
 205#define	NFSERR_ENCRALGUNSUPP	10079
 206#define	NFSERR_PNFSNOLAYOUT	10080
 207#define	NFSERR_NOTONLYOP	10081
 208#define	NFSERR_WRONGCRED	10082
 209#define	NFSERR_WRONGTYPE	10083
 210#define	NFSERR_DIRDELEGUNAVAIL	10084
 211#define	NFSERR_REJECTDELEG	10085
 212#define	NFSERR_RETURNCONFLICT	10086
 213#define	NFSERR_DELEGREVOKED	10087
 214
 215/* NFSv4.2 specific errors. */
 216#define	NFSERR_PARTNERNOTSUPP	10088
 217#define	NFSERR_PARTNERNOAUTH	10089
 218#define	NFSERR_UNIONNOTSUPP	10090
 219#define	NFSERR_OFFLOADDENIED	10091
 220#define	NFSERR_WRONGLFS		10092
 221#define	NFSERR_BADLABEL		10093
 222#define	NFSERR_OFFLOADNOREQS	10094
 223
 224/* NFSv4.2 Extended Attribute errors. */
 225#define	NFSERR_NOXATTR		10095
 226#define	NFSERR_XATTR2BIG	10096
 227
 228/* Maximum value of all the NFS error values. */
 229#define	NFSERR_MAXERRVAL	NFSERR_XATTR2BIG
 230
 231#define	NFSERR_STALEWRITEVERF	30001	/* Fake return for nfs_commit() */
 232#define	NFSERR_DONTREPLY	30003	/* Don't process request */
 233#define	NFSERR_RETVOID		30004	/* Return void, not error */
 234#define	NFSERR_REPLYFROMCACHE	30005	/* Reply from recent request cache */
 235#define	NFSERR_STALEDONTRECOVER	30006	/* Don't initiate recovery */
 236
 237#define	NFSERR_RPCERR		0x40000000 /* Mark an RPC layer error */
 238#define	NFSERR_AUTHERR		0x80000000 /* Mark an authentication error */
 239
 240#define	NFSERR_RPCMISMATCH	(NFSERR_RPCERR | RPC_MISMATCH)
 241#define	NFSERR_PROGUNAVAIL	(NFSERR_RPCERR | RPC_PROGUNAVAIL)
 242#define	NFSERR_PROGMISMATCH	(NFSERR_RPCERR | RPC_PROGMISMATCH)
 243#define	NFSERR_PROGNOTV4	(NFSERR_RPCERR | 0xffff)
 244#define	NFSERR_PROCUNAVAIL	(NFSERR_RPCERR | RPC_PROCUNAVAIL)
 245#define	NFSERR_GARBAGE		(NFSERR_RPCERR | RPC_GARBAGE)
 246
 247/* Sizes in bytes of various nfs rpc components */
 248#define	NFSX_UNSIGNED	4
 249#define	NFSX_HYPER	(2 * NFSX_UNSIGNED)
 250
 251/* specific to NFS Version 2 */
 252#define	NFSX_V2FH	32
 253#define	NFSX_V2FATTR	68
 254#define	NFSX_V2SATTR	32
 255#define	NFSX_V2COOKIE	4
 256#define	NFSX_V2STATFS	20
 257
 258/* specific to NFS Version 3 */
 259#define	NFSX_V3FHMAX		64	/* max. allowed by protocol */
 260#define	NFSX_V3FATTR		84
 261#define	NFSX_V3SATTR		60	/* max. all fields filled in */
 262#define	NFSX_V3SRVSATTR		(sizeof (struct nfsv3_sattr))
 263#define	NFSX_V3POSTOPATTR	(NFSX_V3FATTR + NFSX_UNSIGNED)
 264#define	NFSX_V3WCCDATA		(NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
 265#define	NFSX_V3STATFS		52
 266#define	NFSX_V3FSINFO		48
 267#define	NFSX_V3PATHCONF		24
 268
 269/* specific to NFS Version 4 */
 270#define	NFSX_V4FHMAX		128
 271#define	NFSX_V4FSID		(2 * NFSX_HYPER)
 272#define	NFSX_V4SPECDATA		(2 * NFSX_UNSIGNED)
 273#define	NFSX_V4TIME		(NFSX_HYPER + NFSX_UNSIGNED)
 274#define	NFSX_V4SETTIME		(NFSX_UNSIGNED + NFSX_V4TIME)
 275#define	NFSX_V4SESSIONID	16
 276#define	NFSX_V4DEVICEID		16
 277#define	NFSX_V4PNFSFH		(sizeof(fhandle_t) + 1)
 278#define	NFSX_V4FILELAYOUT	(4 * NFSX_UNSIGNED + NFSX_V4DEVICEID +	\
 279				 NFSX_HYPER + NFSM_RNDUP(NFSX_V4PNFSFH))
 280#define	NFSX_V4FLEXLAYOUT(m)	(NFSX_HYPER + 3 * NFSX_UNSIGNED +		\
 281    ((m) * (NFSX_V4DEVICEID + NFSX_STATEID + NFSM_RNDUP(NFSX_V4PNFSFH) +	\
 282    8 * NFSX_UNSIGNED)))
 283
 284/* sizes common to multiple NFS versions */
 285#define	NFSX_FHMAX		(NFSX_V4FHMAX)
 286#define	NFSX_MYFH		(sizeof (fhandle_t)) /* size this server uses */
 287#define	NFSX_VERF 		8
 288#define	NFSX_STATEIDOTHER	12
 289#define	NFSX_STATEID		(NFSX_UNSIGNED + NFSX_STATEIDOTHER)
 290#define	NFSX_GSSH		12
 291
 292/* variants for multiple versions */
 293#define	NFSX_STATFS(v3)		((v3) ? NFSX_V3STATFS : NFSX_V2STATFS)
 294
 295/*
 296 * Beware.  NFSPROC_NULL and friends are defined in
 297 * <rpcsvc/nfs_prot.h> as well and the numbers are different.
 298 */
 299#ifndef	NFSPROC_NULL
 300/* nfs rpc procedure numbers (before version mapping) */
 301#define	NFSPROC_NULL		0
 302#define	NFSPROC_GETATTR		1
 303#define	NFSPROC_SETATTR		2
 304#define	NFSPROC_LOOKUP		3
 305#define	NFSPROC_ACCESS		4
 306#define	NFSPROC_READLINK	5
 307#define	NFSPROC_READ		6
 308#define	NFSPROC_WRITE		7
 309#define	NFSPROC_CREATE		8
 310#define	NFSPROC_MKDIR		9
 311#define	NFSPROC_SYMLINK		10
 312#define	NFSPROC_MKNOD		11
 313#define	NFSPROC_REMOVE		12
 314#define	NFSPROC_RMDIR		13
 315#define	NFSPROC_RENAME		14
 316#define	NFSPROC_LINK		15
 317#define	NFSPROC_READDIR		16
 318#define	NFSPROC_READDIRPLUS	17
 319#define	NFSPROC_FSSTAT		18
 320#define	NFSPROC_FSINFO		19
 321#define	NFSPROC_PATHCONF	20
 322#define	NFSPROC_COMMIT		21
 323#endif	/* NFSPROC_NULL */
 324
 325/*
 326 * The lower numbers -> 21 are used by NFSv2 and v3. These define higher
 327 * numbers used by NFSv4.
 328 * NFS_V3NPROCS is one greater than the last V3 op and NFS_NPROCS is
 329 * one greater than the last number.
 330 */
 331#ifndef	NFS_V3NPROCS
 332#define	NFS_V3NPROCS		22
 333
 334#define	NFSPROC_LOOKUPP		22
 335#define	NFSPROC_SETCLIENTID	23
 336#define	NFSPROC_SETCLIENTIDCFRM	24
 337#define	NFSPROC_LOCK		25
 338#define	NFSPROC_LOCKU		26
 339#define	NFSPROC_OPEN		27
 340#define	NFSPROC_CLOSE		28
 341#define	NFSPROC_OPENCONFIRM	29
 342#define	NFSPROC_LOCKT		30
 343#define	NFSPROC_OPENDOWNGRADE	31
 344#define	NFSPROC_RENEW		32
 345#define	NFSPROC_PUTROOTFH	33
 346#define	NFSPROC_RELEASELCKOWN	34
 347#define	NFSPROC_DELEGRETURN	35
 348#define	NFSPROC_RETDELEGREMOVE	36
 349#define	NFSPROC_RETDELEGRENAME1	37
 350#define	NFSPROC_RETDELEGRENAME2	38
 351#define	NFSPROC_GETACL		39
 352#define	NFSPROC_SETACL		40
 353
 354/*
 355 * Must be defined as one higher than the last Proc# above.
 356 */
 357#define	NFSV4_NPROCS		41
 358
 359/* Additional procedures for NFSv4.1. */
 360#define	NFSPROC_EXCHANGEID	41
 361#define	NFSPROC_CREATESESSION	42
 362#define	NFSPROC_DESTROYSESSION	43
 363#define	NFSPROC_DESTROYCLIENT	44
 364#define	NFSPROC_FREESTATEID	45
 365#define	NFSPROC_LAYOUTGET	46
 366#define	NFSPROC_GETDEVICEINFO	47
 367#define	NFSPROC_LAYOUTCOMMIT	48
 368#define	NFSPROC_LAYOUTRETURN	49
 369#define	NFSPROC_RECLAIMCOMPL	50
 370#define	NFSPROC_WRITEDS		51
 371#define	NFSPROC_READDS		52
 372#define	NFSPROC_COMMITDS	53
 373#define	NFSPROC_OPENLAYGET	54
 374#define	NFSPROC_CREATELAYGET	55
 375
 376/*
 377 * Must be defined as one higher than the last NFSv4.1 Proc# above.
 378 */
 379#define	NFSV41_NPROCS		56
 380
 381/* Additional procedures for NFSv4.2. */
 382#define	NFSPROC_IOADVISE	56
 383#define	NFSPROC_ALLOCATE	57
 384#define	NFSPROC_COPY		58
 385#define	NFSPROC_SEEK		59
 386#define	NFSPROC_SEEKDS		60
 387
 388/* and the ones for the optional Extended attribute support (RFC-8276). */
 389#define	NFSPROC_GETEXTATTR	61
 390#define	NFSPROC_SETEXTATTR	62
 391#define	NFSPROC_RMEXTATTR	63
 392#define	NFSPROC_LISTEXTATTR	64
 393
 394/* BindConnectionToSession, done by the krpc for a new connection. */
 395#define	NFSPROC_BINDCONNTOSESS	65
 396
 397/* Do a Lookup+Open for "oneopenown". */
 398#define	NFSPROC_LOOKUPOPEN	66
 399
 400/* Do an NFSv4.2 Deallocate. */
 401#define	NFSPROC_DEALLOCATE	67
 402
 403/* Do an NFSv4.2 LayoutError. */
 404#define	NFSPROC_LAYOUTERROR	68
 405
 406/* Do an NFSv4 Verify+Write. */
 407#define	NFSPROC_APPENDWRITE	69
 408
 409/*
 410 * Must be defined as one higher than the last NFSv4.2 Proc# above.
 411 */
 412#define	NFSV42_NPROCS		70
 413
 414/* Value of NFSV42_NPROCS for old nfsstats structure. (Always 69) */
 415#define	NFSV42_OLDNPROCS	69
 416
 417#endif	/* NFS_V3NPROCS */
 418
 419/*
 420 * Define NFS_NPROCS as NFSV4_NPROCS for the experimental kernel code.
 421 */
 422#ifndef	NFS_NPROCS
 423#define	NFS_NPROCS		NFSV4_NPROCS
 424#endif
 425
 426/*
 427 * NFSPROC_NOOP is a fake op# that can't be the same as any V2/3/4 Procedure
 428 * or Operation#. Since the NFS V4 Op #s go higher, use NFSV42_NOPS, which
 429 * is one greater than the highest Op#.
 430 */
 431#define	NFSPROC_NOOP		NFSV42_NOPS
 432
 433/* Actual Version 2 procedure numbers */
 434#define	NFSV2PROC_NULL		0
 435#define	NFSV2PROC_GETATTR	1
 436#define	NFSV2PROC_SETATTR	2
 437#define	NFSV2PROC_NOOP		3
 438#define	NFSV2PROC_ROOT		NFSV2PROC_NOOP	/* Obsolete */
 439#define	NFSV2PROC_LOOKUP	4
 440#define	NFSV2PROC_READLINK	5
 441#define	NFSV2PROC_READ		6
 442#define	NFSV2PROC_WRITECACHE	NFSV2PROC_NOOP	/* Obsolete */
 443#define	NFSV2PROC_WRITE		8
 444#define	NFSV2PROC_CREATE	9
 445#define	NFSV2PROC_REMOVE	10
 446#define	NFSV2PROC_RENAME	11
 447#define	NFSV2PROC_LINK		12
 448#define	NFSV2PROC_SYMLINK	13
 449#define	NFSV2PROC_MKDIR		14
 450#define	NFSV2PROC_RMDIR		15
 451#define	NFSV2PROC_READDIR	16
 452#define	NFSV2PROC_STATFS	17
 453
 454/*
 455 * V4 Procedure numbers
 456 */
 457#define	NFSV4PROC_COMPOUND	1
 458#define	NFSV4PROC_CBNULL	0
 459#define	NFSV4PROC_CBCOMPOUND	1
 460
 461/*
 462 * Constants used by the Version 3 and 4 protocols for various RPCs
 463 */
 464#define	NFSV3SATTRTIME_DONTCHANGE	0
 465#define	NFSV3SATTRTIME_TOSERVER		1
 466#define	NFSV3SATTRTIME_TOCLIENT		2
 467
 468#define	NFSV4SATTRTIME_TOSERVER		0
 469#define	NFSV4SATTRTIME_TOCLIENT		1
 470
 471#define	NFSV4LOCKT_READ			1
 472#define	NFSV4LOCKT_WRITE		2
 473#define	NFSV4LOCKT_READW		3
 474#define	NFSV4LOCKT_WRITEW		4
 475#define	NFSV4LOCKT_RELEASE		5
 476
 477#define	NFSV4OPEN_NOCREATE		0
 478#define	NFSV4OPEN_CREATE		1
 479#define	NFSV4OPEN_CLAIMNULL		0
 480#define	NFSV4OPEN_CLAIMPREVIOUS		1
 481#define	NFSV4OPEN_CLAIMDELEGATECUR	2
 482#define	NFSV4OPEN_CLAIMDELEGATEPREV	3
 483#define	NFSV4OPEN_CLAIMFH		4
 484#define	NFSV4OPEN_CLAIMDELEGATECURFH	5
 485#define	NFSV4OPEN_CLAIMDELEGATEPREVFH	6
 486#define	NFSV4OPEN_DELEGATENONE		0
 487#define	NFSV4OPEN_DELEGATEREAD		1
 488#define	NFSV4OPEN_DELEGATEWRITE		2
 489#define	NFSV4OPEN_DELEGATENONEEXT	3
 490#define	NFSV4OPEN_LIMITSIZE		1
 491#define	NFSV4OPEN_LIMITBLOCKS		2
 492
 493/*
 494 * Nfs V4 ACE stuff
 495 */
 496#define	NFSV4ACE_ALLOWEDTYPE		0x00000000
 497#define	NFSV4ACE_DENIEDTYPE		0x00000001
 498#define	NFSV4ACE_AUDITTYPE		0x00000002
 499#define	NFSV4ACE_ALARMTYPE		0x00000003
 500
 501#define	NFSV4ACE_SUPALLOWED		0x00000001
 502#define	NFSV4ACE_SUPDENIED		0x00000002
 503#define	NFSV4ACE_SUPAUDIT		0x00000004
 504#define	NFSV4ACE_SUPALARM		0x00000008
 505
 506#define	NFSV4ACE_SUPTYPES	(NFSV4ACE_SUPALLOWED | NFSV4ACE_SUPDENIED)
 507
 508#define	NFSV4ACE_FILEINHERIT		0x00000001
 509#define	NFSV4ACE_DIRECTORYINHERIT	0x00000002
 510#define	NFSV4ACE_NOPROPAGATEINHERIT	0x00000004
 511#define	NFSV4ACE_INHERITONLY		0x00000008
 512#define	NFSV4ACE_SUCCESSFULACCESS	0x00000010
 513#define	NFSV4ACE_FAILEDACCESS		0x00000020
 514#define	NFSV4ACE_IDENTIFIERGROUP	0x00000040
 515
 516#define	NFSV4ACE_READDATA		0x00000001
 517#define	NFSV4ACE_LISTDIRECTORY		0x00000001
 518#define	NFSV4ACE_WRITEDATA		0x00000002
 519#define	NFSV4ACE_ADDFILE		0x00000002
 520#define	NFSV4ACE_APPENDDATA		0x00000004
 521#define	NFSV4ACE_ADDSUBDIRECTORY	0x00000004
 522#define	NFSV4ACE_READNAMEDATTR		0x00000008
 523#define	NFSV4ACE_WRITENAMEDATTR		0x00000010
 524#define	NFSV4ACE_EXECUTE		0x00000020
 525#define	NFSV4ACE_SEARCH			0x00000020
 526#define	NFSV4ACE_DELETECHILD		0x00000040
 527#define	NFSV4ACE_READATTRIBUTES		0x00000080
 528#define	NFSV4ACE_WRITEATTRIBUTES	0x00000100
 529#define	NFSV4ACE_DELETE			0x00010000
 530#define	NFSV4ACE_READACL		0x00020000
 531#define	NFSV4ACE_WRITEACL		0x00040000
 532#define	NFSV4ACE_WRITEOWNER		0x00080000
 533#define	NFSV4ACE_SYNCHRONIZE		0x00100000
 534
 535/*
 536 * Here are the mappings between mode bits and acl mask bits for
 537 * directories and other files.
 538 * (Named attributes have not been included, since named attributes are
 539 *  not yet supported.)
 540 * The mailing list seems to indicate that NFSV4ACE_EXECUTE refers to
 541 * searching a directory, although I can't find a statement of that in
 542 * the RFC.
 543 */
 544#define	NFSV4ACE_ALLFILESMASK	(NFSV4ACE_READATTRIBUTES | NFSV4ACE_READACL)
 545#define	NFSV4ACE_OWNERMASK	(NFSV4ACE_WRITEATTRIBUTES | NFSV4ACE_WRITEACL)
 546#define	NFSV4ACE_DIRREADMASK	NFSV4ACE_LISTDIRECTORY
 547#define	NFSV4ACE_DIREXECUTEMASK	NFSV4ACE_EXECUTE
 548#define	NFSV4ACE_DIRWRITEMASK	(NFSV4ACE_ADDFILE | 			\
 549		NFSV4ACE_ADDSUBDIRECTORY | NFSV4ACE_DELETECHILD)
 550#define	NFSV4ACE_READMASK	NFSV4ACE_READDATA
 551#define	NFSV4ACE_WRITEMASK	(NFSV4ACE_WRITEDATA | NFSV4ACE_APPENDDATA)
 552#define	NFSV4ACE_EXECUTEMASK	NFSV4ACE_EXECUTE
 553#define	NFSV4ACE_ALLFILEBITS	(NFSV4ACE_READMASK | NFSV4ACE_WRITEMASK | \
 554	NFSV4ACE_EXECUTEMASK | NFSV4ACE_SYNCHRONIZE)
 555#define	NFSV4ACE_ALLDIRBITS	(NFSV4ACE_DIRREADMASK | 		\
 556	NFSV4ACE_DIRWRITEMASK | NFSV4ACE_DIREXECUTEMASK)
 557#define	NFSV4ACE_AUDITMASK	0x0
 558
 559/*
 560 * These GENERIC masks are not used and are no longer believed to be useful.
 561 */
 562#define	NFSV4ACE_GENERICREAD		0x00120081
 563#define	NFSV4ACE_GENERICWRITE		0x00160106
 564#define	NFSV4ACE_GENERICEXECUTE		0x001200a0
 565
 566#define	NFSSTATEID_PUTALLZERO		0
 567#define	NFSSTATEID_PUTALLONE		1
 568#define	NFSSTATEID_PUTSTATEID		2
 569#define	NFSSTATEID_PUTSEQIDZERO		3
 570
 571/*
 572 * Bits for share access and deny.
 573 */
 574#define	NFSV4OPEN_ACCESSREAD		0x00000001
 575#define	NFSV4OPEN_ACCESSWRITE		0x00000002
 576#define	NFSV4OPEN_ACCESSBOTH		0x00000003
 577#define	NFSV4OPEN_WANTDELEGMASK		0x0000ff00
 578#define	NFSV4OPEN_WANTREADDELEG		0x00000100
 579#define	NFSV4OPEN_WANTWRITEDELEG	0x00000200
 580#define	NFSV4OPEN_WANTANYDELEG		0x00000300
 581#define	NFSV4OPEN_WANTNODELEG		0x00000400
 582#define	NFSV4OPEN_WANTCANCEL		0x00000500
 583#define	NFSV4OPEN_WANTSIGNALDELEG	0x00010000
 584#define	NFSV4OPEN_WANTPUSHDELEG		0x00020000
 585
 586#define	NFSV4OPEN_DENYNONE		0x00000000
 587#define	NFSV4OPEN_DENYREAD		0x00000001
 588#define	NFSV4OPEN_DENYWRITE		0x00000002
 589#define	NFSV4OPEN_DENYBOTH		0x00000003
 590
 591/*
 592 * Delegate_none_ext reply values.
 593 */
 594#define	NFSV4OPEN_NOTWANTED		0
 595#define	NFSV4OPEN_CONTENTION		1
 596#define	NFSV4OPEN_RESOURCE		2
 597#define	NFSV4OPEN_NOTSUPPFTYPE		3
 598#define	NFSV4OPEN_NOTSUPPWRITEFTYPE	4
 599#define	NFSV4OPEN_NOTSUPPUPGRADE	5
 600#define	NFSV4OPEN_NOTSUPPDOWNGRADE	6
 601#define	NFSV4OPEN_CANCELLED		7
 602#define	NFSV4OPEN_ISDIR			8
 603
 604/*
 605 * Open result flags
 606 * (The first four are in the spec. The rest are used internally.)
 607 */
 608#define	NFSV4OPEN_RESULTCONFIRM		0x00000002
 609#define	NFSV4OPEN_LOCKTYPEPOSIX		0x00000004
 610#define	NFSV4OPEN_PRESERVEUNLINKED	0x00000008
 611#define	NFSV4OPEN_MAYNOTIFYLOCK		0x00000020
 612#define	NFSV4OPEN_RFLAGS 						\
 613    (NFSV4OPEN_RESULTCONFIRM | NFSV4OPEN_LOCKTYPEPOSIX |		\
 614    NFSV4OPEN_PRESERVEUNLINKED | NFSV4OPEN_MAYNOTIFYLOCK)
 615#define	NFSV4OPEN_RECALL		0x00010000
 616#define	NFSV4OPEN_READDELEGATE		0x00020000
 617#define	NFSV4OPEN_WRITEDELEGATE		0x00040000
 618#define	NFSV4OPEN_WDRESOURCE		0x00080000
 619#define	NFSV4OPEN_WDCONTENTION		0x00100000
 620#define	NFSV4OPEN_WDNOTWANTED		0x00200000
 621#define	NFSV4OPEN_WDSUPPFTYPE		0x00400000
 622#define	NFSV4OPEN_WDNOTSUPPDOWNGRADE	0x00800000
 623#define	NFSV4OPEN_WDNOTSUPPUPGRADE	0x01000000
 624
 625/*
 626 * NFS V4 File Handle types
 627 */
 628#define	NFSV4FHTYPE_PERSISTENT		0x0
 629#define	NFSV4FHTYPE_NOEXPIREWITHOPEN	0x1
 630#define	NFSV4FHTYPE_VOLATILEANY		0x2
 631#define	NFSV4FHTYPE_VOLATILEMIGRATE	0x4
 632#define	NFSV4FHTYPE_VOLATILERENAME	0x8
 633
 634/*
 635 * Maximum size of V4 opaque strings.
 636 */
 637#define	NFSV4_OPAQUELIMIT	1024
 638
 639/*
 640 * These are the same for V3 and V4.
 641 */
 642#define	NFSACCESS_READ			0x01
 643#define	NFSACCESS_LOOKUP		0x02
 644#define	NFSACCESS_MODIFY		0x04
 645#define	NFSACCESS_EXTEND		0x08
 646#define	NFSACCESS_DELETE		0x10
 647#define	NFSACCESS_EXECUTE		0x20
 648
 649/* Additional Extended Attribute access bits RFC-8276. */
 650#define	NFSACCESS_XAREAD		0x40
 651#define	NFSACCESS_XAWRITE		0x80
 652#define	NFSACCESS_XALIST		0x100
 653
 654#define	NFSWRITE_UNSTABLE		0
 655#define	NFSWRITE_DATASYNC		1
 656#define	NFSWRITE_FILESYNC		2
 657
 658#define	NFSCREATE_UNCHECKED		0
 659#define	NFSCREATE_GUARDED		1
 660#define	NFSCREATE_EXCLUSIVE		2
 661#define	NFSCREATE_EXCLUSIVE41		3
 662
 663#define	NFSV3FSINFO_LINK		0x01
 664#define	NFSV3FSINFO_SYMLINK		0x02
 665#define	NFSV3FSINFO_HOMOGENEOUS		0x08
 666#define	NFSV3FSINFO_CANSETTIME		0x10
 667
 668/* Flags for Exchange ID */
 669#define	NFSV4EXCH_SUPPMOVEDREFER	0x00000001
 670#define	NFSV4EXCH_SUPPMOVEDMIGR	0x00000002
 671#define	NFSV4EXCH_BINDPRINCSTATEID	0x00000100
 672#define	NFSV4EXCH_USENONPNFS		0x00010000
 673#define	NFSV4EXCH_USEPNFSMDS		0x00020000
 674#define	NFSV4EXCH_USEPNFSDS		0x00040000
 675#define	NFSV4EXCH_MASKPNFS		0x00070000
 676#define	NFSV4EXCH_UPDCONFIRMEDRECA	0x40000000
 677#define	NFSV4EXCH_CONFIRMEDR		0x80000000
 678
 679/* State Protects */
 680#define	NFSV4EXCH_SP4NONE		0
 681#define	NFSV4EXCH_SP4MACHCRED		1
 682#define	NFSV4EXCH_SP4SSV		2
 683
 684/* Flags for Create Session */
 685#define	NFSV4CRSESS_PERSIST		0x00000001
 686#define	NFSV4CRSESS_CONNBACKCHAN	0x00000002
 687#define	NFSV4CRSESS_CONNRDMA		0x00000004
 688
 689/* Flags for Sequence */
 690#define	NFSV4SEQ_CBPATHDOWN		0x00000001
 691#define	NFSV4SEQ_CBGSSCONTEXPIRING	0x00000002
 692#define	NFSV4SEQ_CBGSSCONTEXPIRED	0x00000004
 693#define	NFSV4SEQ_EXPIREDALLSTATEREVOKED	0x00000008
 694#define	NFSV4SEQ_EXPIREDSOMESTATEREVOKED 0x00000010
 695#define	NFSV4SEQ_ADMINSTATEREVOKED	0x00000020
 696#define	NFSV4SEQ_RECALLABLESTATEREVOKED	0x00000040
 697#define	NFSV4SEQ_LEASEMOVED		0x00000080
 698#define	NFSV4SEQ_RESTARTRECLAIMNEEDED	0x00000100
 699#define	NFSV4SEQ_CBPATHDOWNSESSION	0x00000200
 700#define	NFSV4SEQ_BACKCHANNELFAULT	0x00000400
 701#define	NFSV4SEQ_DEVIDCHANGED		0x00000800
 702#define	NFSV4SEQ_DEVIDDELETED		0x00001000
 703
 704/* Flags for Layout. */
 705#define	NFSLAYOUTRETURN_FILE		1
 706#define	NFSLAYOUTRETURN_FSID		2
 707#define	NFSLAYOUTRETURN_ALL		3
 708
 709#define	NFSLAYOUT_NFSV4_1_FILES		0x1
 710#define	NFSLAYOUT_OSD2_OBJECTS		0x2
 711#define	NFSLAYOUT_BLOCK_VOLUME		0x3
 712#define	NFSLAYOUT_FLEXFILE		0x4
 713
 714#define	NFSLAYOUTIOMODE_READ		1
 715#define	NFSLAYOUTIOMODE_RW		2
 716#define	NFSLAYOUTIOMODE_ANY		3
 717
 718/* Flags for Get Device Info. */
 719#define	NFSDEVICEIDNOTIFY_CHANGEBIT	0x1
 720#define	NFSDEVICEIDNOTIFY_DELETEBIT	0x2
 721
 722/* Flags for File Layout. */
 723#define	NFSFLAYUTIL_DENSE		0x1
 724#define	NFSFLAYUTIL_COMMIT_THRU_MDS	0x2
 725#define	NFSFLAYUTIL_IOADVISE_THRU_MDS	0x4
 726#define	NFSFLAYUTIL_STRIPE_MASK		0xffffffc0
 727
 728/* Flags for Flex File Layout. */
 729#define	NFSFLEXFLAG_NO_LAYOUTCOMMIT	0x00000001
 730#define	NFSFLEXFLAG_NOIO_MDS		0x00000002
 731#define	NFSFLEXFLAG_NO_READIO		0x00000004
 732#define	NFSFLEXFLAG_WRITE_ONEMIRROR	0x00000008
 733
 734/* Enum values for Bind Connection to Session. */
 735#define	NFSCDFC4_FORE		0x1
 736#define	NFSCDFC4_BACK		0x2
 737#define	NFSCDFC4_FORE_OR_BOTH	0x3
 738#define	NFSCDFC4_BACK_OR_BOTH	0x7
 739#define	NFSCDFS4_FORE		0x1
 740#define	NFSCDFS4_BACK		0x2
 741#define	NFSCDFS4_BOTH		0x3
 742
 743/* Enum values for Secinfo_no_name. */
 744#define	NFSSECINFONONAME_CURFH	0
 745#define	NFSSECINFONONAME_PARENT	1
 746
 747#if defined(_KERNEL) || defined(KERNEL)
 748/* Conversion macros */
 749#define	vtonfsv2_mode(t,m) 						\
 750		txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : 	\
 751				MAKEIMODE((t), (m)))
 752#define	vtonfsv34_mode(m)	txdr_unsigned((m) & 07777)
 753#define	nfstov_mode(a)		(fxdr_unsigned(u_int16_t, (a))&07777)
 754#define	vtonfsv2_type(a)  (((u_int32_t)(a)) >= 9 ? txdr_unsigned(NFNON) : \
 755		txdr_unsigned(newnfsv2_type[((u_int32_t)(a))]))
 756#define	vtonfsv34_type(a)  (((u_int32_t)(a)) >= 9 ? txdr_unsigned(NFNON) : \
 757		txdr_unsigned(nfsv34_type[((u_int32_t)(a))]))
 758#define	nfsv2tov_type(a)	newnv2tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
 759#define	nfsv34tov_type(a)	nv34tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
 760#define	vtonfs_dtype(a)	(((u_int32_t)(a)) >= 9 ? IFTODT(VTTOIF(VNON)) : \
 761			 IFTODT(VTTOIF(a)))
 762
 763/* File types */
 764typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5,
 765	NFSOCK=6, NFFIFO=7, NFATTRDIR=8, NFNAMEDATTR=9 } nfstype;
 766
 767/* Structs for common parts of the rpc's */
 768
 769struct nfsv2_time {
 770	u_int32_t nfsv2_sec;
 771	u_int32_t nfsv2_usec;
 772};
 773typedef struct nfsv2_time	nfstime2;
 774
 775struct nfsv3_time {
 776	u_int32_t nfsv3_sec;
 777	u_int32_t nfsv3_nsec;
 778};
 779typedef struct nfsv3_time	nfstime3;
 780
 781struct nfsv4_time {
 782	u_int32_t nfsv4_highsec;
 783	u_int32_t nfsv4_sec;
 784	u_int32_t nfsv4_nsec;
 785};
 786typedef struct nfsv4_time	nfstime4;
 787
 788/*
 789 * Quads are defined as arrays of 2 longs to ensure dense packing for the
 790 * protocol and to facilitate xdr conversion.
 791 */
 792struct nfs_uquad {
 793	u_int32_t nfsuquad[2];
 794};
 795typedef	struct nfs_uquad	nfsuint64;
 796
 797/*
 798 * Used to convert between two u_longs and a u_quad_t.
 799 */
 800union nfs_quadconvert {
 801	u_int32_t lval[2];
 802	u_quad_t  qval;
 803};
 804typedef union nfs_quadconvert	nfsquad_t;
 805
 806/*
 807 * NFS Version 3 special file number.
 808 */
 809struct nfsv3_spec {
 810	u_int32_t specdata1;
 811	u_int32_t specdata2;
 812};
 813typedef	struct nfsv3_spec	nfsv3spec;
 814
 815/*
 816 * File attributes and setable attributes. These structures cover both
 817 * NFS version 2 and the version 3 protocol. Note that the union is only
 818 * used so that one pointer can refer to both variants. These structures
 819 * go out on the wire and must be densely packed, so no quad data types
 820 * are used. (all fields are longs or u_longs or structures of same)
 821 * NB: You can't do sizeof(struct nfs_fattr), you must use the
 822 *     NFSX_FATTR(v3) macro.
 823 */
 824struct nfs_fattr {
 825	u_int32_t fa_type;
 826	u_int32_t fa_mode;
 827	u_int32_t fa_nlink;
 828	u_int32_t fa_uid;
 829	u_int32_t fa_gid;
 830	union {
 831		struct {
 832			u_int32_t nfsv2fa_size;
 833			u_int32_t nfsv2fa_blocksize;
 834			u_int32_t nfsv2fa_rdev;
 835			u_int32_t nfsv2fa_blocks;
 836			u_int32_t nfsv2fa_fsid;
 837			u_int32_t nfsv2fa_fileid;
 838			nfstime2  nfsv2fa_atime;
 839			nfstime2  nfsv2fa_mtime;
 840			nfstime2  nfsv2fa_ctime;
 841		} fa_nfsv2;
 842		struct {
 843			nfsuint64 nfsv3fa_size;
 844			nfsuint64 nfsv3fa_used;
 845			nfsv3spec nfsv3fa_rdev;
 846			nfsuint64 nfsv3fa_fsid;
 847			nfsuint64 nfsv3fa_fileid;
 848			nfstime3  nfsv3fa_atime;
 849			nfstime3  nfsv3fa_mtime;
 850			nfstime3  nfsv3fa_ctime;
 851		} fa_nfsv3;
 852	} fa_un;
 853};
 854
 855/* and some ugly defines for accessing union components */
 856#define	fa2_size		fa_un.fa_nfsv2.nfsv2fa_size
 857#define	fa2_blocksize		fa_un.fa_nfsv2.nfsv2fa_blocksize
 858#define	fa2_rdev		fa_un.fa_nfsv2.nfsv2fa_rdev
 859#define	fa2_blocks		fa_un.fa_nfsv2.nfsv2fa_blocks
 860#define	fa2_fsid		fa_un.fa_nfsv2.nfsv2fa_fsid
 861#define	fa2_fileid		fa_un.fa_nfsv2.nfsv2fa_fileid
 862#define	fa2_atime		fa_un.fa_nfsv2.nfsv2fa_atime
 863#define	fa2_mtime		fa_un.fa_nfsv2.nfsv2fa_mtime
 864#define	fa2_ctime		fa_un.fa_nfsv2.nfsv2fa_ctime
 865#define	fa3_size		fa_un.fa_nfsv3.nfsv3fa_size
 866#define	fa3_used		fa_un.fa_nfsv3.nfsv3fa_used
 867#define	fa3_rdev		fa_un.fa_nfsv3.nfsv3fa_rdev
 868#define	fa3_fsid		fa_un.fa_nfsv3.nfsv3fa_fsid
 869#define	fa3_fileid		fa_un.fa_nfsv3.nfsv3fa_fileid
 870#define	fa3_atime		fa_un.fa_nfsv3.nfsv3fa_atime
 871#define	fa3_mtime		fa_un.fa_nfsv3.nfsv3fa_mtime
 872#define	fa3_ctime		fa_un.fa_nfsv3.nfsv3fa_ctime
 873
 874#define	NFS_LINK_MAX	UINT32_MAX
 875
 876struct nfsv2_sattr {
 877	u_int32_t sa_mode;
 878	u_int32_t sa_uid;
 879	u_int32_t sa_gid;
 880	u_int32_t sa_size;
 881	nfstime2  sa_atime;
 882	nfstime2  sa_mtime;
 883};
 884
 885/*
 886 * NFS Version 3 sattr structure for the new node creation case.
 887 */
 888struct nfsv3_sattr {
 889	u_int32_t sa_modetrue;
 890	u_int32_t sa_mode;
 891	u_int32_t sa_uidfalse;
 892	u_int32_t sa_gidfalse;
 893	u_int32_t sa_sizefalse;
 894	u_int32_t sa_atimetype;
 895	nfstime3  sa_atime;
 896	u_int32_t sa_mtimetype;
 897	nfstime3  sa_mtime;
 898};
 899
 900/*
 901 * IO Advise hint bits for NFSv4.2.
 902 * Since these go on the wire as a bitmap, the NFSATTRBIT macros are
 903 * used to manipulate these bits.
 904 */
 905#define	NFSV4IOHINT_NORMAL		0
 906#define	NFSV4IOHINT_SEQUENTIAL		1
 907#define	NFSV4IOHINT_SEQUENTIALBACK	2
 908#define	NFSV4IOHINT_RANDOM		3
 909#define	NFSV4IOHINT_WILLNEED		4
 910#define	NFSV4IOHINT_WILLNEEDOPTUN	5
 911#define	NFSV4IOHINT_DONTNEED		6
 912#define	NFSV4IOHINT_NOREUSE		7
 913#define	NFSV4IOHINT_READ		8
 914#define	NFSV4IOHINT_WRITE		9
 915#define	NFSV4IOHINT_INITPROXIMITY	10
 916
 917#endif	/* _KERNEL */
 918
 919/*
 920 * The attribute bits used for V4.
 921 * NFSATTRBIT_xxx defines the attribute# (and its bit position)
 922 * NFSATTRBM_xxx is a 32bit mask with the correct bit set within the
 923 *	appropriate 32bit word.
 924 * NFSATTRBIT_MAX is one greater than the largest NFSATTRBIT_xxx
 925 */
 926#define	NFSATTRBIT_SUPPORTEDATTRS	0
 927#define	NFSATTRBIT_TYPE			1
 928#define	NFSATTRBIT_FHEXPIRETYPE		2
 929#define	NFSATTRBIT_CHANGE		3
 930#define	NFSATTRBIT_SIZE			4
 931#define	NFSATTRBIT_LINKSUPPORT		5
 932#define	NFSATTRBIT_SYMLINKSUPPORT	6
 933#define	NFSATTRBIT_NAMEDATTR		7
 934#define	NFSATTRBIT_FSID			8
 935#define	NFSATTRBIT_UNIQUEHANDLES	9
 936#define	NFSATTRBIT_LEASETIME		10
 937#define	NFSATTRBIT_RDATTRERROR		11
 938#define	NFSATTRBIT_ACL			12
 939#define	NFSATTRBIT_ACLSUPPORT		13
 940#define	NFSATTRBIT_ARCHIVE		14
 941#define	NFSATTRBIT_CANSETTIME		15
 942#define	NFSATTRBIT_CASEINSENSITIVE	16
 943#define	NFSATTRBIT_CASEPRESERVING	17
 944#define	NFSATTRBIT_CHOWNRESTRICTED	18
 945#define	NFSATTRBIT_FILEHANDLE		19
 946#define	NFSATTRBIT_FILEID		20
 947#define	NFSATTRBIT_FILESAVAIL		21
 948#define	NFSATTRBIT_FILESFREE		22
 949#define	NFSATTRBIT_FILESTOTAL		23
 950#define	NFSATTRBIT_FSLOCATIONS		24
 951#define	NFSATTRBIT_HIDDEN		25
 952#define	NFSATTRBIT_HOMOGENEOUS		26
 953#define	NFSATTRBIT_MAXFILESIZE		27
 954#define	NFSATTRBIT_MAXLINK		28
 955#define	NFSATTRBIT_MAXNAME		29
 956#define	NFSATTRBIT_MAXREAD		30
 957#define	NFSATTRBIT_MAXWRITE		31
 958#define	NFSATTRBIT_MIMETYPE		32
 959#define	NFSATTRBIT_MODE			33
 960#define	NFSATTRBIT_NOTRUNC		34
 961#define	NFSATTRBIT_NUMLINKS		35
 962#define	NFSATTRBIT_OWNER		36
 963#define	NFSATTRBIT_OWNERGROUP		37
 964#define	NFSATTRBIT_QUOTAHARD		38
 965#define	NFSATTRBIT_QUOTASOFT		39
 966#define	NFSATTRBIT_QUOTAUSED		40
 967#define	NFSATTRBIT_RAWDEV		41
 968#define	NFSATTRBIT_SPACEAVAIL		42
 969#define	NFSATTRBIT_SPACEFREE		43
 970#define	NFSATTRBIT_SPACETOTAL		44
 971#define	NFSATTRBIT_SPACEUSED		45
 972#define	NFSATTRBIT_SYSTEM		46
 973#define	NFSATTRBIT_TIMEACCESS		47
 974#define	NFSATTRBIT_TIMEACCESSSET	48
 975#define	NFSATTRBIT_TIMEBACKUP		49
 976#define	NFSATTRBIT_TIMECREATE		50
 977#define	NFSATTRBIT_TIMEDELTA		51
 978#define	NFSATTRBIT_TIMEMETADATA		52
 979#define	NFSATTRBIT_TIMEMODIFY		53
 980#define	NFSATTRBIT_TIMEMODIFYSET	54
 981#define	NFSATTRBIT_MOUNTEDONFILEID	55
 982#define	NFSATTRBIT_DIRNOTIFDELAY	56
 983#define	NFSATTRBIT_DIRENTNOTIFDELAY	57
 984#define	NFSATTRBIT_DACL			58
 985#define	NFSATTRBIT_SACL			59
 986#define	NFSATTRBIT_CHANGEPOLICY		60
 987#define	NFSATTRBIT_FSSTATUS		61
 988#define	NFSATTRBIT_FSLAYOUTTYPE		62
 989#define	NFSATTRBIT_LAYOUTHINT		63
 990#define	NFSATTRBIT_LAYOUTTYPE		64
 991#define	NFSATTRBIT_LAYOUTBLKSIZE	65
 992#define	NFSATTRBIT_LAYOUTALIGNMENT	66
 993#define	NFSATTRBIT_FSLOCATIONSINFO	67
 994#define	NFSATTRBIT_MDSTHRESHOLD		68
 995#define	NFSATTRBIT_RETENTIONGET		69
 996#define	NFSATTRBIT_RETENTIONSET		70
 997#define	NFSATTRBIT_RETENTEVTGET		71
 998#define	NFSATTRBIT_RETENTEVTSET		72
 999#define	NFSATTRBIT_RETENTIONHOLD	73
1000#define	NFSATTRBIT_MODESETMASKED	74
1001#define	NFSATTRBIT_SUPPATTREXCLCREAT	75
1002#define	NFSATTRBIT_FSCHARSETCAP		76
1003#define	NFSATTRBIT_CLONEBLKSIZE		77
1004#define	NFSATTRBIT_SPACEFREED		78
1005#define	NFSATTRBIT_CHANGEATTRTYPE	79
1006#define	NFSATTRBIT_SECLABEL		80
1007#define	NFSATTRBIT_MODEUMASK		81
1008#define	NFSATTRBIT_XATTRSUPPORT		82
1009
1010#define	NFSATTRBM_SUPPORTEDATTRS	0x00000001
1011#define	NFSATTRBM_TYPE			0x00000002
1012#define	NFSATTRBM_FHEXPIRETYPE		0x00000004
1013#define	NFSATTRBM_CHANGE		0x00000008
1014#define	NFSATTRBM_SIZE			0x00000010
1015#define	NFSATTRBM_LINKSUPPORT		0x00000020
1016#define	NFSATTRBM_SYMLINKSUPPORT	0x00000040
1017#define	NFSATTRBM_NAMEDATTR		0x00000080
1018#define	NFSATTRBM_FSID			0x00000100
1019#define	NFSATTRBM_UNIQUEHANDLES		0x00000200
1020#define	NFSATTRBM_LEASETIME		0x00000400
1021#define	NFSATTRBM_RDATTRERROR		0x00000800
1022#define	NFSATTRBM_ACL			0x00001000
1023#define	NFSATTRBM_ACLSUPPORT		0x00002000
1024#define	NFSATTRBM_ARCHIVE		0x00004000
1025#define	NFSATTRBM_CANSETTIME		0x00008000
1026#define	NFSATTRBM_CASEINSENSITIVE	0x00010000
1027#define	NFSATTRBM_CASEPRESERVING	0x00020000
1028#define	NFSATTRBM_CHOWNRESTRICTED	0x00040000
1029#define	NFSATTRBM_FILEHANDLE		0x00080000
1030#define	NFSATTRBM_FILEID		0x00100000
1031#define	NFSATTRBM_FILESAVAIL		0x00200000
1032#define	NFSATTRBM_FILESFREE		0x00400000
1033#define	NFSATTRBM_FILESTOTAL		0x00800000
1034#define	NFSATTRBM_FSLOCATIONS		0x01000000
1035#define	NFSATTRBM_HIDDEN		0x02000000
1036#define	NFSATTRBM_HOMOGENEOUS		0x04000000
1037#define	NFSATTRBM_MAXFILESIZE		0x08000000
1038#define	NFSATTRBM_MAXLINK		0x10000000
1039#define	NFSATTRBM_MAXNAME		0x20000000
1040#define	NFSATTRBM_MAXREAD		0x40000000
1041#define	NFSATTRBM_MAXWRITE		0x80000000
1042#define	NFSATTRBM_MIMETYPE		0x00000001
1043#define	NFSATTRBM_MODE			0x00000002
1044#define	NFSATTRBM_NOTRUNC		0x00000004
1045#define	NFSATTRBM_NUMLINKS		0x00000008
1046#define	NFSATTRBM_OWNER			0x00000010
1047#define	NFSATTRBM_OWNERGROUP		0x00000020
1048#define	NFSATTRBM_QUOTAHARD		0x00000040
1049#define	NFSATTRBM_QUOTASOFT		0x00000080
1050#define	NFSATTRBM_QUOTAUSED		0x00000100
1051#define	NFSATTRBM_RAWDEV		0x00000200
1052#define	NFSATTRBM_SPACEAVAIL		0x00000400
1053#define	NFSATTRBM_SPACEFREE		0x00000800
1054#define	NFSATTRBM_SPACETOTAL		0x00001000
1055#define	NFSATTRBM_SPACEUSED		0x00002000
1056#define	NFSATTRBM_SYSTEM		0x00004000
1057#define	NFSATTRBM_TIMEACCESS		0x00008000
1058#define	NFSATTRBM_TIMEACCESSSET		0x00010000
1059#define	NFSATTRBM_TIMEBACKUP		0x00020000
1060#define	NFSATTRBM_TIMECREATE		0x00040000
1061#define	NFSATTRBM_TIMEDELTA		0x00080000
1062#define	NFSATTRBM_TIMEMETADATA		0x00100000
1063#define	NFSATTRBM_TIMEMODIFY		0x00200000
1064#define	NFSATTRBM_TIMEMODIFYSET		0x00400000
1065#define	NFSATTRBM_MOUNTEDONFILEID	0x00800000
1066#define	NFSATTRBM_DIRNOTIFDELAY		0x01000000
1067#define	NFSATTRBM_DIRENTNOTIFDELAY	0x02000000
1068#define	NFSATTRBM_DACL			0x04000000
1069#define	NFSATTRBM_SACL			0x08000000
1070#define	NFSATTRBM_CHANGEPOLICY		0x10000000
1071#define	NFSATTRBM_FSSTATUS		0x20000000
1072#define	NFSATTRBM_FSLAYOUTTYPE		0x40000000
1073#define	NFSATTRBM_LAYOUTHINT		0x80000000
1074#define	NFSATTRBM_LAYOUTTYPE		0x00000001
1075#define	NFSATTRBM_LAYOUTBLKSIZE		0x00000002
1076#define	NFSATTRBM_LAYOUTALIGNMENT	0x00000004
1077#define	NFSATTRBM_FSLOCATIONSINFO	0x00000008
1078#define	NFSATTRBM_MDSTHRESHOLD		0x00000010
1079#define	NFSATTRBM_RETENTIONGET		0x00000020
1080#define	NFSATTRBM_RETENTIONSET		0x00000040
1081#define	NFSATTRBM_RETENTEVTGET		0x00000080
1082#define	NFSATTRBM_RETENTEVTSET		0x00000100
1083#define	NFSATTRBM_RETENTIONHOLD		0x00000200
1084#define	NFSATTRBM_MODESETMASKED		0x00000400
1085#define	NFSATTRBM_SUPPATTREXCLCREAT	0x00000800
1086#define	NFSATTRBM_FSCHARSETCAP		0x00001000
1087#define	NFSATTRBM_CLONEBLKSIZE		0x00002000
1088#define	NFSATTRBM_SPACEFREED		0x00004000
1089#define	NFSATTRBM_CHANGEATTRTYPE	0x00008000
1090#define	NFSATTRBM_SECLABEL		0x00010000
1091#define	NFSATTRBM_MODEUMASK		0x00020000
1092#define	NFSATTRBM_XATTRSUPPORT		0x00040000
1093
1094#define	NFSATTRBIT_MAX			83
1095
1096/*
1097 * Sets of attributes that are supported, by words in the bitmap.
1098 */
1099/*
1100 * NFSATTRBIT_SUPPORTED - SUPP0 - bits 0<->31
1101 *			  SUPP1 - bits 32<->63
1102 *			  SUPP2 - bits 64<->95
1103 */
1104#define	NFSATTRBIT_SUPP0						\
1105 	(NFSATTRBM_SUPPORTEDATTRS |					\
1106 	NFSATTRBM_TYPE |						\
1107 	NFSATTRBM_FHEXPIRETYPE |					\
1108 	NFSATTRBM_CHANGE |						\
1109 	NFSATTRBM_SIZE |						\
1110 	NFSATTRBM_LINKSUPPORT |						\
1111 	NFSATTRBM_SYMLINKSUPPORT |					\
1112 	NFSATTRBM_NAMEDATTR |						\
1113 	NFSATTRBM_FSID |						\
1114 	NFSATTRBM_UNIQUEHANDLES |					\
1115 	NFSATTRBM_LEASETIME |						\
1116 	NFSATTRBM_RDATTRERROR |						\
1117 	NFSATTRBM_ACL |							\
1118 	NFSATTRBM_ACLSUPPORT |						\
1119 	NFSATTRBM_CANSETTIME |						\
1120 	NFSATTRBM_CASEINSENSITIVE |					\
1121 	NFSATTRBM_CASEPRESERVING |					\
1122 	NFSATTRBM_CHOWNRESTRICTED |					\
1123 	NFSATTRBM_FILEHANDLE |						\
1124 	NFSATTRBM_FILEID |						\
1125 	NFSATTRBM_FILESAVAIL |						\
1126 	NFSATTRBM_FILESFREE |						\
1127 	NFSATTRBM_FILESTOTAL |						\
1128	NFSATTRBM_FSLOCATIONS |						\
1129 	NFSATTRBM_HOMOGENEOUS |						\
1130 	NFSATTRBM_MAXFILESIZE |						\
1131 	NFSATTRBM_MAXLINK |						\
1132 	NFSATTRBM_MAXNAME |						\
1133 	NFSATTRBM_MAXREAD |						\
1134 	NFSATTRBM_MAXWRITE)
1135
1136/*
1137 * NFSATTRBIT_S1 - subset of SUPP1 - OR of the following bits:
1138 */
1139#define	NFSATTRBIT_S1							\
1140 	(NFSATTRBM_MODE |						\
1141 	NFSATTRBM_NOTRUNC |						\
1142 	NFSATTRBM_NUMLINKS |						\
1143 	NFSATTRBM_OWNER |						\
1144 	NFSATTRBM_OWNERGROUP |						\
1145 	NFSATTRBM_RAWDEV |						\
1146 	NFSATTRBM_SPACEAVAIL |						\
1147 	NFSATTRBM_SPACEFREE |						\
1148 	NFSATTRBM_SPACETOTAL |						\
1149 	NFSATTRBM_SPACEUSED |						\
1150 	NFSATTRBM_TIMEACCESS |						\
1151 	NFSATTRBM_TIMECREATE |						\
1152 	NFSATTRBM_TIMEDELTA |						\
1153 	NFSATTRBM_TIMEMETADATA |					\
1154 	NFSATTRBM_TIMEMODIFY |						\
1155 	NFSATTRBM_MOUNTEDONFILEID |					\
1156	NFSATTRBM_QUOTAHARD |                        			\
1157    	NFSATTRBM_QUOTASOFT |                        			\
1158    	NFSATTRBM_QUOTAUSED |						\
1159	NFSATTRBM_FSLAYOUTTYPE)
1160
1161#ifdef QUOTA
1162/*
1163 * If QUOTA OR in NFSATTRBIT_QUOTAHARD, NFSATTRBIT_QUOTASOFT and
1164 * NFSATTRBIT_QUOTAUSED.
1165 */
1166#define	NFSATTRBIT_SUPP1	(NFSATTRBIT_S1 |			\
1167				NFSATTRBM_QUOTAHARD |			\
1168				NFSATTRBM_QUOTASOFT |			\
1169				NFSATTRBM_QUOTAUSED)
1170#else
1171#define	NFSATTRBIT_SUPP1	NFSATTRBIT_S1
1172#endif
1173
1174#define	NFSATTRBIT_SUPP2						\
1175	(NFSATTRBM_LAYOUTTYPE |						\
1176	NFSATTRBM_LAYOUTBLKSIZE |					\
1177	NFSATTRBM_LAYOUTALIGNMENT |					\
1178	NFSATTRBM_SUPPATTREXCLCREAT |					\
1179	NFSATTRBM_XATTRSUPPORT)
1180
1181/*
1182 * These are the set only attributes.
1183 */
1184#define	NFSATTRBIT_SUPPSETONLY1	 (NFSATTRBM_TIMEACCESSSET |		\
1185				 NFSATTRBM_TIMEMODIFYSET)
1186#define	NFSATTRBIT_SUPPSETONLY2	(NFSATTRBM_MODESETMASKED)
1187
1188/*
1189 * NFSATTRBIT_SETABLE - SETABLE0 - bits 0<->31
1190 *			SETABLE1 - bits 32<->63
1191 *			SETABLE2 - bits 64<->95
1192 */
1193#define	NFSATTRBIT_SETABLE0						\
1194	(NFSATTRBM_SIZE |						\
1195	NFSATTRBM_ACL)
1196#define	NFSATTRBIT_SETABLE1						\
1197 	(NFSATTRBM_MODE |						\
1198 	NFSATTRBM_OWNER |						\
1199 	NFSATTRBM_OWNERGROUP |						\
1200 	NFSATTRBM_TIMECREATE |					\
1201 	NFSATTRBM_TIMEACCESSSET |					\
1202 	NFSATTRBM_TIMEMODIFYSET)
1203#define	NFSATTRBIT_SETABLE2						\
1204	(NFSATTRBM_MODESETMASKED)
1205
1206/*
1207 * NFSATTRBIT_NFSV41 - Attributes only supported by NFSv4.1.
1208 */
1209#define	NFSATTRBIT_NFSV41_1						\
1210	(NFSATTRBM_FSLAYOUTTYPE)
1211#define	NFSATTRBIT_NFSV41_2						\
1212	(NFSATTRBM_LAYOUTTYPE |						\
1213	NFSATTRBM_LAYOUTBLKSIZE |					\
1214	NFSATTRBM_LAYOUTALIGNMENT |					\
1215	NFSATTRBM_MODESETMASKED |					\
1216	NFSATTRBM_SUPPATTREXCLCREAT)
1217
1218/*
1219 * NFSATTRBIT_NFSV42 - Attributes only supported by NFSv4.2.
1220 */
1221#define	NFSATTRBIT_NFSV42_2	NFSATTRBM_XATTRSUPPORT
1222
1223/*
1224 * Set of attributes that the getattr vnode op needs.
1225 * OR of the following bits.
1226 * NFSATTRBIT_GETATTR0 - bits 0<->31
1227 */
1228#define	NFSATTRBIT_GETATTR0						\
1229 	(NFSATTRBM_SUPPORTEDATTRS |					\
1230 	NFSATTRBM_TYPE |						\
1231 	NFSATTRBM_CHANGE |						\
1232 	NFSATTRBM_SIZE |						\
1233 	NFSATTRBM_FSID |						\
1234 	NFSATTRBM_FILEID |						\
1235 	NFSATTRBM_MAXREAD)
1236
1237/*
1238 * NFSATTRBIT_GETATTR1 - bits 32<->63
1239 */
1240#define	NFSATTRBIT_GETATTR1						\
1241 	(NFSATTRBM_MODE |						\
1242 	NFSATTRBM_NUMLINKS |						\
1243 	NFSATTRBM_OWNER |						\
1244 	NFSATTRBM_OWNERGROUP |						\
1245 	NFSATTRBM_RAWDEV |						\
1246 	NFSATTRBM_SPACEUSED |						\
1247 	NFSATTRBM_TIMEACCESS |						\
1248	NFSATTRBM_TIMECREATE |						\
1249 	NFSATTRBM_TIMEMETADATA |					\
1250 	NFSATTRBM_TIMEMODIFY)
1251
1252/*
1253 * NFSATTRBIT_GETATTR2 - bits 64<->95
1254 */
1255#define	NFSATTRBIT_GETATTR2		0
1256
1257/*
1258 * Subset of the above that the Write RPC gets.
1259 * OR of the following bits.
1260 * NFSATTRBIT_WRITEGETATTR0 - bits 0<->31
1261 */
1262#define	NFSATTRBIT_WRITEGETATTR0					\
1263 	(NFSATTRBM_SUPPORTEDATTRS |					\
1264 	NFSATTRBM_TYPE |						\
1265 	NFSATTRBM_CHANGE |						\
1266 	NFSATTRBM_SIZE |						\
1267 	NFSATTRBM_FSID |						\
1268 	NFSATTRBM_FILEID |						\
1269 	NFSATTRBM_MAXREAD)
1270
1271/*
1272 * NFSATTRBIT_WRITEGETATTR1 - bits 32<->63
1273 */
1274#define	NFSATTRBIT_WRITEGETATTR1					\
1275 	(NFSATTRBM_MODE |						\
1276 	NFSATTRBM_NUMLINKS |						\
1277 	NFSATTRBM_RAWDEV |						\
1278 	NFSATTRBM_SPACEUSED |						\
1279 	NFSATTRBM_TIMEACCESS |						\
1280	NFSATTRBM_TIMECREATE |						\
1281 	NFSATTRBM_TIMEMETADATA |					\
1282 	NFSATTRBM_TIMEMODIFY)
1283
1284/*
1285 * NFSATTRBIT_WRITEGETATTR2 - bits 64<->95
1286 */
1287#define	NFSATTRBIT_WRITEGETATTR2	0
1288
1289/*
1290 * Set of attributes that the wccattr operation op needs.
1291 * OR of the following bits.
1292 * NFSATTRBIT_WCCATTR0 - bits 0<->31
1293 */
1294#define	NFSATTRBIT_WCCATTR0	0
1295
1296/*
1297 * NFSATTRBIT_WCCATTR1 - bits 32<->63
1298 */
1299#define	NFSATTRBIT_WCCATTR1						\
1300 	(NFSATTRBM_TIMEMODIFY)
1301
1302/*
1303 * NFSATTRBIT_WCCATTR2 - bits 64<->95
1304 */
1305#define	NFSATTRBIT_WCCATTR2		0
1306
1307/*
1308 * NFSATTRBIT_CBGETATTR0 - bits 0<->31
1309 */
1310#define	NFSATTRBIT_CBGETATTR0	(NFSATTRBM_CHANGE | NFSATTRBM_SIZE)
1311
1312/*
1313 * NFSATTRBIT_CBGETATTR1 - bits 32<->63
1314 */
1315#define	NFSATTRBIT_CBGETATTR1		0x0
1316
1317/*
1318 * NFSATTRBIT_CBGETATTR2 - bits 64<->95
1319 */
1320#define	NFSATTRBIT_CBGETATTR2		0x0
1321
1322/*
1323 * Sets of attributes that require a VFS_STATFS() call to get the
1324 * values of.
1325 * NFSATTRBIT_STATFS0 - bits 0<->31
1326 */
1327#define	NFSATTRBIT_STATFS0						\
1328	(NFSATTRBM_LINKSUPPORT |					\
1329	NFSATTRBM_SYMLINKSUPPORT |					\
1330	NFSATTRBM_CANSETTIME |						\
1331 	NFSATTRBM_FILESAVAIL |						\
1332 	NFSATTRBM_FILESFREE |						\
1333 	NFSATTRBM_FILESTOTAL |						\
1334 	NFSATTRBM_HOMOGENEOUS |						\
1335 	NFSATTRBM_MAXFILESIZE |						\
1336	NFSATTRBM_MAXNAME |						\
1337	NFSATTRBM_MAXREAD |						\
1338	NFSATTRBM_MAXWRITE)
1339
1340/*
1341 * NFSATTRBIT_STATFS1 - bits 32<->63
1342 */
1343#define	NFSATTRBIT_STATFS1						\
1344 	(NFSATTRBM_QUOTAHARD |						\
1345 	NFSATTRBM_QUOTASOFT |						\
1346 	NFSATTRBM_QUOTAUSED |						\
1347 	NFSATTRBM_SPACEAVAIL |						\
1348 	NFSATTRBM_SPACEFREE |						\
1349 	NFSATTRBM_SPACETOTAL |						\
1350 	NFSATTRBM_SPACEUSED |						\
1351	NFSATTRBM_TIMEDELTA)
1352
1353/*
1354 * NFSATTRBIT_STATFS2 - bits 64<->95
1355 */
1356#define	NFSATTRBIT_STATFS2		0
1357
1358/*
1359 * These are the bits that are needed by the nfs_statfs() call.
1360 * (The regular getattr bits are or'd in so the vnode gets the correct
1361 *  type, etc.)
1362 * NFSGETATTRBIT_STATFS0 - bits 0<->31
1363 */
1364#define	NFSGETATTRBIT_STATFS0	(NFSATTRBIT_GETATTR0 |			\
1365				NFSATTRBM_LINKSUPPORT |			\
1366				NFSATTRBM_SYMLINKSUPPORT |		\
1367				NFSATTRBM_CANSETTIME |			\
1368				NFSATTRBM_FILESFREE |			\
1369				NFSATTRBM_FILESTOTAL |			\
1370				NFSATTRBM_HOMOGENEOUS |			\
1371				NFSATTRBM_MAXFILESIZE |			\
1372				NFSATTRBM_MAXNAME |			\
1373				NFSATTRBM_MAXREAD |			\
1374				NFSATTRBM_MAXWRITE)
1375
1376/*
1377 * NFSGETATTRBIT_STATFS1 - bits 32<->63
1378 */
1379#define	NFSGETATTRBIT_STATFS1	(NFSATTRBIT_GETATTR1 |			\
1380				NFSATTRBM_SPACEAVAIL |			\
1381				NFSATTRBM_SPACEFREE |			\
1382				NFSATTRBM_SPACETOTAL |			\
1383				NFSATTRBM_TIMEDELTA)
1384
1385/*
1386 * NFSGETATTRBIT_STATFS2 - bits 64<->95
1387 */
1388#define	NFSGETATTRBIT_STATFS2		0
1389
1390/*
1391 * Set of attributes for the equivalent of an nfsv3 pathconf rpc.
1392 * NFSGETATTRBIT_PATHCONF0 - bits 0<->31
1393 */
1394#define	NFSGETATTRBIT_PATHCONF0	(NFSATTRBIT_GETATTR0 |			\
1395			 	NFSATTRBM_CASEINSENSITIVE |		\
1396			 	NFSATTRBM_CASEPRESERVING |		\
1397			 	NFSATTRBM_CHOWNRESTRICTED |		\
1398			 	NFSATTRBM_MAXLINK |			\
1399			 	NFSATTRBM_MAXNAME)
1400
1401/*
1402 * NFSGETATTRBIT_PATHCONF1 - bits 32<->63
1403 */
1404#define	NFSGETATTRBIT_PATHCONF1	(NFSATTRBIT_GETATTR1 |			\
1405				NFSATTRBM_NOTRUNC)
1406
1407/*
1408 * NFSGETATTRBIT_PATHCONF2 - bits 64<->95
1409 */
1410#define	NFSGETATTRBIT_PATHCONF2		0
1411
1412/*
1413 * Sets of attributes required by readdir and readdirplus.
1414 * NFSATTRBIT_READDIRPLUS0	(NFSATTRBIT_GETATTR0 | NFSATTRBIT_FILEHANDLE |
1415 *				 NFSATTRBIT_RDATTRERROR)
1416 */
1417#define	NFSATTRBIT_READDIRPLUS0	(NFSATTRBIT_GETATTR0 | NFSATTRBM_FILEHANDLE | \
1418				NFSATTRBM_RDATTRERROR)
1419#define	NFSATTRBIT_READDIRPLUS1	NFSATTRBIT_GETATTR1
1420#define	NFSATTRBIT_READDIRPLUS2		0
1421
1422/*
1423 * Set of attributes supported by Referral vnodes.
1424 */
1425#define	NFSATTRBIT_REFERRAL0	(NFSATTRBM_TYPE | NFSATTRBM_FSID |	\
1426	NFSATTRBM_RDATTRERROR | NFSATTRBM_FSLOCATIONS)
1427#define	NFSATTRBIT_REFERRAL1	NFSATTRBM_MOUNTEDONFILEID
1428#define	NFSATTRBIT_REFERRAL2		0
1429
1430/* Bits for the operations bitmaps. */
1431#define	NFSV4OPBM_ACCESS		0x00000008
1432#define	NFSV4OPBM_CLOSE			0x00000010
1433#define	NFSV4OPBM_COMMIT		0x00000020
1434#define	NFSV4OPBM_CREATE		0x00000040
1435#define	NFSV4OPBM_DELEGPURGE		0x00000080
1436#define	NFSV4OPBM_DELEGRETURN		0x00000100
1437#define	NFSV4OPBM_GETATTR		0x00000200
1438#define	NFSV4OPBM_GETFH			0x00000400
1439#define	NFSV4OPBM_LINK			0x00000800
1440#define	NFSV4OPBM_LOCK			0x00001000
1441#define	NFSV4OPBM_LOCKT			0x00002000
1442#define	NFSV4OPBM_LOCKU			0x00004000
1443#define	NFSV4OPBM_LOOKUP		0x00008000
1444#define	NFSV4OPBM_LOOKUPP		0x00010000
1445#define	NFSV4OPBM_NVERIFY		0x00020000
1446#define	NFSV4OPBM_OPEN			0x00040000
1447#define	NFSV4OPBM_OPENATTR		0x00080000
1448#define	NFSV4OPBM_OPENCONFIRM		0x00100000
1449#define	NFSV4OPBM_OPENDOWNGRADE		0x00200000
1450#define	NFSV4OPBM_PUTFH			0x00400000
1451#define	NFSV4OPBM_PUTPUBFH		0x00800000
1452#define	NFSV4OPBM_PUTROOTFH		0x01000000
1453#define	NFSV4OPBM_READ			0x02000000
1454#define	NFSV4OPBM_READDIR		0x04000000
1455#define	NFSV4OPBM_READLINK		0x08000000
1456#define	NFSV4OPBM_REMOVE		0x10000000
1457#define	NFSV4OPBM_RENAME		0x20000000
1458#define	NFSV4OPBM_RENEW			0x40000000
1459#define	NFSV4OPBM_RESTOREFH		0x80000000
1460#define	NFSV4OPBM_SAVEFH		0x00000001
1461#define	NFSV4OPBM_SECINFO		0x00000002
1462#define	NFSV4OPBM_SETATTR		0x00000004
1463#define	NFSV4OPBM_SETCLIENTID		0x00000008
1464#define	NFSV4OPBM_SETCLIENTIDCFRM	0x00000010
1465#define	NFSV4OPBM_VERIFY		0x00000020
1466#define	NFSV4OPBM_WRITE			0x00000040
1467#define	NFSV4OPBM_RELEASELCKOWN		0x00000080
1468#define	NFSV4OPBM_BACKCHANNELCTL	0x00000100
1469#define	NFSV4OPBM_BINDCONNTOSESS	0x00000200
1470#define	NFSV4OPBM_EXCHANGEID		0x00000400
1471#define	NFSV4OPBM_CREATESESSION		0x00000800
1472#define	NFSV4OPBM_DESTROYSESSION	0x00001000
1473#define	NFSV4OPBM_FREESTATEID		0x00002000
1474#define	NFSV4OPBM_GETDIRDELEG		0x00004000
1475#define	NFSV4OPBM_GETDEVINFO		0x00008000
1476#define	NFSV4OPBM_GETDEVLIST		0x00010000
1477#define	NFSV4OPBM_LAYOUTCOMMIT		0x00020000
1478#define	NFSV4OPBM_LAYOUTGET		0x00040000
1479#define	NFSV4OPBM_LAYOUTRETURN		0x00080000
1480#define	NFSV4OPBM_SECINFONONAME		0x00100000
1481#define	NFSV4OPBM_SEQUENCE		0x00200000
1482#define	NFSV4OPBM_SETSSV		0x00400000
1483#define	NFSV4OPBM_TESTSTATEID		0x00800000
1484#define	NFSV4OPBM_WANTDELEG		0x01000000
1485#define	NFSV4OPBM_DESTROYCLIENTID	0x02000000
1486#define	NFSV4OPBM_RECLAIMCOMPL		0x04000000
1487#define	NFSV4OPBM_ALLOCATE		0x08000000
1488#define	NFSV4OPBM_COPY			0x10000000
1489#define	NFSV4OPBM_COPYNOTIFY		0x20000000
1490#define	NFSV4OPBM_DEALLOCATE		0x40000000
1491#define	NFSV4OPBM_IOADVISE		0x80000000
1492#define	NFSV4OPBM_LAYOUTERROR		0x00000001
1493#define	NFSV4OPBM_LAYOUTSTATS		0x00000002
1494#define	NFSV4OPBM_OFFLOADCANCEL		0x00000004
1495#define	NFSV4OPBM_OFFLOADSTATUS		0x00000008
1496#define	NFSV4OPBM_READPLUS		0x00000010
1497#define	NFSV4OPBM_SEEK			0x00000020
1498#define	NFSV4OPBM_WRITESAME		0x00000040
1499#define	NFSV4OPBM_CLONE			0x00000080
1500#define	NFSV4OPBM_GETXATTR		0x00000100
1501#define	NFSV4OPBM_SETXATTR		0x00000200
1502#define	NFSV4OPBM_LISTXATTRS		0x00000400
1503#define	NFSV4OPBM_REMOVEXATTR		0x00000800
1504
1505/*
1506 * The set of must and allow operations for SP4_MACH_CRED.  These are
1507 * the operations requested by the Linux NFSv4.1/4.2 client.
1508 * The must list is also the same ones listed in the RFC.
1509 */
1510#define	NFSOPBIT_MUST0	NFSV4OP_DELEGPURGE
1511
1512#define	NFSOPBIT_MUST1							\
1513	(NFSV4OPBM_BINDCONNTOSESS |					\
1514	NFSV4OPBM_EXCHANGEID |						\
1515	NFSV4OPBM_CREATESESSION |					\
1516	NFSV4OPBM_DESTROYSESSION |					\
1517	NFSV4OPBM_DESTROYCLIENTID)
1518
1519#define	NFSOPBIT_MUST2		0x0
1520
1521#define	NFSOPBIT_CLRNOTMUST(b) do {					\
1522	(b)->bits[0] &= NFSOPBIT_MUST0;					\
1523	(b)->bits[1] &= NFSOPBIT_MUST1;					\
1524	(b)->bits[2] &= NFSOPBIT_MUST2;					\
1525    } while (0)
1526
1527#define	NFSOPBIT_ALLOWED0						\
1528	(NFSV4OPBM_CLOSE |						\
1529	NFSV4OPBM_COMMIT |						\
1530	NFSV4OPBM_DELEGRETURN |						\
1531	NFSV4OPBM_LOCKU |						\
1532	NFSV4OPBM_OPENDOWNGRADE)
1533
1534#define	NFSOPBIT_ALLOWED1						\
1535	(NFSV4OPBM_SECINFO |						\
1536	NFSV4OPBM_WRITE |						\
1537	NFSV4OPBM_FREESTATEID |						\
1538	NFSV4OPBM_LAYOUTRETURN |					\
1539	NFSV4OPBM_SECINFONONAME |					\
1540	NFSV4OPBM_TESTSTATEID)
1541
1542#define	NFSOPBIT_ALLOWED2	0x0
1543
1544#define	NFSOPBIT_CLRNOTALLOWED(b) do {					\
1545	(b)->bits[0] &= NFSOPBIT_ALLOWED0;				\
1546	(b)->bits[1] &= NFSOPBIT_ALLOWED1;				\
1547	(b)->bits[2] &= NFSOPBIT_ALLOWED2;				\
1548    } while (0)
1549
1550/*
1551 * Structure for data handled by the statfs rpc. Since some fields are
1552 * u_int64_t, this cannot be used for copying data on/off the wire, due
1553 * to alignment concerns.
1554 */
1555struct nfsstatfs {
1556	union {
1557		struct {
1558			u_int32_t nfsv2sf_tsize;
1559			u_int32_t nfsv2sf_bsize;
1560			u_int32_t nfsv2sf_blocks;
1561			u_int32_t nfsv2sf_bfree;
1562			u_int32_t nfsv2sf_bavail;
1563		} sf_nfsv2;
1564		struct {
1565			u_int64_t nfsv3sf_tbytes;
1566			u_int64_t nfsv3sf_fbytes;
1567			u_int64_t nfsv3sf_abytes;
1568			u_int64_t nfsv3sf_tfiles;
1569			u_int64_t nfsv3sf_ffiles;
1570			u_int64_t nfsv3sf_afiles;
1571			u_int32_t nfsv3sf_invarsec;
1572		} sf_nfsv3;
1573	} sf_un;
1574};
1575
1576#define	sf_tsize	sf_un.sf_nfsv2.nfsv2sf_tsize
1577#define	sf_bsize	sf_un.sf_nfsv2.nfsv2sf_bsize
1578#define	sf_blocks	sf_un.sf_nfsv2.nfsv2sf_blocks
1579#define	sf_bfree	sf_un.sf_nfsv2.nfsv2sf_bfree
1580#define	sf_bavail	sf_un.sf_nfsv2.nfsv2sf_bavail
1581#define	sf_tbytes	sf_un.sf_nfsv3.nfsv3sf_tbytes
1582#define	sf_fbytes	sf_un.sf_nfsv3.nfsv3sf_fbytes
1583#define	sf_abytes	sf_un.sf_nfsv3.nfsv3sf_abytes
1584#define	sf_tfiles	sf_un.sf_nfsv3.nfsv3sf_tfiles
1585#define	sf_ffiles	sf_un.sf_nfsv3.nfsv3sf_ffiles
1586#define	sf_afiles	sf_un.sf_nfsv3.nfsv3sf_afiles
1587#define	sf_invarsec	sf_un.sf_nfsv3.nfsv3sf_invarsec
1588
1589/*
1590 * Now defined using u_int64_t for the 64 bit field(s).
1591 * (Cannot be used to move data on/off the wire, due to alignment concerns.)
1592 */
1593struct nfsfsinfo {
1594	u_int32_t fs_rtmax;
1595	u_int32_t fs_rtpref;
1596	u_int32_t fs_rtmult;
1597	u_int32_t fs_wtmax;
1598	u_int32_t fs_wtpref;
1599	u_int32_t fs_wtmult;
1600	u_int32_t fs_dtpref;
1601	u_int64_t fs_maxfilesize;
1602	struct timespec fs_timedelta;
1603	u_int32_t fs_properties;
1604};
1605
1606/*
1607 * Bits for fs_properties
1608 */
1609#define	NFSV3_FSFLINK		0x1
1610#define	NFSV3_FSFSYMLINK	0x2
1611#define	NFSV3_FSFHOMOGENEOUS	0x4
1612#define	NFSV3_FSFCANSETTIME	0x8
1613
1614/*
1615 * Yikes, overload fs_rtmult as fs_maxname for V4.
1616 */
1617#define	fs_maxname	fs_rtmult
1618
1619struct nfsv3_pathconf {
1620	u_int32_t pc_linkmax;
1621	u_int32_t pc_namemax;
1622	u_int32_t pc_notrunc;
1623	u_int32_t pc_chownrestricted;
1624	u_int32_t pc_caseinsensitive;
1625	u_int32_t pc_casepreserving;
1626};
1627
1628/*
1629 * NFS V4 data structures.
1630 */
1631struct nfsv4stateid {
1632	u_int32_t	seqid;
1633	u_int32_t	other[NFSX_STATEIDOTHER / NFSX_UNSIGNED];
1634};
1635typedef struct nfsv4stateid nfsv4stateid_t;
1636
1637/* Notify bits and notify bitmap size. */
1638#define	NFSV4NOTIFY_CHANGE	1
1639#define	NFSV4NOTIFY_DELETE	2
1640#define	NFSV4_NOTIFYBITMAP	1	/* # of 32bit values needed for bits */
1641
1642/* Layoutreturn kinds. */
1643#define	NFSV4LAYOUTRET_FILE	1
1644#define	NFSV4LAYOUTRET_FSID	2
1645#define	NFSV4LAYOUTRET_ALL	3
1646
1647/* Seek Contents. */
1648#define	NFSV4CONTENT_DATA	0
1649#define	NFSV4CONTENT_HOLE	1
1650
1651/* Options for Set Extended attribute (RFC-8276). */
1652#define	NFSV4SXATTR_EITHER	0
1653#define	NFSV4SXATTR_CREATE	1
1654#define	NFSV4SXATTR_REPLACE	2
1655
1656#endif	/* _NFS_NFSPROTO_H_ */