• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * linux/fs/nfs/nfs3xdr.c
4  *
5  * XDR functions to encode/decode NFSv3 RPC arguments and results.
6  *
7  * Copyright (C) 1996, 1997 Olaf Kirch
8  */
9 
10 #include <linux/param.h>
11 #include <linux/time.h>
12 #include <linux/mm.h>
13 #include <linux/errno.h>
14 #include <linux/string.h>
15 #include <linux/in.h>
16 #include <linux/pagemap.h>
17 #include <linux/proc_fs.h>
18 #include <linux/kdev_t.h>
19 #include <linux/sunrpc/clnt.h>
20 #include <linux/nfs.h>
21 #include <linux/nfs3.h>
22 #include <linux/nfs_fs.h>
23 #include <linux/nfsacl.h>
24 #include "nfstrace.h"
25 #include "internal.h"
26 
27 #define NFSDBG_FACILITY		NFSDBG_XDR
28 
29 /* Mapping from NFS error code to "errno" error code. */
30 #define errno_NFSERR_IO		EIO
31 
32 /*
33  * Declare the space requirements for NFS arguments and replies as
34  * number of 32bit-words
35  */
36 #define NFS3_fhandle_sz		(1+16)
37 #define NFS3_fh_sz		(NFS3_fhandle_sz)	/* shorthand */
38 #define NFS3_post_op_fh_sz	(1+NFS3_fh_sz)
39 #define NFS3_sattr_sz		(15)
40 #define NFS3_filename_sz	(1+(NFS3_MAXNAMLEN>>2))
41 #define NFS3_path_sz		(1+(NFS3_MAXPATHLEN>>2))
42 #define NFS3_fattr_sz		(21)
43 #define NFS3_cookieverf_sz	(NFS3_COOKIEVERFSIZE>>2)
44 #define NFS3_wcc_attr_sz	(6)
45 #define NFS3_pre_op_attr_sz	(1+NFS3_wcc_attr_sz)
46 #define NFS3_post_op_attr_sz	(1+NFS3_fattr_sz)
47 #define NFS3_wcc_data_sz	(NFS3_pre_op_attr_sz+NFS3_post_op_attr_sz)
48 #define NFS3_diropargs_sz	(NFS3_fh_sz+NFS3_filename_sz)
49 
50 #define NFS3_getattrargs_sz	(NFS3_fh_sz)
51 #define NFS3_setattrargs_sz	(NFS3_fh_sz+NFS3_sattr_sz+3)
52 #define NFS3_lookupargs_sz	(NFS3_fh_sz+NFS3_filename_sz)
53 #define NFS3_accessargs_sz	(NFS3_fh_sz+1)
54 #define NFS3_readlinkargs_sz	(NFS3_fh_sz)
55 #define NFS3_readargs_sz	(NFS3_fh_sz+3)
56 #define NFS3_writeargs_sz	(NFS3_fh_sz+5)
57 #define NFS3_createargs_sz	(NFS3_diropargs_sz+NFS3_sattr_sz)
58 #define NFS3_mkdirargs_sz	(NFS3_diropargs_sz+NFS3_sattr_sz)
59 #define NFS3_symlinkargs_sz	(NFS3_diropargs_sz+1+NFS3_sattr_sz)
60 #define NFS3_mknodargs_sz	(NFS3_diropargs_sz+2+NFS3_sattr_sz)
61 #define NFS3_removeargs_sz	(NFS3_fh_sz+NFS3_filename_sz)
62 #define NFS3_renameargs_sz	(NFS3_diropargs_sz+NFS3_diropargs_sz)
63 #define NFS3_linkargs_sz		(NFS3_fh_sz+NFS3_diropargs_sz)
64 #define NFS3_readdirargs_sz	(NFS3_fh_sz+NFS3_cookieverf_sz+3)
65 #define NFS3_readdirplusargs_sz	(NFS3_fh_sz+NFS3_cookieverf_sz+4)
66 #define NFS3_commitargs_sz	(NFS3_fh_sz+3)
67 
68 #define NFS3_getattrres_sz	(1+NFS3_fattr_sz)
69 #define NFS3_setattrres_sz	(1+NFS3_wcc_data_sz)
70 #define NFS3_removeres_sz	(NFS3_setattrres_sz)
71 #define NFS3_lookupres_sz	(1+NFS3_fh_sz+(2 * NFS3_post_op_attr_sz))
72 #define NFS3_accessres_sz	(1+NFS3_post_op_attr_sz+1)
73 #define NFS3_readlinkres_sz	(1+NFS3_post_op_attr_sz+1+1)
74 #define NFS3_readres_sz		(1+NFS3_post_op_attr_sz+3+1)
75 #define NFS3_writeres_sz	(1+NFS3_wcc_data_sz+4)
76 #define NFS3_createres_sz	(1+NFS3_post_op_fh_sz+NFS3_post_op_attr_sz+NFS3_wcc_data_sz)
77 #define NFS3_renameres_sz	(1+(2 * NFS3_wcc_data_sz))
78 #define NFS3_linkres_sz		(1+NFS3_post_op_attr_sz+NFS3_wcc_data_sz)
79 #define NFS3_readdirres_sz	(1+NFS3_post_op_attr_sz+2+1)
80 #define NFS3_fsstatres_sz	(1+NFS3_post_op_attr_sz+13)
81 #define NFS3_fsinfores_sz	(1+NFS3_post_op_attr_sz+12)
82 #define NFS3_pathconfres_sz	(1+NFS3_post_op_attr_sz+6)
83 #define NFS3_commitres_sz	(1+NFS3_wcc_data_sz+2)
84 
85 #define ACL3_getaclargs_sz	(NFS3_fh_sz+1)
86 #define ACL3_setaclargs_sz	(NFS3_fh_sz+1+ \
87 				XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
88 #define ACL3_getaclres_sz	(1+NFS3_post_op_attr_sz+1+ \
89 				XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE)+1)
90 #define ACL3_setaclres_sz	(1+NFS3_post_op_attr_sz)
91 
92 static int nfs3_stat_to_errno(enum nfs_stat);
93 
94 /*
95  * Map file type to S_IFMT bits
96  */
97 static const umode_t nfs_type2fmt[] = {
98 	[NF3BAD] = 0,
99 	[NF3REG] = S_IFREG,
100 	[NF3DIR] = S_IFDIR,
101 	[NF3BLK] = S_IFBLK,
102 	[NF3CHR] = S_IFCHR,
103 	[NF3LNK] = S_IFLNK,
104 	[NF3SOCK] = S_IFSOCK,
105 	[NF3FIFO] = S_IFIFO,
106 };
107 
rpc_userns(const struct rpc_clnt * clnt)108 static struct user_namespace *rpc_userns(const struct rpc_clnt *clnt)
109 {
110 	if (clnt && clnt->cl_cred)
111 		return clnt->cl_cred->user_ns;
112 	return &init_user_ns;
113 }
114 
rpc_rqst_userns(const struct rpc_rqst * rqstp)115 static struct user_namespace *rpc_rqst_userns(const struct rpc_rqst *rqstp)
116 {
117 	if (rqstp->rq_task)
118 		return rpc_userns(rqstp->rq_task->tk_client);
119 	return &init_user_ns;
120 }
121 
122 /*
123  * Encode/decode NFSv3 basic data types
124  *
125  * Basic NFSv3 data types are defined in section 2.5 of RFC 1813:
126  * "NFS Version 3 Protocol Specification".
127  *
128  * Not all basic data types have their own encoding and decoding
129  * functions.  For run-time efficiency, some data types are encoded
130  * or decoded inline.
131  */
132 
encode_uint32(struct xdr_stream * xdr,u32 value)133 static void encode_uint32(struct xdr_stream *xdr, u32 value)
134 {
135 	__be32 *p = xdr_reserve_space(xdr, 4);
136 	*p = cpu_to_be32(value);
137 }
138 
decode_uint32(struct xdr_stream * xdr,u32 * value)139 static int decode_uint32(struct xdr_stream *xdr, u32 *value)
140 {
141 	__be32 *p;
142 
143 	p = xdr_inline_decode(xdr, 4);
144 	if (unlikely(!p))
145 		return -EIO;
146 	*value = be32_to_cpup(p);
147 	return 0;
148 }
149 
decode_uint64(struct xdr_stream * xdr,u64 * value)150 static int decode_uint64(struct xdr_stream *xdr, u64 *value)
151 {
152 	__be32 *p;
153 
154 	p = xdr_inline_decode(xdr, 8);
155 	if (unlikely(!p))
156 		return -EIO;
157 	xdr_decode_hyper(p, value);
158 	return 0;
159 }
160 
161 /*
162  * fileid3
163  *
164  *	typedef uint64 fileid3;
165  */
xdr_decode_fileid3(__be32 * p,u64 * fileid)166 static __be32 *xdr_decode_fileid3(__be32 *p, u64 *fileid)
167 {
168 	return xdr_decode_hyper(p, fileid);
169 }
170 
decode_fileid3(struct xdr_stream * xdr,u64 * fileid)171 static int decode_fileid3(struct xdr_stream *xdr, u64 *fileid)
172 {
173 	return decode_uint64(xdr, fileid);
174 }
175 
176 /*
177  * filename3
178  *
179  *	typedef string filename3<>;
180  */
encode_filename3(struct xdr_stream * xdr,const char * name,u32 length)181 static void encode_filename3(struct xdr_stream *xdr,
182 			     const char *name, u32 length)
183 {
184 	__be32 *p;
185 
186 	WARN_ON_ONCE(length > NFS3_MAXNAMLEN);
187 	p = xdr_reserve_space(xdr, 4 + length);
188 	xdr_encode_opaque(p, name, length);
189 }
190 
decode_inline_filename3(struct xdr_stream * xdr,const char ** name,u32 * length)191 static int decode_inline_filename3(struct xdr_stream *xdr,
192 				   const char **name, u32 *length)
193 {
194 	__be32 *p;
195 	u32 count;
196 
197 	p = xdr_inline_decode(xdr, 4);
198 	if (unlikely(!p))
199 		return -EIO;
200 	count = be32_to_cpup(p);
201 	if (count > NFS3_MAXNAMLEN)
202 		goto out_nametoolong;
203 	p = xdr_inline_decode(xdr, count);
204 	if (unlikely(!p))
205 		return -EIO;
206 	*name = (const char *)p;
207 	*length = count;
208 	return 0;
209 
210 out_nametoolong:
211 	dprintk("NFS: returned filename too long: %u\n", count);
212 	return -ENAMETOOLONG;
213 }
214 
215 /*
216  * nfspath3
217  *
218  *	typedef string nfspath3<>;
219  */
encode_nfspath3(struct xdr_stream * xdr,struct page ** pages,const u32 length)220 static void encode_nfspath3(struct xdr_stream *xdr, struct page **pages,
221 			    const u32 length)
222 {
223 	encode_uint32(xdr, length);
224 	xdr_write_pages(xdr, pages, 0, length);
225 }
226 
decode_nfspath3(struct xdr_stream * xdr)227 static int decode_nfspath3(struct xdr_stream *xdr)
228 {
229 	u32 recvd, count;
230 	__be32 *p;
231 
232 	p = xdr_inline_decode(xdr, 4);
233 	if (unlikely(!p))
234 		return -EIO;
235 	count = be32_to_cpup(p);
236 	if (unlikely(count >= xdr->buf->page_len || count > NFS3_MAXPATHLEN))
237 		goto out_nametoolong;
238 	recvd = xdr_read_pages(xdr, count);
239 	if (unlikely(count > recvd))
240 		goto out_cheating;
241 	xdr_terminate_string(xdr->buf, count);
242 	return 0;
243 
244 out_nametoolong:
245 	dprintk("NFS: returned pathname too long: %u\n", count);
246 	return -ENAMETOOLONG;
247 out_cheating:
248 	dprintk("NFS: server cheating in pathname result: "
249 		"count %u > recvd %u\n", count, recvd);
250 	return -EIO;
251 }
252 
253 /*
254  * cookie3
255  *
256  *	typedef uint64 cookie3
257  */
xdr_encode_cookie3(__be32 * p,u64 cookie)258 static __be32 *xdr_encode_cookie3(__be32 *p, u64 cookie)
259 {
260 	return xdr_encode_hyper(p, cookie);
261 }
262 
decode_cookie3(struct xdr_stream * xdr,u64 * cookie)263 static int decode_cookie3(struct xdr_stream *xdr, u64 *cookie)
264 {
265 	return decode_uint64(xdr, cookie);
266 }
267 
268 /*
269  * cookieverf3
270  *
271  *	typedef opaque cookieverf3[NFS3_COOKIEVERFSIZE];
272  */
xdr_encode_cookieverf3(__be32 * p,const __be32 * verifier)273 static __be32 *xdr_encode_cookieverf3(__be32 *p, const __be32 *verifier)
274 {
275 	memcpy(p, verifier, NFS3_COOKIEVERFSIZE);
276 	return p + XDR_QUADLEN(NFS3_COOKIEVERFSIZE);
277 }
278 
decode_cookieverf3(struct xdr_stream * xdr,__be32 * verifier)279 static int decode_cookieverf3(struct xdr_stream *xdr, __be32 *verifier)
280 {
281 	__be32 *p;
282 
283 	p = xdr_inline_decode(xdr, NFS3_COOKIEVERFSIZE);
284 	if (unlikely(!p))
285 		return -EIO;
286 	memcpy(verifier, p, NFS3_COOKIEVERFSIZE);
287 	return 0;
288 }
289 
290 /*
291  * createverf3
292  *
293  *	typedef opaque createverf3[NFS3_CREATEVERFSIZE];
294  */
encode_createverf3(struct xdr_stream * xdr,const __be32 * verifier)295 static void encode_createverf3(struct xdr_stream *xdr, const __be32 *verifier)
296 {
297 	__be32 *p;
298 
299 	p = xdr_reserve_space(xdr, NFS3_CREATEVERFSIZE);
300 	memcpy(p, verifier, NFS3_CREATEVERFSIZE);
301 }
302 
decode_writeverf3(struct xdr_stream * xdr,struct nfs_write_verifier * verifier)303 static int decode_writeverf3(struct xdr_stream *xdr, struct nfs_write_verifier *verifier)
304 {
305 	__be32 *p;
306 
307 	p = xdr_inline_decode(xdr, NFS3_WRITEVERFSIZE);
308 	if (unlikely(!p))
309 		return -EIO;
310 	memcpy(verifier->data, p, NFS3_WRITEVERFSIZE);
311 	return 0;
312 }
313 
314 /*
315  * size3
316  *
317  *	typedef uint64 size3;
318  */
xdr_decode_size3(__be32 * p,u64 * size)319 static __be32 *xdr_decode_size3(__be32 *p, u64 *size)
320 {
321 	return xdr_decode_hyper(p, size);
322 }
323 
324 /*
325  * nfsstat3
326  *
327  *	enum nfsstat3 {
328  *		NFS3_OK = 0,
329  *		...
330  *	}
331  */
332 #define NFS3_OK		NFS_OK
333 
decode_nfsstat3(struct xdr_stream * xdr,enum nfs_stat * status)334 static int decode_nfsstat3(struct xdr_stream *xdr, enum nfs_stat *status)
335 {
336 	__be32 *p;
337 
338 	p = xdr_inline_decode(xdr, 4);
339 	if (unlikely(!p))
340 		return -EIO;
341 	if (unlikely(*p != cpu_to_be32(NFS3_OK)))
342 		goto out_status;
343 	*status = 0;
344 	return 0;
345 out_status:
346 	*status = be32_to_cpup(p);
347 	trace_nfs_xdr_status(xdr, (int)*status);
348 	return 0;
349 }
350 
351 /*
352  * ftype3
353  *
354  *	enum ftype3 {
355  *		NF3REG	= 1,
356  *		NF3DIR	= 2,
357  *		NF3BLK	= 3,
358  *		NF3CHR	= 4,
359  *		NF3LNK	= 5,
360  *		NF3SOCK	= 6,
361  *		NF3FIFO	= 7
362  *	};
363  */
encode_ftype3(struct xdr_stream * xdr,const u32 type)364 static void encode_ftype3(struct xdr_stream *xdr, const u32 type)
365 {
366 	encode_uint32(xdr, type);
367 }
368 
xdr_decode_ftype3(__be32 * p,umode_t * mode)369 static __be32 *xdr_decode_ftype3(__be32 *p, umode_t *mode)
370 {
371 	u32 type;
372 
373 	type = be32_to_cpup(p++);
374 	if (type > NF3FIFO)
375 		type = NF3NON;
376 	*mode = nfs_type2fmt[type];
377 	return p;
378 }
379 
380 /*
381  * specdata3
382  *
383  *     struct specdata3 {
384  *             uint32  specdata1;
385  *             uint32  specdata2;
386  *     };
387  */
encode_specdata3(struct xdr_stream * xdr,const dev_t rdev)388 static void encode_specdata3(struct xdr_stream *xdr, const dev_t rdev)
389 {
390 	__be32 *p;
391 
392 	p = xdr_reserve_space(xdr, 8);
393 	*p++ = cpu_to_be32(MAJOR(rdev));
394 	*p = cpu_to_be32(MINOR(rdev));
395 }
396 
xdr_decode_specdata3(__be32 * p,dev_t * rdev)397 static __be32 *xdr_decode_specdata3(__be32 *p, dev_t *rdev)
398 {
399 	unsigned int major, minor;
400 
401 	major = be32_to_cpup(p++);
402 	minor = be32_to_cpup(p++);
403 	*rdev = MKDEV(major, minor);
404 	if (MAJOR(*rdev) != major || MINOR(*rdev) != minor)
405 		*rdev = 0;
406 	return p;
407 }
408 
409 /*
410  * nfs_fh3
411  *
412  *	struct nfs_fh3 {
413  *		opaque       data<NFS3_FHSIZE>;
414  *	};
415  */
encode_nfs_fh3(struct xdr_stream * xdr,const struct nfs_fh * fh)416 static void encode_nfs_fh3(struct xdr_stream *xdr, const struct nfs_fh *fh)
417 {
418 	__be32 *p;
419 
420 	WARN_ON_ONCE(fh->size > NFS3_FHSIZE);
421 	p = xdr_reserve_space(xdr, 4 + fh->size);
422 	xdr_encode_opaque(p, fh->data, fh->size);
423 }
424 
decode_nfs_fh3(struct xdr_stream * xdr,struct nfs_fh * fh)425 static int decode_nfs_fh3(struct xdr_stream *xdr, struct nfs_fh *fh)
426 {
427 	u32 length;
428 	__be32 *p;
429 
430 	p = xdr_inline_decode(xdr, 4);
431 	if (unlikely(!p))
432 		return -EIO;
433 	length = be32_to_cpup(p++);
434 	if (unlikely(length > NFS3_FHSIZE))
435 		goto out_toobig;
436 	p = xdr_inline_decode(xdr, length);
437 	if (unlikely(!p))
438 		return -EIO;
439 	fh->size = length;
440 	memcpy(fh->data, p, length);
441 	return 0;
442 out_toobig:
443 	dprintk("NFS: file handle size (%u) too big\n", length);
444 	return -E2BIG;
445 }
446 
zero_nfs_fh3(struct nfs_fh * fh)447 static void zero_nfs_fh3(struct nfs_fh *fh)
448 {
449 	memset(fh, 0, sizeof(*fh));
450 }
451 
452 /*
453  * nfstime3
454  *
455  *	struct nfstime3 {
456  *		uint32	seconds;
457  *		uint32	nseconds;
458  *	};
459  */
xdr_encode_nfstime3(__be32 * p,const struct timespec64 * timep)460 static __be32 *xdr_encode_nfstime3(__be32 *p, const struct timespec64 *timep)
461 {
462 	*p++ = cpu_to_be32((u32)timep->tv_sec);
463 	*p++ = cpu_to_be32(timep->tv_nsec);
464 	return p;
465 }
466 
xdr_decode_nfstime3(__be32 * p,struct timespec64 * timep)467 static __be32 *xdr_decode_nfstime3(__be32 *p, struct timespec64 *timep)
468 {
469 	timep->tv_sec = be32_to_cpup(p++);
470 	timep->tv_nsec = be32_to_cpup(p++);
471 	return p;
472 }
473 
474 /*
475  * sattr3
476  *
477  *	enum time_how {
478  *		DONT_CHANGE		= 0,
479  *		SET_TO_SERVER_TIME	= 1,
480  *		SET_TO_CLIENT_TIME	= 2
481  *	};
482  *
483  *	union set_mode3 switch (bool set_it) {
484  *	case TRUE:
485  *		mode3	mode;
486  *	default:
487  *		void;
488  *	};
489  *
490  *	union set_uid3 switch (bool set_it) {
491  *	case TRUE:
492  *		uid3	uid;
493  *	default:
494  *		void;
495  *	};
496  *
497  *	union set_gid3 switch (bool set_it) {
498  *	case TRUE:
499  *		gid3	gid;
500  *	default:
501  *		void;
502  *	};
503  *
504  *	union set_size3 switch (bool set_it) {
505  *	case TRUE:
506  *		size3	size;
507  *	default:
508  *		void;
509  *	};
510  *
511  *	union set_atime switch (time_how set_it) {
512  *	case SET_TO_CLIENT_TIME:
513  *		nfstime3	atime;
514  *	default:
515  *		void;
516  *	};
517  *
518  *	union set_mtime switch (time_how set_it) {
519  *	case SET_TO_CLIENT_TIME:
520  *		nfstime3  mtime;
521  *	default:
522  *		void;
523  *	};
524  *
525  *	struct sattr3 {
526  *		set_mode3	mode;
527  *		set_uid3	uid;
528  *		set_gid3	gid;
529  *		set_size3	size;
530  *		set_atime	atime;
531  *		set_mtime	mtime;
532  *	};
533  */
encode_sattr3(struct xdr_stream * xdr,const struct iattr * attr,struct user_namespace * userns)534 static void encode_sattr3(struct xdr_stream *xdr, const struct iattr *attr,
535 		struct user_namespace *userns)
536 {
537 	u32 nbytes;
538 	__be32 *p;
539 
540 	/*
541 	 * In order to make only a single xdr_reserve_space() call,
542 	 * pre-compute the total number of bytes to be reserved.
543 	 * Six boolean values, one for each set_foo field, are always
544 	 * present in the encoded result, so start there.
545 	 */
546 	nbytes = 6 * 4;
547 	if (attr->ia_valid & ATTR_MODE)
548 		nbytes += 4;
549 	if (attr->ia_valid & ATTR_UID)
550 		nbytes += 4;
551 	if (attr->ia_valid & ATTR_GID)
552 		nbytes += 4;
553 	if (attr->ia_valid & ATTR_SIZE)
554 		nbytes += 8;
555 	if (attr->ia_valid & ATTR_ATIME_SET)
556 		nbytes += 8;
557 	if (attr->ia_valid & ATTR_MTIME_SET)
558 		nbytes += 8;
559 	p = xdr_reserve_space(xdr, nbytes);
560 
561 	if (attr->ia_valid & ATTR_MODE) {
562 		*p++ = xdr_one;
563 		*p++ = cpu_to_be32(attr->ia_mode & S_IALLUGO);
564 	} else
565 		*p++ = xdr_zero;
566 
567 	if (attr->ia_valid & ATTR_UID) {
568 		*p++ = xdr_one;
569 		*p++ = cpu_to_be32(from_kuid_munged(userns, attr->ia_uid));
570 	} else
571 		*p++ = xdr_zero;
572 
573 	if (attr->ia_valid & ATTR_GID) {
574 		*p++ = xdr_one;
575 		*p++ = cpu_to_be32(from_kgid_munged(userns, attr->ia_gid));
576 	} else
577 		*p++ = xdr_zero;
578 
579 	if (attr->ia_valid & ATTR_SIZE) {
580 		*p++ = xdr_one;
581 		p = xdr_encode_hyper(p, (u64)attr->ia_size);
582 	} else
583 		*p++ = xdr_zero;
584 
585 	if (attr->ia_valid & ATTR_ATIME_SET) {
586 		*p++ = xdr_two;
587 		p = xdr_encode_nfstime3(p, &attr->ia_atime);
588 	} else if (attr->ia_valid & ATTR_ATIME) {
589 		*p++ = xdr_one;
590 	} else
591 		*p++ = xdr_zero;
592 
593 	if (attr->ia_valid & ATTR_MTIME_SET) {
594 		*p++ = xdr_two;
595 		xdr_encode_nfstime3(p, &attr->ia_mtime);
596 	} else if (attr->ia_valid & ATTR_MTIME) {
597 		*p = xdr_one;
598 	} else
599 		*p = xdr_zero;
600 }
601 
602 /*
603  * fattr3
604  *
605  *	struct fattr3 {
606  *		ftype3		type;
607  *		mode3		mode;
608  *		uint32		nlink;
609  *		uid3		uid;
610  *		gid3		gid;
611  *		size3		size;
612  *		size3		used;
613  *		specdata3	rdev;
614  *		uint64		fsid;
615  *		fileid3		fileid;
616  *		nfstime3	atime;
617  *		nfstime3	mtime;
618  *		nfstime3	ctime;
619  *	};
620  */
decode_fattr3(struct xdr_stream * xdr,struct nfs_fattr * fattr,struct user_namespace * userns)621 static int decode_fattr3(struct xdr_stream *xdr, struct nfs_fattr *fattr,
622 		struct user_namespace *userns)
623 {
624 	umode_t fmode;
625 	__be32 *p;
626 
627 	p = xdr_inline_decode(xdr, NFS3_fattr_sz << 2);
628 	if (unlikely(!p))
629 		return -EIO;
630 
631 	p = xdr_decode_ftype3(p, &fmode);
632 
633 	fattr->mode = (be32_to_cpup(p++) & ~S_IFMT) | fmode;
634 	fattr->nlink = be32_to_cpup(p++);
635 	fattr->uid = make_kuid(userns, be32_to_cpup(p++));
636 	if (!uid_valid(fattr->uid))
637 		goto out_uid;
638 	fattr->gid = make_kgid(userns, be32_to_cpup(p++));
639 	if (!gid_valid(fattr->gid))
640 		goto out_gid;
641 
642 	p = xdr_decode_size3(p, &fattr->size);
643 	p = xdr_decode_size3(p, &fattr->du.nfs3.used);
644 	p = xdr_decode_specdata3(p, &fattr->rdev);
645 
646 	p = xdr_decode_hyper(p, &fattr->fsid.major);
647 	fattr->fsid.minor = 0;
648 
649 	p = xdr_decode_fileid3(p, &fattr->fileid);
650 	p = xdr_decode_nfstime3(p, &fattr->atime);
651 	p = xdr_decode_nfstime3(p, &fattr->mtime);
652 	xdr_decode_nfstime3(p, &fattr->ctime);
653 	fattr->change_attr = nfs_timespec_to_change_attr(&fattr->ctime);
654 
655 	fattr->valid |= NFS_ATTR_FATTR_V3;
656 	return 0;
657 out_uid:
658 	dprintk("NFS: returned invalid uid\n");
659 	return -EINVAL;
660 out_gid:
661 	dprintk("NFS: returned invalid gid\n");
662 	return -EINVAL;
663 }
664 
665 /*
666  * post_op_attr
667  *
668  *	union post_op_attr switch (bool attributes_follow) {
669  *	case TRUE:
670  *		fattr3	attributes;
671  *	case FALSE:
672  *		void;
673  *	};
674  */
decode_post_op_attr(struct xdr_stream * xdr,struct nfs_fattr * fattr,struct user_namespace * userns)675 static int decode_post_op_attr(struct xdr_stream *xdr, struct nfs_fattr *fattr,
676 		struct user_namespace *userns)
677 {
678 	__be32 *p;
679 
680 	p = xdr_inline_decode(xdr, 4);
681 	if (unlikely(!p))
682 		return -EIO;
683 	if (*p != xdr_zero)
684 		return decode_fattr3(xdr, fattr, userns);
685 	return 0;
686 }
687 
688 /*
689  * wcc_attr
690  *	struct wcc_attr {
691  *		size3		size;
692  *		nfstime3	mtime;
693  *		nfstime3	ctime;
694  *	};
695  */
decode_wcc_attr(struct xdr_stream * xdr,struct nfs_fattr * fattr)696 static int decode_wcc_attr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
697 {
698 	__be32 *p;
699 
700 	p = xdr_inline_decode(xdr, NFS3_wcc_attr_sz << 2);
701 	if (unlikely(!p))
702 		return -EIO;
703 
704 	fattr->valid |= NFS_ATTR_FATTR_PRESIZE
705 		| NFS_ATTR_FATTR_PRECHANGE
706 		| NFS_ATTR_FATTR_PREMTIME
707 		| NFS_ATTR_FATTR_PRECTIME;
708 
709 	p = xdr_decode_size3(p, &fattr->pre_size);
710 	p = xdr_decode_nfstime3(p, &fattr->pre_mtime);
711 	xdr_decode_nfstime3(p, &fattr->pre_ctime);
712 	fattr->pre_change_attr = nfs_timespec_to_change_attr(&fattr->pre_ctime);
713 
714 	return 0;
715 }
716 
717 /*
718  * pre_op_attr
719  *	union pre_op_attr switch (bool attributes_follow) {
720  *	case TRUE:
721  *		wcc_attr	attributes;
722  *	case FALSE:
723  *		void;
724  *	};
725  *
726  * wcc_data
727  *
728  *	struct wcc_data {
729  *		pre_op_attr	before;
730  *		post_op_attr	after;
731  *	};
732  */
decode_pre_op_attr(struct xdr_stream * xdr,struct nfs_fattr * fattr)733 static int decode_pre_op_attr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
734 {
735 	__be32 *p;
736 
737 	p = xdr_inline_decode(xdr, 4);
738 	if (unlikely(!p))
739 		return -EIO;
740 	if (*p != xdr_zero)
741 		return decode_wcc_attr(xdr, fattr);
742 	return 0;
743 }
744 
decode_wcc_data(struct xdr_stream * xdr,struct nfs_fattr * fattr,struct user_namespace * userns)745 static int decode_wcc_data(struct xdr_stream *xdr, struct nfs_fattr *fattr,
746 		struct user_namespace *userns)
747 {
748 	int error;
749 
750 	error = decode_pre_op_attr(xdr, fattr);
751 	if (unlikely(error))
752 		goto out;
753 	error = decode_post_op_attr(xdr, fattr, userns);
754 out:
755 	return error;
756 }
757 
758 /*
759  * post_op_fh3
760  *
761  *	union post_op_fh3 switch (bool handle_follows) {
762  *	case TRUE:
763  *		nfs_fh3  handle;
764  *	case FALSE:
765  *		void;
766  *	};
767  */
decode_post_op_fh3(struct xdr_stream * xdr,struct nfs_fh * fh)768 static int decode_post_op_fh3(struct xdr_stream *xdr, struct nfs_fh *fh)
769 {
770 	__be32 *p = xdr_inline_decode(xdr, 4);
771 	if (unlikely(!p))
772 		return -EIO;
773 	if (*p != xdr_zero)
774 		return decode_nfs_fh3(xdr, fh);
775 	zero_nfs_fh3(fh);
776 	return 0;
777 }
778 
779 /*
780  * diropargs3
781  *
782  *	struct diropargs3 {
783  *		nfs_fh3		dir;
784  *		filename3	name;
785  *	};
786  */
encode_diropargs3(struct xdr_stream * xdr,const struct nfs_fh * fh,const char * name,u32 length)787 static void encode_diropargs3(struct xdr_stream *xdr, const struct nfs_fh *fh,
788 			      const char *name, u32 length)
789 {
790 	encode_nfs_fh3(xdr, fh);
791 	encode_filename3(xdr, name, length);
792 }
793 
794 
795 /*
796  * NFSv3 XDR encode functions
797  *
798  * NFSv3 argument types are defined in section 3.3 of RFC 1813:
799  * "NFS Version 3 Protocol Specification".
800  */
801 
802 /*
803  * 3.3.1  GETATTR3args
804  *
805  *	struct GETATTR3args {
806  *		nfs_fh3  object;
807  *	};
808  */
nfs3_xdr_enc_getattr3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)809 static void nfs3_xdr_enc_getattr3args(struct rpc_rqst *req,
810 				      struct xdr_stream *xdr,
811 				      const void *data)
812 {
813 	const struct nfs_fh *fh = data;
814 
815 	encode_nfs_fh3(xdr, fh);
816 }
817 
818 /*
819  * 3.3.2  SETATTR3args
820  *
821  *	union sattrguard3 switch (bool check) {
822  *	case TRUE:
823  *		nfstime3  obj_ctime;
824  *	case FALSE:
825  *		void;
826  *	};
827  *
828  *	struct SETATTR3args {
829  *		nfs_fh3		object;
830  *		sattr3		new_attributes;
831  *		sattrguard3	guard;
832  *	};
833  */
encode_sattrguard3(struct xdr_stream * xdr,const struct nfs3_sattrargs * args)834 static void encode_sattrguard3(struct xdr_stream *xdr,
835 			       const struct nfs3_sattrargs *args)
836 {
837 	__be32 *p;
838 
839 	if (args->guard) {
840 		p = xdr_reserve_space(xdr, 4 + 8);
841 		*p++ = xdr_one;
842 		xdr_encode_nfstime3(p, &args->guardtime);
843 	} else {
844 		p = xdr_reserve_space(xdr, 4);
845 		*p = xdr_zero;
846 	}
847 }
848 
nfs3_xdr_enc_setattr3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)849 static void nfs3_xdr_enc_setattr3args(struct rpc_rqst *req,
850 				      struct xdr_stream *xdr,
851 				      const void *data)
852 {
853 	const struct nfs3_sattrargs *args = data;
854 	encode_nfs_fh3(xdr, args->fh);
855 	encode_sattr3(xdr, args->sattr, rpc_rqst_userns(req));
856 	encode_sattrguard3(xdr, args);
857 }
858 
859 /*
860  * 3.3.3  LOOKUP3args
861  *
862  *	struct LOOKUP3args {
863  *		diropargs3  what;
864  *	};
865  */
nfs3_xdr_enc_lookup3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)866 static void nfs3_xdr_enc_lookup3args(struct rpc_rqst *req,
867 				     struct xdr_stream *xdr,
868 				     const void *data)
869 {
870 	const struct nfs3_diropargs *args = data;
871 
872 	encode_diropargs3(xdr, args->fh, args->name, args->len);
873 }
874 
875 /*
876  * 3.3.4  ACCESS3args
877  *
878  *	struct ACCESS3args {
879  *		nfs_fh3		object;
880  *		uint32		access;
881  *	};
882  */
encode_access3args(struct xdr_stream * xdr,const struct nfs3_accessargs * args)883 static void encode_access3args(struct xdr_stream *xdr,
884 			       const struct nfs3_accessargs *args)
885 {
886 	encode_nfs_fh3(xdr, args->fh);
887 	encode_uint32(xdr, args->access);
888 }
889 
nfs3_xdr_enc_access3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)890 static void nfs3_xdr_enc_access3args(struct rpc_rqst *req,
891 				     struct xdr_stream *xdr,
892 				     const void *data)
893 {
894 	const struct nfs3_accessargs *args = data;
895 
896 	encode_access3args(xdr, args);
897 }
898 
899 /*
900  * 3.3.5  READLINK3args
901  *
902  *	struct READLINK3args {
903  *		nfs_fh3	symlink;
904  *	};
905  */
nfs3_xdr_enc_readlink3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)906 static void nfs3_xdr_enc_readlink3args(struct rpc_rqst *req,
907 				       struct xdr_stream *xdr,
908 				       const void *data)
909 {
910 	const struct nfs3_readlinkargs *args = data;
911 
912 	encode_nfs_fh3(xdr, args->fh);
913 	rpc_prepare_reply_pages(req, args->pages, args->pgbase,
914 				args->pglen, NFS3_readlinkres_sz);
915 }
916 
917 /*
918  * 3.3.6  READ3args
919  *
920  *	struct READ3args {
921  *		nfs_fh3		file;
922  *		offset3		offset;
923  *		count3		count;
924  *	};
925  */
encode_read3args(struct xdr_stream * xdr,const struct nfs_pgio_args * args)926 static void encode_read3args(struct xdr_stream *xdr,
927 			     const struct nfs_pgio_args *args)
928 {
929 	__be32 *p;
930 
931 	encode_nfs_fh3(xdr, args->fh);
932 
933 	p = xdr_reserve_space(xdr, 8 + 4);
934 	p = xdr_encode_hyper(p, args->offset);
935 	*p = cpu_to_be32(args->count);
936 }
937 
nfs3_xdr_enc_read3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)938 static void nfs3_xdr_enc_read3args(struct rpc_rqst *req,
939 				   struct xdr_stream *xdr,
940 				   const void *data)
941 {
942 	const struct nfs_pgio_args *args = data;
943 	unsigned int replen = args->replen ? args->replen : NFS3_readres_sz;
944 
945 	encode_read3args(xdr, args);
946 	rpc_prepare_reply_pages(req, args->pages, args->pgbase,
947 				args->count, replen);
948 	req->rq_rcv_buf.flags |= XDRBUF_READ;
949 }
950 
951 /*
952  * 3.3.7  WRITE3args
953  *
954  *	enum stable_how {
955  *		UNSTABLE  = 0,
956  *		DATA_SYNC = 1,
957  *		FILE_SYNC = 2
958  *	};
959  *
960  *	struct WRITE3args {
961  *		nfs_fh3		file;
962  *		offset3		offset;
963  *		count3		count;
964  *		stable_how	stable;
965  *		opaque		data<>;
966  *	};
967  */
encode_write3args(struct xdr_stream * xdr,const struct nfs_pgio_args * args)968 static void encode_write3args(struct xdr_stream *xdr,
969 			      const struct nfs_pgio_args *args)
970 {
971 	__be32 *p;
972 
973 	encode_nfs_fh3(xdr, args->fh);
974 
975 	p = xdr_reserve_space(xdr, 8 + 4 + 4 + 4);
976 	p = xdr_encode_hyper(p, args->offset);
977 	*p++ = cpu_to_be32(args->count);
978 	*p++ = cpu_to_be32(args->stable);
979 	*p = cpu_to_be32(args->count);
980 	xdr_write_pages(xdr, args->pages, args->pgbase, args->count);
981 }
982 
nfs3_xdr_enc_write3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)983 static void nfs3_xdr_enc_write3args(struct rpc_rqst *req,
984 				    struct xdr_stream *xdr,
985 				    const void *data)
986 {
987 	const struct nfs_pgio_args *args = data;
988 
989 	encode_write3args(xdr, args);
990 	xdr->buf->flags |= XDRBUF_WRITE;
991 }
992 
993 /*
994  * 3.3.8  CREATE3args
995  *
996  *	enum createmode3 {
997  *		UNCHECKED = 0,
998  *		GUARDED   = 1,
999  *		EXCLUSIVE = 2
1000  *	};
1001  *
1002  *	union createhow3 switch (createmode3 mode) {
1003  *	case UNCHECKED:
1004  *	case GUARDED:
1005  *		sattr3       obj_attributes;
1006  *	case EXCLUSIVE:
1007  *		createverf3  verf;
1008  *	};
1009  *
1010  *	struct CREATE3args {
1011  *		diropargs3	where;
1012  *		createhow3	how;
1013  *	};
1014  */
encode_createhow3(struct xdr_stream * xdr,const struct nfs3_createargs * args,struct user_namespace * userns)1015 static void encode_createhow3(struct xdr_stream *xdr,
1016 			      const struct nfs3_createargs *args,
1017 			      struct user_namespace *userns)
1018 {
1019 	encode_uint32(xdr, args->createmode);
1020 	switch (args->createmode) {
1021 	case NFS3_CREATE_UNCHECKED:
1022 	case NFS3_CREATE_GUARDED:
1023 		encode_sattr3(xdr, args->sattr, userns);
1024 		break;
1025 	case NFS3_CREATE_EXCLUSIVE:
1026 		encode_createverf3(xdr, args->verifier);
1027 		break;
1028 	default:
1029 		BUG();
1030 	}
1031 }
1032 
nfs3_xdr_enc_create3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1033 static void nfs3_xdr_enc_create3args(struct rpc_rqst *req,
1034 				     struct xdr_stream *xdr,
1035 				     const void *data)
1036 {
1037 	const struct nfs3_createargs *args = data;
1038 
1039 	encode_diropargs3(xdr, args->fh, args->name, args->len);
1040 	encode_createhow3(xdr, args, rpc_rqst_userns(req));
1041 }
1042 
1043 /*
1044  * 3.3.9  MKDIR3args
1045  *
1046  *	struct MKDIR3args {
1047  *		diropargs3	where;
1048  *		sattr3		attributes;
1049  *	};
1050  */
nfs3_xdr_enc_mkdir3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1051 static void nfs3_xdr_enc_mkdir3args(struct rpc_rqst *req,
1052 				    struct xdr_stream *xdr,
1053 				    const void *data)
1054 {
1055 	const struct nfs3_mkdirargs *args = data;
1056 
1057 	encode_diropargs3(xdr, args->fh, args->name, args->len);
1058 	encode_sattr3(xdr, args->sattr, rpc_rqst_userns(req));
1059 }
1060 
1061 /*
1062  * 3.3.10  SYMLINK3args
1063  *
1064  *	struct symlinkdata3 {
1065  *		sattr3		symlink_attributes;
1066  *		nfspath3	symlink_data;
1067  *	};
1068  *
1069  *	struct SYMLINK3args {
1070  *		diropargs3	where;
1071  *		symlinkdata3	symlink;
1072  *	};
1073  */
encode_symlinkdata3(struct xdr_stream * xdr,const void * data,struct user_namespace * userns)1074 static void encode_symlinkdata3(struct xdr_stream *xdr,
1075 				const void *data,
1076 				struct user_namespace *userns)
1077 {
1078 	const struct nfs3_symlinkargs *args = data;
1079 
1080 	encode_sattr3(xdr, args->sattr, userns);
1081 	encode_nfspath3(xdr, args->pages, args->pathlen);
1082 }
1083 
nfs3_xdr_enc_symlink3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1084 static void nfs3_xdr_enc_symlink3args(struct rpc_rqst *req,
1085 				      struct xdr_stream *xdr,
1086 				      const void *data)
1087 {
1088 	const struct nfs3_symlinkargs *args = data;
1089 
1090 	encode_diropargs3(xdr, args->fromfh, args->fromname, args->fromlen);
1091 	encode_symlinkdata3(xdr, args, rpc_rqst_userns(req));
1092 	xdr->buf->flags |= XDRBUF_WRITE;
1093 }
1094 
1095 /*
1096  * 3.3.11  MKNOD3args
1097  *
1098  *	struct devicedata3 {
1099  *		sattr3		dev_attributes;
1100  *		specdata3	spec;
1101  *	};
1102  *
1103  *	union mknoddata3 switch (ftype3 type) {
1104  *	case NF3CHR:
1105  *	case NF3BLK:
1106  *		devicedata3	device;
1107  *	case NF3SOCK:
1108  *	case NF3FIFO:
1109  *		sattr3		pipe_attributes;
1110  *	default:
1111  *		void;
1112  *	};
1113  *
1114  *	struct MKNOD3args {
1115  *		diropargs3	where;
1116  *		mknoddata3	what;
1117  *	};
1118  */
encode_devicedata3(struct xdr_stream * xdr,const struct nfs3_mknodargs * args,struct user_namespace * userns)1119 static void encode_devicedata3(struct xdr_stream *xdr,
1120 			       const struct nfs3_mknodargs *args,
1121 			       struct user_namespace *userns)
1122 {
1123 	encode_sattr3(xdr, args->sattr, userns);
1124 	encode_specdata3(xdr, args->rdev);
1125 }
1126 
encode_mknoddata3(struct xdr_stream * xdr,const struct nfs3_mknodargs * args,struct user_namespace * userns)1127 static void encode_mknoddata3(struct xdr_stream *xdr,
1128 			      const struct nfs3_mknodargs *args,
1129 			      struct user_namespace *userns)
1130 {
1131 	encode_ftype3(xdr, args->type);
1132 	switch (args->type) {
1133 	case NF3CHR:
1134 	case NF3BLK:
1135 		encode_devicedata3(xdr, args, userns);
1136 		break;
1137 	case NF3SOCK:
1138 	case NF3FIFO:
1139 		encode_sattr3(xdr, args->sattr, userns);
1140 		break;
1141 	case NF3REG:
1142 	case NF3DIR:
1143 		break;
1144 	default:
1145 		BUG();
1146 	}
1147 }
1148 
nfs3_xdr_enc_mknod3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1149 static void nfs3_xdr_enc_mknod3args(struct rpc_rqst *req,
1150 				    struct xdr_stream *xdr,
1151 				    const void *data)
1152 {
1153 	const struct nfs3_mknodargs *args = data;
1154 
1155 	encode_diropargs3(xdr, args->fh, args->name, args->len);
1156 	encode_mknoddata3(xdr, args, rpc_rqst_userns(req));
1157 }
1158 
1159 /*
1160  * 3.3.12  REMOVE3args
1161  *
1162  *	struct REMOVE3args {
1163  *		diropargs3  object;
1164  *	};
1165  */
nfs3_xdr_enc_remove3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1166 static void nfs3_xdr_enc_remove3args(struct rpc_rqst *req,
1167 				     struct xdr_stream *xdr,
1168 				     const void *data)
1169 {
1170 	const struct nfs_removeargs *args = data;
1171 
1172 	encode_diropargs3(xdr, args->fh, args->name.name, args->name.len);
1173 }
1174 
1175 /*
1176  * 3.3.14  RENAME3args
1177  *
1178  *	struct RENAME3args {
1179  *		diropargs3	from;
1180  *		diropargs3	to;
1181  *	};
1182  */
nfs3_xdr_enc_rename3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1183 static void nfs3_xdr_enc_rename3args(struct rpc_rqst *req,
1184 				     struct xdr_stream *xdr,
1185 				     const void *data)
1186 {
1187 	const struct nfs_renameargs *args = data;
1188 	const struct qstr *old = args->old_name;
1189 	const struct qstr *new = args->new_name;
1190 
1191 	encode_diropargs3(xdr, args->old_dir, old->name, old->len);
1192 	encode_diropargs3(xdr, args->new_dir, new->name, new->len);
1193 }
1194 
1195 /*
1196  * 3.3.15  LINK3args
1197  *
1198  *	struct LINK3args {
1199  *		nfs_fh3		file;
1200  *		diropargs3	link;
1201  *	};
1202  */
nfs3_xdr_enc_link3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1203 static void nfs3_xdr_enc_link3args(struct rpc_rqst *req,
1204 				   struct xdr_stream *xdr,
1205 				   const void *data)
1206 {
1207 	const struct nfs3_linkargs *args = data;
1208 
1209 	encode_nfs_fh3(xdr, args->fromfh);
1210 	encode_diropargs3(xdr, args->tofh, args->toname, args->tolen);
1211 }
1212 
1213 /*
1214  * 3.3.16  READDIR3args
1215  *
1216  *	struct READDIR3args {
1217  *		nfs_fh3		dir;
1218  *		cookie3		cookie;
1219  *		cookieverf3	cookieverf;
1220  *		count3		count;
1221  *	};
1222  */
encode_readdir3args(struct xdr_stream * xdr,const struct nfs3_readdirargs * args)1223 static void encode_readdir3args(struct xdr_stream *xdr,
1224 				const struct nfs3_readdirargs *args)
1225 {
1226 	__be32 *p;
1227 
1228 	encode_nfs_fh3(xdr, args->fh);
1229 
1230 	p = xdr_reserve_space(xdr, 8 + NFS3_COOKIEVERFSIZE + 4);
1231 	p = xdr_encode_cookie3(p, args->cookie);
1232 	p = xdr_encode_cookieverf3(p, args->verf);
1233 	*p = cpu_to_be32(args->count);
1234 }
1235 
nfs3_xdr_enc_readdir3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1236 static void nfs3_xdr_enc_readdir3args(struct rpc_rqst *req,
1237 				      struct xdr_stream *xdr,
1238 				      const void *data)
1239 {
1240 	const struct nfs3_readdirargs *args = data;
1241 
1242 	encode_readdir3args(xdr, args);
1243 	rpc_prepare_reply_pages(req, args->pages, 0,
1244 				args->count, NFS3_readdirres_sz);
1245 }
1246 
1247 /*
1248  * 3.3.17  READDIRPLUS3args
1249  *
1250  *	struct READDIRPLUS3args {
1251  *		nfs_fh3		dir;
1252  *		cookie3		cookie;
1253  *		cookieverf3	cookieverf;
1254  *		count3		dircount;
1255  *		count3		maxcount;
1256  *	};
1257  */
encode_readdirplus3args(struct xdr_stream * xdr,const struct nfs3_readdirargs * args)1258 static void encode_readdirplus3args(struct xdr_stream *xdr,
1259 				    const struct nfs3_readdirargs *args)
1260 {
1261 	__be32 *p;
1262 
1263 	encode_nfs_fh3(xdr, args->fh);
1264 
1265 	p = xdr_reserve_space(xdr, 8 + NFS3_COOKIEVERFSIZE + 4 + 4);
1266 	p = xdr_encode_cookie3(p, args->cookie);
1267 	p = xdr_encode_cookieverf3(p, args->verf);
1268 
1269 	/*
1270 	 * readdirplus: need dircount + buffer size.
1271 	 * We just make sure we make dircount big enough
1272 	 */
1273 	*p++ = cpu_to_be32(args->count >> 3);
1274 
1275 	*p = cpu_to_be32(args->count);
1276 }
1277 
nfs3_xdr_enc_readdirplus3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1278 static void nfs3_xdr_enc_readdirplus3args(struct rpc_rqst *req,
1279 					  struct xdr_stream *xdr,
1280 					  const void *data)
1281 {
1282 	const struct nfs3_readdirargs *args = data;
1283 
1284 	encode_readdirplus3args(xdr, args);
1285 	rpc_prepare_reply_pages(req, args->pages, 0,
1286 				args->count, NFS3_readdirres_sz);
1287 }
1288 
1289 /*
1290  * 3.3.21  COMMIT3args
1291  *
1292  *	struct COMMIT3args {
1293  *		nfs_fh3		file;
1294  *		offset3		offset;
1295  *		count3		count;
1296  *	};
1297  */
encode_commit3args(struct xdr_stream * xdr,const struct nfs_commitargs * args)1298 static void encode_commit3args(struct xdr_stream *xdr,
1299 			       const struct nfs_commitargs *args)
1300 {
1301 	__be32 *p;
1302 
1303 	encode_nfs_fh3(xdr, args->fh);
1304 
1305 	p = xdr_reserve_space(xdr, 8 + 4);
1306 	p = xdr_encode_hyper(p, args->offset);
1307 	*p = cpu_to_be32(args->count);
1308 }
1309 
nfs3_xdr_enc_commit3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1310 static void nfs3_xdr_enc_commit3args(struct rpc_rqst *req,
1311 				     struct xdr_stream *xdr,
1312 				     const void *data)
1313 {
1314 	const struct nfs_commitargs *args = data;
1315 
1316 	encode_commit3args(xdr, args);
1317 }
1318 
1319 #ifdef CONFIG_NFS_V3_ACL
1320 
nfs3_xdr_enc_getacl3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1321 static void nfs3_xdr_enc_getacl3args(struct rpc_rqst *req,
1322 				     struct xdr_stream *xdr,
1323 				     const void *data)
1324 {
1325 	const struct nfs3_getaclargs *args = data;
1326 
1327 	encode_nfs_fh3(xdr, args->fh);
1328 	encode_uint32(xdr, args->mask);
1329 	if (args->mask & (NFS_ACL | NFS_DFACL)) {
1330 		rpc_prepare_reply_pages(req, args->pages, 0,
1331 					NFSACL_MAXPAGES << PAGE_SHIFT,
1332 					ACL3_getaclres_sz);
1333 		req->rq_rcv_buf.flags |= XDRBUF_SPARSE_PAGES;
1334 	}
1335 }
1336 
nfs3_xdr_enc_setacl3args(struct rpc_rqst * req,struct xdr_stream * xdr,const void * data)1337 static void nfs3_xdr_enc_setacl3args(struct rpc_rqst *req,
1338 				     struct xdr_stream *xdr,
1339 				     const void *data)
1340 {
1341 	const struct nfs3_setaclargs *args = data;
1342 	unsigned int base;
1343 	int error;
1344 
1345 	encode_nfs_fh3(xdr, NFS_FH(args->inode));
1346 	encode_uint32(xdr, args->mask);
1347 
1348 	base = req->rq_slen;
1349 	if (args->npages != 0)
1350 		xdr_write_pages(xdr, args->pages, 0, args->len);
1351 	else
1352 		xdr_reserve_space(xdr, args->len);
1353 
1354 	error = nfsacl_encode(xdr->buf, base, args->inode,
1355 			    (args->mask & NFS_ACL) ?
1356 			    args->acl_access : NULL, 1, 0);
1357 	/* FIXME: this is just broken */
1358 	BUG_ON(error < 0);
1359 	error = nfsacl_encode(xdr->buf, base + error, args->inode,
1360 			    (args->mask & NFS_DFACL) ?
1361 			    args->acl_default : NULL, 1,
1362 			    NFS_ACL_DEFAULT);
1363 	BUG_ON(error < 0);
1364 }
1365 
1366 #endif  /* CONFIG_NFS_V3_ACL */
1367 
1368 /*
1369  * NFSv3 XDR decode functions
1370  *
1371  * NFSv3 result types are defined in section 3.3 of RFC 1813:
1372  * "NFS Version 3 Protocol Specification".
1373  */
1374 
1375 /*
1376  * 3.3.1  GETATTR3res
1377  *
1378  *	struct GETATTR3resok {
1379  *		fattr3		obj_attributes;
1380  *	};
1381  *
1382  *	union GETATTR3res switch (nfsstat3 status) {
1383  *	case NFS3_OK:
1384  *		GETATTR3resok  resok;
1385  *	default:
1386  *		void;
1387  *	};
1388  */
nfs3_xdr_dec_getattr3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * result)1389 static int nfs3_xdr_dec_getattr3res(struct rpc_rqst *req,
1390 				    struct xdr_stream *xdr,
1391 				    void *result)
1392 {
1393 	enum nfs_stat status;
1394 	int error;
1395 
1396 	error = decode_nfsstat3(xdr, &status);
1397 	if (unlikely(error))
1398 		goto out;
1399 	if (status != NFS3_OK)
1400 		goto out_default;
1401 	error = decode_fattr3(xdr, result, rpc_rqst_userns(req));
1402 out:
1403 	return error;
1404 out_default:
1405 	return nfs3_stat_to_errno(status);
1406 }
1407 
1408 /*
1409  * 3.3.2  SETATTR3res
1410  *
1411  *	struct SETATTR3resok {
1412  *		wcc_data  obj_wcc;
1413  *	};
1414  *
1415  *	struct SETATTR3resfail {
1416  *		wcc_data  obj_wcc;
1417  *	};
1418  *
1419  *	union SETATTR3res switch (nfsstat3 status) {
1420  *	case NFS3_OK:
1421  *		SETATTR3resok   resok;
1422  *	default:
1423  *		SETATTR3resfail resfail;
1424  *	};
1425  */
nfs3_xdr_dec_setattr3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * result)1426 static int nfs3_xdr_dec_setattr3res(struct rpc_rqst *req,
1427 				    struct xdr_stream *xdr,
1428 				    void *result)
1429 {
1430 	enum nfs_stat status;
1431 	int error;
1432 
1433 	error = decode_nfsstat3(xdr, &status);
1434 	if (unlikely(error))
1435 		goto out;
1436 	error = decode_wcc_data(xdr, result, rpc_rqst_userns(req));
1437 	if (unlikely(error))
1438 		goto out;
1439 	if (status != NFS3_OK)
1440 		goto out_status;
1441 out:
1442 	return error;
1443 out_status:
1444 	return nfs3_stat_to_errno(status);
1445 }
1446 
1447 /*
1448  * 3.3.3  LOOKUP3res
1449  *
1450  *	struct LOOKUP3resok {
1451  *		nfs_fh3		object;
1452  *		post_op_attr	obj_attributes;
1453  *		post_op_attr	dir_attributes;
1454  *	};
1455  *
1456  *	struct LOOKUP3resfail {
1457  *		post_op_attr	dir_attributes;
1458  *	};
1459  *
1460  *	union LOOKUP3res switch (nfsstat3 status) {
1461  *	case NFS3_OK:
1462  *		LOOKUP3resok	resok;
1463  *	default:
1464  *		LOOKUP3resfail	resfail;
1465  *	};
1466  */
nfs3_xdr_dec_lookup3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)1467 static int nfs3_xdr_dec_lookup3res(struct rpc_rqst *req,
1468 				   struct xdr_stream *xdr,
1469 				   void *data)
1470 {
1471 	struct user_namespace *userns = rpc_rqst_userns(req);
1472 	struct nfs3_diropres *result = data;
1473 	enum nfs_stat status;
1474 	int error;
1475 
1476 	error = decode_nfsstat3(xdr, &status);
1477 	if (unlikely(error))
1478 		goto out;
1479 	if (status != NFS3_OK)
1480 		goto out_default;
1481 	error = decode_nfs_fh3(xdr, result->fh);
1482 	if (unlikely(error))
1483 		goto out;
1484 	error = decode_post_op_attr(xdr, result->fattr, userns);
1485 	if (unlikely(error))
1486 		goto out;
1487 	error = decode_post_op_attr(xdr, result->dir_attr, userns);
1488 out:
1489 	return error;
1490 out_default:
1491 	error = decode_post_op_attr(xdr, result->dir_attr, userns);
1492 	if (unlikely(error))
1493 		goto out;
1494 	return nfs3_stat_to_errno(status);
1495 }
1496 
1497 /*
1498  * 3.3.4  ACCESS3res
1499  *
1500  *	struct ACCESS3resok {
1501  *		post_op_attr	obj_attributes;
1502  *		uint32		access;
1503  *	};
1504  *
1505  *	struct ACCESS3resfail {
1506  *		post_op_attr	obj_attributes;
1507  *	};
1508  *
1509  *	union ACCESS3res switch (nfsstat3 status) {
1510  *	case NFS3_OK:
1511  *		ACCESS3resok	resok;
1512  *	default:
1513  *		ACCESS3resfail	resfail;
1514  *	};
1515  */
nfs3_xdr_dec_access3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)1516 static int nfs3_xdr_dec_access3res(struct rpc_rqst *req,
1517 				   struct xdr_stream *xdr,
1518 				   void *data)
1519 {
1520 	struct nfs3_accessres *result = data;
1521 	enum nfs_stat status;
1522 	int error;
1523 
1524 	error = decode_nfsstat3(xdr, &status);
1525 	if (unlikely(error))
1526 		goto out;
1527 	error = decode_post_op_attr(xdr, result->fattr, rpc_rqst_userns(req));
1528 	if (unlikely(error))
1529 		goto out;
1530 	if (status != NFS3_OK)
1531 		goto out_default;
1532 	error = decode_uint32(xdr, &result->access);
1533 out:
1534 	return error;
1535 out_default:
1536 	return nfs3_stat_to_errno(status);
1537 }
1538 
1539 /*
1540  * 3.3.5  READLINK3res
1541  *
1542  *	struct READLINK3resok {
1543  *		post_op_attr	symlink_attributes;
1544  *		nfspath3	data;
1545  *	};
1546  *
1547  *	struct READLINK3resfail {
1548  *		post_op_attr	symlink_attributes;
1549  *	};
1550  *
1551  *	union READLINK3res switch (nfsstat3 status) {
1552  *	case NFS3_OK:
1553  *		READLINK3resok	resok;
1554  *	default:
1555  *		READLINK3resfail resfail;
1556  *	};
1557  */
nfs3_xdr_dec_readlink3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * result)1558 static int nfs3_xdr_dec_readlink3res(struct rpc_rqst *req,
1559 				     struct xdr_stream *xdr,
1560 				     void *result)
1561 {
1562 	enum nfs_stat status;
1563 	int error;
1564 
1565 	error = decode_nfsstat3(xdr, &status);
1566 	if (unlikely(error))
1567 		goto out;
1568 	error = decode_post_op_attr(xdr, result, rpc_rqst_userns(req));
1569 	if (unlikely(error))
1570 		goto out;
1571 	if (status != NFS3_OK)
1572 		goto out_default;
1573 	error = decode_nfspath3(xdr);
1574 out:
1575 	return error;
1576 out_default:
1577 	return nfs3_stat_to_errno(status);
1578 }
1579 
1580 /*
1581  * 3.3.6  READ3res
1582  *
1583  *	struct READ3resok {
1584  *		post_op_attr	file_attributes;
1585  *		count3		count;
1586  *		bool		eof;
1587  *		opaque		data<>;
1588  *	};
1589  *
1590  *	struct READ3resfail {
1591  *		post_op_attr	file_attributes;
1592  *	};
1593  *
1594  *	union READ3res switch (nfsstat3 status) {
1595  *	case NFS3_OK:
1596  *		READ3resok	resok;
1597  *	default:
1598  *		READ3resfail	resfail;
1599  *	};
1600  */
decode_read3resok(struct xdr_stream * xdr,struct nfs_pgio_res * result)1601 static int decode_read3resok(struct xdr_stream *xdr,
1602 			     struct nfs_pgio_res *result)
1603 {
1604 	u32 eof, count, ocount, recvd;
1605 	__be32 *p;
1606 
1607 	p = xdr_inline_decode(xdr, 4 + 4 + 4);
1608 	if (unlikely(!p))
1609 		return -EIO;
1610 	count = be32_to_cpup(p++);
1611 	eof = be32_to_cpup(p++);
1612 	ocount = be32_to_cpup(p++);
1613 	if (unlikely(ocount != count))
1614 		goto out_mismatch;
1615 	recvd = xdr_read_pages(xdr, count);
1616 	if (unlikely(count > recvd))
1617 		goto out_cheating;
1618 out:
1619 	result->eof = eof;
1620 	result->count = count;
1621 	return count;
1622 out_mismatch:
1623 	dprintk("NFS: READ count doesn't match length of opaque: "
1624 		"count %u != ocount %u\n", count, ocount);
1625 	return -EIO;
1626 out_cheating:
1627 	dprintk("NFS: server cheating in read result: "
1628 		"count %u > recvd %u\n", count, recvd);
1629 	count = recvd;
1630 	eof = 0;
1631 	goto out;
1632 }
1633 
nfs3_xdr_dec_read3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)1634 static int nfs3_xdr_dec_read3res(struct rpc_rqst *req, struct xdr_stream *xdr,
1635 				 void *data)
1636 {
1637 	struct nfs_pgio_res *result = data;
1638 	unsigned int pos;
1639 	enum nfs_stat status;
1640 	int error;
1641 
1642 	pos = xdr_stream_pos(xdr);
1643 	error = decode_nfsstat3(xdr, &status);
1644 	if (unlikely(error))
1645 		goto out;
1646 	error = decode_post_op_attr(xdr, result->fattr, rpc_rqst_userns(req));
1647 	if (unlikely(error))
1648 		goto out;
1649 	result->op_status = status;
1650 	if (status != NFS3_OK)
1651 		goto out_status;
1652 	result->replen = 4 + ((xdr_stream_pos(xdr) - pos) >> 2);
1653 	error = decode_read3resok(xdr, result);
1654 out:
1655 	return error;
1656 out_status:
1657 	return nfs3_stat_to_errno(status);
1658 }
1659 
1660 /*
1661  * 3.3.7  WRITE3res
1662  *
1663  *	enum stable_how {
1664  *		UNSTABLE  = 0,
1665  *		DATA_SYNC = 1,
1666  *		FILE_SYNC = 2
1667  *	};
1668  *
1669  *	struct WRITE3resok {
1670  *		wcc_data	file_wcc;
1671  *		count3		count;
1672  *		stable_how	committed;
1673  *		writeverf3	verf;
1674  *	};
1675  *
1676  *	struct WRITE3resfail {
1677  *		wcc_data	file_wcc;
1678  *	};
1679  *
1680  *	union WRITE3res switch (nfsstat3 status) {
1681  *	case NFS3_OK:
1682  *		WRITE3resok	resok;
1683  *	default:
1684  *		WRITE3resfail	resfail;
1685  *	};
1686  */
decode_write3resok(struct xdr_stream * xdr,struct nfs_pgio_res * result)1687 static int decode_write3resok(struct xdr_stream *xdr,
1688 			      struct nfs_pgio_res *result)
1689 {
1690 	__be32 *p;
1691 
1692 	p = xdr_inline_decode(xdr, 4 + 4);
1693 	if (unlikely(!p))
1694 		return -EIO;
1695 	result->count = be32_to_cpup(p++);
1696 	result->verf->committed = be32_to_cpup(p++);
1697 	if (unlikely(result->verf->committed > NFS_FILE_SYNC))
1698 		goto out_badvalue;
1699 	if (decode_writeverf3(xdr, &result->verf->verifier))
1700 		return -EIO;
1701 	return result->count;
1702 out_badvalue:
1703 	dprintk("NFS: bad stable_how value: %u\n", result->verf->committed);
1704 	return -EIO;
1705 }
1706 
nfs3_xdr_dec_write3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)1707 static int nfs3_xdr_dec_write3res(struct rpc_rqst *req, struct xdr_stream *xdr,
1708 				  void *data)
1709 {
1710 	struct nfs_pgio_res *result = data;
1711 	enum nfs_stat status;
1712 	int error;
1713 
1714 	error = decode_nfsstat3(xdr, &status);
1715 	if (unlikely(error))
1716 		goto out;
1717 	error = decode_wcc_data(xdr, result->fattr, rpc_rqst_userns(req));
1718 	if (unlikely(error))
1719 		goto out;
1720 	result->op_status = status;
1721 	if (status != NFS3_OK)
1722 		goto out_status;
1723 	error = decode_write3resok(xdr, result);
1724 out:
1725 	return error;
1726 out_status:
1727 	return nfs3_stat_to_errno(status);
1728 }
1729 
1730 /*
1731  * 3.3.8  CREATE3res
1732  *
1733  *	struct CREATE3resok {
1734  *		post_op_fh3	obj;
1735  *		post_op_attr	obj_attributes;
1736  *		wcc_data	dir_wcc;
1737  *	};
1738  *
1739  *	struct CREATE3resfail {
1740  *		wcc_data	dir_wcc;
1741  *	};
1742  *
1743  *	union CREATE3res switch (nfsstat3 status) {
1744  *	case NFS3_OK:
1745  *		CREATE3resok	resok;
1746  *	default:
1747  *		CREATE3resfail	resfail;
1748  *	};
1749  */
decode_create3resok(struct xdr_stream * xdr,struct nfs3_diropres * result,struct user_namespace * userns)1750 static int decode_create3resok(struct xdr_stream *xdr,
1751 			       struct nfs3_diropres *result,
1752 			       struct user_namespace *userns)
1753 {
1754 	int error;
1755 
1756 	error = decode_post_op_fh3(xdr, result->fh);
1757 	if (unlikely(error))
1758 		goto out;
1759 	error = decode_post_op_attr(xdr, result->fattr, userns);
1760 	if (unlikely(error))
1761 		goto out;
1762 	/* The server isn't required to return a file handle.
1763 	 * If it didn't, force the client to perform a LOOKUP
1764 	 * to determine the correct file handle and attribute
1765 	 * values for the new object. */
1766 	if (result->fh->size == 0)
1767 		result->fattr->valid = 0;
1768 	error = decode_wcc_data(xdr, result->dir_attr, userns);
1769 out:
1770 	return error;
1771 }
1772 
nfs3_xdr_dec_create3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)1773 static int nfs3_xdr_dec_create3res(struct rpc_rqst *req,
1774 				   struct xdr_stream *xdr,
1775 				   void *data)
1776 {
1777 	struct user_namespace *userns = rpc_rqst_userns(req);
1778 	struct nfs3_diropres *result = data;
1779 	enum nfs_stat status;
1780 	int error;
1781 
1782 	error = decode_nfsstat3(xdr, &status);
1783 	if (unlikely(error))
1784 		goto out;
1785 	if (status != NFS3_OK)
1786 		goto out_default;
1787 	error = decode_create3resok(xdr, result, userns);
1788 out:
1789 	return error;
1790 out_default:
1791 	error = decode_wcc_data(xdr, result->dir_attr, userns);
1792 	if (unlikely(error))
1793 		goto out;
1794 	return nfs3_stat_to_errno(status);
1795 }
1796 
1797 /*
1798  * 3.3.12  REMOVE3res
1799  *
1800  *	struct REMOVE3resok {
1801  *		wcc_data    dir_wcc;
1802  *	};
1803  *
1804  *	struct REMOVE3resfail {
1805  *		wcc_data    dir_wcc;
1806  *	};
1807  *
1808  *	union REMOVE3res switch (nfsstat3 status) {
1809  *	case NFS3_OK:
1810  *		REMOVE3resok   resok;
1811  *	default:
1812  *		REMOVE3resfail resfail;
1813  *	};
1814  */
nfs3_xdr_dec_remove3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)1815 static int nfs3_xdr_dec_remove3res(struct rpc_rqst *req,
1816 				   struct xdr_stream *xdr,
1817 				   void *data)
1818 {
1819 	struct nfs_removeres *result = data;
1820 	enum nfs_stat status;
1821 	int error;
1822 
1823 	error = decode_nfsstat3(xdr, &status);
1824 	if (unlikely(error))
1825 		goto out;
1826 	error = decode_wcc_data(xdr, result->dir_attr, rpc_rqst_userns(req));
1827 	if (unlikely(error))
1828 		goto out;
1829 	if (status != NFS3_OK)
1830 		goto out_status;
1831 out:
1832 	return error;
1833 out_status:
1834 	return nfs3_stat_to_errno(status);
1835 }
1836 
1837 /*
1838  * 3.3.14  RENAME3res
1839  *
1840  *	struct RENAME3resok {
1841  *		wcc_data	fromdir_wcc;
1842  *		wcc_data	todir_wcc;
1843  *	};
1844  *
1845  *	struct RENAME3resfail {
1846  *		wcc_data	fromdir_wcc;
1847  *		wcc_data	todir_wcc;
1848  *	};
1849  *
1850  *	union RENAME3res switch (nfsstat3 status) {
1851  *	case NFS3_OK:
1852  *		RENAME3resok   resok;
1853  *	default:
1854  *		RENAME3resfail resfail;
1855  *	};
1856  */
nfs3_xdr_dec_rename3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)1857 static int nfs3_xdr_dec_rename3res(struct rpc_rqst *req,
1858 				   struct xdr_stream *xdr,
1859 				   void *data)
1860 {
1861 	struct user_namespace *userns = rpc_rqst_userns(req);
1862 	struct nfs_renameres *result = data;
1863 	enum nfs_stat status;
1864 	int error;
1865 
1866 	error = decode_nfsstat3(xdr, &status);
1867 	if (unlikely(error))
1868 		goto out;
1869 	error = decode_wcc_data(xdr, result->old_fattr, userns);
1870 	if (unlikely(error))
1871 		goto out;
1872 	error = decode_wcc_data(xdr, result->new_fattr, userns);
1873 	if (unlikely(error))
1874 		goto out;
1875 	if (status != NFS3_OK)
1876 		goto out_status;
1877 out:
1878 	return error;
1879 out_status:
1880 	return nfs3_stat_to_errno(status);
1881 }
1882 
1883 /*
1884  * 3.3.15  LINK3res
1885  *
1886  *	struct LINK3resok {
1887  *		post_op_attr	file_attributes;
1888  *		wcc_data	linkdir_wcc;
1889  *	};
1890  *
1891  *	struct LINK3resfail {
1892  *		post_op_attr	file_attributes;
1893  *		wcc_data	linkdir_wcc;
1894  *	};
1895  *
1896  *	union LINK3res switch (nfsstat3 status) {
1897  *	case NFS3_OK:
1898  *		LINK3resok	resok;
1899  *	default:
1900  *		LINK3resfail	resfail;
1901  *	};
1902  */
nfs3_xdr_dec_link3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)1903 static int nfs3_xdr_dec_link3res(struct rpc_rqst *req, struct xdr_stream *xdr,
1904 				 void *data)
1905 {
1906 	struct user_namespace *userns = rpc_rqst_userns(req);
1907 	struct nfs3_linkres *result = data;
1908 	enum nfs_stat status;
1909 	int error;
1910 
1911 	error = decode_nfsstat3(xdr, &status);
1912 	if (unlikely(error))
1913 		goto out;
1914 	error = decode_post_op_attr(xdr, result->fattr, userns);
1915 	if (unlikely(error))
1916 		goto out;
1917 	error = decode_wcc_data(xdr, result->dir_attr, userns);
1918 	if (unlikely(error))
1919 		goto out;
1920 	if (status != NFS3_OK)
1921 		goto out_status;
1922 out:
1923 	return error;
1924 out_status:
1925 	return nfs3_stat_to_errno(status);
1926 }
1927 
1928 /**
1929  * nfs3_decode_dirent - Decode a single NFSv3 directory entry stored in
1930  *			the local page cache
1931  * @xdr: XDR stream where entry resides
1932  * @entry: buffer to fill in with entry data
1933  * @plus: boolean indicating whether this should be a readdirplus entry
1934  *
1935  * Returns zero if successful, otherwise a negative errno value is
1936  * returned.
1937  *
1938  * This function is not invoked during READDIR reply decoding, but
1939  * rather whenever an application invokes the getdents(2) system call
1940  * on a directory already in our cache.
1941  *
1942  * 3.3.16  entry3
1943  *
1944  *	struct entry3 {
1945  *		fileid3		fileid;
1946  *		filename3	name;
1947  *		cookie3		cookie;
1948  *		fhandle3	filehandle;
1949  *		post_op_attr3	attributes;
1950  *		entry3		*nextentry;
1951  *	};
1952  *
1953  * 3.3.17  entryplus3
1954  *	struct entryplus3 {
1955  *		fileid3		fileid;
1956  *		filename3	name;
1957  *		cookie3		cookie;
1958  *		post_op_attr	name_attributes;
1959  *		post_op_fh3	name_handle;
1960  *		entryplus3	*nextentry;
1961  *	};
1962  */
nfs3_decode_dirent(struct xdr_stream * xdr,struct nfs_entry * entry,bool plus)1963 int nfs3_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
1964 		       bool plus)
1965 {
1966 	struct user_namespace *userns = rpc_userns(entry->server->client);
1967 	struct nfs_entry old = *entry;
1968 	__be32 *p;
1969 	int error;
1970 	u64 new_cookie;
1971 
1972 	p = xdr_inline_decode(xdr, 4);
1973 	if (unlikely(!p))
1974 		return -EAGAIN;
1975 	if (*p == xdr_zero) {
1976 		p = xdr_inline_decode(xdr, 4);
1977 		if (unlikely(!p))
1978 			return -EAGAIN;
1979 		if (*p == xdr_zero)
1980 			return -EAGAIN;
1981 		entry->eof = 1;
1982 		return -EBADCOOKIE;
1983 	}
1984 
1985 	error = decode_fileid3(xdr, &entry->ino);
1986 	if (unlikely(error))
1987 		return error;
1988 
1989 	error = decode_inline_filename3(xdr, &entry->name, &entry->len);
1990 	if (unlikely(error))
1991 		return error;
1992 
1993 	error = decode_cookie3(xdr, &new_cookie);
1994 	if (unlikely(error))
1995 		return error;
1996 
1997 	entry->d_type = DT_UNKNOWN;
1998 
1999 	if (plus) {
2000 		entry->fattr->valid = 0;
2001 		error = decode_post_op_attr(xdr, entry->fattr, userns);
2002 		if (unlikely(error))
2003 			return error;
2004 		if (entry->fattr->valid & NFS_ATTR_FATTR_V3)
2005 			entry->d_type = nfs_umode_to_dtype(entry->fattr->mode);
2006 
2007 		if (entry->fattr->fileid != entry->ino) {
2008 			entry->fattr->mounted_on_fileid = entry->ino;
2009 			entry->fattr->valid |= NFS_ATTR_FATTR_MOUNTED_ON_FILEID;
2010 		}
2011 
2012 		/* In fact, a post_op_fh3: */
2013 		p = xdr_inline_decode(xdr, 4);
2014 		if (unlikely(!p))
2015 			return -EAGAIN;
2016 		if (*p != xdr_zero) {
2017 			error = decode_nfs_fh3(xdr, entry->fh);
2018 			if (unlikely(error)) {
2019 				if (error == -E2BIG)
2020 					goto out_truncated;
2021 				return error;
2022 			}
2023 		} else
2024 			zero_nfs_fh3(entry->fh);
2025 	}
2026 
2027 	entry->prev_cookie = entry->cookie;
2028 	entry->cookie = new_cookie;
2029 
2030 	return 0;
2031 
2032 out_truncated:
2033 	dprintk("NFS: directory entry contains invalid file handle\n");
2034 	*entry = old;
2035 	return -EAGAIN;
2036 }
2037 
2038 /*
2039  * 3.3.16  READDIR3res
2040  *
2041  *	struct dirlist3 {
2042  *		entry3		*entries;
2043  *		bool		eof;
2044  *	};
2045  *
2046  *	struct READDIR3resok {
2047  *		post_op_attr	dir_attributes;
2048  *		cookieverf3	cookieverf;
2049  *		dirlist3	reply;
2050  *	};
2051  *
2052  *	struct READDIR3resfail {
2053  *		post_op_attr	dir_attributes;
2054  *	};
2055  *
2056  *	union READDIR3res switch (nfsstat3 status) {
2057  *	case NFS3_OK:
2058  *		READDIR3resok	resok;
2059  *	default:
2060  *		READDIR3resfail	resfail;
2061  *	};
2062  *
2063  * Read the directory contents into the page cache, but otherwise
2064  * don't touch them.  The actual decoding is done by nfs3_decode_entry()
2065  * during subsequent nfs_readdir() calls.
2066  */
decode_dirlist3(struct xdr_stream * xdr)2067 static int decode_dirlist3(struct xdr_stream *xdr)
2068 {
2069 	return xdr_read_pages(xdr, xdr->buf->page_len);
2070 }
2071 
decode_readdir3resok(struct xdr_stream * xdr,struct nfs3_readdirres * result,struct user_namespace * userns)2072 static int decode_readdir3resok(struct xdr_stream *xdr,
2073 				struct nfs3_readdirres *result,
2074 				struct user_namespace *userns)
2075 {
2076 	int error;
2077 
2078 	error = decode_post_op_attr(xdr, result->dir_attr, userns);
2079 	if (unlikely(error))
2080 		goto out;
2081 	/* XXX: do we need to check if result->verf != NULL ? */
2082 	error = decode_cookieverf3(xdr, result->verf);
2083 	if (unlikely(error))
2084 		goto out;
2085 	error = decode_dirlist3(xdr);
2086 out:
2087 	return error;
2088 }
2089 
nfs3_xdr_dec_readdir3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)2090 static int nfs3_xdr_dec_readdir3res(struct rpc_rqst *req,
2091 				    struct xdr_stream *xdr,
2092 				    void *data)
2093 {
2094 	struct nfs3_readdirres *result = data;
2095 	enum nfs_stat status;
2096 	int error;
2097 
2098 	error = decode_nfsstat3(xdr, &status);
2099 	if (unlikely(error))
2100 		goto out;
2101 	if (status != NFS3_OK)
2102 		goto out_default;
2103 	error = decode_readdir3resok(xdr, result, rpc_rqst_userns(req));
2104 out:
2105 	return error;
2106 out_default:
2107 	error = decode_post_op_attr(xdr, result->dir_attr, rpc_rqst_userns(req));
2108 	if (unlikely(error))
2109 		goto out;
2110 	return nfs3_stat_to_errno(status);
2111 }
2112 
2113 /*
2114  * 3.3.18  FSSTAT3res
2115  *
2116  *	struct FSSTAT3resok {
2117  *		post_op_attr	obj_attributes;
2118  *		size3		tbytes;
2119  *		size3		fbytes;
2120  *		size3		abytes;
2121  *		size3		tfiles;
2122  *		size3		ffiles;
2123  *		size3		afiles;
2124  *		uint32		invarsec;
2125  *	};
2126  *
2127  *	struct FSSTAT3resfail {
2128  *		post_op_attr	obj_attributes;
2129  *	};
2130  *
2131  *	union FSSTAT3res switch (nfsstat3 status) {
2132  *	case NFS3_OK:
2133  *		FSSTAT3resok	resok;
2134  *	default:
2135  *		FSSTAT3resfail	resfail;
2136  *	};
2137  */
decode_fsstat3resok(struct xdr_stream * xdr,struct nfs_fsstat * result)2138 static int decode_fsstat3resok(struct xdr_stream *xdr,
2139 			       struct nfs_fsstat *result)
2140 {
2141 	__be32 *p;
2142 
2143 	p = xdr_inline_decode(xdr, 8 * 6 + 4);
2144 	if (unlikely(!p))
2145 		return -EIO;
2146 	p = xdr_decode_size3(p, &result->tbytes);
2147 	p = xdr_decode_size3(p, &result->fbytes);
2148 	p = xdr_decode_size3(p, &result->abytes);
2149 	p = xdr_decode_size3(p, &result->tfiles);
2150 	p = xdr_decode_size3(p, &result->ffiles);
2151 	xdr_decode_size3(p, &result->afiles);
2152 	/* ignore invarsec */
2153 	return 0;
2154 }
2155 
nfs3_xdr_dec_fsstat3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)2156 static int nfs3_xdr_dec_fsstat3res(struct rpc_rqst *req,
2157 				   struct xdr_stream *xdr,
2158 				   void *data)
2159 {
2160 	struct nfs_fsstat *result = data;
2161 	enum nfs_stat status;
2162 	int error;
2163 
2164 	error = decode_nfsstat3(xdr, &status);
2165 	if (unlikely(error))
2166 		goto out;
2167 	error = decode_post_op_attr(xdr, result->fattr, rpc_rqst_userns(req));
2168 	if (unlikely(error))
2169 		goto out;
2170 	if (status != NFS3_OK)
2171 		goto out_status;
2172 	error = decode_fsstat3resok(xdr, result);
2173 out:
2174 	return error;
2175 out_status:
2176 	return nfs3_stat_to_errno(status);
2177 }
2178 
2179 /*
2180  * 3.3.19  FSINFO3res
2181  *
2182  *	struct FSINFO3resok {
2183  *		post_op_attr	obj_attributes;
2184  *		uint32		rtmax;
2185  *		uint32		rtpref;
2186  *		uint32		rtmult;
2187  *		uint32		wtmax;
2188  *		uint32		wtpref;
2189  *		uint32		wtmult;
2190  *		uint32		dtpref;
2191  *		size3		maxfilesize;
2192  *		nfstime3	time_delta;
2193  *		uint32		properties;
2194  *	};
2195  *
2196  *	struct FSINFO3resfail {
2197  *		post_op_attr	obj_attributes;
2198  *	};
2199  *
2200  *	union FSINFO3res switch (nfsstat3 status) {
2201  *	case NFS3_OK:
2202  *		FSINFO3resok	resok;
2203  *	default:
2204  *		FSINFO3resfail	resfail;
2205  *	};
2206  */
decode_fsinfo3resok(struct xdr_stream * xdr,struct nfs_fsinfo * result)2207 static int decode_fsinfo3resok(struct xdr_stream *xdr,
2208 			       struct nfs_fsinfo *result)
2209 {
2210 	__be32 *p;
2211 
2212 	p = xdr_inline_decode(xdr, 4 * 7 + 8 + 8 + 4);
2213 	if (unlikely(!p))
2214 		return -EIO;
2215 	result->rtmax  = be32_to_cpup(p++);
2216 	result->rtpref = be32_to_cpup(p++);
2217 	result->rtmult = be32_to_cpup(p++);
2218 	result->wtmax  = be32_to_cpup(p++);
2219 	result->wtpref = be32_to_cpup(p++);
2220 	result->wtmult = be32_to_cpup(p++);
2221 	result->dtpref = be32_to_cpup(p++);
2222 	p = xdr_decode_size3(p, &result->maxfilesize);
2223 	xdr_decode_nfstime3(p, &result->time_delta);
2224 
2225 	/* ignore properties */
2226 	result->lease_time = 0;
2227 	return 0;
2228 }
2229 
nfs3_xdr_dec_fsinfo3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)2230 static int nfs3_xdr_dec_fsinfo3res(struct rpc_rqst *req,
2231 				   struct xdr_stream *xdr,
2232 				   void *data)
2233 {
2234 	struct nfs_fsinfo *result = data;
2235 	enum nfs_stat status;
2236 	int error;
2237 
2238 	error = decode_nfsstat3(xdr, &status);
2239 	if (unlikely(error))
2240 		goto out;
2241 	error = decode_post_op_attr(xdr, result->fattr, rpc_rqst_userns(req));
2242 	if (unlikely(error))
2243 		goto out;
2244 	if (status != NFS3_OK)
2245 		goto out_status;
2246 	error = decode_fsinfo3resok(xdr, result);
2247 out:
2248 	return error;
2249 out_status:
2250 	return nfs3_stat_to_errno(status);
2251 }
2252 
2253 /*
2254  * 3.3.20  PATHCONF3res
2255  *
2256  *	struct PATHCONF3resok {
2257  *		post_op_attr	obj_attributes;
2258  *		uint32		linkmax;
2259  *		uint32		name_max;
2260  *		bool		no_trunc;
2261  *		bool		chown_restricted;
2262  *		bool		case_insensitive;
2263  *		bool		case_preserving;
2264  *	};
2265  *
2266  *	struct PATHCONF3resfail {
2267  *		post_op_attr	obj_attributes;
2268  *	};
2269  *
2270  *	union PATHCONF3res switch (nfsstat3 status) {
2271  *	case NFS3_OK:
2272  *		PATHCONF3resok	resok;
2273  *	default:
2274  *		PATHCONF3resfail resfail;
2275  *	};
2276  */
decode_pathconf3resok(struct xdr_stream * xdr,struct nfs_pathconf * result)2277 static int decode_pathconf3resok(struct xdr_stream *xdr,
2278 				 struct nfs_pathconf *result)
2279 {
2280 	__be32 *p;
2281 
2282 	p = xdr_inline_decode(xdr, 4 * 6);
2283 	if (unlikely(!p))
2284 		return -EIO;
2285 	result->max_link = be32_to_cpup(p++);
2286 	result->max_namelen = be32_to_cpup(p);
2287 	/* ignore remaining fields */
2288 	return 0;
2289 }
2290 
nfs3_xdr_dec_pathconf3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)2291 static int nfs3_xdr_dec_pathconf3res(struct rpc_rqst *req,
2292 				     struct xdr_stream *xdr,
2293 				     void *data)
2294 {
2295 	struct nfs_pathconf *result = data;
2296 	enum nfs_stat status;
2297 	int error;
2298 
2299 	error = decode_nfsstat3(xdr, &status);
2300 	if (unlikely(error))
2301 		goto out;
2302 	error = decode_post_op_attr(xdr, result->fattr, rpc_rqst_userns(req));
2303 	if (unlikely(error))
2304 		goto out;
2305 	if (status != NFS3_OK)
2306 		goto out_status;
2307 	error = decode_pathconf3resok(xdr, result);
2308 out:
2309 	return error;
2310 out_status:
2311 	return nfs3_stat_to_errno(status);
2312 }
2313 
2314 /*
2315  * 3.3.21  COMMIT3res
2316  *
2317  *	struct COMMIT3resok {
2318  *		wcc_data	file_wcc;
2319  *		writeverf3	verf;
2320  *	};
2321  *
2322  *	struct COMMIT3resfail {
2323  *		wcc_data	file_wcc;
2324  *	};
2325  *
2326  *	union COMMIT3res switch (nfsstat3 status) {
2327  *	case NFS3_OK:
2328  *		COMMIT3resok	resok;
2329  *	default:
2330  *		COMMIT3resfail	resfail;
2331  *	};
2332  */
nfs3_xdr_dec_commit3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * data)2333 static int nfs3_xdr_dec_commit3res(struct rpc_rqst *req,
2334 				   struct xdr_stream *xdr,
2335 				   void *data)
2336 {
2337 	struct nfs_commitres *result = data;
2338 	struct nfs_writeverf *verf = result->verf;
2339 	enum nfs_stat status;
2340 	int error;
2341 
2342 	error = decode_nfsstat3(xdr, &status);
2343 	if (unlikely(error))
2344 		goto out;
2345 	error = decode_wcc_data(xdr, result->fattr, rpc_rqst_userns(req));
2346 	if (unlikely(error))
2347 		goto out;
2348 	result->op_status = status;
2349 	if (status != NFS3_OK)
2350 		goto out_status;
2351 	error = decode_writeverf3(xdr, &verf->verifier);
2352 	if (!error)
2353 		verf->committed = NFS_FILE_SYNC;
2354 out:
2355 	return error;
2356 out_status:
2357 	return nfs3_stat_to_errno(status);
2358 }
2359 
2360 #ifdef CONFIG_NFS_V3_ACL
2361 
decode_getacl3resok(struct xdr_stream * xdr,struct nfs3_getaclres * result,struct user_namespace * userns)2362 static inline int decode_getacl3resok(struct xdr_stream *xdr,
2363 				      struct nfs3_getaclres *result,
2364 				      struct user_namespace *userns)
2365 {
2366 	struct posix_acl **acl;
2367 	unsigned int *aclcnt;
2368 	size_t hdrlen;
2369 	int error;
2370 
2371 	error = decode_post_op_attr(xdr, result->fattr, userns);
2372 	if (unlikely(error))
2373 		goto out;
2374 	error = decode_uint32(xdr, &result->mask);
2375 	if (unlikely(error))
2376 		goto out;
2377 	error = -EINVAL;
2378 	if (result->mask & ~(NFS_ACL|NFS_ACLCNT|NFS_DFACL|NFS_DFACLCNT))
2379 		goto out;
2380 
2381 	hdrlen = xdr_stream_pos(xdr);
2382 
2383 	acl = NULL;
2384 	if (result->mask & NFS_ACL)
2385 		acl = &result->acl_access;
2386 	aclcnt = NULL;
2387 	if (result->mask & NFS_ACLCNT)
2388 		aclcnt = &result->acl_access_count;
2389 	error = nfsacl_decode(xdr->buf, hdrlen, aclcnt, acl);
2390 	if (unlikely(error <= 0))
2391 		goto out;
2392 
2393 	acl = NULL;
2394 	if (result->mask & NFS_DFACL)
2395 		acl = &result->acl_default;
2396 	aclcnt = NULL;
2397 	if (result->mask & NFS_DFACLCNT)
2398 		aclcnt = &result->acl_default_count;
2399 	error = nfsacl_decode(xdr->buf, hdrlen + error, aclcnt, acl);
2400 	if (unlikely(error <= 0))
2401 		return error;
2402 	error = 0;
2403 out:
2404 	return error;
2405 }
2406 
nfs3_xdr_dec_getacl3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * result)2407 static int nfs3_xdr_dec_getacl3res(struct rpc_rqst *req,
2408 				   struct xdr_stream *xdr,
2409 				   void *result)
2410 {
2411 	enum nfs_stat status;
2412 	int error;
2413 
2414 	error = decode_nfsstat3(xdr, &status);
2415 	if (unlikely(error))
2416 		goto out;
2417 	if (status != NFS3_OK)
2418 		goto out_default;
2419 	error = decode_getacl3resok(xdr, result, rpc_rqst_userns(req));
2420 out:
2421 	return error;
2422 out_default:
2423 	return nfs3_stat_to_errno(status);
2424 }
2425 
nfs3_xdr_dec_setacl3res(struct rpc_rqst * req,struct xdr_stream * xdr,void * result)2426 static int nfs3_xdr_dec_setacl3res(struct rpc_rqst *req,
2427 				   struct xdr_stream *xdr,
2428 				   void *result)
2429 {
2430 	enum nfs_stat status;
2431 	int error;
2432 
2433 	error = decode_nfsstat3(xdr, &status);
2434 	if (unlikely(error))
2435 		goto out;
2436 	if (status != NFS3_OK)
2437 		goto out_default;
2438 	error = decode_post_op_attr(xdr, result, rpc_rqst_userns(req));
2439 out:
2440 	return error;
2441 out_default:
2442 	return nfs3_stat_to_errno(status);
2443 }
2444 
2445 #endif  /* CONFIG_NFS_V3_ACL */
2446 
2447 
2448 /*
2449  * We need to translate between nfs status return values and
2450  * the local errno values which may not be the same.
2451  */
2452 static const struct {
2453 	int stat;
2454 	int errno;
2455 } nfs_errtbl[] = {
2456 	{ NFS_OK,		0		},
2457 	{ NFSERR_PERM,		-EPERM		},
2458 	{ NFSERR_NOENT,		-ENOENT		},
2459 	{ NFSERR_IO,		-errno_NFSERR_IO},
2460 	{ NFSERR_NXIO,		-ENXIO		},
2461 /*	{ NFSERR_EAGAIN,	-EAGAIN		}, */
2462 	{ NFSERR_ACCES,		-EACCES		},
2463 	{ NFSERR_EXIST,		-EEXIST		},
2464 	{ NFSERR_XDEV,		-EXDEV		},
2465 	{ NFSERR_NODEV,		-ENODEV		},
2466 	{ NFSERR_NOTDIR,	-ENOTDIR	},
2467 	{ NFSERR_ISDIR,		-EISDIR		},
2468 	{ NFSERR_INVAL,		-EINVAL		},
2469 	{ NFSERR_FBIG,		-EFBIG		},
2470 	{ NFSERR_NOSPC,		-ENOSPC		},
2471 	{ NFSERR_ROFS,		-EROFS		},
2472 	{ NFSERR_MLINK,		-EMLINK		},
2473 	{ NFSERR_NAMETOOLONG,	-ENAMETOOLONG	},
2474 	{ NFSERR_NOTEMPTY,	-ENOTEMPTY	},
2475 	{ NFSERR_DQUOT,		-EDQUOT		},
2476 	{ NFSERR_STALE,		-ESTALE		},
2477 	{ NFSERR_REMOTE,	-EREMOTE	},
2478 #ifdef EWFLUSH
2479 	{ NFSERR_WFLUSH,	-EWFLUSH	},
2480 #endif
2481 	{ NFSERR_BADHANDLE,	-EBADHANDLE	},
2482 	{ NFSERR_NOT_SYNC,	-ENOTSYNC	},
2483 	{ NFSERR_BAD_COOKIE,	-EBADCOOKIE	},
2484 	{ NFSERR_NOTSUPP,	-ENOTSUPP	},
2485 	{ NFSERR_TOOSMALL,	-ETOOSMALL	},
2486 	{ NFSERR_SERVERFAULT,	-EREMOTEIO	},
2487 	{ NFSERR_BADTYPE,	-EBADTYPE	},
2488 	{ NFSERR_JUKEBOX,	-EJUKEBOX	},
2489 	{ -1,			-EIO		}
2490 };
2491 
2492 /**
2493  * nfs3_stat_to_errno - convert an NFS status code to a local errno
2494  * @status: NFS status code to convert
2495  *
2496  * Returns a local errno value, or -EIO if the NFS status code is
2497  * not recognized.  This function is used jointly by NFSv2 and NFSv3.
2498  */
nfs3_stat_to_errno(enum nfs_stat status)2499 static int nfs3_stat_to_errno(enum nfs_stat status)
2500 {
2501 	int i;
2502 
2503 	for (i = 0; nfs_errtbl[i].stat != -1; i++) {
2504 		if (nfs_errtbl[i].stat == (int)status)
2505 			return nfs_errtbl[i].errno;
2506 	}
2507 	dprintk("NFS: Unrecognized nfs status value: %u\n", status);
2508 	return nfs_errtbl[i].errno;
2509 }
2510 
2511 
2512 #define PROC(proc, argtype, restype, timer)				\
2513 [NFS3PROC_##proc] = {							\
2514 	.p_proc      = NFS3PROC_##proc,					\
2515 	.p_encode    = nfs3_xdr_enc_##argtype##3args,			\
2516 	.p_decode    = nfs3_xdr_dec_##restype##3res,			\
2517 	.p_arglen    = NFS3_##argtype##args_sz,				\
2518 	.p_replen    = NFS3_##restype##res_sz,				\
2519 	.p_timer     = timer,						\
2520 	.p_statidx   = NFS3PROC_##proc,					\
2521 	.p_name      = #proc,						\
2522 	}
2523 
2524 const struct rpc_procinfo nfs3_procedures[] = {
2525 	PROC(GETATTR,		getattr,	getattr,	1),
2526 	PROC(SETATTR,		setattr,	setattr,	0),
2527 	PROC(LOOKUP,		lookup,		lookup,		2),
2528 	PROC(ACCESS,		access,		access,		1),
2529 	PROC(READLINK,		readlink,	readlink,	3),
2530 	PROC(READ,		read,		read,		3),
2531 	PROC(WRITE,		write,		write,		4),
2532 	PROC(CREATE,		create,		create,		0),
2533 	PROC(MKDIR,		mkdir,		create,		0),
2534 	PROC(SYMLINK,		symlink,	create,		0),
2535 	PROC(MKNOD,		mknod,		create,		0),
2536 	PROC(REMOVE,		remove,		remove,		0),
2537 	PROC(RMDIR,		lookup,		setattr,	0),
2538 	PROC(RENAME,		rename,		rename,		0),
2539 	PROC(LINK,		link,		link,		0),
2540 	PROC(READDIR,		readdir,	readdir,	3),
2541 	PROC(READDIRPLUS,	readdirplus,	readdir,	3),
2542 	PROC(FSSTAT,		getattr,	fsstat,		0),
2543 	PROC(FSINFO,		getattr,	fsinfo,		0),
2544 	PROC(PATHCONF,		getattr,	pathconf,	0),
2545 	PROC(COMMIT,		commit,		commit,		5),
2546 };
2547 
2548 static unsigned int nfs_version3_counts[ARRAY_SIZE(nfs3_procedures)];
2549 const struct rpc_version nfs_version3 = {
2550 	.number			= 3,
2551 	.nrprocs		= ARRAY_SIZE(nfs3_procedures),
2552 	.procs			= nfs3_procedures,
2553 	.counts			= nfs_version3_counts,
2554 };
2555 
2556 #ifdef CONFIG_NFS_V3_ACL
2557 static const struct rpc_procinfo nfs3_acl_procedures[] = {
2558 	[ACLPROC3_GETACL] = {
2559 		.p_proc = ACLPROC3_GETACL,
2560 		.p_encode = nfs3_xdr_enc_getacl3args,
2561 		.p_decode = nfs3_xdr_dec_getacl3res,
2562 		.p_arglen = ACL3_getaclargs_sz,
2563 		.p_replen = ACL3_getaclres_sz,
2564 		.p_timer = 1,
2565 		.p_name = "GETACL",
2566 	},
2567 	[ACLPROC3_SETACL] = {
2568 		.p_proc = ACLPROC3_SETACL,
2569 		.p_encode = nfs3_xdr_enc_setacl3args,
2570 		.p_decode = nfs3_xdr_dec_setacl3res,
2571 		.p_arglen = ACL3_setaclargs_sz,
2572 		.p_replen = ACL3_setaclres_sz,
2573 		.p_timer = 0,
2574 		.p_name = "SETACL",
2575 	},
2576 };
2577 
2578 static unsigned int nfs3_acl_counts[ARRAY_SIZE(nfs3_acl_procedures)];
2579 const struct rpc_version nfsacl_version3 = {
2580 	.number			= 3,
2581 	.nrprocs		= ARRAY_SIZE(nfs3_acl_procedures),
2582 	.procs			= nfs3_acl_procedures,
2583 	.counts			= nfs3_acl_counts,
2584 };
2585 #endif  /* CONFIG_NFS_V3_ACL */
2586