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