1*1c0d8861SChuck Lever /* SPDX-License-Identifier: GPL-2.0 */ 2*1c0d8861SChuck Lever /* 3*1c0d8861SChuck Lever * NFSv4 file attributes supported by this implementation 4*1c0d8861SChuck Lever */ 5*1c0d8861SChuck Lever 6*1c0d8861SChuck Lever #ifndef _LINUX_NFSD_ATTR4_H 7*1c0d8861SChuck Lever #define _LINUX_NFSD_ATTR4_H 8*1c0d8861SChuck Lever 9*1c0d8861SChuck Lever #include <linux/types.h> 10*1c0d8861SChuck Lever #include <linux/nfs4.h> 11*1c0d8861SChuck Lever 12*1c0d8861SChuck Lever /* 13*1c0d8861SChuck Lever * The following attributes are not implemented by NFSD: 14*1c0d8861SChuck Lever * ARCHIVE (deprecated anyway) 15*1c0d8861SChuck Lever * HIDDEN (unlikely to be supported any time soon) 16*1c0d8861SChuck Lever * MIMETYPE (unlikely to be supported any time soon) 17*1c0d8861SChuck Lever * QUOTA_* (unlikely to be supported any time soon) 18*1c0d8861SChuck Lever * SYSTEM (unlikely to be supported any time soon) 19*1c0d8861SChuck Lever * TIME_BACKUP (unlikely to be supported any time soon) 20*1c0d8861SChuck Lever */ 21*1c0d8861SChuck Lever #define NFSD4_SUPPORTED_ATTRS_WORD0 \ 22*1c0d8861SChuck Lever (FATTR4_WORD0_SUPPORTED_ATTRS | FATTR4_WORD0_TYPE | FATTR4_WORD0_FH_EXPIRE_TYPE \ 23*1c0d8861SChuck Lever | FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE | FATTR4_WORD0_LINK_SUPPORT \ 24*1c0d8861SChuck Lever | FATTR4_WORD0_SYMLINK_SUPPORT | FATTR4_WORD0_NAMED_ATTR | FATTR4_WORD0_FSID \ 25*1c0d8861SChuck Lever | FATTR4_WORD0_UNIQUE_HANDLES | FATTR4_WORD0_LEASE_TIME | FATTR4_WORD0_RDATTR_ERROR \ 26*1c0d8861SChuck Lever | FATTR4_WORD0_ACLSUPPORT | FATTR4_WORD0_CANSETTIME | FATTR4_WORD0_CASE_INSENSITIVE \ 27*1c0d8861SChuck Lever | FATTR4_WORD0_CASE_PRESERVING | FATTR4_WORD0_CHOWN_RESTRICTED \ 28*1c0d8861SChuck Lever | FATTR4_WORD0_FILEHANDLE | FATTR4_WORD0_FILEID | FATTR4_WORD0_FILES_AVAIL \ 29*1c0d8861SChuck Lever | FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL | FATTR4_WORD0_FS_LOCATIONS | FATTR4_WORD0_HOMOGENEOUS \ 30*1c0d8861SChuck Lever | FATTR4_WORD0_MAXFILESIZE | FATTR4_WORD0_MAXLINK | FATTR4_WORD0_MAXNAME \ 31*1c0d8861SChuck Lever | FATTR4_WORD0_MAXREAD | FATTR4_WORD0_MAXWRITE | FATTR4_WORD0_ACL) 32*1c0d8861SChuck Lever 33*1c0d8861SChuck Lever #define NFSD4_SUPPORTED_ATTRS_WORD1 \ 34*1c0d8861SChuck Lever (FATTR4_WORD1_MODE | FATTR4_WORD1_NO_TRUNC | FATTR4_WORD1_NUMLINKS \ 35*1c0d8861SChuck Lever | FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP | FATTR4_WORD1_RAWDEV \ 36*1c0d8861SChuck Lever | FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | FATTR4_WORD1_SPACE_TOTAL \ 37*1c0d8861SChuck Lever | FATTR4_WORD1_SPACE_USED | FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_ACCESS_SET \ 38*1c0d8861SChuck Lever | FATTR4_WORD1_TIME_DELTA | FATTR4_WORD1_TIME_METADATA | FATTR4_WORD1_TIME_CREATE \ 39*1c0d8861SChuck Lever | FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID) 40*1c0d8861SChuck Lever 41*1c0d8861SChuck Lever #define NFSD4_SUPPORTED_ATTRS_WORD2 0 42*1c0d8861SChuck Lever 43*1c0d8861SChuck Lever /* 4.1 */ 44*1c0d8861SChuck Lever #ifdef CONFIG_NFSD_PNFS 45*1c0d8861SChuck Lever #define PNFSD_SUPPORTED_ATTRS_WORD1 FATTR4_WORD1_FS_LAYOUT_TYPES 46*1c0d8861SChuck Lever #define PNFSD_SUPPORTED_ATTRS_WORD2 \ 47*1c0d8861SChuck Lever (FATTR4_WORD2_LAYOUT_BLKSIZE | FATTR4_WORD2_LAYOUT_TYPES) 48*1c0d8861SChuck Lever #else 49*1c0d8861SChuck Lever #define PNFSD_SUPPORTED_ATTRS_WORD1 0 50*1c0d8861SChuck Lever #define PNFSD_SUPPORTED_ATTRS_WORD2 0 51*1c0d8861SChuck Lever #endif /* CONFIG_NFSD_PNFS */ 52*1c0d8861SChuck Lever 53*1c0d8861SChuck Lever #define NFSD4_1_SUPPORTED_ATTRS_WORD0 \ 54*1c0d8861SChuck Lever NFSD4_SUPPORTED_ATTRS_WORD0 55*1c0d8861SChuck Lever 56*1c0d8861SChuck Lever #define NFSD4_1_SUPPORTED_ATTRS_WORD1 \ 57*1c0d8861SChuck Lever (NFSD4_SUPPORTED_ATTRS_WORD1 | PNFSD_SUPPORTED_ATTRS_WORD1) 58*1c0d8861SChuck Lever 59*1c0d8861SChuck Lever #define NFSD4_1_SUPPORTED_ATTRS_WORD2 \ 60*1c0d8861SChuck Lever (NFSD4_SUPPORTED_ATTRS_WORD2 | PNFSD_SUPPORTED_ATTRS_WORD2 | \ 61*1c0d8861SChuck Lever FATTR4_WORD2_SUPPATTR_EXCLCREAT) 62*1c0d8861SChuck Lever 63*1c0d8861SChuck Lever /* 4.2 */ 64*1c0d8861SChuck Lever #ifdef CONFIG_NFSD_V4_SECURITY_LABEL 65*1c0d8861SChuck Lever #define NFSD4_2_SECURITY_ATTRS FATTR4_WORD2_SECURITY_LABEL 66*1c0d8861SChuck Lever #else 67*1c0d8861SChuck Lever #define NFSD4_2_SECURITY_ATTRS 0 68*1c0d8861SChuck Lever #endif 69*1c0d8861SChuck Lever 70*1c0d8861SChuck Lever #ifdef CONFIG_NFSD_V4_POSIX_ACLS 71*1c0d8861SChuck Lever #define NFSD4_2_POSIX_ACL_ATTRS \ 72*1c0d8861SChuck Lever (FATTR4_WORD2_ACL_TRUEFORM | \ 73*1c0d8861SChuck Lever FATTR4_WORD2_ACL_TRUEFORM_SCOPE | \ 74*1c0d8861SChuck Lever FATTR4_WORD2_POSIX_DEFAULT_ACL | \ 75*1c0d8861SChuck Lever FATTR4_WORD2_POSIX_ACCESS_ACL) 76*1c0d8861SChuck Lever #else 77*1c0d8861SChuck Lever #define NFSD4_2_POSIX_ACL_ATTRS 0 78*1c0d8861SChuck Lever #endif 79*1c0d8861SChuck Lever 80*1c0d8861SChuck Lever #define NFSD4_2_SUPPORTED_ATTRS_WORD2 \ 81*1c0d8861SChuck Lever (NFSD4_1_SUPPORTED_ATTRS_WORD2 | \ 82*1c0d8861SChuck Lever FATTR4_WORD2_MODE_UMASK | \ 83*1c0d8861SChuck Lever FATTR4_WORD2_CLONE_BLKSIZE | \ 84*1c0d8861SChuck Lever NFSD4_2_SECURITY_ATTRS | \ 85*1c0d8861SChuck Lever FATTR4_WORD2_XATTR_SUPPORT | \ 86*1c0d8861SChuck Lever FATTR4_WORD2_TIME_DELEG_ACCESS | \ 87*1c0d8861SChuck Lever FATTR4_WORD2_TIME_DELEG_MODIFY | \ 88*1c0d8861SChuck Lever FATTR4_WORD2_OPEN_ARGUMENTS | \ 89*1c0d8861SChuck Lever NFSD4_2_POSIX_ACL_ATTRS) 90*1c0d8861SChuck Lever 91*1c0d8861SChuck Lever /* These will return ERR_INVAL if specified in GETATTR or READDIR. */ 92*1c0d8861SChuck Lever #define NFSD_WRITEONLY_ATTRS_WORD1 \ 93*1c0d8861SChuck Lever (FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET) 94*1c0d8861SChuck Lever 95*1c0d8861SChuck Lever /* 96*1c0d8861SChuck Lever * These are the only attrs allowed in CREATE/OPEN/SETATTR. Don't add 97*1c0d8861SChuck Lever * a writeable attribute here without also adding code to parse it to 98*1c0d8861SChuck Lever * nfsd4_decode_fattr4(). 99*1c0d8861SChuck Lever */ 100*1c0d8861SChuck Lever #define NFSD_WRITEABLE_ATTRS_WORD0 \ 101*1c0d8861SChuck Lever (FATTR4_WORD0_SIZE | FATTR4_WORD0_ACL) 102*1c0d8861SChuck Lever #define NFSD_WRITEABLE_ATTRS_WORD1 \ 103*1c0d8861SChuck Lever (FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP \ 104*1c0d8861SChuck Lever | FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_CREATE \ 105*1c0d8861SChuck Lever | FATTR4_WORD1_TIME_MODIFY_SET) 106*1c0d8861SChuck Lever #ifdef CONFIG_NFSD_V4_SECURITY_LABEL 107*1c0d8861SChuck Lever #define MAYBE_FATTR4_WORD2_SECURITY_LABEL \ 108*1c0d8861SChuck Lever FATTR4_WORD2_SECURITY_LABEL 109*1c0d8861SChuck Lever #else 110*1c0d8861SChuck Lever #define MAYBE_FATTR4_WORD2_SECURITY_LABEL 0 111*1c0d8861SChuck Lever #endif 112*1c0d8861SChuck Lever #ifdef CONFIG_NFSD_V4_POSIX_ACLS 113*1c0d8861SChuck Lever #define MAYBE_FATTR4_WORD2_POSIX_ACL_ATTRS \ 114*1c0d8861SChuck Lever FATTR4_WORD2_POSIX_DEFAULT_ACL | FATTR4_WORD2_POSIX_ACCESS_ACL 115*1c0d8861SChuck Lever #else 116*1c0d8861SChuck Lever #define MAYBE_FATTR4_WORD2_POSIX_ACL_ATTRS 0 117*1c0d8861SChuck Lever #endif 118*1c0d8861SChuck Lever #define NFSD_WRITEABLE_ATTRS_WORD2 \ 119*1c0d8861SChuck Lever (FATTR4_WORD2_MODE_UMASK \ 120*1c0d8861SChuck Lever | MAYBE_FATTR4_WORD2_SECURITY_LABEL \ 121*1c0d8861SChuck Lever | FATTR4_WORD2_TIME_DELEG_ACCESS \ 122*1c0d8861SChuck Lever | FATTR4_WORD2_TIME_DELEG_MODIFY \ 123*1c0d8861SChuck Lever | MAYBE_FATTR4_WORD2_POSIX_ACL_ATTRS \ 124*1c0d8861SChuck Lever ) 125*1c0d8861SChuck Lever 126*1c0d8861SChuck Lever #define NFSD_SUPPATTR_EXCLCREAT_WORD0 \ 127*1c0d8861SChuck Lever NFSD_WRITEABLE_ATTRS_WORD0 128*1c0d8861SChuck Lever /* 129*1c0d8861SChuck Lever * we currently store the exclusive create verifier in the v_{a,m}time 130*1c0d8861SChuck Lever * attributes so the client can't set these at create time using EXCLUSIVE4_1 131*1c0d8861SChuck Lever */ 132*1c0d8861SChuck Lever #define NFSD_SUPPATTR_EXCLCREAT_WORD1 \ 133*1c0d8861SChuck Lever (NFSD_WRITEABLE_ATTRS_WORD1 & \ 134*1c0d8861SChuck Lever ~(FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET)) 135*1c0d8861SChuck Lever /* 136*1c0d8861SChuck Lever * The FATTR4_WORD2_TIME_DELEG attributes are not to be allowed for 137*1c0d8861SChuck Lever * OPEN(create) with EXCLUSIVE4_1. It doesn't make sense to set a 138*1c0d8861SChuck Lever * delegated timestamp on a new file. 139*1c0d8861SChuck Lever * 140*1c0d8861SChuck Lever * This mask includes NFSv4.2-only attributes (e.g., POSIX ACLs). 141*1c0d8861SChuck Lever * Version filtering occurs via nfsd_suppattrs[] before this mask 142*1c0d8861SChuck Lever * is applied, so pre-4.2 clients never see unsupported attributes. 143*1c0d8861SChuck Lever */ 144*1c0d8861SChuck Lever #define NFSD_SUPPATTR_EXCLCREAT_WORD2 \ 145*1c0d8861SChuck Lever (NFSD_WRITEABLE_ATTRS_WORD2 & \ 146*1c0d8861SChuck Lever ~(FATTR4_WORD2_TIME_DELEG_ACCESS | FATTR4_WORD2_TIME_DELEG_MODIFY)) 147*1c0d8861SChuck Lever 148*1c0d8861SChuck Lever extern const u32 nfsd_suppattrs[3][3]; 149*1c0d8861SChuck Lever bmval_is_subset(const u32 * bm1,const u32 * bm2)150*1c0d8861SChuck Leverstatic inline bool bmval_is_subset(const u32 *bm1, const u32 *bm2) 151*1c0d8861SChuck Lever { 152*1c0d8861SChuck Lever return !((bm1[0] & ~bm2[0]) || 153*1c0d8861SChuck Lever (bm1[1] & ~bm2[1]) || 154*1c0d8861SChuck Lever (bm1[2] & ~bm2[2])); 155*1c0d8861SChuck Lever } 156*1c0d8861SChuck Lever nfsd_attrs_supported(u32 minorversion,const u32 * bmval)157*1c0d8861SChuck Leverstatic inline bool nfsd_attrs_supported(u32 minorversion, const u32 *bmval) 158*1c0d8861SChuck Lever { 159*1c0d8861SChuck Lever return bmval_is_subset(bmval, nfsd_suppattrs[minorversion]); 160*1c0d8861SChuck Lever } 161*1c0d8861SChuck Lever 162*1c0d8861SChuck Lever #endif /* _LINUX_NFSD_ATTR4_H */ 163