xref: /linux/fs/nfsd/attr4.h (revision d141ec2825b4d3ec52f27c43bdd864090159273a)
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 Lever static 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 Lever static 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