xref: /linux/include/linux/nfs4.h (revision 73e3f0710014fe6d4ed98cfc02292f6121db7558)
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 
seqid_mutating_err(u32 err)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 lock_type4 {
267 	NFS4_UNLOCK_LT = 0,
268 	NFS4_READ_LT = 1,
269 	NFS4_WRITE_LT = 2,
270 	NFS4_READW_LT = 3,
271 	NFS4_WRITEW_LT = 4
272 };
273 
274 /*
275  * Symbol names and values are from RFC 7531 Section 2.
276  * "XDR Description of NFSv4.0"
277  */
278 enum {
279 	FATTR4_SUPPORTED_ATTRS		= 0,
280 	FATTR4_TYPE			= 1,
281 	FATTR4_FH_EXPIRE_TYPE		= 2,
282 	FATTR4_CHANGE			= 3,
283 	FATTR4_SIZE			= 4,
284 	FATTR4_LINK_SUPPORT		= 5,
285 	FATTR4_SYMLINK_SUPPORT		= 6,
286 	FATTR4_NAMED_ATTR		= 7,
287 	FATTR4_FSID			= 8,
288 	FATTR4_UNIQUE_HANDLES		= 9,
289 	FATTR4_LEASE_TIME		= 10,
290 	FATTR4_RDATTR_ERROR		= 11,
291 	FATTR4_ACL			= 12,
292 	FATTR4_ACLSUPPORT		= 13,
293 	FATTR4_ARCHIVE			= 14,
294 	FATTR4_CANSETTIME		= 15,
295 	FATTR4_CASE_INSENSITIVE		= 16,
296 	FATTR4_CASE_PRESERVING		= 17,
297 	FATTR4_CHOWN_RESTRICTED		= 18,
298 	FATTR4_FILEHANDLE		= 19,
299 	FATTR4_FILEID			= 20,
300 	FATTR4_FILES_AVAIL		= 21,
301 	FATTR4_FILES_FREE		= 22,
302 	FATTR4_FILES_TOTAL		= 23,
303 	FATTR4_FS_LOCATIONS		= 24,
304 	FATTR4_HIDDEN			= 25,
305 	FATTR4_HOMOGENEOUS		= 26,
306 	FATTR4_MAXFILESIZE		= 27,
307 	FATTR4_MAXLINK			= 28,
308 	FATTR4_MAXNAME			= 29,
309 	FATTR4_MAXREAD			= 30,
310 	FATTR4_MAXWRITE			= 31,
311 	FATTR4_MIMETYPE			= 32,
312 	FATTR4_MODE			= 33,
313 	FATTR4_NO_TRUNC			= 34,
314 	FATTR4_NUMLINKS			= 35,
315 	FATTR4_OWNER			= 36,
316 	FATTR4_OWNER_GROUP		= 37,
317 	FATTR4_QUOTA_AVAIL_HARD		= 38,
318 	FATTR4_QUOTA_AVAIL_SOFT		= 39,
319 	FATTR4_QUOTA_USED		= 40,
320 	FATTR4_RAWDEV			= 41,
321 	FATTR4_SPACE_AVAIL		= 42,
322 	FATTR4_SPACE_FREE		= 43,
323 	FATTR4_SPACE_TOTAL		= 44,
324 	FATTR4_SPACE_USED		= 45,
325 	FATTR4_SYSTEM			= 46,
326 	FATTR4_TIME_ACCESS		= 47,
327 	FATTR4_TIME_ACCESS_SET		= 48,
328 	FATTR4_TIME_BACKUP		= 49,
329 	FATTR4_TIME_CREATE		= 50,
330 	FATTR4_TIME_DELTA		= 51,
331 	FATTR4_TIME_METADATA		= 52,
332 	FATTR4_TIME_MODIFY		= 53,
333 	FATTR4_TIME_MODIFY_SET		= 54,
334 	FATTR4_MOUNTED_ON_FILEID	= 55,
335 };
336 
337 /*
338  * Symbol names and values are from RFC 5662 Section 2.
339  * "XDR Description of NFSv4.1"
340  */
341 enum {
342 	FATTR4_DIR_NOTIF_DELAY		= 56,
343 	FATTR4_DIRENT_NOTIF_DELAY	= 57,
344 	FATTR4_DACL			= 58,
345 	FATTR4_SACL			= 59,
346 	FATTR4_CHANGE_POLICY		= 60,
347 	FATTR4_FS_STATUS		= 61,
348 	FATTR4_FS_LAYOUT_TYPES		= 62,
349 	FATTR4_LAYOUT_HINT		= 63,
350 	FATTR4_LAYOUT_TYPES		= 64,
351 	FATTR4_LAYOUT_BLKSIZE		= 65,
352 	FATTR4_LAYOUT_ALIGNMENT		= 66,
353 	FATTR4_FS_LOCATIONS_INFO	= 67,
354 	FATTR4_MDSTHRESHOLD		= 68,
355 	FATTR4_RETENTION_GET		= 69,
356 	FATTR4_RETENTION_SET		= 70,
357 	FATTR4_RETENTEVT_GET		= 71,
358 	FATTR4_RETENTEVT_SET		= 72,
359 	FATTR4_RETENTION_HOLD		= 73,
360 	FATTR4_MODE_SET_MASKED		= 74,
361 	FATTR4_SUPPATTR_EXCLCREAT	= 75,
362 	FATTR4_FS_CHARSET_CAP		= 76,
363 };
364 
365 /*
366  * Symbol names and values are from RFC 7863 Section 2.
367  * "XDR Description of NFSv4.2"
368  */
369 enum {
370 	FATTR4_CLONE_BLKSIZE		= 77,
371 	FATTR4_SPACE_FREED		= 78,
372 	FATTR4_CHANGE_ATTR_TYPE		= 79,
373 	FATTR4_SEC_LABEL		= 80,
374 };
375 
376 /*
377  * Symbol names and values are from RFC 8275 Section 5.
378  * "The mode_umask Attribute"
379  */
380 enum {
381 	FATTR4_MODE_UMASK		= 81,
382 };
383 
384 /*
385  * Symbol names and values are from RFC 8276 Section 8.6.
386  * "Numeric Values Assigned to Protocol Extensions"
387  */
388 enum {
389 	FATTR4_XATTR_SUPPORT		= 82,
390 };
391 
392 /*
393  * Symbol name and value are from draft-ietf-nfsv4-uncacheable-files
394  * Section 7.  "XDR for Uncacheable Attribute"
395  */
396 enum {
397 	FATTR4_UNCACHEABLE_FILE_DATA	= 87,
398 };
399 
400 /*
401  * The following internal definitions enable processing the above
402  * attribute bits within 32-bit word boundaries.
403  */
404 
405 /* Mandatory Attributes */
406 #define FATTR4_WORD0_SUPPORTED_ATTRS    BIT(FATTR4_SUPPORTED_ATTRS)
407 #define FATTR4_WORD0_TYPE               BIT(FATTR4_TYPE)
408 #define FATTR4_WORD0_FH_EXPIRE_TYPE     BIT(FATTR4_FH_EXPIRE_TYPE)
409 #define FATTR4_WORD0_CHANGE             BIT(FATTR4_CHANGE)
410 #define FATTR4_WORD0_SIZE               BIT(FATTR4_SIZE)
411 #define FATTR4_WORD0_LINK_SUPPORT       BIT(FATTR4_LINK_SUPPORT)
412 #define FATTR4_WORD0_SYMLINK_SUPPORT    BIT(FATTR4_SYMLINK_SUPPORT)
413 #define FATTR4_WORD0_NAMED_ATTR         BIT(FATTR4_NAMED_ATTR)
414 #define FATTR4_WORD0_FSID               BIT(FATTR4_FSID)
415 #define FATTR4_WORD0_UNIQUE_HANDLES     BIT(FATTR4_UNIQUE_HANDLES)
416 #define FATTR4_WORD0_LEASE_TIME         BIT(FATTR4_LEASE_TIME)
417 #define FATTR4_WORD0_RDATTR_ERROR       BIT(FATTR4_RDATTR_ERROR)
418 /* Mandatory in NFSv4.1 */
419 #define FATTR4_WORD2_SUPPATTR_EXCLCREAT BIT(FATTR4_SUPPATTR_EXCLCREAT - 64)
420 
421 /* Recommended Attributes */
422 #define FATTR4_WORD0_ACL                BIT(FATTR4_ACL)
423 #define FATTR4_WORD0_ACLSUPPORT         BIT(FATTR4_ACLSUPPORT)
424 #define FATTR4_WORD0_ARCHIVE            BIT(FATTR4_ARCHIVE)
425 #define FATTR4_WORD0_CANSETTIME         BIT(FATTR4_CANSETTIME)
426 #define FATTR4_WORD0_CASE_INSENSITIVE   BIT(FATTR4_CASE_INSENSITIVE)
427 #define FATTR4_WORD0_CASE_PRESERVING    BIT(FATTR4_CASE_PRESERVING)
428 #define FATTR4_WORD0_CHOWN_RESTRICTED   BIT(FATTR4_CHOWN_RESTRICTED)
429 #define FATTR4_WORD0_FILEHANDLE         BIT(FATTR4_FILEHANDLE)
430 #define FATTR4_WORD0_FILEID             BIT(FATTR4_FILEID)
431 #define FATTR4_WORD0_FILES_AVAIL        BIT(FATTR4_FILES_AVAIL)
432 #define FATTR4_WORD0_FILES_FREE         BIT(FATTR4_FILES_FREE)
433 #define FATTR4_WORD0_FILES_TOTAL        BIT(FATTR4_FILES_TOTAL)
434 #define FATTR4_WORD0_FS_LOCATIONS       BIT(FATTR4_FS_LOCATIONS)
435 #define FATTR4_WORD0_HIDDEN             BIT(FATTR4_HIDDEN)
436 #define FATTR4_WORD0_HOMOGENEOUS        BIT(FATTR4_HOMOGENEOUS)
437 #define FATTR4_WORD0_MAXFILESIZE        BIT(FATTR4_MAXFILESIZE)
438 #define FATTR4_WORD0_MAXLINK            BIT(FATTR4_MAXLINK)
439 #define FATTR4_WORD0_MAXNAME            BIT(FATTR4_MAXNAME)
440 #define FATTR4_WORD0_MAXREAD            BIT(FATTR4_MAXREAD)
441 #define FATTR4_WORD0_MAXWRITE           BIT(FATTR4_MAXWRITE)
442 
443 #define FATTR4_WORD1_MIMETYPE           BIT(FATTR4_MIMETYPE - 32)
444 #define FATTR4_WORD1_MODE               BIT(FATTR4_MODE	- 32)
445 #define FATTR4_WORD1_NO_TRUNC           BIT(FATTR4_NO_TRUNC - 32)
446 #define FATTR4_WORD1_NUMLINKS           BIT(FATTR4_NUMLINKS - 32)
447 #define FATTR4_WORD1_OWNER              BIT(FATTR4_OWNER - 32)
448 #define FATTR4_WORD1_OWNER_GROUP        BIT(FATTR4_OWNER_GROUP - 32)
449 #define FATTR4_WORD1_QUOTA_HARD         BIT(FATTR4_QUOTA_AVAIL_HARD - 32)
450 #define FATTR4_WORD1_QUOTA_SOFT         BIT(FATTR4_QUOTA_AVAIL_SOFT - 32)
451 #define FATTR4_WORD1_QUOTA_USED         BIT(FATTR4_QUOTA_USED - 32)
452 #define FATTR4_WORD1_RAWDEV             BIT(FATTR4_RAWDEV - 32)
453 #define FATTR4_WORD1_SPACE_AVAIL        BIT(FATTR4_SPACE_AVAIL - 32)
454 #define FATTR4_WORD1_SPACE_FREE         BIT(FATTR4_SPACE_FREE - 32)
455 #define FATTR4_WORD1_SPACE_TOTAL        BIT(FATTR4_SPACE_TOTAL - 32)
456 #define FATTR4_WORD1_SPACE_USED         BIT(FATTR4_SPACE_USED - 32)
457 #define FATTR4_WORD1_SYSTEM             BIT(FATTR4_SYSTEM - 32)
458 #define FATTR4_WORD1_TIME_ACCESS        BIT(FATTR4_TIME_ACCESS - 32)
459 #define FATTR4_WORD1_TIME_ACCESS_SET    BIT(FATTR4_TIME_ACCESS_SET - 32)
460 #define FATTR4_WORD1_TIME_BACKUP        BIT(FATTR4_TIME_BACKUP - 32)
461 #define FATTR4_WORD1_TIME_CREATE        BIT(FATTR4_TIME_CREATE - 32)
462 #define FATTR4_WORD1_TIME_DELTA         BIT(FATTR4_TIME_DELTA - 32)
463 #define FATTR4_WORD1_TIME_METADATA      BIT(FATTR4_TIME_METADATA - 32)
464 #define FATTR4_WORD1_TIME_MODIFY        BIT(FATTR4_TIME_MODIFY - 32)
465 #define FATTR4_WORD1_TIME_MODIFY_SET    BIT(FATTR4_TIME_MODIFY_SET - 32)
466 #define FATTR4_WORD1_MOUNTED_ON_FILEID  BIT(FATTR4_MOUNTED_ON_FILEID - 32)
467 #define FATTR4_WORD1_DACL               BIT(FATTR4_DACL	- 32)
468 #define FATTR4_WORD1_SACL               BIT(FATTR4_SACL	- 32)
469 #define FATTR4_WORD1_FS_LAYOUT_TYPES    BIT(FATTR4_FS_LAYOUT_TYPES - 32)
470 
471 #define FATTR4_WORD2_LAYOUT_TYPES       BIT(FATTR4_LAYOUT_TYPES - 64)
472 #define FATTR4_WORD2_LAYOUT_BLKSIZE     BIT(FATTR4_LAYOUT_BLKSIZE - 64)
473 #define FATTR4_WORD2_MDSTHRESHOLD       BIT(FATTR4_MDSTHRESHOLD	- 64)
474 #define FATTR4_WORD2_CLONE_BLKSIZE	BIT(FATTR4_CLONE_BLKSIZE - 64)
475 #define FATTR4_WORD2_CHANGE_ATTR_TYPE	BIT(FATTR4_CHANGE_ATTR_TYPE - 64)
476 #define FATTR4_WORD2_SECURITY_LABEL     BIT(FATTR4_SEC_LABEL - 64)
477 #define FATTR4_WORD2_MODE_UMASK		BIT(FATTR4_MODE_UMASK - 64)
478 #define FATTR4_WORD2_XATTR_SUPPORT	BIT(FATTR4_XATTR_SUPPORT - 64)
479 #define FATTR4_WORD2_TIME_DELEG_ACCESS	BIT(FATTR4_TIME_DELEG_ACCESS - 64)
480 #define FATTR4_WORD2_TIME_DELEG_MODIFY	BIT(FATTR4_TIME_DELEG_MODIFY - 64)
481 #define FATTR4_WORD2_OPEN_ARGUMENTS	BIT(FATTR4_OPEN_ARGUMENTS - 64)
482 #define FATTR4_WORD2_ACL_TRUEFORM	BIT(FATTR4_ACL_TRUEFORM - 64)
483 #define FATTR4_WORD2_ACL_TRUEFORM_SCOPE	BIT(FATTR4_ACL_TRUEFORM_SCOPE - 64)
484 #define FATTR4_WORD2_POSIX_DEFAULT_ACL	BIT(FATTR4_POSIX_DEFAULT_ACL - 64)
485 #define FATTR4_WORD2_POSIX_ACCESS_ACL	BIT(FATTR4_POSIX_ACCESS_ACL - 64)
486 #define FATTR4_WORD2_UNCACHEABLE_FILE_DATA	BIT(FATTR4_UNCACHEABLE_FILE_DATA - 64)
487 
488 /* MDS threshold bitmap bits */
489 #define THRESHOLD_RD                    (1UL << 0)
490 #define THRESHOLD_WR                    (1UL << 1)
491 #define THRESHOLD_RD_IO                 (1UL << 2)
492 #define THRESHOLD_WR_IO                 (1UL << 3)
493 
494 #define NFSPROC4_NULL 0
495 #define NFSPROC4_COMPOUND 1
496 #define NFS4_VERSION 4
497 #define NFS4_MINOR_VERSION 0
498 
499 #define NFS4_DEBUG 1
500 
501 /*
502  * Index of predefined Linux client operations
503  *
504  * To ensure that /proc/net/rpc/nfs remains correctly ordered, please
505  * append only to this enum when adding new client operations.
506  */
507 
508 enum {
509 	NFSPROC4_CLNT_NULL = 0,		/* Unused */
510 	NFSPROC4_CLNT_READ,
511 	NFSPROC4_CLNT_WRITE,
512 	NFSPROC4_CLNT_COMMIT,
513 	NFSPROC4_CLNT_OPEN,
514 	NFSPROC4_CLNT_OPEN_CONFIRM,
515 	NFSPROC4_CLNT_OPEN_NOATTR,
516 	NFSPROC4_CLNT_OPEN_DOWNGRADE,
517 	NFSPROC4_CLNT_CLOSE,
518 	NFSPROC4_CLNT_SETATTR,
519 	NFSPROC4_CLNT_FSINFO,
520 	NFSPROC4_CLNT_RENEW,
521 	NFSPROC4_CLNT_SETCLIENTID,
522 	NFSPROC4_CLNT_SETCLIENTID_CONFIRM,
523 	NFSPROC4_CLNT_LOCK,
524 	NFSPROC4_CLNT_LOCKT,
525 	NFSPROC4_CLNT_LOCKU,
526 	NFSPROC4_CLNT_ACCESS,
527 	NFSPROC4_CLNT_GETATTR,
528 	NFSPROC4_CLNT_LOOKUP,
529 	NFSPROC4_CLNT_LOOKUP_ROOT,
530 	NFSPROC4_CLNT_REMOVE,
531 	NFSPROC4_CLNT_RENAME,
532 	NFSPROC4_CLNT_LINK,
533 	NFSPROC4_CLNT_SYMLINK,
534 	NFSPROC4_CLNT_CREATE,
535 	NFSPROC4_CLNT_PATHCONF,
536 	NFSPROC4_CLNT_STATFS,
537 	NFSPROC4_CLNT_READLINK,
538 	NFSPROC4_CLNT_READDIR,
539 	NFSPROC4_CLNT_SERVER_CAPS,
540 	NFSPROC4_CLNT_DELEGRETURN,
541 	NFSPROC4_CLNT_GETACL,
542 	NFSPROC4_CLNT_SETACL,
543 	NFSPROC4_CLNT_FS_LOCATIONS,
544 	NFSPROC4_CLNT_RELEASE_LOCKOWNER,
545 	NFSPROC4_CLNT_SECINFO,
546 	NFSPROC4_CLNT_FSID_PRESENT,
547 
548 	NFSPROC4_CLNT_EXCHANGE_ID,
549 	NFSPROC4_CLNT_CREATE_SESSION,
550 	NFSPROC4_CLNT_DESTROY_SESSION,
551 	NFSPROC4_CLNT_SEQUENCE,
552 	NFSPROC4_CLNT_GET_LEASE_TIME,
553 	NFSPROC4_CLNT_RECLAIM_COMPLETE,
554 	NFSPROC4_CLNT_LAYOUTGET,
555 	NFSPROC4_CLNT_GETDEVICEINFO,
556 	NFSPROC4_CLNT_LAYOUTCOMMIT,
557 	NFSPROC4_CLNT_LAYOUTRETURN,
558 	NFSPROC4_CLNT_SECINFO_NO_NAME,
559 	NFSPROC4_CLNT_TEST_STATEID,
560 	NFSPROC4_CLNT_FREE_STATEID,
561 	NFSPROC4_CLNT_GETDEVICELIST,
562 	NFSPROC4_CLNT_BIND_CONN_TO_SESSION,
563 	NFSPROC4_CLNT_DESTROY_CLIENTID,
564 
565 	NFSPROC4_CLNT_SEEK,
566 	NFSPROC4_CLNT_ALLOCATE,
567 	NFSPROC4_CLNT_DEALLOCATE,
568 	NFSPROC4_CLNT_ZERO_RANGE,
569 	NFSPROC4_CLNT_LAYOUTSTATS,
570 	NFSPROC4_CLNT_CLONE,
571 	NFSPROC4_CLNT_COPY,
572 	NFSPROC4_CLNT_OFFLOAD_CANCEL,
573 
574 	NFSPROC4_CLNT_LOOKUPP,
575 	NFSPROC4_CLNT_LAYOUTERROR,
576 	NFSPROC4_CLNT_COPY_NOTIFY,
577 
578 	NFSPROC4_CLNT_GETXATTR,
579 	NFSPROC4_CLNT_SETXATTR,
580 	NFSPROC4_CLNT_LISTXATTRS,
581 	NFSPROC4_CLNT_REMOVEXATTR,
582 	NFSPROC4_CLNT_READ_PLUS,
583 	NFSPROC4_CLNT_OFFLOAD_STATUS,
584 };
585 
586 /* nfs41 types */
587 struct nfs4_sessionid {
588 	unsigned char data[NFS4_MAX_SESSIONID_LEN];
589 };
590 
591 /* Create Session Flags */
592 #define SESSION4_PERSIST	0x001
593 #define SESSION4_BACK_CHAN	0x002
594 #define SESSION4_RDMA		0x004
595 
596 #define SESSION4_FLAG_MASK_A	0x007
597 
598 enum state_protect_how4 {
599 	SP4_NONE	= 0,
600 	SP4_MACH_CRED	= 1,
601 	SP4_SSV		= 2
602 };
603 
604 /* GET_DIR_DELEGATION non-fatal status codes */
605 enum gddrnf4_status {
606 	GDD4_OK		= 0,
607 	GDD4_UNAVAIL	= 1
608 };
609 
610 enum pnfs_layouttype {
611 	LAYOUT_NFSV4_1_FILES  = 1,
612 	LAYOUT_OSD2_OBJECTS = 2,
613 	LAYOUT_BLOCK_VOLUME = 3,
614 	LAYOUT_FLEX_FILES = 4,
615 	LAYOUT_SCSI = 5,
616 	LAYOUT_TYPE_MAX
617 };
618 
619 /* used for both layout return and recall */
620 enum pnfs_layoutreturn_type {
621 	RETURN_FILE = 1,
622 	RETURN_FSID = 2,
623 	RETURN_ALL  = 3
624 };
625 
626 enum pnfs_iomode {
627 	IOMODE_READ = 1,
628 	IOMODE_RW = 2,
629 	IOMODE_ANY = 3,
630 };
631 
632 enum pnfs_notify_deviceid_type4 {
633 	NOTIFY_DEVICEID4_CHANGE = 1 << 1,
634 	NOTIFY_DEVICEID4_DELETE = 1 << 2,
635 };
636 
637 enum pnfs_block_volume_type {
638 	PNFS_BLOCK_VOLUME_SIMPLE	= 0,
639 	PNFS_BLOCK_VOLUME_SLICE		= 1,
640 	PNFS_BLOCK_VOLUME_CONCAT	= 2,
641 	PNFS_BLOCK_VOLUME_STRIPE	= 3,
642 	PNFS_BLOCK_VOLUME_SCSI		= 4,
643 };
644 
645 enum pnfs_block_extent_state {
646 	PNFS_BLOCK_READWRITE_DATA	= 0,
647 	PNFS_BLOCK_READ_DATA		= 1,
648 	PNFS_BLOCK_INVALID_DATA		= 2,
649 	PNFS_BLOCK_NONE_DATA		= 3,
650 };
651 
652 /* on the wire size of a block layout extent */
653 #define PNFS_BLOCK_EXTENT_SIZE \
654 	(7 * sizeof(__be32) + NFS4_DEVICEID4_SIZE)
655 
656 /* on the wire size of a scsi commit range */
657 #define PNFS_SCSI_RANGE_SIZE \
658 	(4 * sizeof(__be32))
659 
660 enum scsi_code_set {
661 	PS_CODE_SET_BINARY	= 1,
662 	PS_CODE_SET_ASCII	= 2,
663 	PS_CODE_SET_UTF8	= 3
664 };
665 
666 enum scsi_designator_type {
667 	PS_DESIGNATOR_T10	= 1,
668 	PS_DESIGNATOR_EUI64	= 2,
669 	PS_DESIGNATOR_NAA	= 3,
670 	PS_DESIGNATOR_NAME	= 8
671 };
672 
673 #define NFL4_UFLG_MASK			0x0000003F
674 #define NFL4_UFLG_DENSE			0x00000001
675 #define NFL4_UFLG_COMMIT_THRU_MDS	0x00000002
676 #define NFL4_UFLG_STRIPE_UNIT_SIZE_MASK	0xFFFFFFC0
677 
678 /* Encoded in the loh_body field of type layouthint4 */
679 enum filelayout_hint_care4 {
680 	NFLH4_CARE_DENSE		= NFL4_UFLG_DENSE,
681 	NFLH4_CARE_COMMIT_THRU_MDS	= NFL4_UFLG_COMMIT_THRU_MDS,
682 	NFLH4_CARE_STRIPE_UNIT_SIZE	= 0x00000040,
683 	NFLH4_CARE_STRIPE_COUNT		= 0x00000080
684 };
685 
686 #define NFS4_DEVICEID4_SIZE 16
687 
688 struct nfs4_deviceid {
689 	char data[NFS4_DEVICEID4_SIZE];
690 };
691 
692 enum data_content4 {
693 	NFS4_CONTENT_DATA		= 0,
694 	NFS4_CONTENT_HOLE		= 1,
695 };
696 
697 enum pnfs_update_layout_reason {
698 	PNFS_UPDATE_LAYOUT_UNKNOWN = 0,
699 	PNFS_UPDATE_LAYOUT_NO_PNFS,
700 	PNFS_UPDATE_LAYOUT_RD_ZEROLEN,
701 	PNFS_UPDATE_LAYOUT_MDSTHRESH,
702 	PNFS_UPDATE_LAYOUT_NOMEM,
703 	PNFS_UPDATE_LAYOUT_BULK_RECALL,
704 	PNFS_UPDATE_LAYOUT_IO_TEST_FAIL,
705 	PNFS_UPDATE_LAYOUT_FOUND_CACHED,
706 	PNFS_UPDATE_LAYOUT_RETURN,
707 	PNFS_UPDATE_LAYOUT_RETRY,
708 	PNFS_UPDATE_LAYOUT_BLOCKED,
709 	PNFS_UPDATE_LAYOUT_INVALID_OPEN,
710 	PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET,
711 	PNFS_UPDATE_LAYOUT_EXIT,
712 };
713 
714 #define NFS4_OP_MAP_NUM_LONGS					\
715 	DIV_ROUND_UP(LAST_NFS4_OP, 8 * sizeof(unsigned long))
716 #define NFS4_OP_MAP_NUM_WORDS \
717 	(NFS4_OP_MAP_NUM_LONGS * sizeof(unsigned long) / sizeof(u32))
718 struct nfs4_op_map {
719 	union {
720 		unsigned long longs[NFS4_OP_MAP_NUM_LONGS];
721 		u32 words[NFS4_OP_MAP_NUM_WORDS];
722 	} u;
723 };
724 
725 struct nfs42_netaddr {
726 	char		netid[RPCBIND_MAXNETIDLEN];
727 	char		addr[RPCBIND_MAXUADDRLEN + 1];
728 	u32		netid_len;
729 	u32		addr_len;
730 };
731 
732 enum netloc_type4 {
733 	NL4_NAME		= 1,
734 	NL4_URL			= 2,
735 	NL4_NETADDR		= 3,
736 };
737 
738 struct nl4_server {
739 	enum netloc_type4	nl4_type;
740 	union {
741 		struct { /* NL4_NAME, NL4_URL */
742 			int	nl4_str_sz;
743 			char	nl4_str[NFS4_OPAQUE_LIMIT + 1];
744 		};
745 		struct nfs42_netaddr	nl4_addr; /* NL4_NETADDR */
746 	} u;
747 };
748 
749 enum nfs4_change_attr_type {
750 	NFS4_CHANGE_TYPE_IS_MONOTONIC_INCR = 0,
751 	NFS4_CHANGE_TYPE_IS_VERSION_COUNTER = 1,
752 	NFS4_CHANGE_TYPE_IS_VERSION_COUNTER_NOPNFS = 2,
753 	NFS4_CHANGE_TYPE_IS_TIME_METADATA = 3,
754 	NFS4_CHANGE_TYPE_IS_UNDEFINED = 4,
755 };
756 
757 /*
758  * Options for setxattr. These match the flags for setxattr(2).
759  */
760 enum nfs4_setxattr_options {
761 	SETXATTR4_EITHER	= 0,
762 	SETXATTR4_CREATE	= 1,
763 	SETXATTR4_REPLACE	= 2,
764 };
765 
766 enum {
767 	RCA4_TYPE_MASK_RDATA_DLG	= 0,
768 	RCA4_TYPE_MASK_WDATA_DLG	= 1,
769 	RCA4_TYPE_MASK_DIR_DLG		= 2,
770 	RCA4_TYPE_MASK_FILE_LAYOUT	= 3,
771 	RCA4_TYPE_MASK_BLK_LAYOUT	= 4,
772 	RCA4_TYPE_MASK_OBJ_LAYOUT_MIN	= 8,
773 	RCA4_TYPE_MASK_OBJ_LAYOUT_MAX	= 9,
774 	RCA4_TYPE_MASK_OTHER_LAYOUT_MIN	= 12,
775 	RCA4_TYPE_MASK_OTHER_LAYOUT_MAX	= 15,
776 };
777 
778 enum nfs_cb_opnum4 {
779 	OP_CB_GETATTR = 3,
780 	OP_CB_RECALL  = 4,
781 
782 	/* Callback operations new to NFSv4.1 */
783 	OP_CB_LAYOUTRECALL  = 5,
784 	OP_CB_NOTIFY        = 6,
785 	OP_CB_PUSH_DELEG    = 7,
786 	OP_CB_RECALL_ANY    = 8,
787 	OP_CB_RECALLABLE_OBJ_AVAIL = 9,
788 	OP_CB_RECALL_SLOT   = 10,
789 	OP_CB_SEQUENCE      = 11,
790 	OP_CB_WANTS_CANCELLED = 12,
791 	OP_CB_NOTIFY_LOCK   = 13,
792 	OP_CB_NOTIFY_DEVICEID = 14,
793 
794 	/* Callback operations new to NFSv4.2 */
795 	OP_CB_OFFLOAD = 15,
796 
797 	OP_CB_ILLEGAL = 10044,
798 };
799 
800 #endif
801