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