xref: /linux/include/linux/nfs4.h (revision 7f7dde9a45dfd9b3c9f35cb24aff9e45669071cc)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *  include/linux/nfs4.h
4  *
5  *  NFSv4 protocol definitions.
6  *
7  *  Copyright (c) 2002 The Regents of the University of Michigan.
8  *  All rights reserved.
9  *
10  *  Kendrick Smith <kmsmith@umich.edu>
11  *  Andy Adamson   <andros@umich.edu>
12  */
13 #ifndef _LINUX_NFS4_H
14 #define _LINUX_NFS4_H
15 
16 #include <linux/list.h>
17 #include <linux/uidgid.h>
18 #include <uapi/linux/nfs4.h>
19 #include <linux/sunrpc/msg_prot.h>
20 #include <linux/sunrpc/xdrgen/nfs4_1.h>
21 
22 enum nfs4_acl_whotype {
23 	NFS4_ACL_WHO_NAMED = 0,
24 	NFS4_ACL_WHO_OWNER,
25 	NFS4_ACL_WHO_GROUP,
26 	NFS4_ACL_WHO_EVERYONE,
27 };
28 
29 struct nfs4_ace {
30 	uint32_t	type;
31 	uint32_t	flag;
32 	uint32_t	access_mask;
33 	int		whotype;
34 	union {
35 		kuid_t	who_uid;
36 		kgid_t	who_gid;
37 	};
38 };
39 
40 struct nfs4_acl {
41 	uint32_t	naces;
42 	struct nfs4_ace	aces[];
43 };
44 
45 #define NFS4_MAXLABELLEN	2048
46 
47 struct nfs4_label {
48 	uint32_t	lfs;
49 	uint32_t	pi;
50 	u32		lsmid;
51 	u32		len;
52 	char	*label;
53 };
54 
55 typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier;
56 
57 struct nfs4_stateid_struct {
58 	union {
59 		char data[NFS4_STATEID_SIZE];
60 		struct {
61 			__be32 seqid;
62 			char other[NFS4_STATEID_OTHER_SIZE];
63 		} __attribute__ ((packed));
64 	};
65 
66 	enum {
67 		NFS4_INVALID_STATEID_TYPE = 0,
68 		NFS4_SPECIAL_STATEID_TYPE,
69 		NFS4_OPEN_STATEID_TYPE,
70 		NFS4_LOCK_STATEID_TYPE,
71 		NFS4_DELEGATION_STATEID_TYPE,
72 		NFS4_LAYOUT_STATEID_TYPE,
73 		NFS4_PNFS_DS_STATEID_TYPE,
74 		NFS4_REVOKED_STATEID_TYPE,
75 		NFS4_FREED_STATEID_TYPE,
76 	} type;
77 };
78 
79 typedef struct nfs4_stateid_struct nfs4_stateid;
80 
81 enum nfs_opnum4 {
82 	OP_ACCESS = 3,
83 	OP_CLOSE = 4,
84 	OP_COMMIT = 5,
85 	OP_CREATE = 6,
86 	OP_DELEGPURGE = 7,
87 	OP_DELEGRETURN = 8,
88 	OP_GETATTR = 9,
89 	OP_GETFH = 10,
90 	OP_LINK = 11,
91 	OP_LOCK = 12,
92 	OP_LOCKT = 13,
93 	OP_LOCKU = 14,
94 	OP_LOOKUP = 15,
95 	OP_LOOKUPP = 16,
96 	OP_NVERIFY = 17,
97 	OP_OPEN = 18,
98 	OP_OPENATTR = 19,
99 	OP_OPEN_CONFIRM = 20,
100 	OP_OPEN_DOWNGRADE = 21,
101 	OP_PUTFH = 22,
102 	OP_PUTPUBFH = 23,
103 	OP_PUTROOTFH = 24,
104 	OP_READ = 25,
105 	OP_READDIR = 26,
106 	OP_READLINK = 27,
107 	OP_REMOVE = 28,
108 	OP_RENAME = 29,
109 	OP_RENEW = 30,
110 	OP_RESTOREFH = 31,
111 	OP_SAVEFH = 32,
112 	OP_SECINFO = 33,
113 	OP_SETATTR = 34,
114 	OP_SETCLIENTID = 35,
115 	OP_SETCLIENTID_CONFIRM = 36,
116 	OP_VERIFY = 37,
117 	OP_WRITE = 38,
118 	OP_RELEASE_LOCKOWNER = 39,
119 
120 	/* nfs41 */
121 	OP_BACKCHANNEL_CTL = 40,
122 	OP_BIND_CONN_TO_SESSION = 41,
123 	OP_EXCHANGE_ID = 42,
124 	OP_CREATE_SESSION = 43,
125 	OP_DESTROY_SESSION = 44,
126 	OP_FREE_STATEID = 45,
127 	OP_GET_DIR_DELEGATION = 46,
128 	OP_GETDEVICEINFO = 47,
129 	OP_GETDEVICELIST = 48,
130 	OP_LAYOUTCOMMIT = 49,
131 	OP_LAYOUTGET = 50,
132 	OP_LAYOUTRETURN = 51,
133 	OP_SECINFO_NO_NAME = 52,
134 	OP_SEQUENCE = 53,
135 	OP_SET_SSV = 54,
136 	OP_TEST_STATEID = 55,
137 	OP_WANT_DELEGATION = 56,
138 	OP_DESTROY_CLIENTID = 57,
139 	OP_RECLAIM_COMPLETE = 58,
140 
141 	/* nfs42 */
142 	OP_ALLOCATE = 59,
143 	OP_COPY = 60,
144 	OP_COPY_NOTIFY = 61,
145 	OP_DEALLOCATE = 62,
146 	OP_IO_ADVISE = 63,
147 	OP_LAYOUTERROR = 64,
148 	OP_LAYOUTSTATS = 65,
149 	OP_OFFLOAD_CANCEL = 66,
150 	OP_OFFLOAD_STATUS = 67,
151 	OP_READ_PLUS = 68,
152 	OP_SEEK = 69,
153 	OP_WRITE_SAME = 70,
154 	OP_CLONE = 71,
155 
156 	/* xattr support (RFC8276) */
157 	OP_GETXATTR                = 72,
158 	OP_SETXATTR                = 73,
159 	OP_LISTXATTRS              = 74,
160 	OP_REMOVEXATTR             = 75,
161 
162 	OP_ILLEGAL = 10044,
163 };
164 
165 /*Defining first and last NFS4 operations implemented.
166 Needs to be updated if more operations are defined in future.*/
167 
168 #define FIRST_NFS4_OP	OP_ACCESS
169 #define LAST_NFS40_OP	OP_RELEASE_LOCKOWNER
170 #define LAST_NFS41_OP	OP_RECLAIM_COMPLETE
171 #define LAST_NFS42_OP	OP_REMOVEXATTR
172 #define LAST_NFS4_OP	LAST_NFS42_OP
173 
174 /* error codes for internal client use */
175 #define NFS4ERR_RESET_TO_MDS   12001
176 #define NFS4ERR_RESET_TO_PNFS  12002
177 #define NFS4ERR_FATAL_IOERROR  12003
178 
179 static inline bool seqid_mutating_err(u32 err)
180 {
181 	/* See RFC 7530, section 9.1.7 */
182 	switch (err) {
183 	case NFS4ERR_STALE_CLIENTID:
184 	case NFS4ERR_STALE_STATEID:
185 	case NFS4ERR_BAD_STATEID:
186 	case NFS4ERR_BAD_SEQID:
187 	case NFS4ERR_BADXDR:
188 	case NFS4ERR_RESOURCE:
189 	case NFS4ERR_NOFILEHANDLE:
190 	case NFS4ERR_MOVED:
191 		return false;
192 	}
193 	return true;
194 }
195 
196 /*
197  * Note: NF4BAD is not actually part of the protocol; it is just used
198  * internally by nfsd.
199  */
200 enum nfs_ftype4 {
201 	NF4BAD		= 0,
202         NF4REG          = 1,    /* Regular File */
203         NF4DIR          = 2,    /* Directory */
204         NF4BLK          = 3,    /* Special File - block device */
205         NF4CHR          = 4,    /* Special File - character device */
206         NF4LNK          = 5,    /* Symbolic Link */
207         NF4SOCK         = 6,    /* Special File - socket */
208         NF4FIFO         = 7,    /* Special File - fifo */
209         NF4ATTRDIR      = 8,    /* Attribute Directory */
210         NF4NAMEDATTR    = 9     /* Named Attribute */
211 };
212 
213 enum open_claim_type4 {
214 	NFS4_OPEN_CLAIM_NULL = 0,
215 	NFS4_OPEN_CLAIM_PREVIOUS = 1,
216 	NFS4_OPEN_CLAIM_DELEGATE_CUR = 2,
217 	NFS4_OPEN_CLAIM_DELEGATE_PREV = 3,
218 	NFS4_OPEN_CLAIM_FH = 4, /* 4.1 */
219 	NFS4_OPEN_CLAIM_DELEG_CUR_FH = 5, /* 4.1 */
220 	NFS4_OPEN_CLAIM_DELEG_PREV_FH = 6, /* 4.1 */
221 };
222 
223 enum opentype4 {
224 	NFS4_OPEN_NOCREATE = 0,
225 	NFS4_OPEN_CREATE = 1
226 };
227 
228 enum createmode4 {
229 	NFS4_CREATE_UNCHECKED = 0,
230 	NFS4_CREATE_GUARDED = 1,
231 	NFS4_CREATE_EXCLUSIVE = 2,
232 	/*
233 	 * New to NFSv4.1. If session is persistent,
234 	 * GUARDED4 MUST be used. Otherwise, use
235 	 * EXCLUSIVE4_1 instead of EXCLUSIVE4.
236 	 */
237 	NFS4_CREATE_EXCLUSIVE4_1 = 3
238 };
239 
240 enum limit_by4 {
241 	NFS4_LIMIT_SIZE = 1,
242 	NFS4_LIMIT_BLOCKS = 2
243 };
244 
245 enum nfs4_open_delegation_type4 {
246 	NFS4_OPEN_DELEGATE_NONE = 0,
247 	NFS4_OPEN_DELEGATE_READ = 1,
248 	NFS4_OPEN_DELEGATE_WRITE = 2,
249 	NFS4_OPEN_DELEGATE_NONE_EXT = 3, /* 4.1 */
250 	NFS4_OPEN_DELEGATE_READ_ATTRS_DELEG = 4,
251 	NFS4_OPEN_DELEGATE_WRITE_ATTRS_DELEG = 5,
252 };
253 
254 enum why_no_delegation4 { /* new to v4.1 */
255 	WND4_NOT_WANTED = 0,
256 	WND4_CONTENTION = 1,
257 	WND4_RESOURCE = 2,
258 	WND4_NOT_SUPP_FTYPE = 3,
259 	WND4_WRITE_DELEG_NOT_SUPP_FTYPE = 4,
260 	WND4_NOT_SUPP_UPGRADE = 5,
261 	WND4_NOT_SUPP_DOWNGRADE = 6,
262 	WND4_CANCELLED = 7,
263 	WND4_IS_DIR = 8,
264 };
265 
266 enum stable_how4 {
267 	UNSTABLE4	= 0,
268 	DATA_SYNC4	= 1,
269 	FILE_SYNC4	= 2,
270 };
271 
272 enum lock_type4 {
273 	NFS4_UNLOCK_LT = 0,
274 	NFS4_READ_LT = 1,
275 	NFS4_WRITE_LT = 2,
276 	NFS4_READW_LT = 3,
277 	NFS4_WRITEW_LT = 4
278 };
279 
280 /*
281  * Symbol names and values are from RFC 7531 Section 2.
282  * "XDR Description of NFSv4.0"
283  */
284 enum {
285 	FATTR4_SUPPORTED_ATTRS		= 0,
286 	FATTR4_TYPE			= 1,
287 	FATTR4_FH_EXPIRE_TYPE		= 2,
288 	FATTR4_CHANGE			= 3,
289 	FATTR4_SIZE			= 4,
290 	FATTR4_LINK_SUPPORT		= 5,
291 	FATTR4_SYMLINK_SUPPORT		= 6,
292 	FATTR4_NAMED_ATTR		= 7,
293 	FATTR4_FSID			= 8,
294 	FATTR4_UNIQUE_HANDLES		= 9,
295 	FATTR4_LEASE_TIME		= 10,
296 	FATTR4_RDATTR_ERROR		= 11,
297 	FATTR4_ACL			= 12,
298 	FATTR4_ACLSUPPORT		= 13,
299 	FATTR4_ARCHIVE			= 14,
300 	FATTR4_CANSETTIME		= 15,
301 	FATTR4_CASE_INSENSITIVE		= 16,
302 	FATTR4_CASE_PRESERVING		= 17,
303 	FATTR4_CHOWN_RESTRICTED		= 18,
304 	FATTR4_FILEHANDLE		= 19,
305 	FATTR4_FILEID			= 20,
306 	FATTR4_FILES_AVAIL		= 21,
307 	FATTR4_FILES_FREE		= 22,
308 	FATTR4_FILES_TOTAL		= 23,
309 	FATTR4_FS_LOCATIONS		= 24,
310 	FATTR4_HIDDEN			= 25,
311 	FATTR4_HOMOGENEOUS		= 26,
312 	FATTR4_MAXFILESIZE		= 27,
313 	FATTR4_MAXLINK			= 28,
314 	FATTR4_MAXNAME			= 29,
315 	FATTR4_MAXREAD			= 30,
316 	FATTR4_MAXWRITE			= 31,
317 	FATTR4_MIMETYPE			= 32,
318 	FATTR4_MODE			= 33,
319 	FATTR4_NO_TRUNC			= 34,
320 	FATTR4_NUMLINKS			= 35,
321 	FATTR4_OWNER			= 36,
322 	FATTR4_OWNER_GROUP		= 37,
323 	FATTR4_QUOTA_AVAIL_HARD		= 38,
324 	FATTR4_QUOTA_AVAIL_SOFT		= 39,
325 	FATTR4_QUOTA_USED		= 40,
326 	FATTR4_RAWDEV			= 41,
327 	FATTR4_SPACE_AVAIL		= 42,
328 	FATTR4_SPACE_FREE		= 43,
329 	FATTR4_SPACE_TOTAL		= 44,
330 	FATTR4_SPACE_USED		= 45,
331 	FATTR4_SYSTEM			= 46,
332 	FATTR4_TIME_ACCESS		= 47,
333 	FATTR4_TIME_ACCESS_SET		= 48,
334 	FATTR4_TIME_BACKUP		= 49,
335 	FATTR4_TIME_CREATE		= 50,
336 	FATTR4_TIME_DELTA		= 51,
337 	FATTR4_TIME_METADATA		= 52,
338 	FATTR4_TIME_MODIFY		= 53,
339 	FATTR4_TIME_MODIFY_SET		= 54,
340 	FATTR4_MOUNTED_ON_FILEID	= 55,
341 };
342 
343 /*
344  * Symbol names and values are from RFC 5662 Section 2.
345  * "XDR Description of NFSv4.1"
346  */
347 enum {
348 	FATTR4_DIR_NOTIF_DELAY		= 56,
349 	FATTR4_DIRENT_NOTIF_DELAY	= 57,
350 	FATTR4_DACL			= 58,
351 	FATTR4_SACL			= 59,
352 	FATTR4_CHANGE_POLICY		= 60,
353 	FATTR4_FS_STATUS		= 61,
354 	FATTR4_FS_LAYOUT_TYPES		= 62,
355 	FATTR4_LAYOUT_HINT		= 63,
356 	FATTR4_LAYOUT_TYPES		= 64,
357 	FATTR4_LAYOUT_BLKSIZE		= 65,
358 	FATTR4_LAYOUT_ALIGNMENT		= 66,
359 	FATTR4_FS_LOCATIONS_INFO	= 67,
360 	FATTR4_MDSTHRESHOLD		= 68,
361 	FATTR4_RETENTION_GET		= 69,
362 	FATTR4_RETENTION_SET		= 70,
363 	FATTR4_RETENTEVT_GET		= 71,
364 	FATTR4_RETENTEVT_SET		= 72,
365 	FATTR4_RETENTION_HOLD		= 73,
366 	FATTR4_MODE_SET_MASKED		= 74,
367 	FATTR4_SUPPATTR_EXCLCREAT	= 75,
368 	FATTR4_FS_CHARSET_CAP		= 76,
369 };
370 
371 /*
372  * Symbol names and values are from RFC 7863 Section 2.
373  * "XDR Description of NFSv4.2"
374  */
375 enum {
376 	FATTR4_CLONE_BLKSIZE		= 77,
377 	FATTR4_SPACE_FREED		= 78,
378 	FATTR4_CHANGE_ATTR_TYPE		= 79,
379 	FATTR4_SEC_LABEL		= 80,
380 };
381 
382 /*
383  * Symbol names and values are from RFC 8275 Section 5.
384  * "The mode_umask Attribute"
385  */
386 enum {
387 	FATTR4_MODE_UMASK		= 81,
388 };
389 
390 /*
391  * Symbol names and values are from RFC 8276 Section 8.6.
392  * "Numeric Values Assigned to Protocol Extensions"
393  */
394 enum {
395 	FATTR4_XATTR_SUPPORT		= 82,
396 };
397 
398 /*
399  * Symbol name and value are from draft-ietf-nfsv4-uncacheable-files
400  * Section 7.  "XDR for Uncacheable Attribute"
401  */
402 enum {
403 	FATTR4_UNCACHEABLE_FILE_DATA	= 87,
404 };
405 
406 /*
407  * The following internal definitions enable processing the above
408  * attribute bits within 32-bit word boundaries.
409  */
410 
411 /* Mandatory Attributes */
412 #define FATTR4_WORD0_SUPPORTED_ATTRS    BIT(FATTR4_SUPPORTED_ATTRS)
413 #define FATTR4_WORD0_TYPE               BIT(FATTR4_TYPE)
414 #define FATTR4_WORD0_FH_EXPIRE_TYPE     BIT(FATTR4_FH_EXPIRE_TYPE)
415 #define FATTR4_WORD0_CHANGE             BIT(FATTR4_CHANGE)
416 #define FATTR4_WORD0_SIZE               BIT(FATTR4_SIZE)
417 #define FATTR4_WORD0_LINK_SUPPORT       BIT(FATTR4_LINK_SUPPORT)
418 #define FATTR4_WORD0_SYMLINK_SUPPORT    BIT(FATTR4_SYMLINK_SUPPORT)
419 #define FATTR4_WORD0_NAMED_ATTR         BIT(FATTR4_NAMED_ATTR)
420 #define FATTR4_WORD0_FSID               BIT(FATTR4_FSID)
421 #define FATTR4_WORD0_UNIQUE_HANDLES     BIT(FATTR4_UNIQUE_HANDLES)
422 #define FATTR4_WORD0_LEASE_TIME         BIT(FATTR4_LEASE_TIME)
423 #define FATTR4_WORD0_RDATTR_ERROR       BIT(FATTR4_RDATTR_ERROR)
424 /* Mandatory in NFSv4.1 */
425 #define FATTR4_WORD2_SUPPATTR_EXCLCREAT BIT(FATTR4_SUPPATTR_EXCLCREAT - 64)
426 
427 /* Recommended Attributes */
428 #define FATTR4_WORD0_ACL                BIT(FATTR4_ACL)
429 #define FATTR4_WORD0_ACLSUPPORT         BIT(FATTR4_ACLSUPPORT)
430 #define FATTR4_WORD0_ARCHIVE            BIT(FATTR4_ARCHIVE)
431 #define FATTR4_WORD0_CANSETTIME         BIT(FATTR4_CANSETTIME)
432 #define FATTR4_WORD0_CASE_INSENSITIVE   BIT(FATTR4_CASE_INSENSITIVE)
433 #define FATTR4_WORD0_CASE_PRESERVING    BIT(FATTR4_CASE_PRESERVING)
434 #define FATTR4_WORD0_CHOWN_RESTRICTED   BIT(FATTR4_CHOWN_RESTRICTED)
435 #define FATTR4_WORD0_FILEHANDLE         BIT(FATTR4_FILEHANDLE)
436 #define FATTR4_WORD0_FILEID             BIT(FATTR4_FILEID)
437 #define FATTR4_WORD0_FILES_AVAIL        BIT(FATTR4_FILES_AVAIL)
438 #define FATTR4_WORD0_FILES_FREE         BIT(FATTR4_FILES_FREE)
439 #define FATTR4_WORD0_FILES_TOTAL        BIT(FATTR4_FILES_TOTAL)
440 #define FATTR4_WORD0_FS_LOCATIONS       BIT(FATTR4_FS_LOCATIONS)
441 #define FATTR4_WORD0_HIDDEN             BIT(FATTR4_HIDDEN)
442 #define FATTR4_WORD0_HOMOGENEOUS        BIT(FATTR4_HOMOGENEOUS)
443 #define FATTR4_WORD0_MAXFILESIZE        BIT(FATTR4_MAXFILESIZE)
444 #define FATTR4_WORD0_MAXLINK            BIT(FATTR4_MAXLINK)
445 #define FATTR4_WORD0_MAXNAME            BIT(FATTR4_MAXNAME)
446 #define FATTR4_WORD0_MAXREAD            BIT(FATTR4_MAXREAD)
447 #define FATTR4_WORD0_MAXWRITE           BIT(FATTR4_MAXWRITE)
448 
449 #define FATTR4_WORD1_MIMETYPE           BIT(FATTR4_MIMETYPE - 32)
450 #define FATTR4_WORD1_MODE               BIT(FATTR4_MODE	- 32)
451 #define FATTR4_WORD1_NO_TRUNC           BIT(FATTR4_NO_TRUNC - 32)
452 #define FATTR4_WORD1_NUMLINKS           BIT(FATTR4_NUMLINKS - 32)
453 #define FATTR4_WORD1_OWNER              BIT(FATTR4_OWNER - 32)
454 #define FATTR4_WORD1_OWNER_GROUP        BIT(FATTR4_OWNER_GROUP - 32)
455 #define FATTR4_WORD1_QUOTA_HARD         BIT(FATTR4_QUOTA_AVAIL_HARD - 32)
456 #define FATTR4_WORD1_QUOTA_SOFT         BIT(FATTR4_QUOTA_AVAIL_SOFT - 32)
457 #define FATTR4_WORD1_QUOTA_USED         BIT(FATTR4_QUOTA_USED - 32)
458 #define FATTR4_WORD1_RAWDEV             BIT(FATTR4_RAWDEV - 32)
459 #define FATTR4_WORD1_SPACE_AVAIL        BIT(FATTR4_SPACE_AVAIL - 32)
460 #define FATTR4_WORD1_SPACE_FREE         BIT(FATTR4_SPACE_FREE - 32)
461 #define FATTR4_WORD1_SPACE_TOTAL        BIT(FATTR4_SPACE_TOTAL - 32)
462 #define FATTR4_WORD1_SPACE_USED         BIT(FATTR4_SPACE_USED - 32)
463 #define FATTR4_WORD1_SYSTEM             BIT(FATTR4_SYSTEM - 32)
464 #define FATTR4_WORD1_TIME_ACCESS        BIT(FATTR4_TIME_ACCESS - 32)
465 #define FATTR4_WORD1_TIME_ACCESS_SET    BIT(FATTR4_TIME_ACCESS_SET - 32)
466 #define FATTR4_WORD1_TIME_BACKUP        BIT(FATTR4_TIME_BACKUP - 32)
467 #define FATTR4_WORD1_TIME_CREATE        BIT(FATTR4_TIME_CREATE - 32)
468 #define FATTR4_WORD1_TIME_DELTA         BIT(FATTR4_TIME_DELTA - 32)
469 #define FATTR4_WORD1_TIME_METADATA      BIT(FATTR4_TIME_METADATA - 32)
470 #define FATTR4_WORD1_TIME_MODIFY        BIT(FATTR4_TIME_MODIFY - 32)
471 #define FATTR4_WORD1_TIME_MODIFY_SET    BIT(FATTR4_TIME_MODIFY_SET - 32)
472 #define FATTR4_WORD1_MOUNTED_ON_FILEID  BIT(FATTR4_MOUNTED_ON_FILEID - 32)
473 #define FATTR4_WORD1_DACL               BIT(FATTR4_DACL	- 32)
474 #define FATTR4_WORD1_SACL               BIT(FATTR4_SACL	- 32)
475 #define FATTR4_WORD1_FS_LAYOUT_TYPES    BIT(FATTR4_FS_LAYOUT_TYPES - 32)
476 
477 #define FATTR4_WORD2_LAYOUT_TYPES       BIT(FATTR4_LAYOUT_TYPES - 64)
478 #define FATTR4_WORD2_LAYOUT_BLKSIZE     BIT(FATTR4_LAYOUT_BLKSIZE - 64)
479 #define FATTR4_WORD2_MDSTHRESHOLD       BIT(FATTR4_MDSTHRESHOLD	- 64)
480 #define FATTR4_WORD2_CLONE_BLKSIZE	BIT(FATTR4_CLONE_BLKSIZE - 64)
481 #define FATTR4_WORD2_CHANGE_ATTR_TYPE	BIT(FATTR4_CHANGE_ATTR_TYPE - 64)
482 #define FATTR4_WORD2_SECURITY_LABEL     BIT(FATTR4_SEC_LABEL - 64)
483 #define FATTR4_WORD2_MODE_UMASK		BIT(FATTR4_MODE_UMASK - 64)
484 #define FATTR4_WORD2_XATTR_SUPPORT	BIT(FATTR4_XATTR_SUPPORT - 64)
485 #define FATTR4_WORD2_TIME_DELEG_ACCESS	BIT(FATTR4_TIME_DELEG_ACCESS - 64)
486 #define FATTR4_WORD2_TIME_DELEG_MODIFY	BIT(FATTR4_TIME_DELEG_MODIFY - 64)
487 #define FATTR4_WORD2_OPEN_ARGUMENTS	BIT(FATTR4_OPEN_ARGUMENTS - 64)
488 #define FATTR4_WORD2_ACL_TRUEFORM	BIT(FATTR4_ACL_TRUEFORM - 64)
489 #define FATTR4_WORD2_ACL_TRUEFORM_SCOPE	BIT(FATTR4_ACL_TRUEFORM_SCOPE - 64)
490 #define FATTR4_WORD2_POSIX_DEFAULT_ACL	BIT(FATTR4_POSIX_DEFAULT_ACL - 64)
491 #define FATTR4_WORD2_POSIX_ACCESS_ACL	BIT(FATTR4_POSIX_ACCESS_ACL - 64)
492 #define FATTR4_WORD2_UNCACHEABLE_FILE_DATA	BIT(FATTR4_UNCACHEABLE_FILE_DATA - 64)
493 
494 /* MDS threshold bitmap bits */
495 #define THRESHOLD_RD                    (1UL << 0)
496 #define THRESHOLD_WR                    (1UL << 1)
497 #define THRESHOLD_RD_IO                 (1UL << 2)
498 #define THRESHOLD_WR_IO                 (1UL << 3)
499 
500 #define NFSPROC4_NULL 0
501 #define NFSPROC4_COMPOUND 1
502 #define NFS4_VERSION 4
503 #define NFS4_MINOR_VERSION 0
504 
505 #define NFS4_DEBUG 1
506 
507 /*
508  * Index of predefined Linux client operations
509  *
510  * To ensure that /proc/net/rpc/nfs remains correctly ordered, please
511  * append only to this enum when adding new client operations.
512  */
513 
514 enum {
515 	NFSPROC4_CLNT_NULL = 0,		/* Unused */
516 	NFSPROC4_CLNT_READ,
517 	NFSPROC4_CLNT_WRITE,
518 	NFSPROC4_CLNT_COMMIT,
519 	NFSPROC4_CLNT_OPEN,
520 	NFSPROC4_CLNT_OPEN_CONFIRM,
521 	NFSPROC4_CLNT_OPEN_NOATTR,
522 	NFSPROC4_CLNT_OPEN_DOWNGRADE,
523 	NFSPROC4_CLNT_CLOSE,
524 	NFSPROC4_CLNT_SETATTR,
525 	NFSPROC4_CLNT_FSINFO,
526 	NFSPROC4_CLNT_RENEW,
527 	NFSPROC4_CLNT_SETCLIENTID,
528 	NFSPROC4_CLNT_SETCLIENTID_CONFIRM,
529 	NFSPROC4_CLNT_LOCK,
530 	NFSPROC4_CLNT_LOCKT,
531 	NFSPROC4_CLNT_LOCKU,
532 	NFSPROC4_CLNT_ACCESS,
533 	NFSPROC4_CLNT_GETATTR,
534 	NFSPROC4_CLNT_LOOKUP,
535 	NFSPROC4_CLNT_LOOKUP_ROOT,
536 	NFSPROC4_CLNT_REMOVE,
537 	NFSPROC4_CLNT_RENAME,
538 	NFSPROC4_CLNT_LINK,
539 	NFSPROC4_CLNT_SYMLINK,
540 	NFSPROC4_CLNT_CREATE,
541 	NFSPROC4_CLNT_PATHCONF,
542 	NFSPROC4_CLNT_STATFS,
543 	NFSPROC4_CLNT_READLINK,
544 	NFSPROC4_CLNT_READDIR,
545 	NFSPROC4_CLNT_SERVER_CAPS,
546 	NFSPROC4_CLNT_DELEGRETURN,
547 	NFSPROC4_CLNT_GETACL,
548 	NFSPROC4_CLNT_SETACL,
549 	NFSPROC4_CLNT_FS_LOCATIONS,
550 	NFSPROC4_CLNT_RELEASE_LOCKOWNER,
551 	NFSPROC4_CLNT_SECINFO,
552 	NFSPROC4_CLNT_FSID_PRESENT,
553 
554 	NFSPROC4_CLNT_EXCHANGE_ID,
555 	NFSPROC4_CLNT_CREATE_SESSION,
556 	NFSPROC4_CLNT_DESTROY_SESSION,
557 	NFSPROC4_CLNT_SEQUENCE,
558 	NFSPROC4_CLNT_GET_LEASE_TIME,
559 	NFSPROC4_CLNT_RECLAIM_COMPLETE,
560 	NFSPROC4_CLNT_LAYOUTGET,
561 	NFSPROC4_CLNT_GETDEVICEINFO,
562 	NFSPROC4_CLNT_LAYOUTCOMMIT,
563 	NFSPROC4_CLNT_LAYOUTRETURN,
564 	NFSPROC4_CLNT_SECINFO_NO_NAME,
565 	NFSPROC4_CLNT_TEST_STATEID,
566 	NFSPROC4_CLNT_FREE_STATEID,
567 	NFSPROC4_CLNT_GETDEVICELIST,
568 	NFSPROC4_CLNT_BIND_CONN_TO_SESSION,
569 	NFSPROC4_CLNT_DESTROY_CLIENTID,
570 
571 	NFSPROC4_CLNT_SEEK,
572 	NFSPROC4_CLNT_ALLOCATE,
573 	NFSPROC4_CLNT_DEALLOCATE,
574 	NFSPROC4_CLNT_ZERO_RANGE,
575 	NFSPROC4_CLNT_LAYOUTSTATS,
576 	NFSPROC4_CLNT_CLONE,
577 	NFSPROC4_CLNT_COPY,
578 	NFSPROC4_CLNT_OFFLOAD_CANCEL,
579 
580 	NFSPROC4_CLNT_LOOKUPP,
581 	NFSPROC4_CLNT_LAYOUTERROR,
582 	NFSPROC4_CLNT_COPY_NOTIFY,
583 
584 	NFSPROC4_CLNT_GETXATTR,
585 	NFSPROC4_CLNT_SETXATTR,
586 	NFSPROC4_CLNT_LISTXATTRS,
587 	NFSPROC4_CLNT_REMOVEXATTR,
588 	NFSPROC4_CLNT_READ_PLUS,
589 	NFSPROC4_CLNT_OFFLOAD_STATUS,
590 };
591 
592 /* nfs41 types */
593 struct nfs4_sessionid {
594 	unsigned char data[NFS4_MAX_SESSIONID_LEN];
595 };
596 
597 /* Create Session Flags */
598 #define SESSION4_PERSIST	0x001
599 #define SESSION4_BACK_CHAN	0x002
600 #define SESSION4_RDMA		0x004
601 
602 #define SESSION4_FLAG_MASK_A	0x007
603 
604 enum state_protect_how4 {
605 	SP4_NONE	= 0,
606 	SP4_MACH_CRED	= 1,
607 	SP4_SSV		= 2
608 };
609 
610 /* GET_DIR_DELEGATION non-fatal status codes */
611 enum gddrnf4_status {
612 	GDD4_OK		= 0,
613 	GDD4_UNAVAIL	= 1
614 };
615 
616 enum pnfs_layouttype {
617 	LAYOUT_NFSV4_1_FILES  = 1,
618 	LAYOUT_OSD2_OBJECTS = 2,
619 	LAYOUT_BLOCK_VOLUME = 3,
620 	LAYOUT_FLEX_FILES = 4,
621 	LAYOUT_SCSI = 5,
622 	LAYOUT_TYPE_MAX
623 };
624 
625 /* used for both layout return and recall */
626 enum pnfs_layoutreturn_type {
627 	RETURN_FILE = 1,
628 	RETURN_FSID = 2,
629 	RETURN_ALL  = 3
630 };
631 
632 enum pnfs_iomode {
633 	IOMODE_READ = 1,
634 	IOMODE_RW = 2,
635 	IOMODE_ANY = 3,
636 };
637 
638 enum pnfs_notify_deviceid_type4 {
639 	NOTIFY_DEVICEID4_CHANGE = 1 << 1,
640 	NOTIFY_DEVICEID4_DELETE = 1 << 2,
641 };
642 
643 enum pnfs_block_volume_type {
644 	PNFS_BLOCK_VOLUME_SIMPLE	= 0,
645 	PNFS_BLOCK_VOLUME_SLICE		= 1,
646 	PNFS_BLOCK_VOLUME_CONCAT	= 2,
647 	PNFS_BLOCK_VOLUME_STRIPE	= 3,
648 	PNFS_BLOCK_VOLUME_SCSI		= 4,
649 };
650 
651 enum pnfs_block_extent_state {
652 	PNFS_BLOCK_READWRITE_DATA	= 0,
653 	PNFS_BLOCK_READ_DATA		= 1,
654 	PNFS_BLOCK_INVALID_DATA		= 2,
655 	PNFS_BLOCK_NONE_DATA		= 3,
656 };
657 
658 /* on the wire size of a block layout extent */
659 #define PNFS_BLOCK_EXTENT_SIZE \
660 	(7 * sizeof(__be32) + NFS4_DEVICEID4_SIZE)
661 
662 /* on the wire size of a scsi commit range */
663 #define PNFS_SCSI_RANGE_SIZE \
664 	(4 * sizeof(__be32))
665 
666 enum scsi_code_set {
667 	PS_CODE_SET_BINARY	= 1,
668 	PS_CODE_SET_ASCII	= 2,
669 	PS_CODE_SET_UTF8	= 3
670 };
671 
672 enum scsi_designator_type {
673 	PS_DESIGNATOR_T10	= 1,
674 	PS_DESIGNATOR_EUI64	= 2,
675 	PS_DESIGNATOR_NAA	= 3,
676 	PS_DESIGNATOR_NAME	= 8
677 };
678 
679 #define NFL4_UFLG_MASK			0x0000003F
680 #define NFL4_UFLG_DENSE			0x00000001
681 #define NFL4_UFLG_COMMIT_THRU_MDS	0x00000002
682 #define NFL4_UFLG_STRIPE_UNIT_SIZE_MASK	0xFFFFFFC0
683 
684 /* Encoded in the loh_body field of type layouthint4 */
685 enum filelayout_hint_care4 {
686 	NFLH4_CARE_DENSE		= NFL4_UFLG_DENSE,
687 	NFLH4_CARE_COMMIT_THRU_MDS	= NFL4_UFLG_COMMIT_THRU_MDS,
688 	NFLH4_CARE_STRIPE_UNIT_SIZE	= 0x00000040,
689 	NFLH4_CARE_STRIPE_COUNT		= 0x00000080
690 };
691 
692 #define NFS4_DEVICEID4_SIZE 16
693 
694 struct nfs4_deviceid {
695 	char data[NFS4_DEVICEID4_SIZE];
696 };
697 
698 enum data_content4 {
699 	NFS4_CONTENT_DATA		= 0,
700 	NFS4_CONTENT_HOLE		= 1,
701 };
702 
703 enum pnfs_update_layout_reason {
704 	PNFS_UPDATE_LAYOUT_UNKNOWN = 0,
705 	PNFS_UPDATE_LAYOUT_NO_PNFS,
706 	PNFS_UPDATE_LAYOUT_RD_ZEROLEN,
707 	PNFS_UPDATE_LAYOUT_MDSTHRESH,
708 	PNFS_UPDATE_LAYOUT_NOMEM,
709 	PNFS_UPDATE_LAYOUT_BULK_RECALL,
710 	PNFS_UPDATE_LAYOUT_IO_TEST_FAIL,
711 	PNFS_UPDATE_LAYOUT_FOUND_CACHED,
712 	PNFS_UPDATE_LAYOUT_RETURN,
713 	PNFS_UPDATE_LAYOUT_RETRY,
714 	PNFS_UPDATE_LAYOUT_BLOCKED,
715 	PNFS_UPDATE_LAYOUT_INVALID_OPEN,
716 	PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET,
717 	PNFS_UPDATE_LAYOUT_EXIT,
718 };
719 
720 #define NFS4_OP_MAP_NUM_LONGS					\
721 	DIV_ROUND_UP(LAST_NFS4_OP, 8 * sizeof(unsigned long))
722 #define NFS4_OP_MAP_NUM_WORDS \
723 	(NFS4_OP_MAP_NUM_LONGS * sizeof(unsigned long) / sizeof(u32))
724 struct nfs4_op_map {
725 	union {
726 		unsigned long longs[NFS4_OP_MAP_NUM_LONGS];
727 		u32 words[NFS4_OP_MAP_NUM_WORDS];
728 	} u;
729 };
730 
731 struct nfs42_netaddr {
732 	char		netid[RPCBIND_MAXNETIDLEN];
733 	char		addr[RPCBIND_MAXUADDRLEN + 1];
734 	u32		netid_len;
735 	u32		addr_len;
736 };
737 
738 enum netloc_type4 {
739 	NL4_NAME		= 1,
740 	NL4_URL			= 2,
741 	NL4_NETADDR		= 3,
742 };
743 
744 struct nl4_server {
745 	enum netloc_type4	nl4_type;
746 	union {
747 		struct { /* NL4_NAME, NL4_URL */
748 			int	nl4_str_sz;
749 			char	nl4_str[NFS4_OPAQUE_LIMIT + 1];
750 		};
751 		struct nfs42_netaddr	nl4_addr; /* NL4_NETADDR */
752 	} u;
753 };
754 
755 enum nfs4_change_attr_type {
756 	NFS4_CHANGE_TYPE_IS_MONOTONIC_INCR = 0,
757 	NFS4_CHANGE_TYPE_IS_VERSION_COUNTER = 1,
758 	NFS4_CHANGE_TYPE_IS_VERSION_COUNTER_NOPNFS = 2,
759 	NFS4_CHANGE_TYPE_IS_TIME_METADATA = 3,
760 	NFS4_CHANGE_TYPE_IS_UNDEFINED = 4,
761 };
762 
763 /*
764  * Options for setxattr. These match the flags for setxattr(2).
765  */
766 enum nfs4_setxattr_options {
767 	SETXATTR4_EITHER	= 0,
768 	SETXATTR4_CREATE	= 1,
769 	SETXATTR4_REPLACE	= 2,
770 };
771 
772 enum {
773 	RCA4_TYPE_MASK_RDATA_DLG	= 0,
774 	RCA4_TYPE_MASK_WDATA_DLG	= 1,
775 	RCA4_TYPE_MASK_DIR_DLG		= 2,
776 	RCA4_TYPE_MASK_FILE_LAYOUT	= 3,
777 	RCA4_TYPE_MASK_BLK_LAYOUT	= 4,
778 	RCA4_TYPE_MASK_OBJ_LAYOUT_MIN	= 8,
779 	RCA4_TYPE_MASK_OBJ_LAYOUT_MAX	= 9,
780 	RCA4_TYPE_MASK_OTHER_LAYOUT_MIN	= 12,
781 	RCA4_TYPE_MASK_OTHER_LAYOUT_MAX	= 15,
782 };
783 
784 enum nfs_cb_opnum4 {
785 	OP_CB_GETATTR = 3,
786 	OP_CB_RECALL  = 4,
787 
788 	/* Callback operations new to NFSv4.1 */
789 	OP_CB_LAYOUTRECALL  = 5,
790 	OP_CB_NOTIFY        = 6,
791 	OP_CB_PUSH_DELEG    = 7,
792 	OP_CB_RECALL_ANY    = 8,
793 	OP_CB_RECALLABLE_OBJ_AVAIL = 9,
794 	OP_CB_RECALL_SLOT   = 10,
795 	OP_CB_SEQUENCE      = 11,
796 	OP_CB_WANTS_CANCELLED = 12,
797 	OP_CB_NOTIFY_LOCK   = 13,
798 	OP_CB_NOTIFY_DEVICEID = 14,
799 
800 	/* Callback operations new to NFSv4.2 */
801 	OP_CB_OFFLOAD = 15,
802 
803 	OP_CB_ILLEGAL = 10044,
804 };
805 
806 #endif
807