cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

nfs4.h (19621B)


      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
     21enum nfs4_acl_whotype {
     22	NFS4_ACL_WHO_NAMED = 0,
     23	NFS4_ACL_WHO_OWNER,
     24	NFS4_ACL_WHO_GROUP,
     25	NFS4_ACL_WHO_EVERYONE,
     26};
     27
     28struct nfs4_ace {
     29	uint32_t	type;
     30	uint32_t	flag;
     31	uint32_t	access_mask;
     32	int		whotype;
     33	union {
     34		kuid_t	who_uid;
     35		kgid_t	who_gid;
     36	};
     37};
     38
     39struct nfs4_acl {
     40	uint32_t	naces;
     41	struct nfs4_ace	aces[];
     42};
     43
     44#define NFS4_MAXLABELLEN	2048
     45
     46struct nfs4_label {
     47	uint32_t	lfs;
     48	uint32_t	pi;
     49	u32		len;
     50	char	*label;
     51};
     52
     53typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier;
     54
     55struct nfs4_stateid_struct {
     56	union {
     57		char data[NFS4_STATEID_SIZE];
     58		struct {
     59			__be32 seqid;
     60			char other[NFS4_STATEID_OTHER_SIZE];
     61		} __attribute__ ((packed));
     62	};
     63
     64	enum {
     65		NFS4_INVALID_STATEID_TYPE = 0,
     66		NFS4_SPECIAL_STATEID_TYPE,
     67		NFS4_OPEN_STATEID_TYPE,
     68		NFS4_LOCK_STATEID_TYPE,
     69		NFS4_DELEGATION_STATEID_TYPE,
     70		NFS4_LAYOUT_STATEID_TYPE,
     71		NFS4_PNFS_DS_STATEID_TYPE,
     72		NFS4_REVOKED_STATEID_TYPE,
     73	} type;
     74};
     75
     76typedef struct nfs4_stateid_struct nfs4_stateid;
     77
     78enum nfs_opnum4 {
     79	OP_ACCESS = 3,
     80	OP_CLOSE = 4,
     81	OP_COMMIT = 5,
     82	OP_CREATE = 6,
     83	OP_DELEGPURGE = 7,
     84	OP_DELEGRETURN = 8,
     85	OP_GETATTR = 9,
     86	OP_GETFH = 10,
     87	OP_LINK = 11,
     88	OP_LOCK = 12,
     89	OP_LOCKT = 13,
     90	OP_LOCKU = 14,
     91	OP_LOOKUP = 15,
     92	OP_LOOKUPP = 16,
     93	OP_NVERIFY = 17,
     94	OP_OPEN = 18,
     95	OP_OPENATTR = 19,
     96	OP_OPEN_CONFIRM = 20,
     97	OP_OPEN_DOWNGRADE = 21,
     98	OP_PUTFH = 22,
     99	OP_PUTPUBFH = 23,
    100	OP_PUTROOTFH = 24,
    101	OP_READ = 25,
    102	OP_READDIR = 26,
    103	OP_READLINK = 27,
    104	OP_REMOVE = 28,
    105	OP_RENAME = 29,
    106	OP_RENEW = 30,
    107	OP_RESTOREFH = 31,
    108	OP_SAVEFH = 32,
    109	OP_SECINFO = 33,
    110	OP_SETATTR = 34,
    111	OP_SETCLIENTID = 35,
    112	OP_SETCLIENTID_CONFIRM = 36,
    113	OP_VERIFY = 37,
    114	OP_WRITE = 38,
    115	OP_RELEASE_LOCKOWNER = 39,
    116
    117	/* nfs41 */
    118	OP_BACKCHANNEL_CTL = 40,
    119	OP_BIND_CONN_TO_SESSION = 41,
    120	OP_EXCHANGE_ID = 42,
    121	OP_CREATE_SESSION = 43,
    122	OP_DESTROY_SESSION = 44,
    123	OP_FREE_STATEID = 45,
    124	OP_GET_DIR_DELEGATION = 46,
    125	OP_GETDEVICEINFO = 47,
    126	OP_GETDEVICELIST = 48,
    127	OP_LAYOUTCOMMIT = 49,
    128	OP_LAYOUTGET = 50,
    129	OP_LAYOUTRETURN = 51,
    130	OP_SECINFO_NO_NAME = 52,
    131	OP_SEQUENCE = 53,
    132	OP_SET_SSV = 54,
    133	OP_TEST_STATEID = 55,
    134	OP_WANT_DELEGATION = 56,
    135	OP_DESTROY_CLIENTID = 57,
    136	OP_RECLAIM_COMPLETE = 58,
    137
    138	/* nfs42 */
    139	OP_ALLOCATE = 59,
    140	OP_COPY = 60,
    141	OP_COPY_NOTIFY = 61,
    142	OP_DEALLOCATE = 62,
    143	OP_IO_ADVISE = 63,
    144	OP_LAYOUTERROR = 64,
    145	OP_LAYOUTSTATS = 65,
    146	OP_OFFLOAD_CANCEL = 66,
    147	OP_OFFLOAD_STATUS = 67,
    148	OP_READ_PLUS = 68,
    149	OP_SEEK = 69,
    150	OP_WRITE_SAME = 70,
    151	OP_CLONE = 71,
    152
    153	/* xattr support (RFC8726) */
    154	OP_GETXATTR                = 72,
    155	OP_SETXATTR                = 73,
    156	OP_LISTXATTRS              = 74,
    157	OP_REMOVEXATTR             = 75,
    158
    159	OP_ILLEGAL = 10044,
    160};
    161
    162/*Defining first and last NFS4 operations implemented.
    163Needs to be updated if more operations are defined in future.*/
    164
    165#define FIRST_NFS4_OP	OP_ACCESS
    166#define LAST_NFS40_OP	OP_RELEASE_LOCKOWNER
    167#define LAST_NFS41_OP	OP_RECLAIM_COMPLETE
    168#define LAST_NFS42_OP	OP_REMOVEXATTR
    169#define LAST_NFS4_OP	LAST_NFS42_OP
    170
    171enum nfsstat4 {
    172	NFS4_OK = 0,
    173	NFS4ERR_PERM = 1,
    174	NFS4ERR_NOENT = 2,
    175	NFS4ERR_IO = 5,
    176	NFS4ERR_NXIO = 6,
    177	NFS4ERR_ACCESS = 13,
    178	NFS4ERR_EXIST = 17,
    179	NFS4ERR_XDEV = 18,
    180	/* Unused/reserved 19 */
    181	NFS4ERR_NOTDIR = 20,
    182	NFS4ERR_ISDIR = 21,
    183	NFS4ERR_INVAL = 22,
    184	NFS4ERR_FBIG = 27,
    185	NFS4ERR_NOSPC = 28,
    186	NFS4ERR_ROFS = 30,
    187	NFS4ERR_MLINK = 31,
    188	NFS4ERR_NAMETOOLONG = 63,
    189	NFS4ERR_NOTEMPTY = 66,
    190	NFS4ERR_DQUOT = 69,
    191	NFS4ERR_STALE = 70,
    192	NFS4ERR_BADHANDLE = 10001,
    193	NFS4ERR_BAD_COOKIE = 10003,
    194	NFS4ERR_NOTSUPP = 10004,
    195	NFS4ERR_TOOSMALL = 10005,
    196	NFS4ERR_SERVERFAULT = 10006,
    197	NFS4ERR_BADTYPE = 10007,
    198	NFS4ERR_DELAY = 10008,
    199	NFS4ERR_SAME = 10009,
    200	NFS4ERR_DENIED = 10010,
    201	NFS4ERR_EXPIRED = 10011,
    202	NFS4ERR_LOCKED = 10012,
    203	NFS4ERR_GRACE = 10013,
    204	NFS4ERR_FHEXPIRED = 10014,
    205	NFS4ERR_SHARE_DENIED = 10015,
    206	NFS4ERR_WRONGSEC = 10016,
    207	NFS4ERR_CLID_INUSE = 10017,
    208	NFS4ERR_RESOURCE = 10018,
    209	NFS4ERR_MOVED = 10019,
    210	NFS4ERR_NOFILEHANDLE = 10020,
    211	NFS4ERR_MINOR_VERS_MISMATCH = 10021,
    212	NFS4ERR_STALE_CLIENTID = 10022,
    213	NFS4ERR_STALE_STATEID = 10023,
    214	NFS4ERR_OLD_STATEID = 10024,
    215	NFS4ERR_BAD_STATEID = 10025,
    216	NFS4ERR_BAD_SEQID = 10026,
    217	NFS4ERR_NOT_SAME = 10027,
    218	NFS4ERR_LOCK_RANGE = 10028,
    219	NFS4ERR_SYMLINK = 10029,
    220	NFS4ERR_RESTOREFH = 10030,
    221	NFS4ERR_LEASE_MOVED = 10031,
    222	NFS4ERR_ATTRNOTSUPP = 10032,
    223	NFS4ERR_NO_GRACE = 10033,
    224	NFS4ERR_RECLAIM_BAD = 10034,
    225	NFS4ERR_RECLAIM_CONFLICT = 10035,
    226	NFS4ERR_BADXDR = 10036,
    227	NFS4ERR_LOCKS_HELD = 10037,
    228	NFS4ERR_OPENMODE = 10038,
    229	NFS4ERR_BADOWNER = 10039,
    230	NFS4ERR_BADCHAR = 10040,
    231	NFS4ERR_BADNAME = 10041,
    232	NFS4ERR_BAD_RANGE = 10042,
    233	NFS4ERR_LOCK_NOTSUPP = 10043,
    234	NFS4ERR_OP_ILLEGAL = 10044,
    235	NFS4ERR_DEADLOCK = 10045,
    236	NFS4ERR_FILE_OPEN = 10046,
    237	NFS4ERR_ADMIN_REVOKED = 10047,
    238	NFS4ERR_CB_PATH_DOWN = 10048,
    239
    240	/* nfs41 */
    241	NFS4ERR_BADIOMODE	= 10049,
    242	NFS4ERR_BADLAYOUT	= 10050,
    243	NFS4ERR_BAD_SESSION_DIGEST = 10051,
    244	NFS4ERR_BADSESSION	= 10052,
    245	NFS4ERR_BADSLOT		= 10053,
    246	NFS4ERR_COMPLETE_ALREADY = 10054,
    247	NFS4ERR_CONN_NOT_BOUND_TO_SESSION = 10055,
    248	NFS4ERR_DELEG_ALREADY_WANTED = 10056,
    249	NFS4ERR_BACK_CHAN_BUSY	= 10057,	/* backchan reqs outstanding */
    250	NFS4ERR_LAYOUTTRYLATER	= 10058,
    251	NFS4ERR_LAYOUTUNAVAILABLE = 10059,
    252	NFS4ERR_NOMATCHING_LAYOUT = 10060,
    253	NFS4ERR_RECALLCONFLICT	= 10061,
    254	NFS4ERR_UNKNOWN_LAYOUTTYPE = 10062,
    255	NFS4ERR_SEQ_MISORDERED = 10063, 	/* unexpected seq.id in req */
    256	NFS4ERR_SEQUENCE_POS	= 10064,	/* [CB_]SEQ. op not 1st op */
    257	NFS4ERR_REQ_TOO_BIG	= 10065,	/* request too big */
    258	NFS4ERR_REP_TOO_BIG	= 10066,	/* reply too big */
    259	NFS4ERR_REP_TOO_BIG_TO_CACHE = 10067,	/* rep. not all cached */
    260	NFS4ERR_RETRY_UNCACHED_REP = 10068,	/* retry & rep. uncached */
    261	NFS4ERR_UNSAFE_COMPOUND = 10069,	/* retry/recovery too hard */
    262	NFS4ERR_TOO_MANY_OPS	= 10070,	/* too many ops in [CB_]COMP */
    263	NFS4ERR_OP_NOT_IN_SESSION = 10071,	/* op needs [CB_]SEQ. op */
    264	NFS4ERR_HASH_ALG_UNSUPP = 10072,	/* hash alg. not supp. */
    265						/* Error 10073 is unused. */
    266	NFS4ERR_CLIENTID_BUSY	= 10074,	/* clientid has state */
    267	NFS4ERR_PNFS_IO_HOLE	= 10075,	/* IO to _SPARSE file hole */
    268	NFS4ERR_SEQ_FALSE_RETRY	= 10076,	/* retry not original */
    269	NFS4ERR_BAD_HIGH_SLOT	= 10077,	/* sequence arg bad */
    270	NFS4ERR_DEADSESSION	= 10078,	/* persistent session dead */
    271	NFS4ERR_ENCR_ALG_UNSUPP = 10079,	/* SSV alg mismatch */
    272	NFS4ERR_PNFS_NO_LAYOUT	= 10080,	/* direct I/O with no layout */
    273	NFS4ERR_NOT_ONLY_OP	= 10081,	/* bad compound */
    274	NFS4ERR_WRONG_CRED	= 10082,	/* permissions:state change */
    275	NFS4ERR_WRONG_TYPE	= 10083,	/* current operation mismatch */
    276	NFS4ERR_DIRDELEG_UNAVAIL = 10084,	/* no directory delegation */
    277	NFS4ERR_REJECT_DELEG	= 10085,	/* on callback */
    278	NFS4ERR_RETURNCONFLICT	= 10086,	/* outstanding layoutreturn */
    279	NFS4ERR_DELEG_REVOKED	= 10087,	/* deleg./layout revoked */
    280
    281	/* nfs42 */
    282	NFS4ERR_PARTNER_NOTSUPP	= 10088,
    283	NFS4ERR_PARTNER_NO_AUTH	= 10089,
    284	NFS4ERR_UNION_NOTSUPP = 10090,
    285	NFS4ERR_OFFLOAD_DENIED = 10091,
    286	NFS4ERR_WRONG_LFS = 10092,
    287	NFS4ERR_BADLABEL = 10093,
    288	NFS4ERR_OFFLOAD_NO_REQS = 10094,
    289
    290	/* xattr (RFC8276) */
    291	NFS4ERR_NOXATTR        = 10095,
    292	NFS4ERR_XATTR2BIG      = 10096,
    293};
    294
    295/* error codes for internal client use */
    296#define NFS4ERR_RESET_TO_MDS   12001
    297#define NFS4ERR_RESET_TO_PNFS  12002
    298
    299static inline bool seqid_mutating_err(u32 err)
    300{
    301	/* See RFC 7530, section 9.1.7 */
    302	switch (err) {
    303	case NFS4ERR_STALE_CLIENTID:
    304	case NFS4ERR_STALE_STATEID:
    305	case NFS4ERR_BAD_STATEID:
    306	case NFS4ERR_BAD_SEQID:
    307	case NFS4ERR_BADXDR:
    308	case NFS4ERR_RESOURCE:
    309	case NFS4ERR_NOFILEHANDLE:
    310	case NFS4ERR_MOVED:
    311		return false;
    312	}
    313	return true;
    314}
    315
    316/*
    317 * Note: NF4BAD is not actually part of the protocol; it is just used
    318 * internally by nfsd.
    319 */
    320enum nfs_ftype4 {
    321	NF4BAD		= 0,
    322        NF4REG          = 1,    /* Regular File */
    323        NF4DIR          = 2,    /* Directory */
    324        NF4BLK          = 3,    /* Special File - block device */
    325        NF4CHR          = 4,    /* Special File - character device */
    326        NF4LNK          = 5,    /* Symbolic Link */
    327        NF4SOCK         = 6,    /* Special File - socket */
    328        NF4FIFO         = 7,    /* Special File - fifo */
    329        NF4ATTRDIR      = 8,    /* Attribute Directory */
    330        NF4NAMEDATTR    = 9     /* Named Attribute */
    331};
    332
    333enum open_claim_type4 {
    334	NFS4_OPEN_CLAIM_NULL = 0,
    335	NFS4_OPEN_CLAIM_PREVIOUS = 1,
    336	NFS4_OPEN_CLAIM_DELEGATE_CUR = 2,
    337	NFS4_OPEN_CLAIM_DELEGATE_PREV = 3,
    338	NFS4_OPEN_CLAIM_FH = 4, /* 4.1 */
    339	NFS4_OPEN_CLAIM_DELEG_CUR_FH = 5, /* 4.1 */
    340	NFS4_OPEN_CLAIM_DELEG_PREV_FH = 6, /* 4.1 */
    341};
    342
    343enum opentype4 {
    344	NFS4_OPEN_NOCREATE = 0,
    345	NFS4_OPEN_CREATE = 1
    346};
    347
    348enum createmode4 {
    349	NFS4_CREATE_UNCHECKED = 0,
    350	NFS4_CREATE_GUARDED = 1,
    351	NFS4_CREATE_EXCLUSIVE = 2,
    352	/*
    353	 * New to NFSv4.1. If session is persistent,
    354	 * GUARDED4 MUST be used. Otherwise, use
    355	 * EXCLUSIVE4_1 instead of EXCLUSIVE4.
    356	 */
    357	NFS4_CREATE_EXCLUSIVE4_1 = 3
    358};
    359
    360enum limit_by4 {
    361	NFS4_LIMIT_SIZE = 1,
    362	NFS4_LIMIT_BLOCKS = 2
    363};
    364
    365enum open_delegation_type4 {
    366	NFS4_OPEN_DELEGATE_NONE = 0,
    367	NFS4_OPEN_DELEGATE_READ = 1,
    368	NFS4_OPEN_DELEGATE_WRITE = 2,
    369	NFS4_OPEN_DELEGATE_NONE_EXT = 3, /* 4.1 */
    370};
    371
    372enum why_no_delegation4 { /* new to v4.1 */
    373	WND4_NOT_WANTED = 0,
    374	WND4_CONTENTION = 1,
    375	WND4_RESOURCE = 2,
    376	WND4_NOT_SUPP_FTYPE = 3,
    377	WND4_WRITE_DELEG_NOT_SUPP_FTYPE = 4,
    378	WND4_NOT_SUPP_UPGRADE = 5,
    379	WND4_NOT_SUPP_DOWNGRADE = 6,
    380	WND4_CANCELLED = 7,
    381	WND4_IS_DIR = 8,
    382};
    383
    384enum lock_type4 {
    385	NFS4_UNLOCK_LT = 0,
    386	NFS4_READ_LT = 1,
    387	NFS4_WRITE_LT = 2,
    388	NFS4_READW_LT = 3,
    389	NFS4_WRITEW_LT = 4
    390};
    391
    392
    393/* Mandatory Attributes */
    394#define FATTR4_WORD0_SUPPORTED_ATTRS    (1UL << 0)
    395#define FATTR4_WORD0_TYPE               (1UL << 1)
    396#define FATTR4_WORD0_FH_EXPIRE_TYPE     (1UL << 2)
    397#define FATTR4_WORD0_CHANGE             (1UL << 3)
    398#define FATTR4_WORD0_SIZE               (1UL << 4)
    399#define FATTR4_WORD0_LINK_SUPPORT       (1UL << 5)
    400#define FATTR4_WORD0_SYMLINK_SUPPORT    (1UL << 6)
    401#define FATTR4_WORD0_NAMED_ATTR         (1UL << 7)
    402#define FATTR4_WORD0_FSID               (1UL << 8)
    403#define FATTR4_WORD0_UNIQUE_HANDLES     (1UL << 9)
    404#define FATTR4_WORD0_LEASE_TIME         (1UL << 10)
    405#define FATTR4_WORD0_RDATTR_ERROR       (1UL << 11)
    406/* Mandatory in NFSv4.1 */
    407#define FATTR4_WORD2_SUPPATTR_EXCLCREAT (1UL << 11)
    408
    409/* Recommended Attributes */
    410#define FATTR4_WORD0_ACL                (1UL << 12)
    411#define FATTR4_WORD0_ACLSUPPORT         (1UL << 13)
    412#define FATTR4_WORD0_ARCHIVE            (1UL << 14)
    413#define FATTR4_WORD0_CANSETTIME         (1UL << 15)
    414#define FATTR4_WORD0_CASE_INSENSITIVE   (1UL << 16)
    415#define FATTR4_WORD0_CASE_PRESERVING    (1UL << 17)
    416#define FATTR4_WORD0_CHOWN_RESTRICTED   (1UL << 18)
    417#define FATTR4_WORD0_FILEHANDLE         (1UL << 19)
    418#define FATTR4_WORD0_FILEID             (1UL << 20)
    419#define FATTR4_WORD0_FILES_AVAIL        (1UL << 21)
    420#define FATTR4_WORD0_FILES_FREE         (1UL << 22)
    421#define FATTR4_WORD0_FILES_TOTAL        (1UL << 23)
    422#define FATTR4_WORD0_FS_LOCATIONS       (1UL << 24)
    423#define FATTR4_WORD0_HIDDEN             (1UL << 25)
    424#define FATTR4_WORD0_HOMOGENEOUS        (1UL << 26)
    425#define FATTR4_WORD0_MAXFILESIZE        (1UL << 27)
    426#define FATTR4_WORD0_MAXLINK            (1UL << 28)
    427#define FATTR4_WORD0_MAXNAME            (1UL << 29)
    428#define FATTR4_WORD0_MAXREAD            (1UL << 30)
    429#define FATTR4_WORD0_MAXWRITE           (1UL << 31)
    430#define FATTR4_WORD1_MIMETYPE           (1UL << 0)
    431#define FATTR4_WORD1_MODE               (1UL << 1)
    432#define FATTR4_WORD1_NO_TRUNC           (1UL << 2)
    433#define FATTR4_WORD1_NUMLINKS           (1UL << 3)
    434#define FATTR4_WORD1_OWNER              (1UL << 4)
    435#define FATTR4_WORD1_OWNER_GROUP        (1UL << 5)
    436#define FATTR4_WORD1_QUOTA_HARD         (1UL << 6)
    437#define FATTR4_WORD1_QUOTA_SOFT         (1UL << 7)
    438#define FATTR4_WORD1_QUOTA_USED         (1UL << 8)
    439#define FATTR4_WORD1_RAWDEV             (1UL << 9)
    440#define FATTR4_WORD1_SPACE_AVAIL        (1UL << 10)
    441#define FATTR4_WORD1_SPACE_FREE         (1UL << 11)
    442#define FATTR4_WORD1_SPACE_TOTAL        (1UL << 12)
    443#define FATTR4_WORD1_SPACE_USED         (1UL << 13)
    444#define FATTR4_WORD1_SYSTEM             (1UL << 14)
    445#define FATTR4_WORD1_TIME_ACCESS        (1UL << 15)
    446#define FATTR4_WORD1_TIME_ACCESS_SET    (1UL << 16)
    447#define FATTR4_WORD1_TIME_BACKUP        (1UL << 17)
    448#define FATTR4_WORD1_TIME_CREATE        (1UL << 18)
    449#define FATTR4_WORD1_TIME_DELTA         (1UL << 19)
    450#define FATTR4_WORD1_TIME_METADATA      (1UL << 20)
    451#define FATTR4_WORD1_TIME_MODIFY        (1UL << 21)
    452#define FATTR4_WORD1_TIME_MODIFY_SET    (1UL << 22)
    453#define FATTR4_WORD1_MOUNTED_ON_FILEID  (1UL << 23)
    454#define FATTR4_WORD1_DACL               (1UL << 26)
    455#define FATTR4_WORD1_SACL               (1UL << 27)
    456#define FATTR4_WORD1_FS_LAYOUT_TYPES    (1UL << 30)
    457#define FATTR4_WORD2_LAYOUT_TYPES       (1UL << 0)
    458#define FATTR4_WORD2_LAYOUT_BLKSIZE     (1UL << 1)
    459#define FATTR4_WORD2_MDSTHRESHOLD       (1UL << 4)
    460#define FATTR4_WORD2_CLONE_BLKSIZE	(1UL << 13)
    461#define FATTR4_WORD2_CHANGE_ATTR_TYPE	(1UL << 15)
    462#define FATTR4_WORD2_SECURITY_LABEL     (1UL << 16)
    463#define FATTR4_WORD2_MODE_UMASK		(1UL << 17)
    464#define FATTR4_WORD2_XATTR_SUPPORT	(1UL << 18)
    465
    466/* MDS threshold bitmap bits */
    467#define THRESHOLD_RD                    (1UL << 0)
    468#define THRESHOLD_WR                    (1UL << 1)
    469#define THRESHOLD_RD_IO                 (1UL << 2)
    470#define THRESHOLD_WR_IO                 (1UL << 3)
    471
    472#define NFSPROC4_NULL 0
    473#define NFSPROC4_COMPOUND 1
    474#define NFS4_VERSION 4
    475#define NFS4_MINOR_VERSION 0
    476
    477#define NFS4_DEBUG 1
    478
    479/*
    480 * Index of predefined Linux client operations
    481 *
    482 * To ensure that /proc/net/rpc/nfs remains correctly ordered, please
    483 * append only to this enum when adding new client operations.
    484 */
    485
    486enum {
    487	NFSPROC4_CLNT_NULL = 0,		/* Unused */
    488	NFSPROC4_CLNT_READ,
    489	NFSPROC4_CLNT_WRITE,
    490	NFSPROC4_CLNT_COMMIT,
    491	NFSPROC4_CLNT_OPEN,
    492	NFSPROC4_CLNT_OPEN_CONFIRM,
    493	NFSPROC4_CLNT_OPEN_NOATTR,
    494	NFSPROC4_CLNT_OPEN_DOWNGRADE,
    495	NFSPROC4_CLNT_CLOSE,
    496	NFSPROC4_CLNT_SETATTR,
    497	NFSPROC4_CLNT_FSINFO,
    498	NFSPROC4_CLNT_RENEW,
    499	NFSPROC4_CLNT_SETCLIENTID,
    500	NFSPROC4_CLNT_SETCLIENTID_CONFIRM,
    501	NFSPROC4_CLNT_LOCK,
    502	NFSPROC4_CLNT_LOCKT,
    503	NFSPROC4_CLNT_LOCKU,
    504	NFSPROC4_CLNT_ACCESS,
    505	NFSPROC4_CLNT_GETATTR,
    506	NFSPROC4_CLNT_LOOKUP,
    507	NFSPROC4_CLNT_LOOKUP_ROOT,
    508	NFSPROC4_CLNT_REMOVE,
    509	NFSPROC4_CLNT_RENAME,
    510	NFSPROC4_CLNT_LINK,
    511	NFSPROC4_CLNT_SYMLINK,
    512	NFSPROC4_CLNT_CREATE,
    513	NFSPROC4_CLNT_PATHCONF,
    514	NFSPROC4_CLNT_STATFS,
    515	NFSPROC4_CLNT_READLINK,
    516	NFSPROC4_CLNT_READDIR,
    517	NFSPROC4_CLNT_SERVER_CAPS,
    518	NFSPROC4_CLNT_DELEGRETURN,
    519	NFSPROC4_CLNT_GETACL,
    520	NFSPROC4_CLNT_SETACL,
    521	NFSPROC4_CLNT_FS_LOCATIONS,
    522	NFSPROC4_CLNT_RELEASE_LOCKOWNER,
    523	NFSPROC4_CLNT_SECINFO,
    524	NFSPROC4_CLNT_FSID_PRESENT,
    525
    526	NFSPROC4_CLNT_EXCHANGE_ID,
    527	NFSPROC4_CLNT_CREATE_SESSION,
    528	NFSPROC4_CLNT_DESTROY_SESSION,
    529	NFSPROC4_CLNT_SEQUENCE,
    530	NFSPROC4_CLNT_GET_LEASE_TIME,
    531	NFSPROC4_CLNT_RECLAIM_COMPLETE,
    532	NFSPROC4_CLNT_LAYOUTGET,
    533	NFSPROC4_CLNT_GETDEVICEINFO,
    534	NFSPROC4_CLNT_LAYOUTCOMMIT,
    535	NFSPROC4_CLNT_LAYOUTRETURN,
    536	NFSPROC4_CLNT_SECINFO_NO_NAME,
    537	NFSPROC4_CLNT_TEST_STATEID,
    538	NFSPROC4_CLNT_FREE_STATEID,
    539	NFSPROC4_CLNT_GETDEVICELIST,
    540	NFSPROC4_CLNT_BIND_CONN_TO_SESSION,
    541	NFSPROC4_CLNT_DESTROY_CLIENTID,
    542
    543	NFSPROC4_CLNT_SEEK,
    544	NFSPROC4_CLNT_ALLOCATE,
    545	NFSPROC4_CLNT_DEALLOCATE,
    546	NFSPROC4_CLNT_LAYOUTSTATS,
    547	NFSPROC4_CLNT_CLONE,
    548	NFSPROC4_CLNT_COPY,
    549	NFSPROC4_CLNT_OFFLOAD_CANCEL,
    550
    551	NFSPROC4_CLNT_LOOKUPP,
    552	NFSPROC4_CLNT_LAYOUTERROR,
    553	NFSPROC4_CLNT_COPY_NOTIFY,
    554
    555	NFSPROC4_CLNT_GETXATTR,
    556	NFSPROC4_CLNT_SETXATTR,
    557	NFSPROC4_CLNT_LISTXATTRS,
    558	NFSPROC4_CLNT_REMOVEXATTR,
    559	NFSPROC4_CLNT_READ_PLUS,
    560};
    561
    562/* nfs41 types */
    563struct nfs4_sessionid {
    564	unsigned char data[NFS4_MAX_SESSIONID_LEN];
    565};
    566
    567/* Create Session Flags */
    568#define SESSION4_PERSIST	0x001
    569#define SESSION4_BACK_CHAN	0x002
    570#define SESSION4_RDMA		0x004
    571
    572#define SESSION4_FLAG_MASK_A	0x007
    573
    574enum state_protect_how4 {
    575	SP4_NONE	= 0,
    576	SP4_MACH_CRED	= 1,
    577	SP4_SSV		= 2
    578};
    579
    580enum pnfs_layouttype {
    581	LAYOUT_NFSV4_1_FILES  = 1,
    582	LAYOUT_OSD2_OBJECTS = 2,
    583	LAYOUT_BLOCK_VOLUME = 3,
    584	LAYOUT_FLEX_FILES = 4,
    585	LAYOUT_SCSI = 5,
    586	LAYOUT_TYPE_MAX
    587};
    588
    589/* used for both layout return and recall */
    590enum pnfs_layoutreturn_type {
    591	RETURN_FILE = 1,
    592	RETURN_FSID = 2,
    593	RETURN_ALL  = 3
    594};
    595
    596enum pnfs_iomode {
    597	IOMODE_READ = 1,
    598	IOMODE_RW = 2,
    599	IOMODE_ANY = 3,
    600};
    601
    602enum pnfs_notify_deviceid_type4 {
    603	NOTIFY_DEVICEID4_CHANGE = 1 << 1,
    604	NOTIFY_DEVICEID4_DELETE = 1 << 2,
    605};
    606
    607enum pnfs_block_volume_type {
    608	PNFS_BLOCK_VOLUME_SIMPLE	= 0,
    609	PNFS_BLOCK_VOLUME_SLICE		= 1,
    610	PNFS_BLOCK_VOLUME_CONCAT	= 2,
    611	PNFS_BLOCK_VOLUME_STRIPE	= 3,
    612	PNFS_BLOCK_VOLUME_SCSI		= 4,
    613};
    614
    615enum pnfs_block_extent_state {
    616	PNFS_BLOCK_READWRITE_DATA	= 0,
    617	PNFS_BLOCK_READ_DATA		= 1,
    618	PNFS_BLOCK_INVALID_DATA		= 2,
    619	PNFS_BLOCK_NONE_DATA		= 3,
    620};
    621
    622/* on the wire size of a block layout extent */
    623#define PNFS_BLOCK_EXTENT_SIZE \
    624	(7 * sizeof(__be32) + NFS4_DEVICEID4_SIZE)
    625
    626/* on the wire size of a scsi commit range */
    627#define PNFS_SCSI_RANGE_SIZE \
    628	(4 * sizeof(__be32))
    629
    630enum scsi_code_set {
    631	PS_CODE_SET_BINARY	= 1,
    632	PS_CODE_SET_ASCII	= 2,
    633	PS_CODE_SET_UTF8	= 3
    634};
    635
    636enum scsi_designator_type {
    637	PS_DESIGNATOR_T10	= 1,
    638	PS_DESIGNATOR_EUI64	= 2,
    639	PS_DESIGNATOR_NAA	= 3,
    640	PS_DESIGNATOR_NAME	= 8
    641};
    642
    643#define NFL4_UFLG_MASK			0x0000003F
    644#define NFL4_UFLG_DENSE			0x00000001
    645#define NFL4_UFLG_COMMIT_THRU_MDS	0x00000002
    646#define NFL4_UFLG_STRIPE_UNIT_SIZE_MASK	0xFFFFFFC0
    647
    648/* Encoded in the loh_body field of type layouthint4 */
    649enum filelayout_hint_care4 {
    650	NFLH4_CARE_DENSE		= NFL4_UFLG_DENSE,
    651	NFLH4_CARE_COMMIT_THRU_MDS	= NFL4_UFLG_COMMIT_THRU_MDS,
    652	NFLH4_CARE_STRIPE_UNIT_SIZE	= 0x00000040,
    653	NFLH4_CARE_STRIPE_COUNT		= 0x00000080
    654};
    655
    656#define NFS4_DEVICEID4_SIZE 16
    657
    658struct nfs4_deviceid {
    659	char data[NFS4_DEVICEID4_SIZE];
    660};
    661
    662enum data_content4 {
    663	NFS4_CONTENT_DATA		= 0,
    664	NFS4_CONTENT_HOLE		= 1,
    665};
    666
    667enum pnfs_update_layout_reason {
    668	PNFS_UPDATE_LAYOUT_UNKNOWN = 0,
    669	PNFS_UPDATE_LAYOUT_NO_PNFS,
    670	PNFS_UPDATE_LAYOUT_RD_ZEROLEN,
    671	PNFS_UPDATE_LAYOUT_MDSTHRESH,
    672	PNFS_UPDATE_LAYOUT_NOMEM,
    673	PNFS_UPDATE_LAYOUT_BULK_RECALL,
    674	PNFS_UPDATE_LAYOUT_IO_TEST_FAIL,
    675	PNFS_UPDATE_LAYOUT_FOUND_CACHED,
    676	PNFS_UPDATE_LAYOUT_RETURN,
    677	PNFS_UPDATE_LAYOUT_RETRY,
    678	PNFS_UPDATE_LAYOUT_BLOCKED,
    679	PNFS_UPDATE_LAYOUT_INVALID_OPEN,
    680	PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET,
    681	PNFS_UPDATE_LAYOUT_EXIT,
    682};
    683
    684#define NFS4_OP_MAP_NUM_LONGS					\
    685	DIV_ROUND_UP(LAST_NFS4_OP, 8 * sizeof(unsigned long))
    686#define NFS4_OP_MAP_NUM_WORDS \
    687	(NFS4_OP_MAP_NUM_LONGS * sizeof(unsigned long) / sizeof(u32))
    688struct nfs4_op_map {
    689	union {
    690		unsigned long longs[NFS4_OP_MAP_NUM_LONGS];
    691		u32 words[NFS4_OP_MAP_NUM_WORDS];
    692	} u;
    693};
    694
    695struct nfs42_netaddr {
    696	char		netid[RPCBIND_MAXNETIDLEN];
    697	char		addr[RPCBIND_MAXUADDRLEN + 1];
    698	u32		netid_len;
    699	u32		addr_len;
    700};
    701
    702enum netloc_type4 {
    703	NL4_NAME		= 1,
    704	NL4_URL			= 2,
    705	NL4_NETADDR		= 3,
    706};
    707
    708struct nl4_server {
    709	enum netloc_type4	nl4_type;
    710	union {
    711		struct { /* NL4_NAME, NL4_URL */
    712			int	nl4_str_sz;
    713			char	nl4_str[NFS4_OPAQUE_LIMIT + 1];
    714		};
    715		struct nfs42_netaddr	nl4_addr; /* NL4_NETADDR */
    716	} u;
    717};
    718
    719enum nfs4_change_attr_type {
    720	NFS4_CHANGE_TYPE_IS_MONOTONIC_INCR = 0,
    721	NFS4_CHANGE_TYPE_IS_VERSION_COUNTER = 1,
    722	NFS4_CHANGE_TYPE_IS_VERSION_COUNTER_NOPNFS = 2,
    723	NFS4_CHANGE_TYPE_IS_TIME_METADATA = 3,
    724	NFS4_CHANGE_TYPE_IS_UNDEFINED = 4,
    725};
    726
    727/*
    728 * Options for setxattr. These match the flags for setxattr(2).
    729 */
    730enum nfs4_setxattr_options {
    731	SETXATTR4_EITHER	= 0,
    732	SETXATTR4_CREATE	= 1,
    733	SETXATTR4_REPLACE	= 2,
    734};
    735#endif