xref: /OK3568_Linux_fs/kernel/fs/nfsd/xdr3.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * XDR types for NFSv3 in nfsd.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 1996-1998, Olaf Kirch <okir@monad.swb.de>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef _LINUX_NFSD_XDR3_H
9*4882a593Smuzhiyun #define _LINUX_NFSD_XDR3_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include "xdr.h"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun struct nfsd3_sattrargs {
14*4882a593Smuzhiyun 	struct svc_fh		fh;
15*4882a593Smuzhiyun 	struct iattr		attrs;
16*4882a593Smuzhiyun 	int			check_guard;
17*4882a593Smuzhiyun 	time64_t		guardtime;
18*4882a593Smuzhiyun };
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun struct nfsd3_diropargs {
21*4882a593Smuzhiyun 	struct svc_fh		fh;
22*4882a593Smuzhiyun 	char *			name;
23*4882a593Smuzhiyun 	unsigned int		len;
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun struct nfsd3_accessargs {
27*4882a593Smuzhiyun 	struct svc_fh		fh;
28*4882a593Smuzhiyun 	unsigned int		access;
29*4882a593Smuzhiyun };
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun struct nfsd3_readargs {
32*4882a593Smuzhiyun 	struct svc_fh		fh;
33*4882a593Smuzhiyun 	__u64			offset;
34*4882a593Smuzhiyun 	__u32			count;
35*4882a593Smuzhiyun 	int			vlen;
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun struct nfsd3_writeargs {
39*4882a593Smuzhiyun 	svc_fh			fh;
40*4882a593Smuzhiyun 	__u64			offset;
41*4882a593Smuzhiyun 	__u32			count;
42*4882a593Smuzhiyun 	int			stable;
43*4882a593Smuzhiyun 	__u32			len;
44*4882a593Smuzhiyun 	struct kvec		first;
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun struct nfsd3_createargs {
48*4882a593Smuzhiyun 	struct svc_fh		fh;
49*4882a593Smuzhiyun 	char *			name;
50*4882a593Smuzhiyun 	unsigned int		len;
51*4882a593Smuzhiyun 	int			createmode;
52*4882a593Smuzhiyun 	struct iattr		attrs;
53*4882a593Smuzhiyun 	__be32 *		verf;
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun struct nfsd3_mknodargs {
57*4882a593Smuzhiyun 	struct svc_fh		fh;
58*4882a593Smuzhiyun 	char *			name;
59*4882a593Smuzhiyun 	unsigned int		len;
60*4882a593Smuzhiyun 	__u32			ftype;
61*4882a593Smuzhiyun 	__u32			major, minor;
62*4882a593Smuzhiyun 	struct iattr		attrs;
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun struct nfsd3_renameargs {
66*4882a593Smuzhiyun 	struct svc_fh		ffh;
67*4882a593Smuzhiyun 	char *			fname;
68*4882a593Smuzhiyun 	unsigned int		flen;
69*4882a593Smuzhiyun 	struct svc_fh		tfh;
70*4882a593Smuzhiyun 	char *			tname;
71*4882a593Smuzhiyun 	unsigned int		tlen;
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun struct nfsd3_readlinkargs {
75*4882a593Smuzhiyun 	struct svc_fh		fh;
76*4882a593Smuzhiyun 	char *			buffer;
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun struct nfsd3_linkargs {
80*4882a593Smuzhiyun 	struct svc_fh		ffh;
81*4882a593Smuzhiyun 	struct svc_fh		tfh;
82*4882a593Smuzhiyun 	char *			tname;
83*4882a593Smuzhiyun 	unsigned int		tlen;
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun struct nfsd3_symlinkargs {
87*4882a593Smuzhiyun 	struct svc_fh		ffh;
88*4882a593Smuzhiyun 	char *			fname;
89*4882a593Smuzhiyun 	unsigned int		flen;
90*4882a593Smuzhiyun 	char *			tname;
91*4882a593Smuzhiyun 	unsigned int		tlen;
92*4882a593Smuzhiyun 	struct iattr		attrs;
93*4882a593Smuzhiyun 	struct kvec		first;
94*4882a593Smuzhiyun };
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun struct nfsd3_readdirargs {
97*4882a593Smuzhiyun 	struct svc_fh		fh;
98*4882a593Smuzhiyun 	__u64			cookie;
99*4882a593Smuzhiyun 	__u32			dircount;
100*4882a593Smuzhiyun 	__u32			count;
101*4882a593Smuzhiyun 	__be32 *		verf;
102*4882a593Smuzhiyun 	__be32 *		buffer;
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun struct nfsd3_commitargs {
106*4882a593Smuzhiyun 	struct svc_fh		fh;
107*4882a593Smuzhiyun 	__u64			offset;
108*4882a593Smuzhiyun 	__u32			count;
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun struct nfsd3_getaclargs {
112*4882a593Smuzhiyun 	struct svc_fh		fh;
113*4882a593Smuzhiyun 	int			mask;
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun struct posix_acl;
117*4882a593Smuzhiyun struct nfsd3_setaclargs {
118*4882a593Smuzhiyun 	struct svc_fh		fh;
119*4882a593Smuzhiyun 	int			mask;
120*4882a593Smuzhiyun 	struct posix_acl	*acl_access;
121*4882a593Smuzhiyun 	struct posix_acl	*acl_default;
122*4882a593Smuzhiyun };
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun struct nfsd3_attrstat {
125*4882a593Smuzhiyun 	__be32			status;
126*4882a593Smuzhiyun 	struct svc_fh		fh;
127*4882a593Smuzhiyun 	struct kstat            stat;
128*4882a593Smuzhiyun };
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /* LOOKUP, CREATE, MKDIR, SYMLINK, MKNOD */
131*4882a593Smuzhiyun struct nfsd3_diropres  {
132*4882a593Smuzhiyun 	__be32			status;
133*4882a593Smuzhiyun 	struct svc_fh		dirfh;
134*4882a593Smuzhiyun 	struct svc_fh		fh;
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun struct nfsd3_accessres {
138*4882a593Smuzhiyun 	__be32			status;
139*4882a593Smuzhiyun 	struct svc_fh		fh;
140*4882a593Smuzhiyun 	__u32			access;
141*4882a593Smuzhiyun 	struct kstat		stat;
142*4882a593Smuzhiyun };
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun struct nfsd3_readlinkres {
145*4882a593Smuzhiyun 	__be32			status;
146*4882a593Smuzhiyun 	struct svc_fh		fh;
147*4882a593Smuzhiyun 	__u32			len;
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun struct nfsd3_readres {
151*4882a593Smuzhiyun 	__be32			status;
152*4882a593Smuzhiyun 	struct svc_fh		fh;
153*4882a593Smuzhiyun 	unsigned long		count;
154*4882a593Smuzhiyun 	__u32			eof;
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun struct nfsd3_writeres {
158*4882a593Smuzhiyun 	__be32			status;
159*4882a593Smuzhiyun 	struct svc_fh		fh;
160*4882a593Smuzhiyun 	unsigned long		count;
161*4882a593Smuzhiyun 	int			committed;
162*4882a593Smuzhiyun 	__be32			verf[2];
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun struct nfsd3_renameres {
166*4882a593Smuzhiyun 	__be32			status;
167*4882a593Smuzhiyun 	struct svc_fh		ffh;
168*4882a593Smuzhiyun 	struct svc_fh		tfh;
169*4882a593Smuzhiyun };
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun struct nfsd3_linkres {
172*4882a593Smuzhiyun 	__be32			status;
173*4882a593Smuzhiyun 	struct svc_fh		tfh;
174*4882a593Smuzhiyun 	struct svc_fh		fh;
175*4882a593Smuzhiyun };
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun struct nfsd3_readdirres {
178*4882a593Smuzhiyun 	__be32			status;
179*4882a593Smuzhiyun 	struct svc_fh		fh;
180*4882a593Smuzhiyun 	/* Just to save kmalloc on every readdirplus entry (svc_fh is a
181*4882a593Smuzhiyun 	 * little large for the stack): */
182*4882a593Smuzhiyun 	struct svc_fh		scratch;
183*4882a593Smuzhiyun 	int			count;
184*4882a593Smuzhiyun 	__be32			verf[2];
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	struct readdir_cd	common;
187*4882a593Smuzhiyun 	__be32 *		buffer;
188*4882a593Smuzhiyun 	int			buflen;
189*4882a593Smuzhiyun 	__be32 *		offset;
190*4882a593Smuzhiyun 	__be32 *		offset1;
191*4882a593Smuzhiyun 	struct svc_rqst *	rqstp;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun };
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun struct nfsd3_fsstatres {
196*4882a593Smuzhiyun 	__be32			status;
197*4882a593Smuzhiyun 	struct kstatfs		stats;
198*4882a593Smuzhiyun 	__u32			invarsec;
199*4882a593Smuzhiyun };
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun struct nfsd3_fsinfores {
202*4882a593Smuzhiyun 	__be32			status;
203*4882a593Smuzhiyun 	__u32			f_rtmax;
204*4882a593Smuzhiyun 	__u32			f_rtpref;
205*4882a593Smuzhiyun 	__u32			f_rtmult;
206*4882a593Smuzhiyun 	__u32			f_wtmax;
207*4882a593Smuzhiyun 	__u32			f_wtpref;
208*4882a593Smuzhiyun 	__u32			f_wtmult;
209*4882a593Smuzhiyun 	__u32			f_dtpref;
210*4882a593Smuzhiyun 	__u64			f_maxfilesize;
211*4882a593Smuzhiyun 	__u32			f_properties;
212*4882a593Smuzhiyun };
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun struct nfsd3_pathconfres {
215*4882a593Smuzhiyun 	__be32			status;
216*4882a593Smuzhiyun 	__u32			p_link_max;
217*4882a593Smuzhiyun 	__u32			p_name_max;
218*4882a593Smuzhiyun 	__u32			p_no_trunc;
219*4882a593Smuzhiyun 	__u32			p_chown_restricted;
220*4882a593Smuzhiyun 	__u32			p_case_insensitive;
221*4882a593Smuzhiyun 	__u32			p_case_preserving;
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun struct nfsd3_commitres {
225*4882a593Smuzhiyun 	__be32			status;
226*4882a593Smuzhiyun 	struct svc_fh		fh;
227*4882a593Smuzhiyun 	__be32			verf[2];
228*4882a593Smuzhiyun };
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun struct nfsd3_getaclres {
231*4882a593Smuzhiyun 	__be32			status;
232*4882a593Smuzhiyun 	struct svc_fh		fh;
233*4882a593Smuzhiyun 	int			mask;
234*4882a593Smuzhiyun 	struct posix_acl	*acl_access;
235*4882a593Smuzhiyun 	struct posix_acl	*acl_default;
236*4882a593Smuzhiyun 	struct kstat		stat;
237*4882a593Smuzhiyun };
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun /* dummy type for release */
240*4882a593Smuzhiyun struct nfsd3_fhandle_pair {
241*4882a593Smuzhiyun 	__u32			dummy;
242*4882a593Smuzhiyun 	struct svc_fh		fh1;
243*4882a593Smuzhiyun 	struct svc_fh		fh2;
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun /*
247*4882a593Smuzhiyun  * Storage requirements for XDR arguments and results.
248*4882a593Smuzhiyun  */
249*4882a593Smuzhiyun union nfsd3_xdrstore {
250*4882a593Smuzhiyun 	struct nfsd3_sattrargs		sattrargs;
251*4882a593Smuzhiyun 	struct nfsd3_diropargs		diropargs;
252*4882a593Smuzhiyun 	struct nfsd3_readargs		readargs;
253*4882a593Smuzhiyun 	struct nfsd3_writeargs		writeargs;
254*4882a593Smuzhiyun 	struct nfsd3_createargs		createargs;
255*4882a593Smuzhiyun 	struct nfsd3_renameargs		renameargs;
256*4882a593Smuzhiyun 	struct nfsd3_linkargs		linkargs;
257*4882a593Smuzhiyun 	struct nfsd3_symlinkargs	symlinkargs;
258*4882a593Smuzhiyun 	struct nfsd3_readdirargs	readdirargs;
259*4882a593Smuzhiyun 	struct nfsd3_diropres 		diropres;
260*4882a593Smuzhiyun 	struct nfsd3_accessres		accessres;
261*4882a593Smuzhiyun 	struct nfsd3_readlinkres	readlinkres;
262*4882a593Smuzhiyun 	struct nfsd3_readres		readres;
263*4882a593Smuzhiyun 	struct nfsd3_writeres		writeres;
264*4882a593Smuzhiyun 	struct nfsd3_renameres		renameres;
265*4882a593Smuzhiyun 	struct nfsd3_linkres		linkres;
266*4882a593Smuzhiyun 	struct nfsd3_readdirres		readdirres;
267*4882a593Smuzhiyun 	struct nfsd3_fsstatres		fsstatres;
268*4882a593Smuzhiyun 	struct nfsd3_fsinfores		fsinfores;
269*4882a593Smuzhiyun 	struct nfsd3_pathconfres	pathconfres;
270*4882a593Smuzhiyun 	struct nfsd3_commitres		commitres;
271*4882a593Smuzhiyun 	struct nfsd3_getaclres		getaclres;
272*4882a593Smuzhiyun };
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun #define NFS3_SVC_XDRSIZE		sizeof(union nfsd3_xdrstore)
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun int nfs3svc_decode_voidarg(struct svc_rqst *, __be32 *);
277*4882a593Smuzhiyun int nfs3svc_decode_fhandle(struct svc_rqst *, __be32 *);
278*4882a593Smuzhiyun int nfs3svc_decode_sattrargs(struct svc_rqst *, __be32 *);
279*4882a593Smuzhiyun int nfs3svc_decode_diropargs(struct svc_rqst *, __be32 *);
280*4882a593Smuzhiyun int nfs3svc_decode_accessargs(struct svc_rqst *, __be32 *);
281*4882a593Smuzhiyun int nfs3svc_decode_readargs(struct svc_rqst *, __be32 *);
282*4882a593Smuzhiyun int nfs3svc_decode_writeargs(struct svc_rqst *, __be32 *);
283*4882a593Smuzhiyun int nfs3svc_decode_createargs(struct svc_rqst *, __be32 *);
284*4882a593Smuzhiyun int nfs3svc_decode_mkdirargs(struct svc_rqst *, __be32 *);
285*4882a593Smuzhiyun int nfs3svc_decode_mknodargs(struct svc_rqst *, __be32 *);
286*4882a593Smuzhiyun int nfs3svc_decode_renameargs(struct svc_rqst *, __be32 *);
287*4882a593Smuzhiyun int nfs3svc_decode_readlinkargs(struct svc_rqst *, __be32 *);
288*4882a593Smuzhiyun int nfs3svc_decode_linkargs(struct svc_rqst *, __be32 *);
289*4882a593Smuzhiyun int nfs3svc_decode_symlinkargs(struct svc_rqst *, __be32 *);
290*4882a593Smuzhiyun int nfs3svc_decode_readdirargs(struct svc_rqst *, __be32 *);
291*4882a593Smuzhiyun int nfs3svc_decode_readdirplusargs(struct svc_rqst *, __be32 *);
292*4882a593Smuzhiyun int nfs3svc_decode_commitargs(struct svc_rqst *, __be32 *);
293*4882a593Smuzhiyun int nfs3svc_encode_voidres(struct svc_rqst *, __be32 *);
294*4882a593Smuzhiyun int nfs3svc_encode_attrstat(struct svc_rqst *, __be32 *);
295*4882a593Smuzhiyun int nfs3svc_encode_wccstat(struct svc_rqst *, __be32 *);
296*4882a593Smuzhiyun int nfs3svc_encode_diropres(struct svc_rqst *, __be32 *);
297*4882a593Smuzhiyun int nfs3svc_encode_accessres(struct svc_rqst *, __be32 *);
298*4882a593Smuzhiyun int nfs3svc_encode_readlinkres(struct svc_rqst *, __be32 *);
299*4882a593Smuzhiyun int nfs3svc_encode_readres(struct svc_rqst *, __be32 *);
300*4882a593Smuzhiyun int nfs3svc_encode_writeres(struct svc_rqst *, __be32 *);
301*4882a593Smuzhiyun int nfs3svc_encode_createres(struct svc_rqst *, __be32 *);
302*4882a593Smuzhiyun int nfs3svc_encode_renameres(struct svc_rqst *, __be32 *);
303*4882a593Smuzhiyun int nfs3svc_encode_linkres(struct svc_rqst *, __be32 *);
304*4882a593Smuzhiyun int nfs3svc_encode_readdirres(struct svc_rqst *, __be32 *);
305*4882a593Smuzhiyun int nfs3svc_encode_fsstatres(struct svc_rqst *, __be32 *);
306*4882a593Smuzhiyun int nfs3svc_encode_fsinfores(struct svc_rqst *, __be32 *);
307*4882a593Smuzhiyun int nfs3svc_encode_pathconfres(struct svc_rqst *, __be32 *);
308*4882a593Smuzhiyun int nfs3svc_encode_commitres(struct svc_rqst *, __be32 *);
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun void nfs3svc_release_fhandle(struct svc_rqst *);
311*4882a593Smuzhiyun void nfs3svc_release_fhandle2(struct svc_rqst *);
312*4882a593Smuzhiyun int nfs3svc_encode_entry(void *, const char *name,
313*4882a593Smuzhiyun 				int namlen, loff_t offset, u64 ino,
314*4882a593Smuzhiyun 				unsigned int);
315*4882a593Smuzhiyun int nfs3svc_encode_entry_plus(void *, const char *name,
316*4882a593Smuzhiyun 				int namlen, loff_t offset, u64 ino,
317*4882a593Smuzhiyun 				unsigned int);
318*4882a593Smuzhiyun /* Helper functions for NFSv3 ACL code */
319*4882a593Smuzhiyun __be32 *nfs3svc_encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p,
320*4882a593Smuzhiyun 				struct svc_fh *fhp);
321*4882a593Smuzhiyun __be32 *nfs3svc_decode_fh(__be32 *p, struct svc_fh *fhp);
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun #endif /* _LINUX_NFSD_XDR3_H */
325