GNU Linux-libre 6.0.2-gnu
[releases.git] / fs / nfsd / nfs4xdr.c
1 /*
2  *  Server-side XDR for NFSv4
3  *
4  *  Copyright (c) 2002 The Regents of the University of Michigan.
5  *  All rights reserved.
6  *
7  *  Kendrick Smith <kmsmith@umich.edu>
8  *  Andy Adamson   <andros@umich.edu>
9  *
10  *  Redistribution and use in source and binary forms, with or without
11  *  modification, are permitted provided that the following conditions
12  *  are met:
13  *
14  *  1. Redistributions of source code must retain the above copyright
15  *     notice, this list of conditions and the following disclaimer.
16  *  2. Redistributions in binary form must reproduce the above copyright
17  *     notice, this list of conditions and the following disclaimer in the
18  *     documentation and/or other materials provided with the distribution.
19  *  3. Neither the name of the University nor the names of its
20  *     contributors may be used to endorse or promote products derived
21  *     from this software without specific prior written permission.
22  *
23  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
24  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30  *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35
36 #include <linux/file.h>
37 #include <linux/slab.h>
38 #include <linux/namei.h>
39 #include <linux/statfs.h>
40 #include <linux/utsname.h>
41 #include <linux/pagemap.h>
42 #include <linux/sunrpc/svcauth_gss.h>
43 #include <linux/sunrpc/addr.h>
44 #include <linux/xattr.h>
45 #include <uapi/linux/xattr.h>
46
47 #include "idmap.h"
48 #include "acl.h"
49 #include "xdr4.h"
50 #include "vfs.h"
51 #include "state.h"
52 #include "cache.h"
53 #include "netns.h"
54 #include "pnfs.h"
55 #include "filecache.h"
56
57 #include "trace.h"
58
59 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
60 #include <linux/security.h>
61 #endif
62
63
64 #define NFSDDBG_FACILITY                NFSDDBG_XDR
65
66 const u32 nfsd_suppattrs[3][3] = {
67         {NFSD4_SUPPORTED_ATTRS_WORD0,
68          NFSD4_SUPPORTED_ATTRS_WORD1,
69          NFSD4_SUPPORTED_ATTRS_WORD2},
70
71         {NFSD4_1_SUPPORTED_ATTRS_WORD0,
72          NFSD4_1_SUPPORTED_ATTRS_WORD1,
73          NFSD4_1_SUPPORTED_ATTRS_WORD2},
74
75         {NFSD4_1_SUPPORTED_ATTRS_WORD0,
76          NFSD4_1_SUPPORTED_ATTRS_WORD1,
77          NFSD4_2_SUPPORTED_ATTRS_WORD2},
78 };
79
80 /*
81  * As per referral draft, the fsid for a referral MUST be different from the fsid of the containing
82  * directory in order to indicate to the client that a filesystem boundary is present
83  * We use a fixed fsid for a referral
84  */
85 #define NFS4_REFERRAL_FSID_MAJOR        0x8000000ULL
86 #define NFS4_REFERRAL_FSID_MINOR        0x8000000ULL
87
88 static __be32
89 check_filename(char *str, int len)
90 {
91         int i;
92
93         if (len == 0)
94                 return nfserr_inval;
95         if (len > NFS4_MAXNAMLEN)
96                 return nfserr_nametoolong;
97         if (isdotent(str, len))
98                 return nfserr_badname;
99         for (i = 0; i < len; i++)
100                 if (str[i] == '/')
101                         return nfserr_badname;
102         return 0;
103 }
104
105 static int zero_clientid(clientid_t *clid)
106 {
107         return (clid->cl_boot == 0) && (clid->cl_id == 0);
108 }
109
110 /**
111  * svcxdr_tmpalloc - allocate memory to be freed after compound processing
112  * @argp: NFSv4 compound argument structure
113  * @len: length of buffer to allocate
114  *
115  * Allocates a buffer of size @len to be freed when processing the compound
116  * operation described in @argp finishes.
117  */
118 static void *
119 svcxdr_tmpalloc(struct nfsd4_compoundargs *argp, u32 len)
120 {
121         struct svcxdr_tmpbuf *tb;
122
123         tb = kmalloc(sizeof(*tb) + len, GFP_KERNEL);
124         if (!tb)
125                 return NULL;
126         tb->next = argp->to_free;
127         argp->to_free = tb;
128         return tb->buf;
129 }
130
131 /*
132  * For xdr strings that need to be passed to other kernel api's
133  * as null-terminated strings.
134  *
135  * Note null-terminating in place usually isn't safe since the
136  * buffer might end on a page boundary.
137  */
138 static char *
139 svcxdr_dupstr(struct nfsd4_compoundargs *argp, void *buf, u32 len)
140 {
141         char *p = svcxdr_tmpalloc(argp, len + 1);
142
143         if (!p)
144                 return NULL;
145         memcpy(p, buf, len);
146         p[len] = '\0';
147         return p;
148 }
149
150 static void *
151 svcxdr_savemem(struct nfsd4_compoundargs *argp, __be32 *p, u32 len)
152 {
153         __be32 *tmp;
154
155         /*
156          * The location of the decoded data item is stable,
157          * so @p is OK to use. This is the common case.
158          */
159         if (p != argp->xdr->scratch.iov_base)
160                 return p;
161
162         tmp = svcxdr_tmpalloc(argp, len);
163         if (!tmp)
164                 return NULL;
165         memcpy(tmp, p, len);
166         return tmp;
167 }
168
169 /*
170  * NFSv4 basic data type decoders
171  */
172
173 /*
174  * This helper handles variable-length opaques which belong to protocol
175  * elements that this implementation does not support.
176  */
177 static __be32
178 nfsd4_decode_ignored_string(struct nfsd4_compoundargs *argp, u32 maxlen)
179 {
180         u32 len;
181
182         if (xdr_stream_decode_u32(argp->xdr, &len) < 0)
183                 return nfserr_bad_xdr;
184         if (maxlen && len > maxlen)
185                 return nfserr_bad_xdr;
186         if (!xdr_inline_decode(argp->xdr, len))
187                 return nfserr_bad_xdr;
188
189         return nfs_ok;
190 }
191
192 static __be32
193 nfsd4_decode_opaque(struct nfsd4_compoundargs *argp, struct xdr_netobj *o)
194 {
195         __be32 *p;
196         u32 len;
197
198         if (xdr_stream_decode_u32(argp->xdr, &len) < 0)
199                 return nfserr_bad_xdr;
200         if (len == 0 || len > NFS4_OPAQUE_LIMIT)
201                 return nfserr_bad_xdr;
202         p = xdr_inline_decode(argp->xdr, len);
203         if (!p)
204                 return nfserr_bad_xdr;
205         o->data = svcxdr_savemem(argp, p, len);
206         if (!o->data)
207                 return nfserr_jukebox;
208         o->len = len;
209
210         return nfs_ok;
211 }
212
213 static __be32
214 nfsd4_decode_component4(struct nfsd4_compoundargs *argp, char **namp, u32 *lenp)
215 {
216         __be32 *p, status;
217
218         if (xdr_stream_decode_u32(argp->xdr, lenp) < 0)
219                 return nfserr_bad_xdr;
220         p = xdr_inline_decode(argp->xdr, *lenp);
221         if (!p)
222                 return nfserr_bad_xdr;
223         status = check_filename((char *)p, *lenp);
224         if (status)
225                 return status;
226         *namp = svcxdr_savemem(argp, p, *lenp);
227         if (!*namp)
228                 return nfserr_jukebox;
229
230         return nfs_ok;
231 }
232
233 static __be32
234 nfsd4_decode_nfstime4(struct nfsd4_compoundargs *argp, struct timespec64 *tv)
235 {
236         __be32 *p;
237
238         p = xdr_inline_decode(argp->xdr, XDR_UNIT * 3);
239         if (!p)
240                 return nfserr_bad_xdr;
241         p = xdr_decode_hyper(p, &tv->tv_sec);
242         tv->tv_nsec = be32_to_cpup(p++);
243         if (tv->tv_nsec >= (u32)1000000000)
244                 return nfserr_inval;
245         return nfs_ok;
246 }
247
248 static __be32
249 nfsd4_decode_verifier4(struct nfsd4_compoundargs *argp, nfs4_verifier *verf)
250 {
251         __be32 *p;
252
253         p = xdr_inline_decode(argp->xdr, NFS4_VERIFIER_SIZE);
254         if (!p)
255                 return nfserr_bad_xdr;
256         memcpy(verf->data, p, sizeof(verf->data));
257         return nfs_ok;
258 }
259
260 /**
261  * nfsd4_decode_bitmap4 - Decode an NFSv4 bitmap4
262  * @argp: NFSv4 compound argument structure
263  * @bmval: pointer to an array of u32's to decode into
264  * @bmlen: size of the @bmval array
265  *
266  * The server needs to return nfs_ok rather than nfserr_bad_xdr when
267  * encountering bitmaps containing bits it does not recognize. This
268  * includes bits in bitmap words past WORDn, where WORDn is the last
269  * bitmap WORD the implementation currently supports. Thus we are
270  * careful here to simply ignore bits in bitmap words that this
271  * implementation has yet to support explicitly.
272  *
273  * Return values:
274  *   %nfs_ok: @bmval populated successfully
275  *   %nfserr_bad_xdr: the encoded bitmap was invalid
276  */
277 static __be32
278 nfsd4_decode_bitmap4(struct nfsd4_compoundargs *argp, u32 *bmval, u32 bmlen)
279 {
280         ssize_t status;
281
282         status = xdr_stream_decode_uint32_array(argp->xdr, bmval, bmlen);
283         return status == -EBADMSG ? nfserr_bad_xdr : nfs_ok;
284 }
285
286 static __be32
287 nfsd4_decode_nfsace4(struct nfsd4_compoundargs *argp, struct nfs4_ace *ace)
288 {
289         __be32 *p, status;
290         u32 length;
291
292         if (xdr_stream_decode_u32(argp->xdr, &ace->type) < 0)
293                 return nfserr_bad_xdr;
294         if (xdr_stream_decode_u32(argp->xdr, &ace->flag) < 0)
295                 return nfserr_bad_xdr;
296         if (xdr_stream_decode_u32(argp->xdr, &ace->access_mask) < 0)
297                 return nfserr_bad_xdr;
298
299         if (xdr_stream_decode_u32(argp->xdr, &length) < 0)
300                 return nfserr_bad_xdr;
301         p = xdr_inline_decode(argp->xdr, length);
302         if (!p)
303                 return nfserr_bad_xdr;
304         ace->whotype = nfs4_acl_get_whotype((char *)p, length);
305         if (ace->whotype != NFS4_ACL_WHO_NAMED)
306                 status = nfs_ok;
307         else if (ace->flag & NFS4_ACE_IDENTIFIER_GROUP)
308                 status = nfsd_map_name_to_gid(argp->rqstp,
309                                 (char *)p, length, &ace->who_gid);
310         else
311                 status = nfsd_map_name_to_uid(argp->rqstp,
312                                 (char *)p, length, &ace->who_uid);
313
314         return status;
315 }
316
317 /* A counted array of nfsace4's */
318 static noinline __be32
319 nfsd4_decode_acl(struct nfsd4_compoundargs *argp, struct nfs4_acl **acl)
320 {
321         struct nfs4_ace *ace;
322         __be32 status;
323         u32 count;
324
325         if (xdr_stream_decode_u32(argp->xdr, &count) < 0)
326                 return nfserr_bad_xdr;
327
328         if (count > xdr_stream_remaining(argp->xdr) / 20)
329                 /*
330                  * Even with 4-byte names there wouldn't be
331                  * space for that many aces; something fishy is
332                  * going on:
333                  */
334                 return nfserr_fbig;
335
336         *acl = svcxdr_tmpalloc(argp, nfs4_acl_bytes(count));
337         if (*acl == NULL)
338                 return nfserr_jukebox;
339
340         (*acl)->naces = count;
341         for (ace = (*acl)->aces; ace < (*acl)->aces + count; ace++) {
342                 status = nfsd4_decode_nfsace4(argp, ace);
343                 if (status)
344                         return status;
345         }
346
347         return nfs_ok;
348 }
349
350 static noinline __be32
351 nfsd4_decode_security_label(struct nfsd4_compoundargs *argp,
352                             struct xdr_netobj *label)
353 {
354         u32 lfs, pi, length;
355         __be32 *p;
356
357         if (xdr_stream_decode_u32(argp->xdr, &lfs) < 0)
358                 return nfserr_bad_xdr;
359         if (xdr_stream_decode_u32(argp->xdr, &pi) < 0)
360                 return nfserr_bad_xdr;
361
362         if (xdr_stream_decode_u32(argp->xdr, &length) < 0)
363                 return nfserr_bad_xdr;
364         if (length > NFS4_MAXLABELLEN)
365                 return nfserr_badlabel;
366         p = xdr_inline_decode(argp->xdr, length);
367         if (!p)
368                 return nfserr_bad_xdr;
369         label->len = length;
370         label->data = svcxdr_dupstr(argp, p, length);
371         if (!label->data)
372                 return nfserr_jukebox;
373
374         return nfs_ok;
375 }
376
377 static __be32
378 nfsd4_decode_fattr4(struct nfsd4_compoundargs *argp, u32 *bmval, u32 bmlen,
379                     struct iattr *iattr, struct nfs4_acl **acl,
380                     struct xdr_netobj *label, int *umask)
381 {
382         unsigned int starting_pos;
383         u32 attrlist4_count;
384         __be32 *p, status;
385
386         iattr->ia_valid = 0;
387         status = nfsd4_decode_bitmap4(argp, bmval, bmlen);
388         if (status)
389                 return nfserr_bad_xdr;
390
391         if (bmval[0] & ~NFSD_WRITEABLE_ATTRS_WORD0
392             || bmval[1] & ~NFSD_WRITEABLE_ATTRS_WORD1
393             || bmval[2] & ~NFSD_WRITEABLE_ATTRS_WORD2) {
394                 if (nfsd_attrs_supported(argp->minorversion, bmval))
395                         return nfserr_inval;
396                 return nfserr_attrnotsupp;
397         }
398
399         if (xdr_stream_decode_u32(argp->xdr, &attrlist4_count) < 0)
400                 return nfserr_bad_xdr;
401         starting_pos = xdr_stream_pos(argp->xdr);
402
403         if (bmval[0] & FATTR4_WORD0_SIZE) {
404                 u64 size;
405
406                 if (xdr_stream_decode_u64(argp->xdr, &size) < 0)
407                         return nfserr_bad_xdr;
408                 iattr->ia_size = size;
409                 iattr->ia_valid |= ATTR_SIZE;
410         }
411         if (bmval[0] & FATTR4_WORD0_ACL) {
412                 status = nfsd4_decode_acl(argp, acl);
413                 if (status)
414                         return status;
415         } else
416                 *acl = NULL;
417         if (bmval[1] & FATTR4_WORD1_MODE) {
418                 u32 mode;
419
420                 if (xdr_stream_decode_u32(argp->xdr, &mode) < 0)
421                         return nfserr_bad_xdr;
422                 iattr->ia_mode = mode;
423                 iattr->ia_mode &= (S_IFMT | S_IALLUGO);
424                 iattr->ia_valid |= ATTR_MODE;
425         }
426         if (bmval[1] & FATTR4_WORD1_OWNER) {
427                 u32 length;
428
429                 if (xdr_stream_decode_u32(argp->xdr, &length) < 0)
430                         return nfserr_bad_xdr;
431                 p = xdr_inline_decode(argp->xdr, length);
432                 if (!p)
433                         return nfserr_bad_xdr;
434                 status = nfsd_map_name_to_uid(argp->rqstp, (char *)p, length,
435                                               &iattr->ia_uid);
436                 if (status)
437                         return status;
438                 iattr->ia_valid |= ATTR_UID;
439         }
440         if (bmval[1] & FATTR4_WORD1_OWNER_GROUP) {
441                 u32 length;
442
443                 if (xdr_stream_decode_u32(argp->xdr, &length) < 0)
444                         return nfserr_bad_xdr;
445                 p = xdr_inline_decode(argp->xdr, length);
446                 if (!p)
447                         return nfserr_bad_xdr;
448                 status = nfsd_map_name_to_gid(argp->rqstp, (char *)p, length,
449                                               &iattr->ia_gid);
450                 if (status)
451                         return status;
452                 iattr->ia_valid |= ATTR_GID;
453         }
454         if (bmval[1] & FATTR4_WORD1_TIME_ACCESS_SET) {
455                 u32 set_it;
456
457                 if (xdr_stream_decode_u32(argp->xdr, &set_it) < 0)
458                         return nfserr_bad_xdr;
459                 switch (set_it) {
460                 case NFS4_SET_TO_CLIENT_TIME:
461                         status = nfsd4_decode_nfstime4(argp, &iattr->ia_atime);
462                         if (status)
463                                 return status;
464                         iattr->ia_valid |= (ATTR_ATIME | ATTR_ATIME_SET);
465                         break;
466                 case NFS4_SET_TO_SERVER_TIME:
467                         iattr->ia_valid |= ATTR_ATIME;
468                         break;
469                 default:
470                         return nfserr_bad_xdr;
471                 }
472         }
473         if (bmval[1] & FATTR4_WORD1_TIME_CREATE) {
474                 struct timespec64 ts;
475
476                 /* No Linux filesystem supports setting this attribute. */
477                 bmval[1] &= ~FATTR4_WORD1_TIME_CREATE;
478                 status = nfsd4_decode_nfstime4(argp, &ts);
479                 if (status)
480                         return status;
481         }
482         if (bmval[1] & FATTR4_WORD1_TIME_MODIFY_SET) {
483                 u32 set_it;
484
485                 if (xdr_stream_decode_u32(argp->xdr, &set_it) < 0)
486                         return nfserr_bad_xdr;
487                 switch (set_it) {
488                 case NFS4_SET_TO_CLIENT_TIME:
489                         status = nfsd4_decode_nfstime4(argp, &iattr->ia_mtime);
490                         if (status)
491                                 return status;
492                         iattr->ia_valid |= (ATTR_MTIME | ATTR_MTIME_SET);
493                         break;
494                 case NFS4_SET_TO_SERVER_TIME:
495                         iattr->ia_valid |= ATTR_MTIME;
496                         break;
497                 default:
498                         return nfserr_bad_xdr;
499                 }
500         }
501         label->len = 0;
502         if (IS_ENABLED(CONFIG_NFSD_V4_SECURITY_LABEL) &&
503             bmval[2] & FATTR4_WORD2_SECURITY_LABEL) {
504                 status = nfsd4_decode_security_label(argp, label);
505                 if (status)
506                         return status;
507         }
508         if (bmval[2] & FATTR4_WORD2_MODE_UMASK) {
509                 u32 mode, mask;
510
511                 if (!umask)
512                         return nfserr_bad_xdr;
513                 if (xdr_stream_decode_u32(argp->xdr, &mode) < 0)
514                         return nfserr_bad_xdr;
515                 iattr->ia_mode = mode & (S_IFMT | S_IALLUGO);
516                 if (xdr_stream_decode_u32(argp->xdr, &mask) < 0)
517                         return nfserr_bad_xdr;
518                 *umask = mask & S_IRWXUGO;
519                 iattr->ia_valid |= ATTR_MODE;
520         }
521
522         /* request sanity: did attrlist4 contain the expected number of words? */
523         if (attrlist4_count != xdr_stream_pos(argp->xdr) - starting_pos)
524                 return nfserr_bad_xdr;
525
526         return nfs_ok;
527 }
528
529 static __be32
530 nfsd4_decode_stateid4(struct nfsd4_compoundargs *argp, stateid_t *sid)
531 {
532         __be32 *p;
533
534         p = xdr_inline_decode(argp->xdr, NFS4_STATEID_SIZE);
535         if (!p)
536                 return nfserr_bad_xdr;
537         sid->si_generation = be32_to_cpup(p++);
538         memcpy(&sid->si_opaque, p, sizeof(sid->si_opaque));
539         return nfs_ok;
540 }
541
542 static __be32
543 nfsd4_decode_clientid4(struct nfsd4_compoundargs *argp, clientid_t *clientid)
544 {
545         __be32 *p;
546
547         p = xdr_inline_decode(argp->xdr, sizeof(__be64));
548         if (!p)
549                 return nfserr_bad_xdr;
550         memcpy(clientid, p, sizeof(*clientid));
551         return nfs_ok;
552 }
553
554 static __be32
555 nfsd4_decode_state_owner4(struct nfsd4_compoundargs *argp,
556                           clientid_t *clientid, struct xdr_netobj *owner)
557 {
558         __be32 status;
559
560         status = nfsd4_decode_clientid4(argp, clientid);
561         if (status)
562                 return status;
563         return nfsd4_decode_opaque(argp, owner);
564 }
565
566 #ifdef CONFIG_NFSD_PNFS
567 static __be32
568 nfsd4_decode_deviceid4(struct nfsd4_compoundargs *argp,
569                        struct nfsd4_deviceid *devid)
570 {
571         __be32 *p;
572
573         p = xdr_inline_decode(argp->xdr, NFS4_DEVICEID4_SIZE);
574         if (!p)
575                 return nfserr_bad_xdr;
576         memcpy(devid, p, sizeof(*devid));
577         return nfs_ok;
578 }
579
580 static __be32
581 nfsd4_decode_layoutupdate4(struct nfsd4_compoundargs *argp,
582                            struct nfsd4_layoutcommit *lcp)
583 {
584         if (xdr_stream_decode_u32(argp->xdr, &lcp->lc_layout_type) < 0)
585                 return nfserr_bad_xdr;
586         if (lcp->lc_layout_type < LAYOUT_NFSV4_1_FILES)
587                 return nfserr_bad_xdr;
588         if (lcp->lc_layout_type >= LAYOUT_TYPE_MAX)
589                 return nfserr_bad_xdr;
590
591         if (xdr_stream_decode_u32(argp->xdr, &lcp->lc_up_len) < 0)
592                 return nfserr_bad_xdr;
593         if (lcp->lc_up_len > 0) {
594                 lcp->lc_up_layout = xdr_inline_decode(argp->xdr, lcp->lc_up_len);
595                 if (!lcp->lc_up_layout)
596                         return nfserr_bad_xdr;
597         }
598
599         return nfs_ok;
600 }
601
602 static __be32
603 nfsd4_decode_layoutreturn4(struct nfsd4_compoundargs *argp,
604                            struct nfsd4_layoutreturn *lrp)
605 {
606         __be32 status;
607
608         if (xdr_stream_decode_u32(argp->xdr, &lrp->lr_return_type) < 0)
609                 return nfserr_bad_xdr;
610         switch (lrp->lr_return_type) {
611         case RETURN_FILE:
612                 if (xdr_stream_decode_u64(argp->xdr, &lrp->lr_seg.offset) < 0)
613                         return nfserr_bad_xdr;
614                 if (xdr_stream_decode_u64(argp->xdr, &lrp->lr_seg.length) < 0)
615                         return nfserr_bad_xdr;
616                 status = nfsd4_decode_stateid4(argp, &lrp->lr_sid);
617                 if (status)
618                         return status;
619                 if (xdr_stream_decode_u32(argp->xdr, &lrp->lrf_body_len) < 0)
620                         return nfserr_bad_xdr;
621                 if (lrp->lrf_body_len > 0) {
622                         lrp->lrf_body = xdr_inline_decode(argp->xdr, lrp->lrf_body_len);
623                         if (!lrp->lrf_body)
624                                 return nfserr_bad_xdr;
625                 }
626                 break;
627         case RETURN_FSID:
628         case RETURN_ALL:
629                 lrp->lr_seg.offset = 0;
630                 lrp->lr_seg.length = NFS4_MAX_UINT64;
631                 break;
632         default:
633                 return nfserr_bad_xdr;
634         }
635
636         return nfs_ok;
637 }
638
639 #endif /* CONFIG_NFSD_PNFS */
640
641 static __be32
642 nfsd4_decode_sessionid4(struct nfsd4_compoundargs *argp,
643                         struct nfs4_sessionid *sessionid)
644 {
645         __be32 *p;
646
647         p = xdr_inline_decode(argp->xdr, NFS4_MAX_SESSIONID_LEN);
648         if (!p)
649                 return nfserr_bad_xdr;
650         memcpy(sessionid->data, p, sizeof(sessionid->data));
651         return nfs_ok;
652 }
653
654 /* Defined in Appendix A of RFC 5531 */
655 static __be32
656 nfsd4_decode_authsys_parms(struct nfsd4_compoundargs *argp,
657                            struct nfsd4_cb_sec *cbs)
658 {
659         u32 stamp, gidcount, uid, gid;
660         __be32 *p, status;
661
662         if (xdr_stream_decode_u32(argp->xdr, &stamp) < 0)
663                 return nfserr_bad_xdr;
664         /* machine name */
665         status = nfsd4_decode_ignored_string(argp, 255);
666         if (status)
667                 return status;
668         if (xdr_stream_decode_u32(argp->xdr, &uid) < 0)
669                 return nfserr_bad_xdr;
670         if (xdr_stream_decode_u32(argp->xdr, &gid) < 0)
671                 return nfserr_bad_xdr;
672         if (xdr_stream_decode_u32(argp->xdr, &gidcount) < 0)
673                 return nfserr_bad_xdr;
674         if (gidcount > 16)
675                 return nfserr_bad_xdr;
676         p = xdr_inline_decode(argp->xdr, gidcount << 2);
677         if (!p)
678                 return nfserr_bad_xdr;
679         if (cbs->flavor == (u32)(-1)) {
680                 struct user_namespace *userns = nfsd_user_namespace(argp->rqstp);
681
682                 kuid_t kuid = make_kuid(userns, uid);
683                 kgid_t kgid = make_kgid(userns, gid);
684                 if (uid_valid(kuid) && gid_valid(kgid)) {
685                         cbs->uid = kuid;
686                         cbs->gid = kgid;
687                         cbs->flavor = RPC_AUTH_UNIX;
688                 } else {
689                         dprintk("RPC_AUTH_UNIX with invalid uid or gid, ignoring!\n");
690                 }
691         }
692
693         return nfs_ok;
694 }
695
696 static __be32
697 nfsd4_decode_gss_cb_handles4(struct nfsd4_compoundargs *argp,
698                              struct nfsd4_cb_sec *cbs)
699 {
700         __be32 status;
701         u32 service;
702
703         dprintk("RPC_AUTH_GSS callback secflavor not supported!\n");
704
705         if (xdr_stream_decode_u32(argp->xdr, &service) < 0)
706                 return nfserr_bad_xdr;
707         if (service < RPC_GSS_SVC_NONE || service > RPC_GSS_SVC_PRIVACY)
708                 return nfserr_bad_xdr;
709         /* gcbp_handle_from_server */
710         status = nfsd4_decode_ignored_string(argp, 0);
711         if (status)
712                 return status;
713         /* gcbp_handle_from_client */
714         status = nfsd4_decode_ignored_string(argp, 0);
715         if (status)
716                 return status;
717
718         return nfs_ok;
719 }
720
721 /* a counted array of callback_sec_parms4 items */
722 static __be32
723 nfsd4_decode_cb_sec(struct nfsd4_compoundargs *argp, struct nfsd4_cb_sec *cbs)
724 {
725         u32 i, secflavor, nr_secflavs;
726         __be32 status;
727
728         /* callback_sec_params4 */
729         if (xdr_stream_decode_u32(argp->xdr, &nr_secflavs) < 0)
730                 return nfserr_bad_xdr;
731         if (nr_secflavs)
732                 cbs->flavor = (u32)(-1);
733         else
734                 /* Is this legal? Be generous, take it to mean AUTH_NONE: */
735                 cbs->flavor = 0;
736
737         for (i = 0; i < nr_secflavs; ++i) {
738                 if (xdr_stream_decode_u32(argp->xdr, &secflavor) < 0)
739                         return nfserr_bad_xdr;
740                 switch (secflavor) {
741                 case RPC_AUTH_NULL:
742                         /* void */
743                         if (cbs->flavor == (u32)(-1))
744                                 cbs->flavor = RPC_AUTH_NULL;
745                         break;
746                 case RPC_AUTH_UNIX:
747                         status = nfsd4_decode_authsys_parms(argp, cbs);
748                         if (status)
749                                 return status;
750                         break;
751                 case RPC_AUTH_GSS:
752                         status = nfsd4_decode_gss_cb_handles4(argp, cbs);
753                         if (status)
754                                 return status;
755                         break;
756                 default:
757                         return nfserr_inval;
758                 }
759         }
760
761         return nfs_ok;
762 }
763
764
765 /*
766  * NFSv4 operation argument decoders
767  */
768
769 static __be32
770 nfsd4_decode_access(struct nfsd4_compoundargs *argp,
771                     struct nfsd4_access *access)
772 {
773         if (xdr_stream_decode_u32(argp->xdr, &access->ac_req_access) < 0)
774                 return nfserr_bad_xdr;
775         return nfs_ok;
776 }
777
778 static __be32
779 nfsd4_decode_close(struct nfsd4_compoundargs *argp, struct nfsd4_close *close)
780 {
781         if (xdr_stream_decode_u32(argp->xdr, &close->cl_seqid) < 0)
782                 return nfserr_bad_xdr;
783         return nfsd4_decode_stateid4(argp, &close->cl_stateid);
784 }
785
786
787 static __be32
788 nfsd4_decode_commit(struct nfsd4_compoundargs *argp, struct nfsd4_commit *commit)
789 {
790         if (xdr_stream_decode_u64(argp->xdr, &commit->co_offset) < 0)
791                 return nfserr_bad_xdr;
792         if (xdr_stream_decode_u32(argp->xdr, &commit->co_count) < 0)
793                 return nfserr_bad_xdr;
794         return nfs_ok;
795 }
796
797 static __be32
798 nfsd4_decode_create(struct nfsd4_compoundargs *argp, struct nfsd4_create *create)
799 {
800         __be32 *p, status;
801
802         if (xdr_stream_decode_u32(argp->xdr, &create->cr_type) < 0)
803                 return nfserr_bad_xdr;
804         switch (create->cr_type) {
805         case NF4LNK:
806                 if (xdr_stream_decode_u32(argp->xdr, &create->cr_datalen) < 0)
807                         return nfserr_bad_xdr;
808                 p = xdr_inline_decode(argp->xdr, create->cr_datalen);
809                 if (!p)
810                         return nfserr_bad_xdr;
811                 create->cr_data = svcxdr_dupstr(argp, p, create->cr_datalen);
812                 if (!create->cr_data)
813                         return nfserr_jukebox;
814                 break;
815         case NF4BLK:
816         case NF4CHR:
817                 if (xdr_stream_decode_u32(argp->xdr, &create->cr_specdata1) < 0)
818                         return nfserr_bad_xdr;
819                 if (xdr_stream_decode_u32(argp->xdr, &create->cr_specdata2) < 0)
820                         return nfserr_bad_xdr;
821                 break;
822         case NF4SOCK:
823         case NF4FIFO:
824         case NF4DIR:
825         default:
826                 break;
827         }
828         status = nfsd4_decode_component4(argp, &create->cr_name,
829                                          &create->cr_namelen);
830         if (status)
831                 return status;
832         status = nfsd4_decode_fattr4(argp, create->cr_bmval,
833                                     ARRAY_SIZE(create->cr_bmval),
834                                     &create->cr_iattr, &create->cr_acl,
835                                     &create->cr_label, &create->cr_umask);
836         if (status)
837                 return status;
838
839         return nfs_ok;
840 }
841
842 static inline __be32
843 nfsd4_decode_delegreturn(struct nfsd4_compoundargs *argp, struct nfsd4_delegreturn *dr)
844 {
845         return nfsd4_decode_stateid4(argp, &dr->dr_stateid);
846 }
847
848 static inline __be32
849 nfsd4_decode_getattr(struct nfsd4_compoundargs *argp, struct nfsd4_getattr *getattr)
850 {
851         return nfsd4_decode_bitmap4(argp, getattr->ga_bmval,
852                                     ARRAY_SIZE(getattr->ga_bmval));
853 }
854
855 static __be32
856 nfsd4_decode_link(struct nfsd4_compoundargs *argp, struct nfsd4_link *link)
857 {
858         return nfsd4_decode_component4(argp, &link->li_name, &link->li_namelen);
859 }
860
861 static __be32
862 nfsd4_decode_open_to_lock_owner4(struct nfsd4_compoundargs *argp,
863                                  struct nfsd4_lock *lock)
864 {
865         __be32 status;
866
867         if (xdr_stream_decode_u32(argp->xdr, &lock->lk_new_open_seqid) < 0)
868                 return nfserr_bad_xdr;
869         status = nfsd4_decode_stateid4(argp, &lock->lk_new_open_stateid);
870         if (status)
871                 return status;
872         if (xdr_stream_decode_u32(argp->xdr, &lock->lk_new_lock_seqid) < 0)
873                 return nfserr_bad_xdr;
874         return nfsd4_decode_state_owner4(argp, &lock->lk_new_clientid,
875                                          &lock->lk_new_owner);
876 }
877
878 static __be32
879 nfsd4_decode_exist_lock_owner4(struct nfsd4_compoundargs *argp,
880                                struct nfsd4_lock *lock)
881 {
882         __be32 status;
883
884         status = nfsd4_decode_stateid4(argp, &lock->lk_old_lock_stateid);
885         if (status)
886                 return status;
887         if (xdr_stream_decode_u32(argp->xdr, &lock->lk_old_lock_seqid) < 0)
888                 return nfserr_bad_xdr;
889
890         return nfs_ok;
891 }
892
893 static __be32
894 nfsd4_decode_locker4(struct nfsd4_compoundargs *argp, struct nfsd4_lock *lock)
895 {
896         if (xdr_stream_decode_bool(argp->xdr, &lock->lk_is_new) < 0)
897                 return nfserr_bad_xdr;
898         if (lock->lk_is_new)
899                 return nfsd4_decode_open_to_lock_owner4(argp, lock);
900         return nfsd4_decode_exist_lock_owner4(argp, lock);
901 }
902
903 static __be32
904 nfsd4_decode_lock(struct nfsd4_compoundargs *argp, struct nfsd4_lock *lock)
905 {
906         if (xdr_stream_decode_u32(argp->xdr, &lock->lk_type) < 0)
907                 return nfserr_bad_xdr;
908         if ((lock->lk_type < NFS4_READ_LT) || (lock->lk_type > NFS4_WRITEW_LT))
909                 return nfserr_bad_xdr;
910         if (xdr_stream_decode_bool(argp->xdr, &lock->lk_reclaim) < 0)
911                 return nfserr_bad_xdr;
912         if (xdr_stream_decode_u64(argp->xdr, &lock->lk_offset) < 0)
913                 return nfserr_bad_xdr;
914         if (xdr_stream_decode_u64(argp->xdr, &lock->lk_length) < 0)
915                 return nfserr_bad_xdr;
916         return nfsd4_decode_locker4(argp, lock);
917 }
918
919 static __be32
920 nfsd4_decode_lockt(struct nfsd4_compoundargs *argp, struct nfsd4_lockt *lockt)
921 {
922         if (xdr_stream_decode_u32(argp->xdr, &lockt->lt_type) < 0)
923                 return nfserr_bad_xdr;
924         if ((lockt->lt_type < NFS4_READ_LT) || (lockt->lt_type > NFS4_WRITEW_LT))
925                 return nfserr_bad_xdr;
926         if (xdr_stream_decode_u64(argp->xdr, &lockt->lt_offset) < 0)
927                 return nfserr_bad_xdr;
928         if (xdr_stream_decode_u64(argp->xdr, &lockt->lt_length) < 0)
929                 return nfserr_bad_xdr;
930         return nfsd4_decode_state_owner4(argp, &lockt->lt_clientid,
931                                          &lockt->lt_owner);
932 }
933
934 static __be32
935 nfsd4_decode_locku(struct nfsd4_compoundargs *argp, struct nfsd4_locku *locku)
936 {
937         __be32 status;
938
939         if (xdr_stream_decode_u32(argp->xdr, &locku->lu_type) < 0)
940                 return nfserr_bad_xdr;
941         if ((locku->lu_type < NFS4_READ_LT) || (locku->lu_type > NFS4_WRITEW_LT))
942                 return nfserr_bad_xdr;
943         if (xdr_stream_decode_u32(argp->xdr, &locku->lu_seqid) < 0)
944                 return nfserr_bad_xdr;
945         status = nfsd4_decode_stateid4(argp, &locku->lu_stateid);
946         if (status)
947                 return status;
948         if (xdr_stream_decode_u64(argp->xdr, &locku->lu_offset) < 0)
949                 return nfserr_bad_xdr;
950         if (xdr_stream_decode_u64(argp->xdr, &locku->lu_length) < 0)
951                 return nfserr_bad_xdr;
952
953         return nfs_ok;
954 }
955
956 static __be32
957 nfsd4_decode_lookup(struct nfsd4_compoundargs *argp, struct nfsd4_lookup *lookup)
958 {
959         return nfsd4_decode_component4(argp, &lookup->lo_name, &lookup->lo_len);
960 }
961
962 static __be32
963 nfsd4_decode_createhow4(struct nfsd4_compoundargs *argp, struct nfsd4_open *open)
964 {
965         __be32 status;
966
967         if (xdr_stream_decode_u32(argp->xdr, &open->op_createmode) < 0)
968                 return nfserr_bad_xdr;
969         switch (open->op_createmode) {
970         case NFS4_CREATE_UNCHECKED:
971         case NFS4_CREATE_GUARDED:
972                 status = nfsd4_decode_fattr4(argp, open->op_bmval,
973                                              ARRAY_SIZE(open->op_bmval),
974                                              &open->op_iattr, &open->op_acl,
975                                              &open->op_label, &open->op_umask);
976                 if (status)
977                         return status;
978                 break;
979         case NFS4_CREATE_EXCLUSIVE:
980                 status = nfsd4_decode_verifier4(argp, &open->op_verf);
981                 if (status)
982                         return status;
983                 break;
984         case NFS4_CREATE_EXCLUSIVE4_1:
985                 if (argp->minorversion < 1)
986                         return nfserr_bad_xdr;
987                 status = nfsd4_decode_verifier4(argp, &open->op_verf);
988                 if (status)
989                         return status;
990                 status = nfsd4_decode_fattr4(argp, open->op_bmval,
991                                              ARRAY_SIZE(open->op_bmval),
992                                              &open->op_iattr, &open->op_acl,
993                                              &open->op_label, &open->op_umask);
994                 if (status)
995                         return status;
996                 break;
997         default:
998                 return nfserr_bad_xdr;
999         }
1000
1001         return nfs_ok;
1002 }
1003
1004 static __be32
1005 nfsd4_decode_openflag4(struct nfsd4_compoundargs *argp, struct nfsd4_open *open)
1006 {
1007         __be32 status;
1008
1009         if (xdr_stream_decode_u32(argp->xdr, &open->op_create) < 0)
1010                 return nfserr_bad_xdr;
1011         switch (open->op_create) {
1012         case NFS4_OPEN_NOCREATE:
1013                 break;
1014         case NFS4_OPEN_CREATE:
1015                 status = nfsd4_decode_createhow4(argp, open);
1016                 if (status)
1017                         return status;
1018                 break;
1019         default:
1020                 return nfserr_bad_xdr;
1021         }
1022
1023         return nfs_ok;
1024 }
1025
1026 static __be32 nfsd4_decode_share_access(struct nfsd4_compoundargs *argp, u32 *share_access, u32 *deleg_want, u32 *deleg_when)
1027 {
1028         u32 w;
1029
1030         if (xdr_stream_decode_u32(argp->xdr, &w) < 0)
1031                 return nfserr_bad_xdr;
1032         *share_access = w & NFS4_SHARE_ACCESS_MASK;
1033         *deleg_want = w & NFS4_SHARE_WANT_MASK;
1034         if (deleg_when)
1035                 *deleg_when = w & NFS4_SHARE_WHEN_MASK;
1036
1037         switch (w & NFS4_SHARE_ACCESS_MASK) {
1038         case NFS4_SHARE_ACCESS_READ:
1039         case NFS4_SHARE_ACCESS_WRITE:
1040         case NFS4_SHARE_ACCESS_BOTH:
1041                 break;
1042         default:
1043                 return nfserr_bad_xdr;
1044         }
1045         w &= ~NFS4_SHARE_ACCESS_MASK;
1046         if (!w)
1047                 return nfs_ok;
1048         if (!argp->minorversion)
1049                 return nfserr_bad_xdr;
1050         switch (w & NFS4_SHARE_WANT_MASK) {
1051         case NFS4_SHARE_WANT_NO_PREFERENCE:
1052         case NFS4_SHARE_WANT_READ_DELEG:
1053         case NFS4_SHARE_WANT_WRITE_DELEG:
1054         case NFS4_SHARE_WANT_ANY_DELEG:
1055         case NFS4_SHARE_WANT_NO_DELEG:
1056         case NFS4_SHARE_WANT_CANCEL:
1057                 break;
1058         default:
1059                 return nfserr_bad_xdr;
1060         }
1061         w &= ~NFS4_SHARE_WANT_MASK;
1062         if (!w)
1063                 return nfs_ok;
1064
1065         if (!deleg_when)        /* open_downgrade */
1066                 return nfserr_inval;
1067         switch (w) {
1068         case NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL:
1069         case NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED:
1070         case (NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL |
1071               NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED):
1072                 return nfs_ok;
1073         }
1074         return nfserr_bad_xdr;
1075 }
1076
1077 static __be32 nfsd4_decode_share_deny(struct nfsd4_compoundargs *argp, u32 *x)
1078 {
1079         if (xdr_stream_decode_u32(argp->xdr, x) < 0)
1080                 return nfserr_bad_xdr;
1081         /* Note: unlike access bits, deny bits may be zero. */
1082         if (*x & ~NFS4_SHARE_DENY_BOTH)
1083                 return nfserr_bad_xdr;
1084
1085         return nfs_ok;
1086 }
1087
1088 static __be32
1089 nfsd4_decode_open_claim4(struct nfsd4_compoundargs *argp,
1090                          struct nfsd4_open *open)
1091 {
1092         __be32 status;
1093
1094         if (xdr_stream_decode_u32(argp->xdr, &open->op_claim_type) < 0)
1095                 return nfserr_bad_xdr;
1096         switch (open->op_claim_type) {
1097         case NFS4_OPEN_CLAIM_NULL:
1098         case NFS4_OPEN_CLAIM_DELEGATE_PREV:
1099                 status = nfsd4_decode_component4(argp, &open->op_fname,
1100                                                  &open->op_fnamelen);
1101                 if (status)
1102                         return status;
1103                 break;
1104         case NFS4_OPEN_CLAIM_PREVIOUS:
1105                 if (xdr_stream_decode_u32(argp->xdr, &open->op_delegate_type) < 0)
1106                         return nfserr_bad_xdr;
1107                 break;
1108         case NFS4_OPEN_CLAIM_DELEGATE_CUR:
1109                 status = nfsd4_decode_stateid4(argp, &open->op_delegate_stateid);
1110                 if (status)
1111                         return status;
1112                 status = nfsd4_decode_component4(argp, &open->op_fname,
1113                                                  &open->op_fnamelen);
1114                 if (status)
1115                         return status;
1116                 break;
1117         case NFS4_OPEN_CLAIM_FH:
1118         case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
1119                 if (argp->minorversion < 1)
1120                         return nfserr_bad_xdr;
1121                 /* void */
1122                 break;
1123         case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
1124                 if (argp->minorversion < 1)
1125                         return nfserr_bad_xdr;
1126                 status = nfsd4_decode_stateid4(argp, &open->op_delegate_stateid);
1127                 if (status)
1128                         return status;
1129                 break;
1130         default:
1131                 return nfserr_bad_xdr;
1132         }
1133
1134         return nfs_ok;
1135 }
1136
1137 static __be32
1138 nfsd4_decode_open(struct nfsd4_compoundargs *argp, struct nfsd4_open *open)
1139 {
1140         __be32 status;
1141         u32 dummy;
1142
1143         memset(open->op_bmval, 0, sizeof(open->op_bmval));
1144         open->op_iattr.ia_valid = 0;
1145         open->op_openowner = NULL;
1146
1147         open->op_xdr_error = 0;
1148         if (xdr_stream_decode_u32(argp->xdr, &open->op_seqid) < 0)
1149                 return nfserr_bad_xdr;
1150         /* deleg_want is ignored */
1151         status = nfsd4_decode_share_access(argp, &open->op_share_access,
1152                                            &open->op_deleg_want, &dummy);
1153         if (status)
1154                 return status;
1155         status = nfsd4_decode_share_deny(argp, &open->op_share_deny);
1156         if (status)
1157                 return status;
1158         status = nfsd4_decode_state_owner4(argp, &open->op_clientid,
1159                                            &open->op_owner);
1160         if (status)
1161                 return status;
1162         status = nfsd4_decode_openflag4(argp, open);
1163         if (status)
1164                 return status;
1165         return nfsd4_decode_open_claim4(argp, open);
1166 }
1167
1168 static __be32
1169 nfsd4_decode_open_confirm(struct nfsd4_compoundargs *argp, struct nfsd4_open_confirm *open_conf)
1170 {
1171         __be32 status;
1172
1173         if (argp->minorversion >= 1)
1174                 return nfserr_notsupp;
1175
1176         status = nfsd4_decode_stateid4(argp, &open_conf->oc_req_stateid);
1177         if (status)
1178                 return status;
1179         if (xdr_stream_decode_u32(argp->xdr, &open_conf->oc_seqid) < 0)
1180                 return nfserr_bad_xdr;
1181
1182         return nfs_ok;
1183 }
1184
1185 static __be32
1186 nfsd4_decode_open_downgrade(struct nfsd4_compoundargs *argp, struct nfsd4_open_downgrade *open_down)
1187 {
1188         __be32 status;
1189
1190         status = nfsd4_decode_stateid4(argp, &open_down->od_stateid);
1191         if (status)
1192                 return status;
1193         if (xdr_stream_decode_u32(argp->xdr, &open_down->od_seqid) < 0)
1194                 return nfserr_bad_xdr;
1195         /* deleg_want is ignored */
1196         status = nfsd4_decode_share_access(argp, &open_down->od_share_access,
1197                                            &open_down->od_deleg_want, NULL);
1198         if (status)
1199                 return status;
1200         return nfsd4_decode_share_deny(argp, &open_down->od_share_deny);
1201 }
1202
1203 static __be32
1204 nfsd4_decode_putfh(struct nfsd4_compoundargs *argp, struct nfsd4_putfh *putfh)
1205 {
1206         __be32 *p;
1207
1208         if (xdr_stream_decode_u32(argp->xdr, &putfh->pf_fhlen) < 0)
1209                 return nfserr_bad_xdr;
1210         if (putfh->pf_fhlen > NFS4_FHSIZE)
1211                 return nfserr_bad_xdr;
1212         p = xdr_inline_decode(argp->xdr, putfh->pf_fhlen);
1213         if (!p)
1214                 return nfserr_bad_xdr;
1215         putfh->pf_fhval = svcxdr_savemem(argp, p, putfh->pf_fhlen);
1216         if (!putfh->pf_fhval)
1217                 return nfserr_jukebox;
1218
1219         return nfs_ok;
1220 }
1221
1222 static __be32
1223 nfsd4_decode_putpubfh(struct nfsd4_compoundargs *argp, void *p)
1224 {
1225         if (argp->minorversion == 0)
1226                 return nfs_ok;
1227         return nfserr_notsupp;
1228 }
1229
1230 static __be32
1231 nfsd4_decode_read(struct nfsd4_compoundargs *argp, struct nfsd4_read *read)
1232 {
1233         __be32 status;
1234
1235         status = nfsd4_decode_stateid4(argp, &read->rd_stateid);
1236         if (status)
1237                 return status;
1238         if (xdr_stream_decode_u64(argp->xdr, &read->rd_offset) < 0)
1239                 return nfserr_bad_xdr;
1240         if (xdr_stream_decode_u32(argp->xdr, &read->rd_length) < 0)
1241                 return nfserr_bad_xdr;
1242
1243         return nfs_ok;
1244 }
1245
1246 static __be32
1247 nfsd4_decode_readdir(struct nfsd4_compoundargs *argp, struct nfsd4_readdir *readdir)
1248 {
1249         __be32 status;
1250
1251         if (xdr_stream_decode_u64(argp->xdr, &readdir->rd_cookie) < 0)
1252                 return nfserr_bad_xdr;
1253         status = nfsd4_decode_verifier4(argp, &readdir->rd_verf);
1254         if (status)
1255                 return status;
1256         if (xdr_stream_decode_u32(argp->xdr, &readdir->rd_dircount) < 0)
1257                 return nfserr_bad_xdr;
1258         if (xdr_stream_decode_u32(argp->xdr, &readdir->rd_maxcount) < 0)
1259                 return nfserr_bad_xdr;
1260         if (xdr_stream_decode_uint32_array(argp->xdr, readdir->rd_bmval,
1261                                            ARRAY_SIZE(readdir->rd_bmval)) < 0)
1262                 return nfserr_bad_xdr;
1263
1264         return nfs_ok;
1265 }
1266
1267 static __be32
1268 nfsd4_decode_remove(struct nfsd4_compoundargs *argp, struct nfsd4_remove *remove)
1269 {
1270         return nfsd4_decode_component4(argp, &remove->rm_name, &remove->rm_namelen);
1271 }
1272
1273 static __be32
1274 nfsd4_decode_rename(struct nfsd4_compoundargs *argp, struct nfsd4_rename *rename)
1275 {
1276         __be32 status;
1277
1278         status = nfsd4_decode_component4(argp, &rename->rn_sname, &rename->rn_snamelen);
1279         if (status)
1280                 return status;
1281         return nfsd4_decode_component4(argp, &rename->rn_tname, &rename->rn_tnamelen);
1282 }
1283
1284 static __be32
1285 nfsd4_decode_renew(struct nfsd4_compoundargs *argp, clientid_t *clientid)
1286 {
1287         return nfsd4_decode_clientid4(argp, clientid);
1288 }
1289
1290 static __be32
1291 nfsd4_decode_secinfo(struct nfsd4_compoundargs *argp,
1292                      struct nfsd4_secinfo *secinfo)
1293 {
1294         return nfsd4_decode_component4(argp, &secinfo->si_name, &secinfo->si_namelen);
1295 }
1296
1297 static __be32
1298 nfsd4_decode_setattr(struct nfsd4_compoundargs *argp, struct nfsd4_setattr *setattr)
1299 {
1300         __be32 status;
1301
1302         status = nfsd4_decode_stateid4(argp, &setattr->sa_stateid);
1303         if (status)
1304                 return status;
1305         return nfsd4_decode_fattr4(argp, setattr->sa_bmval,
1306                                    ARRAY_SIZE(setattr->sa_bmval),
1307                                    &setattr->sa_iattr, &setattr->sa_acl,
1308                                    &setattr->sa_label, NULL);
1309 }
1310
1311 static __be32
1312 nfsd4_decode_setclientid(struct nfsd4_compoundargs *argp, struct nfsd4_setclientid *setclientid)
1313 {
1314         __be32 *p, status;
1315
1316         if (argp->minorversion >= 1)
1317                 return nfserr_notsupp;
1318
1319         status = nfsd4_decode_verifier4(argp, &setclientid->se_verf);
1320         if (status)
1321                 return status;
1322         status = nfsd4_decode_opaque(argp, &setclientid->se_name);
1323         if (status)
1324                 return status;
1325         if (xdr_stream_decode_u32(argp->xdr, &setclientid->se_callback_prog) < 0)
1326                 return nfserr_bad_xdr;
1327         if (xdr_stream_decode_u32(argp->xdr, &setclientid->se_callback_netid_len) < 0)
1328                 return nfserr_bad_xdr;
1329         p = xdr_inline_decode(argp->xdr, setclientid->se_callback_netid_len);
1330         if (!p)
1331                 return nfserr_bad_xdr;
1332         setclientid->se_callback_netid_val = svcxdr_savemem(argp, p,
1333                                                 setclientid->se_callback_netid_len);
1334         if (!setclientid->se_callback_netid_val)
1335                 return nfserr_jukebox;
1336
1337         if (xdr_stream_decode_u32(argp->xdr, &setclientid->se_callback_addr_len) < 0)
1338                 return nfserr_bad_xdr;
1339         p = xdr_inline_decode(argp->xdr, setclientid->se_callback_addr_len);
1340         if (!p)
1341                 return nfserr_bad_xdr;
1342         setclientid->se_callback_addr_val = svcxdr_savemem(argp, p,
1343                                                 setclientid->se_callback_addr_len);
1344         if (!setclientid->se_callback_addr_val)
1345                 return nfserr_jukebox;
1346         if (xdr_stream_decode_u32(argp->xdr, &setclientid->se_callback_ident) < 0)
1347                 return nfserr_bad_xdr;
1348
1349         return nfs_ok;
1350 }
1351
1352 static __be32
1353 nfsd4_decode_setclientid_confirm(struct nfsd4_compoundargs *argp, struct nfsd4_setclientid_confirm *scd_c)
1354 {
1355         __be32 status;
1356
1357         if (argp->minorversion >= 1)
1358                 return nfserr_notsupp;
1359
1360         status = nfsd4_decode_clientid4(argp, &scd_c->sc_clientid);
1361         if (status)
1362                 return status;
1363         return nfsd4_decode_verifier4(argp, &scd_c->sc_confirm);
1364 }
1365
1366 /* Also used for NVERIFY */
1367 static __be32
1368 nfsd4_decode_verify(struct nfsd4_compoundargs *argp, struct nfsd4_verify *verify)
1369 {
1370         __be32 *p, status;
1371
1372         status = nfsd4_decode_bitmap4(argp, verify->ve_bmval,
1373                                       ARRAY_SIZE(verify->ve_bmval));
1374         if (status)
1375                 return status;
1376
1377         /* For convenience's sake, we compare raw xdr'd attributes in
1378          * nfsd4_proc_verify */
1379
1380         if (xdr_stream_decode_u32(argp->xdr, &verify->ve_attrlen) < 0)
1381                 return nfserr_bad_xdr;
1382         p = xdr_inline_decode(argp->xdr, verify->ve_attrlen);
1383         if (!p)
1384                 return nfserr_bad_xdr;
1385         verify->ve_attrval = svcxdr_savemem(argp, p, verify->ve_attrlen);
1386         if (!verify->ve_attrval)
1387                 return nfserr_jukebox;
1388
1389         return nfs_ok;
1390 }
1391
1392 static __be32
1393 nfsd4_decode_write(struct nfsd4_compoundargs *argp, struct nfsd4_write *write)
1394 {
1395         __be32 status;
1396
1397         status = nfsd4_decode_stateid4(argp, &write->wr_stateid);
1398         if (status)
1399                 return status;
1400         if (xdr_stream_decode_u64(argp->xdr, &write->wr_offset) < 0)
1401                 return nfserr_bad_xdr;
1402         if (xdr_stream_decode_u32(argp->xdr, &write->wr_stable_how) < 0)
1403                 return nfserr_bad_xdr;
1404         if (write->wr_stable_how > NFS_FILE_SYNC)
1405                 return nfserr_bad_xdr;
1406         if (xdr_stream_decode_u32(argp->xdr, &write->wr_buflen) < 0)
1407                 return nfserr_bad_xdr;
1408         if (!xdr_stream_subsegment(argp->xdr, &write->wr_payload, write->wr_buflen))
1409                 return nfserr_bad_xdr;
1410
1411         return nfs_ok;
1412 }
1413
1414 static __be32
1415 nfsd4_decode_release_lockowner(struct nfsd4_compoundargs *argp, struct nfsd4_release_lockowner *rlockowner)
1416 {
1417         __be32 status;
1418
1419         if (argp->minorversion >= 1)
1420                 return nfserr_notsupp;
1421
1422         status = nfsd4_decode_state_owner4(argp, &rlockowner->rl_clientid,
1423                                            &rlockowner->rl_owner);
1424         if (status)
1425                 return status;
1426
1427         if (argp->minorversion && !zero_clientid(&rlockowner->rl_clientid))
1428                 return nfserr_inval;
1429
1430         return nfs_ok;
1431 }
1432
1433 static __be32 nfsd4_decode_backchannel_ctl(struct nfsd4_compoundargs *argp, struct nfsd4_backchannel_ctl *bc)
1434 {
1435         if (xdr_stream_decode_u32(argp->xdr, &bc->bc_cb_program) < 0)
1436                 return nfserr_bad_xdr;
1437         return nfsd4_decode_cb_sec(argp, &bc->bc_cb_sec);
1438 }
1439
1440 static __be32 nfsd4_decode_bind_conn_to_session(struct nfsd4_compoundargs *argp, struct nfsd4_bind_conn_to_session *bcts)
1441 {
1442         u32 use_conn_in_rdma_mode;
1443         __be32 status;
1444
1445         status = nfsd4_decode_sessionid4(argp, &bcts->sessionid);
1446         if (status)
1447                 return status;
1448         if (xdr_stream_decode_u32(argp->xdr, &bcts->dir) < 0)
1449                 return nfserr_bad_xdr;
1450         if (xdr_stream_decode_u32(argp->xdr, &use_conn_in_rdma_mode) < 0)
1451                 return nfserr_bad_xdr;
1452
1453         return nfs_ok;
1454 }
1455
1456 static __be32
1457 nfsd4_decode_state_protect_ops(struct nfsd4_compoundargs *argp,
1458                                struct nfsd4_exchange_id *exid)
1459 {
1460         __be32 status;
1461
1462         status = nfsd4_decode_bitmap4(argp, exid->spo_must_enforce,
1463                                       ARRAY_SIZE(exid->spo_must_enforce));
1464         if (status)
1465                 return nfserr_bad_xdr;
1466         status = nfsd4_decode_bitmap4(argp, exid->spo_must_allow,
1467                                       ARRAY_SIZE(exid->spo_must_allow));
1468         if (status)
1469                 return nfserr_bad_xdr;
1470
1471         return nfs_ok;
1472 }
1473
1474 /*
1475  * This implementation currently does not support SP4_SSV.
1476  * This decoder simply skips over these arguments.
1477  */
1478 static noinline __be32
1479 nfsd4_decode_ssv_sp_parms(struct nfsd4_compoundargs *argp,
1480                           struct nfsd4_exchange_id *exid)
1481 {
1482         u32 count, window, num_gss_handles;
1483         __be32 status;
1484
1485         /* ssp_ops */
1486         status = nfsd4_decode_state_protect_ops(argp, exid);
1487         if (status)
1488                 return status;
1489
1490         /* ssp_hash_algs<> */
1491         if (xdr_stream_decode_u32(argp->xdr, &count) < 0)
1492                 return nfserr_bad_xdr;
1493         while (count--) {
1494                 status = nfsd4_decode_ignored_string(argp, 0);
1495                 if (status)
1496                         return status;
1497         }
1498
1499         /* ssp_encr_algs<> */
1500         if (xdr_stream_decode_u32(argp->xdr, &count) < 0)
1501                 return nfserr_bad_xdr;
1502         while (count--) {
1503                 status = nfsd4_decode_ignored_string(argp, 0);
1504                 if (status)
1505                         return status;
1506         }
1507
1508         if (xdr_stream_decode_u32(argp->xdr, &window) < 0)
1509                 return nfserr_bad_xdr;
1510         if (xdr_stream_decode_u32(argp->xdr, &num_gss_handles) < 0)
1511                 return nfserr_bad_xdr;
1512
1513         return nfs_ok;
1514 }
1515
1516 static __be32
1517 nfsd4_decode_state_protect4_a(struct nfsd4_compoundargs *argp,
1518                               struct nfsd4_exchange_id *exid)
1519 {
1520         __be32 status;
1521
1522         if (xdr_stream_decode_u32(argp->xdr, &exid->spa_how) < 0)
1523                 return nfserr_bad_xdr;
1524         switch (exid->spa_how) {
1525         case SP4_NONE:
1526                 break;
1527         case SP4_MACH_CRED:
1528                 status = nfsd4_decode_state_protect_ops(argp, exid);
1529                 if (status)
1530                         return status;
1531                 break;
1532         case SP4_SSV:
1533                 status = nfsd4_decode_ssv_sp_parms(argp, exid);
1534                 if (status)
1535                         return status;
1536                 break;
1537         default:
1538                 return nfserr_bad_xdr;
1539         }
1540
1541         return nfs_ok;
1542 }
1543
1544 static __be32
1545 nfsd4_decode_nfs_impl_id4(struct nfsd4_compoundargs *argp,
1546                           struct nfsd4_exchange_id *exid)
1547 {
1548         __be32 status;
1549         u32 count;
1550
1551         if (xdr_stream_decode_u32(argp->xdr, &count) < 0)
1552                 return nfserr_bad_xdr;
1553         switch (count) {
1554         case 0:
1555                 break;
1556         case 1:
1557                 /* Note that RFC 8881 places no length limit on
1558                  * nii_domain, but this implementation permits no
1559                  * more than NFS4_OPAQUE_LIMIT bytes */
1560                 status = nfsd4_decode_opaque(argp, &exid->nii_domain);
1561                 if (status)
1562                         return status;
1563                 /* Note that RFC 8881 places no length limit on
1564                  * nii_name, but this implementation permits no
1565                  * more than NFS4_OPAQUE_LIMIT bytes */
1566                 status = nfsd4_decode_opaque(argp, &exid->nii_name);
1567                 if (status)
1568                         return status;
1569                 status = nfsd4_decode_nfstime4(argp, &exid->nii_time);
1570                 if (status)
1571                         return status;
1572                 break;
1573         default:
1574                 return nfserr_bad_xdr;
1575         }
1576
1577         return nfs_ok;
1578 }
1579
1580 static __be32
1581 nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp,
1582                          struct nfsd4_exchange_id *exid)
1583 {
1584         __be32 status;
1585
1586         status = nfsd4_decode_verifier4(argp, &exid->verifier);
1587         if (status)
1588                 return status;
1589         status = nfsd4_decode_opaque(argp, &exid->clname);
1590         if (status)
1591                 return status;
1592         if (xdr_stream_decode_u32(argp->xdr, &exid->flags) < 0)
1593                 return nfserr_bad_xdr;
1594         status = nfsd4_decode_state_protect4_a(argp, exid);
1595         if (status)
1596                 return status;
1597         return nfsd4_decode_nfs_impl_id4(argp, exid);
1598 }
1599
1600 static __be32
1601 nfsd4_decode_channel_attrs4(struct nfsd4_compoundargs *argp,
1602                             struct nfsd4_channel_attrs *ca)
1603 {
1604         __be32 *p;
1605
1606         p = xdr_inline_decode(argp->xdr, XDR_UNIT * 7);
1607         if (!p)
1608                 return nfserr_bad_xdr;
1609
1610         /* headerpadsz is ignored */
1611         p++;
1612         ca->maxreq_sz = be32_to_cpup(p++);
1613         ca->maxresp_sz = be32_to_cpup(p++);
1614         ca->maxresp_cached = be32_to_cpup(p++);
1615         ca->maxops = be32_to_cpup(p++);
1616         ca->maxreqs = be32_to_cpup(p++);
1617         ca->nr_rdma_attrs = be32_to_cpup(p);
1618         switch (ca->nr_rdma_attrs) {
1619         case 0:
1620                 break;
1621         case 1:
1622                 if (xdr_stream_decode_u32(argp->xdr, &ca->rdma_attrs) < 0)
1623                         return nfserr_bad_xdr;
1624                 break;
1625         default:
1626                 return nfserr_bad_xdr;
1627         }
1628
1629         return nfs_ok;
1630 }
1631
1632 static __be32
1633 nfsd4_decode_create_session(struct nfsd4_compoundargs *argp,
1634                             struct nfsd4_create_session *sess)
1635 {
1636         __be32 status;
1637
1638         status = nfsd4_decode_clientid4(argp, &sess->clientid);
1639         if (status)
1640                 return status;
1641         if (xdr_stream_decode_u32(argp->xdr, &sess->seqid) < 0)
1642                 return nfserr_bad_xdr;
1643         if (xdr_stream_decode_u32(argp->xdr, &sess->flags) < 0)
1644                 return nfserr_bad_xdr;
1645         status = nfsd4_decode_channel_attrs4(argp, &sess->fore_channel);
1646         if (status)
1647                 return status;
1648         status = nfsd4_decode_channel_attrs4(argp, &sess->back_channel);
1649         if (status)
1650                 return status;
1651         if (xdr_stream_decode_u32(argp->xdr, &sess->callback_prog) < 0)
1652                 return nfserr_bad_xdr;
1653         status = nfsd4_decode_cb_sec(argp, &sess->cb_sec);
1654         if (status)
1655                 return status;
1656
1657         return nfs_ok;
1658 }
1659
1660 static __be32
1661 nfsd4_decode_destroy_session(struct nfsd4_compoundargs *argp,
1662                              struct nfsd4_destroy_session *destroy_session)
1663 {
1664         return nfsd4_decode_sessionid4(argp, &destroy_session->sessionid);
1665 }
1666
1667 static __be32
1668 nfsd4_decode_free_stateid(struct nfsd4_compoundargs *argp,
1669                           struct nfsd4_free_stateid *free_stateid)
1670 {
1671         return nfsd4_decode_stateid4(argp, &free_stateid->fr_stateid);
1672 }
1673
1674 #ifdef CONFIG_NFSD_PNFS
1675 static __be32
1676 nfsd4_decode_getdeviceinfo(struct nfsd4_compoundargs *argp,
1677                 struct nfsd4_getdeviceinfo *gdev)
1678 {
1679         __be32 status;
1680
1681         status = nfsd4_decode_deviceid4(argp, &gdev->gd_devid);
1682         if (status)
1683                 return status;
1684         if (xdr_stream_decode_u32(argp->xdr, &gdev->gd_layout_type) < 0)
1685                 return nfserr_bad_xdr;
1686         if (xdr_stream_decode_u32(argp->xdr, &gdev->gd_maxcount) < 0)
1687                 return nfserr_bad_xdr;
1688         if (xdr_stream_decode_uint32_array(argp->xdr,
1689                                            &gdev->gd_notify_types, 1) < 0)
1690                 return nfserr_bad_xdr;
1691
1692         return nfs_ok;
1693 }
1694
1695 static __be32
1696 nfsd4_decode_layoutcommit(struct nfsd4_compoundargs *argp,
1697                           struct nfsd4_layoutcommit *lcp)
1698 {
1699         __be32 *p, status;
1700
1701         if (xdr_stream_decode_u64(argp->xdr, &lcp->lc_seg.offset) < 0)
1702                 return nfserr_bad_xdr;
1703         if (xdr_stream_decode_u64(argp->xdr, &lcp->lc_seg.length) < 0)
1704                 return nfserr_bad_xdr;
1705         if (xdr_stream_decode_bool(argp->xdr, &lcp->lc_reclaim) < 0)
1706                 return nfserr_bad_xdr;
1707         status = nfsd4_decode_stateid4(argp, &lcp->lc_sid);
1708         if (status)
1709                 return status;
1710         if (xdr_stream_decode_u32(argp->xdr, &lcp->lc_newoffset) < 0)
1711                 return nfserr_bad_xdr;
1712         if (lcp->lc_newoffset) {
1713                 if (xdr_stream_decode_u64(argp->xdr, &lcp->lc_last_wr) < 0)
1714                         return nfserr_bad_xdr;
1715         } else
1716                 lcp->lc_last_wr = 0;
1717         p = xdr_inline_decode(argp->xdr, XDR_UNIT);
1718         if (!p)
1719                 return nfserr_bad_xdr;
1720         if (xdr_item_is_present(p)) {
1721                 status = nfsd4_decode_nfstime4(argp, &lcp->lc_mtime);
1722                 if (status)
1723                         return status;
1724         } else {
1725                 lcp->lc_mtime.tv_nsec = UTIME_NOW;
1726         }
1727         return nfsd4_decode_layoutupdate4(argp, lcp);
1728 }
1729
1730 static __be32
1731 nfsd4_decode_layoutget(struct nfsd4_compoundargs *argp,
1732                 struct nfsd4_layoutget *lgp)
1733 {
1734         __be32 status;
1735
1736         if (xdr_stream_decode_u32(argp->xdr, &lgp->lg_signal) < 0)
1737                 return nfserr_bad_xdr;
1738         if (xdr_stream_decode_u32(argp->xdr, &lgp->lg_layout_type) < 0)
1739                 return nfserr_bad_xdr;
1740         if (xdr_stream_decode_u32(argp->xdr, &lgp->lg_seg.iomode) < 0)
1741                 return nfserr_bad_xdr;
1742         if (xdr_stream_decode_u64(argp->xdr, &lgp->lg_seg.offset) < 0)
1743                 return nfserr_bad_xdr;
1744         if (xdr_stream_decode_u64(argp->xdr, &lgp->lg_seg.length) < 0)
1745                 return nfserr_bad_xdr;
1746         if (xdr_stream_decode_u64(argp->xdr, &lgp->lg_minlength) < 0)
1747                 return nfserr_bad_xdr;
1748         status = nfsd4_decode_stateid4(argp, &lgp->lg_sid);
1749         if (status)
1750                 return status;
1751         if (xdr_stream_decode_u32(argp->xdr, &lgp->lg_maxcount) < 0)
1752                 return nfserr_bad_xdr;
1753
1754         return nfs_ok;
1755 }
1756
1757 static __be32
1758 nfsd4_decode_layoutreturn(struct nfsd4_compoundargs *argp,
1759                 struct nfsd4_layoutreturn *lrp)
1760 {
1761         if (xdr_stream_decode_bool(argp->xdr, &lrp->lr_reclaim) < 0)
1762                 return nfserr_bad_xdr;
1763         if (xdr_stream_decode_u32(argp->xdr, &lrp->lr_layout_type) < 0)
1764                 return nfserr_bad_xdr;
1765         if (xdr_stream_decode_u32(argp->xdr, &lrp->lr_seg.iomode) < 0)
1766                 return nfserr_bad_xdr;
1767         return nfsd4_decode_layoutreturn4(argp, lrp);
1768 }
1769 #endif /* CONFIG_NFSD_PNFS */
1770
1771 static __be32 nfsd4_decode_secinfo_no_name(struct nfsd4_compoundargs *argp,
1772                                            struct nfsd4_secinfo_no_name *sin)
1773 {
1774         if (xdr_stream_decode_u32(argp->xdr, &sin->sin_style) < 0)
1775                 return nfserr_bad_xdr;
1776         return nfs_ok;
1777 }
1778
1779 static __be32
1780 nfsd4_decode_sequence(struct nfsd4_compoundargs *argp,
1781                       struct nfsd4_sequence *seq)
1782 {
1783         __be32 *p, status;
1784
1785         status = nfsd4_decode_sessionid4(argp, &seq->sessionid);
1786         if (status)
1787                 return status;
1788         p = xdr_inline_decode(argp->xdr, XDR_UNIT * 4);
1789         if (!p)
1790                 return nfserr_bad_xdr;
1791         seq->seqid = be32_to_cpup(p++);
1792         seq->slotid = be32_to_cpup(p++);
1793         seq->maxslots = be32_to_cpup(p++);
1794         seq->cachethis = be32_to_cpup(p);
1795
1796         return nfs_ok;
1797 }
1798
1799 static __be32
1800 nfsd4_decode_test_stateid(struct nfsd4_compoundargs *argp, struct nfsd4_test_stateid *test_stateid)
1801 {
1802         struct nfsd4_test_stateid_id *stateid;
1803         __be32 status;
1804         u32 i;
1805
1806         if (xdr_stream_decode_u32(argp->xdr, &test_stateid->ts_num_ids) < 0)
1807                 return nfserr_bad_xdr;
1808
1809         INIT_LIST_HEAD(&test_stateid->ts_stateid_list);
1810         for (i = 0; i < test_stateid->ts_num_ids; i++) {
1811                 stateid = svcxdr_tmpalloc(argp, sizeof(*stateid));
1812                 if (!stateid)
1813                         return nfserr_jukebox;
1814                 INIT_LIST_HEAD(&stateid->ts_id_list);
1815                 list_add_tail(&stateid->ts_id_list, &test_stateid->ts_stateid_list);
1816                 status = nfsd4_decode_stateid4(argp, &stateid->ts_id_stateid);
1817                 if (status)
1818                         return status;
1819         }
1820
1821         return nfs_ok;
1822 }
1823
1824 static __be32 nfsd4_decode_destroy_clientid(struct nfsd4_compoundargs *argp,
1825                                             struct nfsd4_destroy_clientid *dc)
1826 {
1827         return nfsd4_decode_clientid4(argp, &dc->clientid);
1828 }
1829
1830 static __be32 nfsd4_decode_reclaim_complete(struct nfsd4_compoundargs *argp,
1831                                             struct nfsd4_reclaim_complete *rc)
1832 {
1833         if (xdr_stream_decode_bool(argp->xdr, &rc->rca_one_fs) < 0)
1834                 return nfserr_bad_xdr;
1835         return nfs_ok;
1836 }
1837
1838 static __be32
1839 nfsd4_decode_fallocate(struct nfsd4_compoundargs *argp,
1840                        struct nfsd4_fallocate *fallocate)
1841 {
1842         __be32 status;
1843
1844         status = nfsd4_decode_stateid4(argp, &fallocate->falloc_stateid);
1845         if (status)
1846                 return status;
1847         if (xdr_stream_decode_u64(argp->xdr, &fallocate->falloc_offset) < 0)
1848                 return nfserr_bad_xdr;
1849         if (xdr_stream_decode_u64(argp->xdr, &fallocate->falloc_length) < 0)
1850                 return nfserr_bad_xdr;
1851
1852         return nfs_ok;
1853 }
1854
1855 static __be32 nfsd4_decode_nl4_server(struct nfsd4_compoundargs *argp,
1856                                       struct nl4_server *ns)
1857 {
1858         struct nfs42_netaddr *naddr;
1859         __be32 *p;
1860
1861         if (xdr_stream_decode_u32(argp->xdr, &ns->nl4_type) < 0)
1862                 return nfserr_bad_xdr;
1863
1864         /* currently support for 1 inter-server source server */
1865         switch (ns->nl4_type) {
1866         case NL4_NETADDR:
1867                 naddr = &ns->u.nl4_addr;
1868
1869                 if (xdr_stream_decode_u32(argp->xdr, &naddr->netid_len) < 0)
1870                         return nfserr_bad_xdr;
1871                 if (naddr->netid_len > RPCBIND_MAXNETIDLEN)
1872                         return nfserr_bad_xdr;
1873
1874                 p = xdr_inline_decode(argp->xdr, naddr->netid_len);
1875                 if (!p)
1876                         return nfserr_bad_xdr;
1877                 memcpy(naddr->netid, p, naddr->netid_len);
1878
1879                 if (xdr_stream_decode_u32(argp->xdr, &naddr->addr_len) < 0)
1880                         return nfserr_bad_xdr;
1881                 if (naddr->addr_len > RPCBIND_MAXUADDRLEN)
1882                         return nfserr_bad_xdr;
1883
1884                 p = xdr_inline_decode(argp->xdr, naddr->addr_len);
1885                 if (!p)
1886                         return nfserr_bad_xdr;
1887                 memcpy(naddr->addr, p, naddr->addr_len);
1888                 break;
1889         default:
1890                 return nfserr_bad_xdr;
1891         }
1892
1893         return nfs_ok;
1894 }
1895
1896 static __be32
1897 nfsd4_decode_copy(struct nfsd4_compoundargs *argp, struct nfsd4_copy *copy)
1898 {
1899         u32 consecutive, i, count, sync;
1900         struct nl4_server *ns_dummy;
1901         __be32 status;
1902
1903         status = nfsd4_decode_stateid4(argp, &copy->cp_src_stateid);
1904         if (status)
1905                 return status;
1906         status = nfsd4_decode_stateid4(argp, &copy->cp_dst_stateid);
1907         if (status)
1908                 return status;
1909         if (xdr_stream_decode_u64(argp->xdr, &copy->cp_src_pos) < 0)
1910                 return nfserr_bad_xdr;
1911         if (xdr_stream_decode_u64(argp->xdr, &copy->cp_dst_pos) < 0)
1912                 return nfserr_bad_xdr;
1913         if (xdr_stream_decode_u64(argp->xdr, &copy->cp_count) < 0)
1914                 return nfserr_bad_xdr;
1915         /* ca_consecutive: we always do consecutive copies */
1916         if (xdr_stream_decode_u32(argp->xdr, &consecutive) < 0)
1917                 return nfserr_bad_xdr;
1918         if (xdr_stream_decode_bool(argp->xdr, &sync) < 0)
1919                 return nfserr_bad_xdr;
1920         nfsd4_copy_set_sync(copy, sync);
1921
1922         if (xdr_stream_decode_u32(argp->xdr, &count) < 0)
1923                 return nfserr_bad_xdr;
1924         copy->cp_src = svcxdr_tmpalloc(argp, sizeof(*copy->cp_src));
1925         if (copy->cp_src == NULL)
1926                 return nfserr_jukebox;
1927         if (count == 0) { /* intra-server copy */
1928                 __set_bit(NFSD4_COPY_F_INTRA, &copy->cp_flags);
1929                 return nfs_ok;
1930         }
1931
1932         /* decode all the supplied server addresses but use only the first */
1933         status = nfsd4_decode_nl4_server(argp, copy->cp_src);
1934         if (status)
1935                 return status;
1936
1937         ns_dummy = kmalloc(sizeof(struct nl4_server), GFP_KERNEL);
1938         if (ns_dummy == NULL)
1939                 return nfserr_jukebox;
1940         for (i = 0; i < count - 1; i++) {
1941                 status = nfsd4_decode_nl4_server(argp, ns_dummy);
1942                 if (status) {
1943                         kfree(ns_dummy);
1944                         return status;
1945                 }
1946         }
1947         kfree(ns_dummy);
1948
1949         return nfs_ok;
1950 }
1951
1952 static __be32
1953 nfsd4_decode_copy_notify(struct nfsd4_compoundargs *argp,
1954                          struct nfsd4_copy_notify *cn)
1955 {
1956         __be32 status;
1957
1958         cn->cpn_src = svcxdr_tmpalloc(argp, sizeof(*cn->cpn_src));
1959         if (cn->cpn_src == NULL)
1960                 return nfserr_jukebox;
1961         cn->cpn_dst = svcxdr_tmpalloc(argp, sizeof(*cn->cpn_dst));
1962         if (cn->cpn_dst == NULL)
1963                 return nfserr_jukebox;
1964
1965         status = nfsd4_decode_stateid4(argp, &cn->cpn_src_stateid);
1966         if (status)
1967                 return status;
1968         return nfsd4_decode_nl4_server(argp, cn->cpn_dst);
1969 }
1970
1971 static __be32
1972 nfsd4_decode_offload_status(struct nfsd4_compoundargs *argp,
1973                             struct nfsd4_offload_status *os)
1974 {
1975         return nfsd4_decode_stateid4(argp, &os->stateid);
1976 }
1977
1978 static __be32
1979 nfsd4_decode_seek(struct nfsd4_compoundargs *argp, struct nfsd4_seek *seek)
1980 {
1981         __be32 status;
1982
1983         status = nfsd4_decode_stateid4(argp, &seek->seek_stateid);
1984         if (status)
1985                 return status;
1986         if (xdr_stream_decode_u64(argp->xdr, &seek->seek_offset) < 0)
1987                 return nfserr_bad_xdr;
1988         if (xdr_stream_decode_u32(argp->xdr, &seek->seek_whence) < 0)
1989                 return nfserr_bad_xdr;
1990
1991         return nfs_ok;
1992 }
1993
1994 static __be32
1995 nfsd4_decode_clone(struct nfsd4_compoundargs *argp, struct nfsd4_clone *clone)
1996 {
1997         __be32 status;
1998
1999         status = nfsd4_decode_stateid4(argp, &clone->cl_src_stateid);
2000         if (status)
2001                 return status;
2002         status = nfsd4_decode_stateid4(argp, &clone->cl_dst_stateid);
2003         if (status)
2004                 return status;
2005         if (xdr_stream_decode_u64(argp->xdr, &clone->cl_src_pos) < 0)
2006                 return nfserr_bad_xdr;
2007         if (xdr_stream_decode_u64(argp->xdr, &clone->cl_dst_pos) < 0)
2008                 return nfserr_bad_xdr;
2009         if (xdr_stream_decode_u64(argp->xdr, &clone->cl_count) < 0)
2010                 return nfserr_bad_xdr;
2011
2012         return nfs_ok;
2013 }
2014
2015 /*
2016  * XDR data that is more than PAGE_SIZE in size is normally part of a
2017  * read or write. However, the size of extended attributes is limited
2018  * by the maximum request size, and then further limited by the underlying
2019  * filesystem limits. This can exceed PAGE_SIZE (currently, XATTR_SIZE_MAX
2020  * is 64k). Since there is no kvec- or page-based interface to xattrs,
2021  * and we're not dealing with contiguous pages, we need to do some copying.
2022  */
2023
2024 /*
2025  * Decode data into buffer.
2026  */
2027 static __be32
2028 nfsd4_vbuf_from_vector(struct nfsd4_compoundargs *argp, struct xdr_buf *xdr,
2029                        char **bufp, u32 buflen)
2030 {
2031         struct page **pages = xdr->pages;
2032         struct kvec *head = xdr->head;
2033         char *tmp, *dp;
2034         u32 len;
2035
2036         if (buflen <= head->iov_len) {
2037                 /*
2038                  * We're in luck, the head has enough space. Just return
2039                  * the head, no need for copying.
2040                  */
2041                 *bufp = head->iov_base;
2042                 return 0;
2043         }
2044
2045         tmp = svcxdr_tmpalloc(argp, buflen);
2046         if (tmp == NULL)
2047                 return nfserr_jukebox;
2048
2049         dp = tmp;
2050         memcpy(dp, head->iov_base, head->iov_len);
2051         buflen -= head->iov_len;
2052         dp += head->iov_len;
2053
2054         while (buflen > 0) {
2055                 len = min_t(u32, buflen, PAGE_SIZE);
2056                 memcpy(dp, page_address(*pages), len);
2057
2058                 buflen -= len;
2059                 dp += len;
2060                 pages++;
2061         }
2062
2063         *bufp = tmp;
2064         return 0;
2065 }
2066
2067 /*
2068  * Get a user extended attribute name from the XDR buffer.
2069  * It will not have the "user." prefix, so prepend it.
2070  * Lastly, check for nul characters in the name.
2071  */
2072 static __be32
2073 nfsd4_decode_xattr_name(struct nfsd4_compoundargs *argp, char **namep)
2074 {
2075         char *name, *sp, *dp;
2076         u32 namelen, cnt;
2077         __be32 *p;
2078
2079         if (xdr_stream_decode_u32(argp->xdr, &namelen) < 0)
2080                 return nfserr_bad_xdr;
2081         if (namelen > (XATTR_NAME_MAX - XATTR_USER_PREFIX_LEN))
2082                 return nfserr_nametoolong;
2083         if (namelen == 0)
2084                 return nfserr_bad_xdr;
2085         p = xdr_inline_decode(argp->xdr, namelen);
2086         if (!p)
2087                 return nfserr_bad_xdr;
2088         name = svcxdr_tmpalloc(argp, namelen + XATTR_USER_PREFIX_LEN + 1);
2089         if (!name)
2090                 return nfserr_jukebox;
2091         memcpy(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN);
2092
2093         /*
2094          * Copy the extended attribute name over while checking for 0
2095          * characters.
2096          */
2097         sp = (char *)p;
2098         dp = name + XATTR_USER_PREFIX_LEN;
2099         cnt = namelen;
2100
2101         while (cnt-- > 0) {
2102                 if (*sp == '\0')
2103                         return nfserr_bad_xdr;
2104                 *dp++ = *sp++;
2105         }
2106         *dp = '\0';
2107
2108         *namep = name;
2109
2110         return nfs_ok;
2111 }
2112
2113 /*
2114  * A GETXATTR op request comes without a length specifier. We just set the
2115  * maximum length for the reply based on XATTR_SIZE_MAX and the maximum
2116  * channel reply size. nfsd_getxattr will probe the length of the xattr,
2117  * check it against getxa_len, and allocate + return the value.
2118  */
2119 static __be32
2120 nfsd4_decode_getxattr(struct nfsd4_compoundargs *argp,
2121                       struct nfsd4_getxattr *getxattr)
2122 {
2123         __be32 status;
2124         u32 maxcount;
2125
2126         status = nfsd4_decode_xattr_name(argp, &getxattr->getxa_name);
2127         if (status)
2128                 return status;
2129
2130         maxcount = svc_max_payload(argp->rqstp);
2131         maxcount = min_t(u32, XATTR_SIZE_MAX, maxcount);
2132
2133         getxattr->getxa_len = maxcount;
2134
2135         return status;
2136 }
2137
2138 static __be32
2139 nfsd4_decode_setxattr(struct nfsd4_compoundargs *argp,
2140                       struct nfsd4_setxattr *setxattr)
2141 {
2142         u32 flags, maxcount, size;
2143         __be32 status;
2144
2145         if (xdr_stream_decode_u32(argp->xdr, &flags) < 0)
2146                 return nfserr_bad_xdr;
2147
2148         if (flags > SETXATTR4_REPLACE)
2149                 return nfserr_inval;
2150         setxattr->setxa_flags = flags;
2151
2152         status = nfsd4_decode_xattr_name(argp, &setxattr->setxa_name);
2153         if (status)
2154                 return status;
2155
2156         maxcount = svc_max_payload(argp->rqstp);
2157         maxcount = min_t(u32, XATTR_SIZE_MAX, maxcount);
2158
2159         if (xdr_stream_decode_u32(argp->xdr, &size) < 0)
2160                 return nfserr_bad_xdr;
2161         if (size > maxcount)
2162                 return nfserr_xattr2big;
2163
2164         setxattr->setxa_len = size;
2165         if (size > 0) {
2166                 struct xdr_buf payload;
2167
2168                 if (!xdr_stream_subsegment(argp->xdr, &payload, size))
2169                         return nfserr_bad_xdr;
2170                 status = nfsd4_vbuf_from_vector(argp, &payload,
2171                                                 &setxattr->setxa_buf, size);
2172         }
2173
2174         return nfs_ok;
2175 }
2176
2177 static __be32
2178 nfsd4_decode_listxattrs(struct nfsd4_compoundargs *argp,
2179                         struct nfsd4_listxattrs *listxattrs)
2180 {
2181         u32 maxcount;
2182
2183         if (xdr_stream_decode_u64(argp->xdr, &listxattrs->lsxa_cookie) < 0)
2184                 return nfserr_bad_xdr;
2185
2186         /*
2187          * If the cookie  is too large to have even one user.x attribute
2188          * plus trailing '\0' left in a maximum size buffer, it's invalid.
2189          */
2190         if (listxattrs->lsxa_cookie >=
2191             (XATTR_LIST_MAX / (XATTR_USER_PREFIX_LEN + 2)))
2192                 return nfserr_badcookie;
2193
2194         if (xdr_stream_decode_u32(argp->xdr, &maxcount) < 0)
2195                 return nfserr_bad_xdr;
2196         if (maxcount < 8)
2197                 /* Always need at least 2 words (length and one character) */
2198                 return nfserr_inval;
2199
2200         maxcount = min(maxcount, svc_max_payload(argp->rqstp));
2201         listxattrs->lsxa_maxcount = maxcount;
2202
2203         return nfs_ok;
2204 }
2205
2206 static __be32
2207 nfsd4_decode_removexattr(struct nfsd4_compoundargs *argp,
2208                          struct nfsd4_removexattr *removexattr)
2209 {
2210         return nfsd4_decode_xattr_name(argp, &removexattr->rmxa_name);
2211 }
2212
2213 static __be32
2214 nfsd4_decode_noop(struct nfsd4_compoundargs *argp, void *p)
2215 {
2216         return nfs_ok;
2217 }
2218
2219 static __be32
2220 nfsd4_decode_notsupp(struct nfsd4_compoundargs *argp, void *p)
2221 {
2222         return nfserr_notsupp;
2223 }
2224
2225 typedef __be32(*nfsd4_dec)(struct nfsd4_compoundargs *argp, void *);
2226
2227 static const nfsd4_dec nfsd4_dec_ops[] = {
2228         [OP_ACCESS]             = (nfsd4_dec)nfsd4_decode_access,
2229         [OP_CLOSE]              = (nfsd4_dec)nfsd4_decode_close,
2230         [OP_COMMIT]             = (nfsd4_dec)nfsd4_decode_commit,
2231         [OP_CREATE]             = (nfsd4_dec)nfsd4_decode_create,
2232         [OP_DELEGPURGE]         = (nfsd4_dec)nfsd4_decode_notsupp,
2233         [OP_DELEGRETURN]        = (nfsd4_dec)nfsd4_decode_delegreturn,
2234         [OP_GETATTR]            = (nfsd4_dec)nfsd4_decode_getattr,
2235         [OP_GETFH]              = (nfsd4_dec)nfsd4_decode_noop,
2236         [OP_LINK]               = (nfsd4_dec)nfsd4_decode_link,
2237         [OP_LOCK]               = (nfsd4_dec)nfsd4_decode_lock,
2238         [OP_LOCKT]              = (nfsd4_dec)nfsd4_decode_lockt,
2239         [OP_LOCKU]              = (nfsd4_dec)nfsd4_decode_locku,
2240         [OP_LOOKUP]             = (nfsd4_dec)nfsd4_decode_lookup,
2241         [OP_LOOKUPP]            = (nfsd4_dec)nfsd4_decode_noop,
2242         [OP_NVERIFY]            = (nfsd4_dec)nfsd4_decode_verify,
2243         [OP_OPEN]               = (nfsd4_dec)nfsd4_decode_open,
2244         [OP_OPENATTR]           = (nfsd4_dec)nfsd4_decode_notsupp,
2245         [OP_OPEN_CONFIRM]       = (nfsd4_dec)nfsd4_decode_open_confirm,
2246         [OP_OPEN_DOWNGRADE]     = (nfsd4_dec)nfsd4_decode_open_downgrade,
2247         [OP_PUTFH]              = (nfsd4_dec)nfsd4_decode_putfh,
2248         [OP_PUTPUBFH]           = (nfsd4_dec)nfsd4_decode_putpubfh,
2249         [OP_PUTROOTFH]          = (nfsd4_dec)nfsd4_decode_noop,
2250         [OP_READ]               = (nfsd4_dec)nfsd4_decode_read,
2251         [OP_READDIR]            = (nfsd4_dec)nfsd4_decode_readdir,
2252         [OP_READLINK]           = (nfsd4_dec)nfsd4_decode_noop,
2253         [OP_REMOVE]             = (nfsd4_dec)nfsd4_decode_remove,
2254         [OP_RENAME]             = (nfsd4_dec)nfsd4_decode_rename,
2255         [OP_RENEW]              = (nfsd4_dec)nfsd4_decode_renew,
2256         [OP_RESTOREFH]          = (nfsd4_dec)nfsd4_decode_noop,
2257         [OP_SAVEFH]             = (nfsd4_dec)nfsd4_decode_noop,
2258         [OP_SECINFO]            = (nfsd4_dec)nfsd4_decode_secinfo,
2259         [OP_SETATTR]            = (nfsd4_dec)nfsd4_decode_setattr,
2260         [OP_SETCLIENTID]        = (nfsd4_dec)nfsd4_decode_setclientid,
2261         [OP_SETCLIENTID_CONFIRM] = (nfsd4_dec)nfsd4_decode_setclientid_confirm,
2262         [OP_VERIFY]             = (nfsd4_dec)nfsd4_decode_verify,
2263         [OP_WRITE]              = (nfsd4_dec)nfsd4_decode_write,
2264         [OP_RELEASE_LOCKOWNER]  = (nfsd4_dec)nfsd4_decode_release_lockowner,
2265
2266         /* new operations for NFSv4.1 */
2267         [OP_BACKCHANNEL_CTL]    = (nfsd4_dec)nfsd4_decode_backchannel_ctl,
2268         [OP_BIND_CONN_TO_SESSION]= (nfsd4_dec)nfsd4_decode_bind_conn_to_session,
2269         [OP_EXCHANGE_ID]        = (nfsd4_dec)nfsd4_decode_exchange_id,
2270         [OP_CREATE_SESSION]     = (nfsd4_dec)nfsd4_decode_create_session,
2271         [OP_DESTROY_SESSION]    = (nfsd4_dec)nfsd4_decode_destroy_session,
2272         [OP_FREE_STATEID]       = (nfsd4_dec)nfsd4_decode_free_stateid,
2273         [OP_GET_DIR_DELEGATION] = (nfsd4_dec)nfsd4_decode_notsupp,
2274 #ifdef CONFIG_NFSD_PNFS
2275         [OP_GETDEVICEINFO]      = (nfsd4_dec)nfsd4_decode_getdeviceinfo,
2276         [OP_GETDEVICELIST]      = (nfsd4_dec)nfsd4_decode_notsupp,
2277         [OP_LAYOUTCOMMIT]       = (nfsd4_dec)nfsd4_decode_layoutcommit,
2278         [OP_LAYOUTGET]          = (nfsd4_dec)nfsd4_decode_layoutget,
2279         [OP_LAYOUTRETURN]       = (nfsd4_dec)nfsd4_decode_layoutreturn,
2280 #else
2281         [OP_GETDEVICEINFO]      = (nfsd4_dec)nfsd4_decode_notsupp,
2282         [OP_GETDEVICELIST]      = (nfsd4_dec)nfsd4_decode_notsupp,
2283         [OP_LAYOUTCOMMIT]       = (nfsd4_dec)nfsd4_decode_notsupp,
2284         [OP_LAYOUTGET]          = (nfsd4_dec)nfsd4_decode_notsupp,
2285         [OP_LAYOUTRETURN]       = (nfsd4_dec)nfsd4_decode_notsupp,
2286 #endif
2287         [OP_SECINFO_NO_NAME]    = (nfsd4_dec)nfsd4_decode_secinfo_no_name,
2288         [OP_SEQUENCE]           = (nfsd4_dec)nfsd4_decode_sequence,
2289         [OP_SET_SSV]            = (nfsd4_dec)nfsd4_decode_notsupp,
2290         [OP_TEST_STATEID]       = (nfsd4_dec)nfsd4_decode_test_stateid,
2291         [OP_WANT_DELEGATION]    = (nfsd4_dec)nfsd4_decode_notsupp,
2292         [OP_DESTROY_CLIENTID]   = (nfsd4_dec)nfsd4_decode_destroy_clientid,
2293         [OP_RECLAIM_COMPLETE]   = (nfsd4_dec)nfsd4_decode_reclaim_complete,
2294
2295         /* new operations for NFSv4.2 */
2296         [OP_ALLOCATE]           = (nfsd4_dec)nfsd4_decode_fallocate,
2297         [OP_COPY]               = (nfsd4_dec)nfsd4_decode_copy,
2298         [OP_COPY_NOTIFY]        = (nfsd4_dec)nfsd4_decode_copy_notify,
2299         [OP_DEALLOCATE]         = (nfsd4_dec)nfsd4_decode_fallocate,
2300         [OP_IO_ADVISE]          = (nfsd4_dec)nfsd4_decode_notsupp,
2301         [OP_LAYOUTERROR]        = (nfsd4_dec)nfsd4_decode_notsupp,
2302         [OP_LAYOUTSTATS]        = (nfsd4_dec)nfsd4_decode_notsupp,
2303         [OP_OFFLOAD_CANCEL]     = (nfsd4_dec)nfsd4_decode_offload_status,
2304         [OP_OFFLOAD_STATUS]     = (nfsd4_dec)nfsd4_decode_offload_status,
2305         [OP_READ_PLUS]          = (nfsd4_dec)nfsd4_decode_read,
2306         [OP_SEEK]               = (nfsd4_dec)nfsd4_decode_seek,
2307         [OP_WRITE_SAME]         = (nfsd4_dec)nfsd4_decode_notsupp,
2308         [OP_CLONE]              = (nfsd4_dec)nfsd4_decode_clone,
2309         /* RFC 8276 extended atributes operations */
2310         [OP_GETXATTR]           = (nfsd4_dec)nfsd4_decode_getxattr,
2311         [OP_SETXATTR]           = (nfsd4_dec)nfsd4_decode_setxattr,
2312         [OP_LISTXATTRS]         = (nfsd4_dec)nfsd4_decode_listxattrs,
2313         [OP_REMOVEXATTR]        = (nfsd4_dec)nfsd4_decode_removexattr,
2314 };
2315
2316 static inline bool
2317 nfsd4_opnum_in_range(struct nfsd4_compoundargs *argp, struct nfsd4_op *op)
2318 {
2319         if (op->opnum < FIRST_NFS4_OP)
2320                 return false;
2321         else if (argp->minorversion == 0 && op->opnum > LAST_NFS40_OP)
2322                 return false;
2323         else if (argp->minorversion == 1 && op->opnum > LAST_NFS41_OP)
2324                 return false;
2325         else if (argp->minorversion == 2 && op->opnum > LAST_NFS42_OP)
2326                 return false;
2327         return true;
2328 }
2329
2330 static bool
2331 nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
2332 {
2333         struct nfsd4_op *op;
2334         bool cachethis = false;
2335         int auth_slack= argp->rqstp->rq_auth_slack;
2336         int max_reply = auth_slack + 8; /* opcnt, status */
2337         int readcount = 0;
2338         int readbytes = 0;
2339         __be32 *p;
2340         int i;
2341
2342         if (xdr_stream_decode_u32(argp->xdr, &argp->taglen) < 0)
2343                 return false;
2344         max_reply += XDR_UNIT;
2345         argp->tag = NULL;
2346         if (unlikely(argp->taglen)) {
2347                 if (argp->taglen > NFSD4_MAX_TAGLEN)
2348                         return false;
2349                 p = xdr_inline_decode(argp->xdr, argp->taglen);
2350                 if (!p)
2351                         return false;
2352                 argp->tag = svcxdr_savemem(argp, p, argp->taglen);
2353                 if (!argp->tag)
2354                         return false;
2355                 max_reply += xdr_align_size(argp->taglen);
2356         }
2357
2358         if (xdr_stream_decode_u32(argp->xdr, &argp->minorversion) < 0)
2359                 return false;
2360         if (xdr_stream_decode_u32(argp->xdr, &argp->opcnt) < 0)
2361                 return false;
2362
2363         /*
2364          * NFS4ERR_RESOURCE is a more helpful error than GARBAGE_ARGS
2365          * here, so we return success at the xdr level so that
2366          * nfsd4_proc can handle this is an NFS-level error.
2367          */
2368         if (argp->opcnt > NFSD_MAX_OPS_PER_COMPOUND)
2369                 return true;
2370
2371         if (argp->opcnt > ARRAY_SIZE(argp->iops)) {
2372                 argp->ops = kzalloc(argp->opcnt * sizeof(*argp->ops), GFP_KERNEL);
2373                 if (!argp->ops) {
2374                         argp->ops = argp->iops;
2375                         dprintk("nfsd: couldn't allocate room for COMPOUND\n");
2376                         return false;
2377                 }
2378         }
2379
2380         if (argp->minorversion > NFSD_SUPPORTED_MINOR_VERSION)
2381                 argp->opcnt = 0;
2382
2383         for (i = 0; i < argp->opcnt; i++) {
2384                 op = &argp->ops[i];
2385                 op->replay = NULL;
2386
2387                 if (xdr_stream_decode_u32(argp->xdr, &op->opnum) < 0)
2388                         return false;
2389                 if (nfsd4_opnum_in_range(argp, op)) {
2390                         op->status = nfsd4_dec_ops[op->opnum](argp, &op->u);
2391                         if (op->status != nfs_ok)
2392                                 trace_nfsd_compound_decode_err(argp->rqstp,
2393                                                                argp->opcnt, i,
2394                                                                op->opnum,
2395                                                                op->status);
2396                 } else {
2397                         op->opnum = OP_ILLEGAL;
2398                         op->status = nfserr_op_illegal;
2399                 }
2400                 op->opdesc = OPDESC(op);
2401                 /*
2402                  * We'll try to cache the result in the DRC if any one
2403                  * op in the compound wants to be cached:
2404                  */
2405                 cachethis |= nfsd4_cache_this_op(op);
2406
2407                 if (op->opnum == OP_READ || op->opnum == OP_READ_PLUS) {
2408                         readcount++;
2409                         readbytes += nfsd4_max_reply(argp->rqstp, op);
2410                 } else
2411                         max_reply += nfsd4_max_reply(argp->rqstp, op);
2412                 /*
2413                  * OP_LOCK and OP_LOCKT may return a conflicting lock.
2414                  * (Special case because it will just skip encoding this
2415                  * if it runs out of xdr buffer space, and it is the only
2416                  * operation that behaves this way.)
2417                  */
2418                 if (op->opnum == OP_LOCK || op->opnum == OP_LOCKT)
2419                         max_reply += NFS4_OPAQUE_LIMIT;
2420
2421                 if (op->status) {
2422                         argp->opcnt = i+1;
2423                         break;
2424                 }
2425         }
2426         /* Sessions make the DRC unnecessary: */
2427         if (argp->minorversion)
2428                 cachethis = false;
2429         svc_reserve(argp->rqstp, max_reply + readbytes);
2430         argp->rqstp->rq_cachetype = cachethis ? RC_REPLBUFF : RC_NOCACHE;
2431
2432         if (readcount > 1 || max_reply > PAGE_SIZE - auth_slack)
2433                 __clear_bit(RQ_SPLICE_OK, &argp->rqstp->rq_flags);
2434
2435         return true;
2436 }
2437
2438 static __be32 *encode_change(__be32 *p, struct kstat *stat, struct inode *inode,
2439                              struct svc_export *exp)
2440 {
2441         if (exp->ex_flags & NFSEXP_V4ROOT) {
2442                 *p++ = cpu_to_be32(convert_to_wallclock(exp->cd->flush_time));
2443                 *p++ = 0;
2444         } else
2445                 p = xdr_encode_hyper(p, nfsd4_change_attribute(stat, inode));
2446         return p;
2447 }
2448
2449 /*
2450  * ctime (in NFSv4, time_metadata) is not writeable, and the client
2451  * doesn't really care what resolution could theoretically be stored by
2452  * the filesystem.
2453  *
2454  * The client cares how close together changes can be while still
2455  * guaranteeing ctime changes.  For most filesystems (which have
2456  * timestamps with nanosecond fields) that is limited by the resolution
2457  * of the time returned from current_time() (which I'm assuming to be
2458  * 1/HZ).
2459  */
2460 static __be32 *encode_time_delta(__be32 *p, struct inode *inode)
2461 {
2462         struct timespec64 ts;
2463         u32 ns;
2464
2465         ns = max_t(u32, NSEC_PER_SEC/HZ, inode->i_sb->s_time_gran);
2466         ts = ns_to_timespec64(ns);
2467
2468         p = xdr_encode_hyper(p, ts.tv_sec);
2469         *p++ = cpu_to_be32(ts.tv_nsec);
2470
2471         return p;
2472 }
2473
2474 static __be32 *encode_cinfo(__be32 *p, struct nfsd4_change_info *c)
2475 {
2476         *p++ = cpu_to_be32(c->atomic);
2477         p = xdr_encode_hyper(p, c->before_change);
2478         p = xdr_encode_hyper(p, c->after_change);
2479         return p;
2480 }
2481
2482 /* Encode as an array of strings the string given with components
2483  * separated @sep, escaped with esc_enter and esc_exit.
2484  */
2485 static __be32 nfsd4_encode_components_esc(struct xdr_stream *xdr, char sep,
2486                                           char *components, char esc_enter,
2487                                           char esc_exit)
2488 {
2489         __be32 *p;
2490         __be32 pathlen;
2491         int pathlen_offset;
2492         int strlen, count=0;
2493         char *str, *end, *next;
2494
2495         dprintk("nfsd4_encode_components(%s)\n", components);
2496
2497         pathlen_offset = xdr->buf->len;
2498         p = xdr_reserve_space(xdr, 4);
2499         if (!p)
2500                 return nfserr_resource;
2501         p++; /* We will fill this in with @count later */
2502
2503         end = str = components;
2504         while (*end) {
2505                 bool found_esc = false;
2506
2507                 /* try to parse as esc_start, ..., esc_end, sep */
2508                 if (*str == esc_enter) {
2509                         for (; *end && (*end != esc_exit); end++)
2510                                 /* find esc_exit or end of string */;
2511                         next = end + 1;
2512                         if (*end && (!*next || *next == sep)) {
2513                                 str++;
2514                                 found_esc = true;
2515                         }
2516                 }
2517
2518                 if (!found_esc)
2519                         for (; *end && (*end != sep); end++)
2520                                 /* find sep or end of string */;
2521
2522                 strlen = end - str;
2523                 if (strlen) {
2524                         p = xdr_reserve_space(xdr, strlen + 4);
2525                         if (!p)
2526                                 return nfserr_resource;
2527                         p = xdr_encode_opaque(p, str, strlen);
2528                         count++;
2529                 }
2530                 else
2531                         end++;
2532                 if (found_esc)
2533                         end = next;
2534
2535                 str = end;
2536         }
2537         pathlen = htonl(count);
2538         write_bytes_to_xdr_buf(xdr->buf, pathlen_offset, &pathlen, 4);
2539         return 0;
2540 }
2541
2542 /* Encode as an array of strings the string given with components
2543  * separated @sep.
2544  */
2545 static __be32 nfsd4_encode_components(struct xdr_stream *xdr, char sep,
2546                                       char *components)
2547 {
2548         return nfsd4_encode_components_esc(xdr, sep, components, 0, 0);
2549 }
2550
2551 /*
2552  * encode a location element of a fs_locations structure
2553  */
2554 static __be32 nfsd4_encode_fs_location4(struct xdr_stream *xdr,
2555                                         struct nfsd4_fs_location *location)
2556 {
2557         __be32 status;
2558
2559         status = nfsd4_encode_components_esc(xdr, ':', location->hosts,
2560                                                 '[', ']');
2561         if (status)
2562                 return status;
2563         status = nfsd4_encode_components(xdr, '/', location->path);
2564         if (status)
2565                 return status;
2566         return 0;
2567 }
2568
2569 /*
2570  * Encode a path in RFC3530 'pathname4' format
2571  */
2572 static __be32 nfsd4_encode_path(struct xdr_stream *xdr,
2573                                 const struct path *root,
2574                                 const struct path *path)
2575 {
2576         struct path cur = *path;
2577         __be32 *p;
2578         struct dentry **components = NULL;
2579         unsigned int ncomponents = 0;
2580         __be32 err = nfserr_jukebox;
2581
2582         dprintk("nfsd4_encode_components(");
2583
2584         path_get(&cur);
2585         /* First walk the path up to the nfsd root, and store the
2586          * dentries/path components in an array.
2587          */
2588         for (;;) {
2589                 if (path_equal(&cur, root))
2590                         break;
2591                 if (cur.dentry == cur.mnt->mnt_root) {
2592                         if (follow_up(&cur))
2593                                 continue;
2594                         goto out_free;
2595                 }
2596                 if ((ncomponents & 15) == 0) {
2597                         struct dentry **new;
2598                         new = krealloc(components,
2599                                         sizeof(*new) * (ncomponents + 16),
2600                                         GFP_KERNEL);
2601                         if (!new)
2602                                 goto out_free;
2603                         components = new;
2604                 }
2605                 components[ncomponents++] = cur.dentry;
2606                 cur.dentry = dget_parent(cur.dentry);
2607         }
2608         err = nfserr_resource;
2609         p = xdr_reserve_space(xdr, 4);
2610         if (!p)
2611                 goto out_free;
2612         *p++ = cpu_to_be32(ncomponents);
2613
2614         while (ncomponents) {
2615                 struct dentry *dentry = components[ncomponents - 1];
2616                 unsigned int len;
2617
2618                 spin_lock(&dentry->d_lock);
2619                 len = dentry->d_name.len;
2620                 p = xdr_reserve_space(xdr, len + 4);
2621                 if (!p) {
2622                         spin_unlock(&dentry->d_lock);
2623                         goto out_free;
2624                 }
2625                 p = xdr_encode_opaque(p, dentry->d_name.name, len);
2626                 dprintk("/%pd", dentry);
2627                 spin_unlock(&dentry->d_lock);
2628                 dput(dentry);
2629                 ncomponents--;
2630         }
2631
2632         err = 0;
2633 out_free:
2634         dprintk(")\n");
2635         while (ncomponents)
2636                 dput(components[--ncomponents]);
2637         kfree(components);
2638         path_put(&cur);
2639         return err;
2640 }
2641
2642 static __be32 nfsd4_encode_fsloc_fsroot(struct xdr_stream *xdr,
2643                         struct svc_rqst *rqstp, const struct path *path)
2644 {
2645         struct svc_export *exp_ps;
2646         __be32 res;
2647
2648         exp_ps = rqst_find_fsidzero_export(rqstp);
2649         if (IS_ERR(exp_ps))
2650                 return nfserrno(PTR_ERR(exp_ps));
2651         res = nfsd4_encode_path(xdr, &exp_ps->ex_path, path);
2652         exp_put(exp_ps);
2653         return res;
2654 }
2655
2656 /*
2657  *  encode a fs_locations structure
2658  */
2659 static __be32 nfsd4_encode_fs_locations(struct xdr_stream *xdr,
2660                         struct svc_rqst *rqstp, struct svc_export *exp)
2661 {
2662         __be32 status;
2663         int i;
2664         __be32 *p;
2665         struct nfsd4_fs_locations *fslocs = &exp->ex_fslocs;
2666
2667         status = nfsd4_encode_fsloc_fsroot(xdr, rqstp, &exp->ex_path);
2668         if (status)
2669                 return status;
2670         p = xdr_reserve_space(xdr, 4);
2671         if (!p)
2672                 return nfserr_resource;
2673         *p++ = cpu_to_be32(fslocs->locations_count);
2674         for (i=0; i<fslocs->locations_count; i++) {
2675                 status = nfsd4_encode_fs_location4(xdr, &fslocs->locations[i]);
2676                 if (status)
2677                         return status;
2678         }
2679         return 0;
2680 }
2681
2682 static u32 nfs4_file_type(umode_t mode)
2683 {
2684         switch (mode & S_IFMT) {
2685         case S_IFIFO:   return NF4FIFO;
2686         case S_IFCHR:   return NF4CHR;
2687         case S_IFDIR:   return NF4DIR;
2688         case S_IFBLK:   return NF4BLK;
2689         case S_IFLNK:   return NF4LNK;
2690         case S_IFREG:   return NF4REG;
2691         case S_IFSOCK:  return NF4SOCK;
2692         default:        return NF4BAD;
2693         }
2694 }
2695
2696 static inline __be32
2697 nfsd4_encode_aclname(struct xdr_stream *xdr, struct svc_rqst *rqstp,
2698                      struct nfs4_ace *ace)
2699 {
2700         if (ace->whotype != NFS4_ACL_WHO_NAMED)
2701                 return nfs4_acl_write_who(xdr, ace->whotype);
2702         else if (ace->flag & NFS4_ACE_IDENTIFIER_GROUP)
2703                 return nfsd4_encode_group(xdr, rqstp, ace->who_gid);
2704         else
2705                 return nfsd4_encode_user(xdr, rqstp, ace->who_uid);
2706 }
2707
2708 static inline __be32
2709 nfsd4_encode_layout_types(struct xdr_stream *xdr, u32 layout_types)
2710 {
2711         __be32          *p;
2712         unsigned long   i = hweight_long(layout_types);
2713
2714         p = xdr_reserve_space(xdr, 4 + 4 * i);
2715         if (!p)
2716                 return nfserr_resource;
2717
2718         *p++ = cpu_to_be32(i);
2719
2720         for (i = LAYOUT_NFSV4_1_FILES; i < LAYOUT_TYPE_MAX; ++i)
2721                 if (layout_types & (1 << i))
2722                         *p++ = cpu_to_be32(i);
2723
2724         return 0;
2725 }
2726
2727 #define WORD0_ABSENT_FS_ATTRS (FATTR4_WORD0_FS_LOCATIONS | FATTR4_WORD0_FSID | \
2728                               FATTR4_WORD0_RDATTR_ERROR)
2729 #define WORD1_ABSENT_FS_ATTRS FATTR4_WORD1_MOUNTED_ON_FILEID
2730 #define WORD2_ABSENT_FS_ATTRS 0
2731
2732 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
2733 static inline __be32
2734 nfsd4_encode_security_label(struct xdr_stream *xdr, struct svc_rqst *rqstp,
2735                             void *context, int len)
2736 {
2737         __be32 *p;
2738
2739         p = xdr_reserve_space(xdr, len + 4 + 4 + 4);
2740         if (!p)
2741                 return nfserr_resource;
2742
2743         /*
2744          * For now we use a 0 here to indicate the null translation; in
2745          * the future we may place a call to translation code here.
2746          */
2747         *p++ = cpu_to_be32(0); /* lfs */
2748         *p++ = cpu_to_be32(0); /* pi */
2749         p = xdr_encode_opaque(p, context, len);
2750         return 0;
2751 }
2752 #else
2753 static inline __be32
2754 nfsd4_encode_security_label(struct xdr_stream *xdr, struct svc_rqst *rqstp,
2755                             void *context, int len)
2756 { return 0; }
2757 #endif
2758
2759 static __be32 fattr_handle_absent_fs(u32 *bmval0, u32 *bmval1, u32 *bmval2, u32 *rdattr_err)
2760 {
2761         /* As per referral draft:  */
2762         if (*bmval0 & ~WORD0_ABSENT_FS_ATTRS ||
2763             *bmval1 & ~WORD1_ABSENT_FS_ATTRS) {
2764                 if (*bmval0 & FATTR4_WORD0_RDATTR_ERROR ||
2765                     *bmval0 & FATTR4_WORD0_FS_LOCATIONS)
2766                         *rdattr_err = NFSERR_MOVED;
2767                 else
2768                         return nfserr_moved;
2769         }
2770         *bmval0 &= WORD0_ABSENT_FS_ATTRS;
2771         *bmval1 &= WORD1_ABSENT_FS_ATTRS;
2772         *bmval2 &= WORD2_ABSENT_FS_ATTRS;
2773         return 0;
2774 }
2775
2776
2777 static int get_parent_attributes(struct svc_export *exp, struct kstat *stat)
2778 {
2779         struct path path = exp->ex_path;
2780         int err;
2781
2782         path_get(&path);
2783         while (follow_up(&path)) {
2784                 if (path.dentry != path.mnt->mnt_root)
2785                         break;
2786         }
2787         err = vfs_getattr(&path, stat, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT);
2788         path_put(&path);
2789         return err;
2790 }
2791
2792 static __be32
2793 nfsd4_encode_bitmap(struct xdr_stream *xdr, u32 bmval0, u32 bmval1, u32 bmval2)
2794 {
2795         __be32 *p;
2796
2797         if (bmval2) {
2798                 p = xdr_reserve_space(xdr, 16);
2799                 if (!p)
2800                         goto out_resource;
2801                 *p++ = cpu_to_be32(3);
2802                 *p++ = cpu_to_be32(bmval0);
2803                 *p++ = cpu_to_be32(bmval1);
2804                 *p++ = cpu_to_be32(bmval2);
2805         } else if (bmval1) {
2806                 p = xdr_reserve_space(xdr, 12);
2807                 if (!p)
2808                         goto out_resource;
2809                 *p++ = cpu_to_be32(2);
2810                 *p++ = cpu_to_be32(bmval0);
2811                 *p++ = cpu_to_be32(bmval1);
2812         } else {
2813                 p = xdr_reserve_space(xdr, 8);
2814                 if (!p)
2815                         goto out_resource;
2816                 *p++ = cpu_to_be32(1);
2817                 *p++ = cpu_to_be32(bmval0);
2818         }
2819
2820         return 0;
2821 out_resource:
2822         return nfserr_resource;
2823 }
2824
2825 /*
2826  * Note: @fhp can be NULL; in this case, we might have to compose the filehandle
2827  * ourselves.
2828  */
2829 static __be32
2830 nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp,
2831                 struct svc_export *exp,
2832                 struct dentry *dentry, u32 *bmval,
2833                 struct svc_rqst *rqstp, int ignore_crossmnt)
2834 {
2835         u32 bmval0 = bmval[0];
2836         u32 bmval1 = bmval[1];
2837         u32 bmval2 = bmval[2];
2838         struct kstat stat;
2839         struct svc_fh *tempfh = NULL;
2840         struct kstatfs statfs;
2841         __be32 *p, *attrlen_p;
2842         int starting_len = xdr->buf->len;
2843         int attrlen_offset;
2844         u32 dummy;
2845         u64 dummy64;
2846         u32 rdattr_err = 0;
2847         __be32 status;
2848         int err;
2849         struct nfs4_acl *acl = NULL;
2850 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
2851         void *context = NULL;
2852         int contextlen;
2853 #endif
2854         bool contextsupport = false;
2855         struct nfsd4_compoundres *resp = rqstp->rq_resp;
2856         u32 minorversion = resp->cstate.minorversion;
2857         struct path path = {
2858                 .mnt    = exp->ex_path.mnt,
2859                 .dentry = dentry,
2860         };
2861         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
2862
2863         BUG_ON(bmval1 & NFSD_WRITEONLY_ATTRS_WORD1);
2864         BUG_ON(!nfsd_attrs_supported(minorversion, bmval));
2865
2866         if (exp->ex_fslocs.migrated) {
2867                 status = fattr_handle_absent_fs(&bmval0, &bmval1, &bmval2, &rdattr_err);
2868                 if (status)
2869                         goto out;
2870         }
2871
2872         err = vfs_getattr(&path, &stat, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT);
2873         if (err)
2874                 goto out_nfserr;
2875         if (!(stat.result_mask & STATX_BTIME))
2876                 /* underlying FS does not offer btime so we can't share it */
2877                 bmval1 &= ~FATTR4_WORD1_TIME_CREATE;
2878         if ((bmval0 & (FATTR4_WORD0_FILES_AVAIL | FATTR4_WORD0_FILES_FREE |
2879                         FATTR4_WORD0_FILES_TOTAL | FATTR4_WORD0_MAXNAME)) ||
2880             (bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE |
2881                        FATTR4_WORD1_SPACE_TOTAL))) {
2882                 err = vfs_statfs(&path, &statfs);
2883                 if (err)
2884                         goto out_nfserr;
2885         }
2886         if ((bmval0 & (FATTR4_WORD0_FILEHANDLE | FATTR4_WORD0_FSID)) && !fhp) {
2887                 tempfh = kmalloc(sizeof(struct svc_fh), GFP_KERNEL);
2888                 status = nfserr_jukebox;
2889                 if (!tempfh)
2890                         goto out;
2891                 fh_init(tempfh, NFS4_FHSIZE);
2892                 status = fh_compose(tempfh, exp, dentry, NULL);
2893                 if (status)
2894                         goto out;
2895                 fhp = tempfh;
2896         }
2897         if (bmval0 & FATTR4_WORD0_ACL) {
2898                 err = nfsd4_get_nfs4_acl(rqstp, dentry, &acl);
2899                 if (err == -EOPNOTSUPP)
2900                         bmval0 &= ~FATTR4_WORD0_ACL;
2901                 else if (err == -EINVAL) {
2902                         status = nfserr_attrnotsupp;
2903                         goto out;
2904                 } else if (err != 0)
2905                         goto out_nfserr;
2906         }
2907
2908 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
2909         if ((bmval2 & FATTR4_WORD2_SECURITY_LABEL) ||
2910              bmval0 & FATTR4_WORD0_SUPPORTED_ATTRS) {
2911                 if (exp->ex_flags & NFSEXP_SECURITY_LABEL)
2912                         err = security_inode_getsecctx(d_inode(dentry),
2913                                                 &context, &contextlen);
2914                 else
2915                         err = -EOPNOTSUPP;
2916                 contextsupport = (err == 0);
2917                 if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) {
2918                         if (err == -EOPNOTSUPP)
2919                                 bmval2 &= ~FATTR4_WORD2_SECURITY_LABEL;
2920                         else if (err)
2921                                 goto out_nfserr;
2922                 }
2923         }
2924 #endif /* CONFIG_NFSD_V4_SECURITY_LABEL */
2925
2926         status = nfsd4_encode_bitmap(xdr, bmval0, bmval1, bmval2);
2927         if (status)
2928                 goto out;
2929
2930         attrlen_offset = xdr->buf->len;
2931         attrlen_p = xdr_reserve_space(xdr, XDR_UNIT);
2932         if (!attrlen_p)
2933                 goto out_resource;
2934
2935         if (bmval0 & FATTR4_WORD0_SUPPORTED_ATTRS) {
2936                 u32 supp[3];
2937
2938                 memcpy(supp, nfsd_suppattrs[minorversion], sizeof(supp));
2939
2940                 if (!IS_POSIXACL(dentry->d_inode))
2941                         supp[0] &= ~FATTR4_WORD0_ACL;
2942                 if (!contextsupport)
2943                         supp[2] &= ~FATTR4_WORD2_SECURITY_LABEL;
2944                 if (!supp[2]) {
2945                         p = xdr_reserve_space(xdr, 12);
2946                         if (!p)
2947                                 goto out_resource;
2948                         *p++ = cpu_to_be32(2);
2949                         *p++ = cpu_to_be32(supp[0]);
2950                         *p++ = cpu_to_be32(supp[1]);
2951                 } else {
2952                         p = xdr_reserve_space(xdr, 16);
2953                         if (!p)
2954                                 goto out_resource;
2955                         *p++ = cpu_to_be32(3);
2956                         *p++ = cpu_to_be32(supp[0]);
2957                         *p++ = cpu_to_be32(supp[1]);
2958                         *p++ = cpu_to_be32(supp[2]);
2959                 }
2960         }
2961         if (bmval0 & FATTR4_WORD0_TYPE) {
2962                 p = xdr_reserve_space(xdr, 4);
2963                 if (!p)
2964                         goto out_resource;
2965                 dummy = nfs4_file_type(stat.mode);
2966                 if (dummy == NF4BAD) {
2967                         status = nfserr_serverfault;
2968                         goto out;
2969                 }
2970                 *p++ = cpu_to_be32(dummy);
2971         }
2972         if (bmval0 & FATTR4_WORD0_FH_EXPIRE_TYPE) {
2973                 p = xdr_reserve_space(xdr, 4);
2974                 if (!p)
2975                         goto out_resource;
2976                 if (exp->ex_flags & NFSEXP_NOSUBTREECHECK)
2977                         *p++ = cpu_to_be32(NFS4_FH_PERSISTENT);
2978                 else
2979                         *p++ = cpu_to_be32(NFS4_FH_PERSISTENT|
2980                                                 NFS4_FH_VOL_RENAME);
2981         }
2982         if (bmval0 & FATTR4_WORD0_CHANGE) {
2983                 p = xdr_reserve_space(xdr, 8);
2984                 if (!p)
2985                         goto out_resource;
2986                 p = encode_change(p, &stat, d_inode(dentry), exp);
2987         }
2988         if (bmval0 & FATTR4_WORD0_SIZE) {
2989                 p = xdr_reserve_space(xdr, 8);
2990                 if (!p)
2991                         goto out_resource;
2992                 p = xdr_encode_hyper(p, stat.size);
2993         }
2994         if (bmval0 & FATTR4_WORD0_LINK_SUPPORT) {
2995                 p = xdr_reserve_space(xdr, 4);
2996                 if (!p)
2997                         goto out_resource;
2998                 *p++ = cpu_to_be32(1);
2999         }
3000         if (bmval0 & FATTR4_WORD0_SYMLINK_SUPPORT) {
3001                 p = xdr_reserve_space(xdr, 4);
3002                 if (!p)
3003                         goto out_resource;
3004                 *p++ = cpu_to_be32(1);
3005         }
3006         if (bmval0 & FATTR4_WORD0_NAMED_ATTR) {
3007                 p = xdr_reserve_space(xdr, 4);
3008                 if (!p)
3009                         goto out_resource;
3010                 *p++ = cpu_to_be32(0);
3011         }
3012         if (bmval0 & FATTR4_WORD0_FSID) {
3013                 p = xdr_reserve_space(xdr, 16);
3014                 if (!p)
3015                         goto out_resource;
3016                 if (exp->ex_fslocs.migrated) {
3017                         p = xdr_encode_hyper(p, NFS4_REFERRAL_FSID_MAJOR);
3018                         p = xdr_encode_hyper(p, NFS4_REFERRAL_FSID_MINOR);
3019                 } else switch(fsid_source(fhp)) {
3020                 case FSIDSOURCE_FSID:
3021                         p = xdr_encode_hyper(p, (u64)exp->ex_fsid);
3022                         p = xdr_encode_hyper(p, (u64)0);
3023                         break;
3024                 case FSIDSOURCE_DEV:
3025                         *p++ = cpu_to_be32(0);
3026                         *p++ = cpu_to_be32(MAJOR(stat.dev));
3027                         *p++ = cpu_to_be32(0);
3028                         *p++ = cpu_to_be32(MINOR(stat.dev));
3029                         break;
3030                 case FSIDSOURCE_UUID:
3031                         p = xdr_encode_opaque_fixed(p, exp->ex_uuid,
3032                                                                 EX_UUID_LEN);
3033                         break;
3034                 }
3035         }
3036         if (bmval0 & FATTR4_WORD0_UNIQUE_HANDLES) {
3037                 p = xdr_reserve_space(xdr, 4);
3038                 if (!p)
3039                         goto out_resource;
3040                 *p++ = cpu_to_be32(0);
3041         }
3042         if (bmval0 & FATTR4_WORD0_LEASE_TIME) {
3043                 p = xdr_reserve_space(xdr, 4);
3044                 if (!p)
3045                         goto out_resource;
3046                 *p++ = cpu_to_be32(nn->nfsd4_lease);
3047         }
3048         if (bmval0 & FATTR4_WORD0_RDATTR_ERROR) {
3049                 p = xdr_reserve_space(xdr, 4);
3050                 if (!p)
3051                         goto out_resource;
3052                 *p++ = cpu_to_be32(rdattr_err);
3053         }
3054         if (bmval0 & FATTR4_WORD0_ACL) {
3055                 struct nfs4_ace *ace;
3056
3057                 if (acl == NULL) {
3058                         p = xdr_reserve_space(xdr, 4);
3059                         if (!p)
3060                                 goto out_resource;
3061
3062                         *p++ = cpu_to_be32(0);
3063                         goto out_acl;
3064                 }
3065                 p = xdr_reserve_space(xdr, 4);
3066                 if (!p)
3067                         goto out_resource;
3068                 *p++ = cpu_to_be32(acl->naces);
3069
3070                 for (ace = acl->aces; ace < acl->aces + acl->naces; ace++) {
3071                         p = xdr_reserve_space(xdr, 4*3);
3072                         if (!p)
3073                                 goto out_resource;
3074                         *p++ = cpu_to_be32(ace->type);
3075                         *p++ = cpu_to_be32(ace->flag);
3076                         *p++ = cpu_to_be32(ace->access_mask &
3077                                                         NFS4_ACE_MASK_ALL);
3078                         status = nfsd4_encode_aclname(xdr, rqstp, ace);
3079                         if (status)
3080                                 goto out;
3081                 }
3082         }
3083 out_acl:
3084         if (bmval0 & FATTR4_WORD0_ACLSUPPORT) {
3085                 p = xdr_reserve_space(xdr, 4);
3086                 if (!p)
3087                         goto out_resource;
3088                 *p++ = cpu_to_be32(IS_POSIXACL(dentry->d_inode) ?
3089                         ACL4_SUPPORT_ALLOW_ACL|ACL4_SUPPORT_DENY_ACL : 0);
3090         }
3091         if (bmval0 & FATTR4_WORD0_CANSETTIME) {
3092                 p = xdr_reserve_space(xdr, 4);
3093                 if (!p)
3094                         goto out_resource;
3095                 *p++ = cpu_to_be32(1);
3096         }
3097         if (bmval0 & FATTR4_WORD0_CASE_INSENSITIVE) {
3098                 p = xdr_reserve_space(xdr, 4);
3099                 if (!p)
3100                         goto out_resource;
3101                 *p++ = cpu_to_be32(0);
3102         }
3103         if (bmval0 & FATTR4_WORD0_CASE_PRESERVING) {
3104                 p = xdr_reserve_space(xdr, 4);
3105                 if (!p)
3106                         goto out_resource;
3107                 *p++ = cpu_to_be32(1);
3108         }
3109         if (bmval0 & FATTR4_WORD0_CHOWN_RESTRICTED) {
3110                 p = xdr_reserve_space(xdr, 4);
3111                 if (!p)
3112                         goto out_resource;
3113                 *p++ = cpu_to_be32(1);
3114         }
3115         if (bmval0 & FATTR4_WORD0_FILEHANDLE) {
3116                 p = xdr_reserve_space(xdr, fhp->fh_handle.fh_size + 4);
3117                 if (!p)
3118                         goto out_resource;
3119                 p = xdr_encode_opaque(p, &fhp->fh_handle.fh_raw,
3120                                         fhp->fh_handle.fh_size);
3121         }
3122         if (bmval0 & FATTR4_WORD0_FILEID) {
3123                 p = xdr_reserve_space(xdr, 8);
3124                 if (!p)
3125                         goto out_resource;
3126                 p = xdr_encode_hyper(p, stat.ino);
3127         }
3128         if (bmval0 & FATTR4_WORD0_FILES_AVAIL) {
3129                 p = xdr_reserve_space(xdr, 8);
3130                 if (!p)
3131                         goto out_resource;
3132                 p = xdr_encode_hyper(p, (u64) statfs.f_ffree);
3133         }
3134         if (bmval0 & FATTR4_WORD0_FILES_FREE) {
3135                 p = xdr_reserve_space(xdr, 8);
3136                 if (!p)
3137                         goto out_resource;
3138                 p = xdr_encode_hyper(p, (u64) statfs.f_ffree);
3139         }
3140         if (bmval0 & FATTR4_WORD0_FILES_TOTAL) {
3141                 p = xdr_reserve_space(xdr, 8);
3142                 if (!p)
3143                         goto out_resource;
3144                 p = xdr_encode_hyper(p, (u64) statfs.f_files);
3145         }
3146         if (bmval0 & FATTR4_WORD0_FS_LOCATIONS) {
3147                 status = nfsd4_encode_fs_locations(xdr, rqstp, exp);
3148                 if (status)
3149                         goto out;
3150         }
3151         if (bmval0 & FATTR4_WORD0_HOMOGENEOUS) {
3152                 p = xdr_reserve_space(xdr, 4);
3153                 if (!p)
3154                         goto out_resource;
3155                 *p++ = cpu_to_be32(1);
3156         }
3157         if (bmval0 & FATTR4_WORD0_MAXFILESIZE) {
3158                 p = xdr_reserve_space(xdr, 8);
3159                 if (!p)
3160                         goto out_resource;
3161                 p = xdr_encode_hyper(p, exp->ex_path.mnt->mnt_sb->s_maxbytes);
3162         }
3163         if (bmval0 & FATTR4_WORD0_MAXLINK) {
3164                 p = xdr_reserve_space(xdr, 4);
3165                 if (!p)
3166                         goto out_resource;
3167                 *p++ = cpu_to_be32(255);
3168         }
3169         if (bmval0 & FATTR4_WORD0_MAXNAME) {
3170                 p = xdr_reserve_space(xdr, 4);
3171                 if (!p)
3172                         goto out_resource;
3173                 *p++ = cpu_to_be32(statfs.f_namelen);
3174         }
3175         if (bmval0 & FATTR4_WORD0_MAXREAD) {
3176                 p = xdr_reserve_space(xdr, 8);
3177                 if (!p)
3178                         goto out_resource;
3179                 p = xdr_encode_hyper(p, (u64) svc_max_payload(rqstp));
3180         }
3181         if (bmval0 & FATTR4_WORD0_MAXWRITE) {
3182                 p = xdr_reserve_space(xdr, 8);
3183                 if (!p)
3184                         goto out_resource;
3185                 p = xdr_encode_hyper(p, (u64) svc_max_payload(rqstp));
3186         }
3187         if (bmval1 & FATTR4_WORD1_MODE) {
3188                 p = xdr_reserve_space(xdr, 4);
3189                 if (!p)
3190                         goto out_resource;
3191                 *p++ = cpu_to_be32(stat.mode & S_IALLUGO);
3192         }
3193         if (bmval1 & FATTR4_WORD1_NO_TRUNC) {
3194                 p = xdr_reserve_space(xdr, 4);
3195                 if (!p)
3196                         goto out_resource;
3197                 *p++ = cpu_to_be32(1);
3198         }
3199         if (bmval1 & FATTR4_WORD1_NUMLINKS) {
3200                 p = xdr_reserve_space(xdr, 4);
3201                 if (!p)
3202                         goto out_resource;
3203                 *p++ = cpu_to_be32(stat.nlink);
3204         }
3205         if (bmval1 & FATTR4_WORD1_OWNER) {
3206                 status = nfsd4_encode_user(xdr, rqstp, stat.uid);
3207                 if (status)
3208                         goto out;
3209         }
3210         if (bmval1 & FATTR4_WORD1_OWNER_GROUP) {
3211                 status = nfsd4_encode_group(xdr, rqstp, stat.gid);
3212                 if (status)
3213                         goto out;
3214         }
3215         if (bmval1 & FATTR4_WORD1_RAWDEV) {
3216                 p = xdr_reserve_space(xdr, 8);
3217                 if (!p)
3218                         goto out_resource;
3219                 *p++ = cpu_to_be32((u32) MAJOR(stat.rdev));
3220                 *p++ = cpu_to_be32((u32) MINOR(stat.rdev));
3221         }
3222         if (bmval1 & FATTR4_WORD1_SPACE_AVAIL) {
3223                 p = xdr_reserve_space(xdr, 8);
3224                 if (!p)
3225                         goto out_resource;
3226                 dummy64 = (u64)statfs.f_bavail * (u64)statfs.f_bsize;
3227                 p = xdr_encode_hyper(p, dummy64);
3228         }
3229         if (bmval1 & FATTR4_WORD1_SPACE_FREE) {
3230                 p = xdr_reserve_space(xdr, 8);
3231                 if (!p)
3232                         goto out_resource;
3233                 dummy64 = (u64)statfs.f_bfree * (u64)statfs.f_bsize;
3234                 p = xdr_encode_hyper(p, dummy64);
3235         }
3236         if (bmval1 & FATTR4_WORD1_SPACE_TOTAL) {
3237                 p = xdr_reserve_space(xdr, 8);
3238                 if (!p)
3239                         goto out_resource;
3240                 dummy64 = (u64)statfs.f_blocks * (u64)statfs.f_bsize;
3241                 p = xdr_encode_hyper(p, dummy64);
3242         }
3243         if (bmval1 & FATTR4_WORD1_SPACE_USED) {
3244                 p = xdr_reserve_space(xdr, 8);
3245                 if (!p)
3246                         goto out_resource;
3247                 dummy64 = (u64)stat.blocks << 9;
3248                 p = xdr_encode_hyper(p, dummy64);
3249         }
3250         if (bmval1 & FATTR4_WORD1_TIME_ACCESS) {
3251                 p = xdr_reserve_space(xdr, 12);
3252                 if (!p)
3253                         goto out_resource;
3254                 p = xdr_encode_hyper(p, (s64)stat.atime.tv_sec);
3255                 *p++ = cpu_to_be32(stat.atime.tv_nsec);
3256         }
3257         if (bmval1 & FATTR4_WORD1_TIME_DELTA) {
3258                 p = xdr_reserve_space(xdr, 12);
3259                 if (!p)
3260                         goto out_resource;
3261                 p = encode_time_delta(p, d_inode(dentry));
3262         }
3263         if (bmval1 & FATTR4_WORD1_TIME_METADATA) {
3264                 p = xdr_reserve_space(xdr, 12);
3265                 if (!p)
3266                         goto out_resource;
3267                 p = xdr_encode_hyper(p, (s64)stat.ctime.tv_sec);
3268                 *p++ = cpu_to_be32(stat.ctime.tv_nsec);
3269         }
3270         if (bmval1 & FATTR4_WORD1_TIME_MODIFY) {
3271                 p = xdr_reserve_space(xdr, 12);
3272                 if (!p)
3273                         goto out_resource;
3274                 p = xdr_encode_hyper(p, (s64)stat.mtime.tv_sec);
3275                 *p++ = cpu_to_be32(stat.mtime.tv_nsec);
3276         }
3277         if (bmval1 & FATTR4_WORD1_TIME_CREATE) {
3278                 p = xdr_reserve_space(xdr, 12);
3279                 if (!p)
3280                         goto out_resource;
3281                 p = xdr_encode_hyper(p, (s64)stat.btime.tv_sec);
3282                 *p++ = cpu_to_be32(stat.btime.tv_nsec);
3283         }
3284         if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) {
3285                 struct kstat parent_stat;
3286                 u64 ino = stat.ino;
3287
3288                 p = xdr_reserve_space(xdr, 8);
3289                 if (!p)
3290                         goto out_resource;
3291                 /*
3292                  * Get parent's attributes if not ignoring crossmount
3293                  * and this is the root of a cross-mounted filesystem.
3294                  */
3295                 if (ignore_crossmnt == 0 &&
3296                     dentry == exp->ex_path.mnt->mnt_root) {
3297                         err = get_parent_attributes(exp, &parent_stat);
3298                         if (err)
3299                                 goto out_nfserr;
3300                         ino = parent_stat.ino;
3301                 }
3302                 p = xdr_encode_hyper(p, ino);
3303         }
3304 #ifdef CONFIG_NFSD_PNFS
3305         if (bmval1 & FATTR4_WORD1_FS_LAYOUT_TYPES) {
3306                 status = nfsd4_encode_layout_types(xdr, exp->ex_layout_types);
3307                 if (status)
3308                         goto out;
3309         }
3310
3311         if (bmval2 & FATTR4_WORD2_LAYOUT_TYPES) {
3312                 status = nfsd4_encode_layout_types(xdr, exp->ex_layout_types);
3313                 if (status)
3314                         goto out;
3315         }
3316
3317         if (bmval2 & FATTR4_WORD2_LAYOUT_BLKSIZE) {
3318                 p = xdr_reserve_space(xdr, 4);
3319                 if (!p)
3320                         goto out_resource;
3321                 *p++ = cpu_to_be32(stat.blksize);
3322         }
3323 #endif /* CONFIG_NFSD_PNFS */
3324         if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) {
3325                 u32 supp[3];
3326
3327                 memcpy(supp, nfsd_suppattrs[minorversion], sizeof(supp));
3328                 supp[0] &= NFSD_SUPPATTR_EXCLCREAT_WORD0;
3329                 supp[1] &= NFSD_SUPPATTR_EXCLCREAT_WORD1;
3330                 supp[2] &= NFSD_SUPPATTR_EXCLCREAT_WORD2;
3331
3332                 status = nfsd4_encode_bitmap(xdr, supp[0], supp[1], supp[2]);
3333                 if (status)
3334                         goto out;
3335         }
3336
3337 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
3338         if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) {
3339                 status = nfsd4_encode_security_label(xdr, rqstp, context,
3340                                                                 contextlen);
3341                 if (status)
3342                         goto out;
3343         }
3344 #endif
3345
3346         if (bmval2 & FATTR4_WORD2_XATTR_SUPPORT) {
3347                 p = xdr_reserve_space(xdr, 4);
3348                 if (!p)
3349                         goto out_resource;
3350                 err = xattr_supported_namespace(d_inode(dentry),
3351                                                 XATTR_USER_PREFIX);
3352                 *p++ = cpu_to_be32(err == 0);
3353         }
3354
3355         *attrlen_p = cpu_to_be32(xdr->buf->len - attrlen_offset - XDR_UNIT);
3356         status = nfs_ok;
3357
3358 out:
3359 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
3360         if (context)
3361                 security_release_secctx(context, contextlen);
3362 #endif /* CONFIG_NFSD_V4_SECURITY_LABEL */
3363         kfree(acl);
3364         if (tempfh) {
3365                 fh_put(tempfh);
3366                 kfree(tempfh);
3367         }
3368         if (status)
3369                 xdr_truncate_encode(xdr, starting_len);
3370         return status;
3371 out_nfserr:
3372         status = nfserrno(err);
3373         goto out;
3374 out_resource:
3375         status = nfserr_resource;
3376         goto out;
3377 }
3378
3379 static void svcxdr_init_encode_from_buffer(struct xdr_stream *xdr,
3380                                 struct xdr_buf *buf, __be32 *p, int bytes)
3381 {
3382         xdr->scratch.iov_len = 0;
3383         memset(buf, 0, sizeof(struct xdr_buf));
3384         buf->head[0].iov_base = p;
3385         buf->head[0].iov_len = 0;
3386         buf->len = 0;
3387         xdr->buf = buf;
3388         xdr->iov = buf->head;
3389         xdr->p = p;
3390         xdr->end = (void *)p + bytes;
3391         buf->buflen = bytes;
3392 }
3393
3394 __be32 nfsd4_encode_fattr_to_buf(__be32 **p, int words,
3395                         struct svc_fh *fhp, struct svc_export *exp,
3396                         struct dentry *dentry, u32 *bmval,
3397                         struct svc_rqst *rqstp, int ignore_crossmnt)
3398 {
3399         struct xdr_buf dummy;
3400         struct xdr_stream xdr;
3401         __be32 ret;
3402
3403         svcxdr_init_encode_from_buffer(&xdr, &dummy, *p, words << 2);
3404         ret = nfsd4_encode_fattr(&xdr, fhp, exp, dentry, bmval, rqstp,
3405                                                         ignore_crossmnt);
3406         *p = xdr.p;
3407         return ret;
3408 }
3409
3410 static inline int attributes_need_mount(u32 *bmval)
3411 {
3412         if (bmval[0] & ~(FATTR4_WORD0_RDATTR_ERROR | FATTR4_WORD0_LEASE_TIME))
3413                 return 1;
3414         if (bmval[1] & ~FATTR4_WORD1_MOUNTED_ON_FILEID)
3415                 return 1;
3416         return 0;
3417 }
3418
3419 static __be32
3420 nfsd4_encode_dirent_fattr(struct xdr_stream *xdr, struct nfsd4_readdir *cd,
3421                         const char *name, int namlen)
3422 {
3423         struct svc_export *exp = cd->rd_fhp->fh_export;
3424         struct dentry *dentry;
3425         __be32 nfserr;
3426         int ignore_crossmnt = 0;
3427
3428         dentry = lookup_positive_unlocked(name, cd->rd_fhp->fh_dentry, namlen);
3429         if (IS_ERR(dentry))
3430                 return nfserrno(PTR_ERR(dentry));
3431
3432         exp_get(exp);
3433         /*
3434          * In the case of a mountpoint, the client may be asking for
3435          * attributes that are only properties of the underlying filesystem
3436          * as opposed to the cross-mounted file system. In such a case,
3437          * we will not follow the cross mount and will fill the attribtutes
3438          * directly from the mountpoint dentry.
3439          */
3440         if (nfsd_mountpoint(dentry, exp)) {
3441                 int err;
3442
3443                 if (!(exp->ex_flags & NFSEXP_V4ROOT)
3444                                 && !attributes_need_mount(cd->rd_bmval)) {
3445                         ignore_crossmnt = 1;
3446                         goto out_encode;
3447                 }
3448                 /*
3449                  * Why the heck aren't we just using nfsd_lookup??
3450                  * Different "."/".." handling?  Something else?
3451                  * At least, add a comment here to explain....
3452                  */
3453                 err = nfsd_cross_mnt(cd->rd_rqstp, &dentry, &exp);
3454                 if (err) {
3455                         nfserr = nfserrno(err);
3456                         goto out_put;
3457                 }
3458                 nfserr = check_nfsd_access(exp, cd->rd_rqstp);
3459                 if (nfserr)
3460                         goto out_put;
3461
3462         }
3463 out_encode:
3464         nfserr = nfsd4_encode_fattr(xdr, NULL, exp, dentry, cd->rd_bmval,
3465                                         cd->rd_rqstp, ignore_crossmnt);
3466 out_put:
3467         dput(dentry);
3468         exp_put(exp);
3469         return nfserr;
3470 }
3471
3472 static __be32 *
3473 nfsd4_encode_rdattr_error(struct xdr_stream *xdr, __be32 nfserr)
3474 {
3475         __be32 *p;
3476
3477         p = xdr_reserve_space(xdr, 20);
3478         if (!p)
3479                 return NULL;
3480         *p++ = htonl(2);
3481         *p++ = htonl(FATTR4_WORD0_RDATTR_ERROR); /* bmval0 */
3482         *p++ = htonl(0);                         /* bmval1 */
3483
3484         *p++ = htonl(4);     /* attribute length */
3485         *p++ = nfserr;       /* no htonl */
3486         return p;
3487 }
3488
3489 static int
3490 nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
3491                     loff_t offset, u64 ino, unsigned int d_type)
3492 {
3493         struct readdir_cd *ccd = ccdv;
3494         struct nfsd4_readdir *cd = container_of(ccd, struct nfsd4_readdir, common);
3495         struct xdr_stream *xdr = cd->xdr;
3496         int start_offset = xdr->buf->len;
3497         int cookie_offset;
3498         u32 name_and_cookie;
3499         int entry_bytes;
3500         __be32 nfserr = nfserr_toosmall;
3501         __be64 wire_offset;
3502         __be32 *p;
3503
3504         /* In nfsv4, "." and ".." never make it onto the wire.. */
3505         if (name && isdotent(name, namlen)) {
3506                 cd->common.err = nfs_ok;
3507                 return 0;
3508         }
3509
3510         if (cd->cookie_offset) {
3511                 wire_offset = cpu_to_be64(offset);
3512                 write_bytes_to_xdr_buf(xdr->buf, cd->cookie_offset,
3513                                                         &wire_offset, 8);
3514         }
3515
3516         p = xdr_reserve_space(xdr, 4);
3517         if (!p)
3518                 goto fail;
3519         *p++ = xdr_one;                             /* mark entry present */
3520         cookie_offset = xdr->buf->len;
3521         p = xdr_reserve_space(xdr, 3*4 + namlen);
3522         if (!p)
3523                 goto fail;
3524         p = xdr_encode_hyper(p, OFFSET_MAX);        /* offset of next entry */
3525         p = xdr_encode_array(p, name, namlen);      /* name length & name */
3526
3527         nfserr = nfsd4_encode_dirent_fattr(xdr, cd, name, namlen);
3528         switch (nfserr) {
3529         case nfs_ok:
3530                 break;
3531         case nfserr_resource:
3532                 nfserr = nfserr_toosmall;
3533                 goto fail;
3534         case nfserr_noent:
3535                 xdr_truncate_encode(xdr, start_offset);
3536                 goto skip_entry;
3537         default:
3538                 /*
3539                  * If the client requested the RDATTR_ERROR attribute,
3540                  * we stuff the error code into this attribute
3541                  * and continue.  If this attribute was not requested,
3542                  * then in accordance with the spec, we fail the
3543                  * entire READDIR operation(!)
3544                  */
3545                 if (!(cd->rd_bmval[0] & FATTR4_WORD0_RDATTR_ERROR))
3546                         goto fail;
3547                 p = nfsd4_encode_rdattr_error(xdr, nfserr);
3548                 if (p == NULL) {
3549                         nfserr = nfserr_toosmall;
3550                         goto fail;
3551                 }
3552         }
3553         nfserr = nfserr_toosmall;
3554         entry_bytes = xdr->buf->len - start_offset;
3555         if (entry_bytes > cd->rd_maxcount)
3556                 goto fail;
3557         cd->rd_maxcount -= entry_bytes;
3558         /*
3559          * RFC 3530 14.2.24 describes rd_dircount as only a "hint", and
3560          * notes that it could be zero. If it is zero, then the server
3561          * should enforce only the rd_maxcount value.
3562          */
3563         if (cd->rd_dircount) {
3564                 name_and_cookie = 4 + 4 * XDR_QUADLEN(namlen) + 8;
3565                 if (name_and_cookie > cd->rd_dircount && cd->cookie_offset)
3566                         goto fail;
3567                 cd->rd_dircount -= min(cd->rd_dircount, name_and_cookie);
3568                 if (!cd->rd_dircount)
3569                         cd->rd_maxcount = 0;
3570         }
3571
3572         cd->cookie_offset = cookie_offset;
3573 skip_entry:
3574         cd->common.err = nfs_ok;
3575         return 0;
3576 fail:
3577         xdr_truncate_encode(xdr, start_offset);
3578         cd->common.err = nfserr;
3579         return -EINVAL;
3580 }
3581
3582 static __be32
3583 nfsd4_encode_stateid(struct xdr_stream *xdr, stateid_t *sid)
3584 {
3585         __be32 *p;
3586
3587         p = xdr_reserve_space(xdr, sizeof(stateid_t));
3588         if (!p)
3589                 return nfserr_resource;
3590         *p++ = cpu_to_be32(sid->si_generation);
3591         p = xdr_encode_opaque_fixed(p, &sid->si_opaque,
3592                                         sizeof(stateid_opaque_t));
3593         return 0;
3594 }
3595
3596 static __be32
3597 nfsd4_encode_access(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_access *access)
3598 {
3599         struct xdr_stream *xdr = resp->xdr;
3600         __be32 *p;
3601
3602         p = xdr_reserve_space(xdr, 8);
3603         if (!p)
3604                 return nfserr_resource;
3605         *p++ = cpu_to_be32(access->ac_supported);
3606         *p++ = cpu_to_be32(access->ac_resp_access);
3607         return 0;
3608 }
3609
3610 static __be32 nfsd4_encode_bind_conn_to_session(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_bind_conn_to_session *bcts)
3611 {
3612         struct xdr_stream *xdr = resp->xdr;
3613         __be32 *p;
3614
3615         p = xdr_reserve_space(xdr, NFS4_MAX_SESSIONID_LEN + 8);
3616         if (!p)
3617                 return nfserr_resource;
3618         p = xdr_encode_opaque_fixed(p, bcts->sessionid.data,
3619                                         NFS4_MAX_SESSIONID_LEN);
3620         *p++ = cpu_to_be32(bcts->dir);
3621         /* Upshifting from TCP to RDMA is not supported */
3622         *p++ = cpu_to_be32(0);
3623         return 0;
3624 }
3625
3626 static __be32
3627 nfsd4_encode_close(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_close *close)
3628 {
3629         struct xdr_stream *xdr = resp->xdr;
3630
3631         return nfsd4_encode_stateid(xdr, &close->cl_stateid);
3632 }
3633
3634
3635 static __be32
3636 nfsd4_encode_commit(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_commit *commit)
3637 {
3638         struct xdr_stream *xdr = resp->xdr;
3639         __be32 *p;
3640
3641         p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE);
3642         if (!p)
3643                 return nfserr_resource;
3644         p = xdr_encode_opaque_fixed(p, commit->co_verf.data,
3645                                                 NFS4_VERIFIER_SIZE);
3646         return 0;
3647 }
3648
3649 static __be32
3650 nfsd4_encode_create(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_create *create)
3651 {
3652         struct xdr_stream *xdr = resp->xdr;
3653         __be32 *p;
3654
3655         p = xdr_reserve_space(xdr, 20);
3656         if (!p)
3657                 return nfserr_resource;
3658         encode_cinfo(p, &create->cr_cinfo);
3659         return nfsd4_encode_bitmap(xdr, create->cr_bmval[0],
3660                         create->cr_bmval[1], create->cr_bmval[2]);
3661 }
3662
3663 static __be32
3664 nfsd4_encode_getattr(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_getattr *getattr)
3665 {
3666         struct svc_fh *fhp = getattr->ga_fhp;
3667         struct xdr_stream *xdr = resp->xdr;
3668
3669         return nfsd4_encode_fattr(xdr, fhp, fhp->fh_export, fhp->fh_dentry,
3670                                     getattr->ga_bmval, resp->rqstp, 0);
3671 }
3672
3673 static __be32
3674 nfsd4_encode_getfh(struct nfsd4_compoundres *resp, __be32 nfserr, struct svc_fh **fhpp)
3675 {
3676         struct xdr_stream *xdr = resp->xdr;
3677         struct svc_fh *fhp = *fhpp;
3678         unsigned int len;
3679         __be32 *p;
3680
3681         len = fhp->fh_handle.fh_size;
3682         p = xdr_reserve_space(xdr, len + 4);
3683         if (!p)
3684                 return nfserr_resource;
3685         p = xdr_encode_opaque(p, &fhp->fh_handle.fh_raw, len);
3686         return 0;
3687 }
3688
3689 /*
3690 * Including all fields other than the name, a LOCK4denied structure requires
3691 *   8(clientid) + 4(namelen) + 8(offset) + 8(length) + 4(type) = 32 bytes.
3692 */
3693 static __be32
3694 nfsd4_encode_lock_denied(struct xdr_stream *xdr, struct nfsd4_lock_denied *ld)
3695 {
3696         struct xdr_netobj *conf = &ld->ld_owner;
3697         __be32 *p;
3698
3699 again:
3700         p = xdr_reserve_space(xdr, 32 + XDR_LEN(conf->len));
3701         if (!p) {
3702                 /*
3703                  * Don't fail to return the result just because we can't
3704                  * return the conflicting open:
3705                  */
3706                 if (conf->len) {
3707                         kfree(conf->data);
3708                         conf->len = 0;
3709                         conf->data = NULL;
3710                         goto again;
3711                 }
3712                 return nfserr_resource;
3713         }
3714         p = xdr_encode_hyper(p, ld->ld_start);
3715         p = xdr_encode_hyper(p, ld->ld_length);
3716         *p++ = cpu_to_be32(ld->ld_type);
3717         if (conf->len) {
3718                 p = xdr_encode_opaque_fixed(p, &ld->ld_clientid, 8);
3719                 p = xdr_encode_opaque(p, conf->data, conf->len);
3720                 kfree(conf->data);
3721         }  else {  /* non - nfsv4 lock in conflict, no clientid nor owner */
3722                 p = xdr_encode_hyper(p, (u64)0); /* clientid */
3723                 *p++ = cpu_to_be32(0); /* length of owner name */
3724         }
3725         return nfserr_denied;
3726 }
3727
3728 static __be32
3729 nfsd4_encode_lock(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_lock *lock)
3730 {
3731         struct xdr_stream *xdr = resp->xdr;
3732
3733         if (!nfserr)
3734                 nfserr = nfsd4_encode_stateid(xdr, &lock->lk_resp_stateid);
3735         else if (nfserr == nfserr_denied)
3736                 nfserr = nfsd4_encode_lock_denied(xdr, &lock->lk_denied);
3737
3738         return nfserr;
3739 }
3740
3741 static __be32
3742 nfsd4_encode_lockt(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_lockt *lockt)
3743 {
3744         struct xdr_stream *xdr = resp->xdr;
3745
3746         if (nfserr == nfserr_denied)
3747                 nfsd4_encode_lock_denied(xdr, &lockt->lt_denied);
3748         return nfserr;
3749 }
3750
3751 static __be32
3752 nfsd4_encode_locku(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_locku *locku)
3753 {
3754         struct xdr_stream *xdr = resp->xdr;
3755
3756         return nfsd4_encode_stateid(xdr, &locku->lu_stateid);
3757 }
3758
3759
3760 static __be32
3761 nfsd4_encode_link(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_link *link)
3762 {
3763         struct xdr_stream *xdr = resp->xdr;
3764         __be32 *p;
3765
3766         p = xdr_reserve_space(xdr, 20);
3767         if (!p)
3768                 return nfserr_resource;
3769         p = encode_cinfo(p, &link->li_cinfo);
3770         return 0;
3771 }
3772
3773
3774 static __be32
3775 nfsd4_encode_open(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_open *open)
3776 {
3777         struct xdr_stream *xdr = resp->xdr;
3778         __be32 *p;
3779
3780         nfserr = nfsd4_encode_stateid(xdr, &open->op_stateid);
3781         if (nfserr)
3782                 return nfserr;
3783         p = xdr_reserve_space(xdr, 24);
3784         if (!p)
3785                 return nfserr_resource;
3786         p = encode_cinfo(p, &open->op_cinfo);
3787         *p++ = cpu_to_be32(open->op_rflags);
3788
3789         nfserr = nfsd4_encode_bitmap(xdr, open->op_bmval[0], open->op_bmval[1],
3790                                         open->op_bmval[2]);
3791         if (nfserr)
3792                 return nfserr;
3793
3794         p = xdr_reserve_space(xdr, 4);
3795         if (!p)
3796                 return nfserr_resource;
3797
3798         *p++ = cpu_to_be32(open->op_delegate_type);
3799         switch (open->op_delegate_type) {
3800         case NFS4_OPEN_DELEGATE_NONE:
3801                 break;
3802         case NFS4_OPEN_DELEGATE_READ:
3803                 nfserr = nfsd4_encode_stateid(xdr, &open->op_delegate_stateid);
3804                 if (nfserr)
3805                         return nfserr;
3806                 p = xdr_reserve_space(xdr, 20);
3807                 if (!p)
3808                         return nfserr_resource;
3809                 *p++ = cpu_to_be32(open->op_recall);
3810
3811                 /*
3812                  * TODO: ACE's in delegations
3813                  */
3814                 *p++ = cpu_to_be32(NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE);
3815                 *p++ = cpu_to_be32(0);
3816                 *p++ = cpu_to_be32(0);
3817                 *p++ = cpu_to_be32(0);   /* XXX: is NULL principal ok? */
3818                 break;
3819         case NFS4_OPEN_DELEGATE_WRITE:
3820                 nfserr = nfsd4_encode_stateid(xdr, &open->op_delegate_stateid);
3821                 if (nfserr)
3822                         return nfserr;
3823                 p = xdr_reserve_space(xdr, 32);
3824                 if (!p)
3825                         return nfserr_resource;
3826                 *p++ = cpu_to_be32(0);
3827
3828                 /*
3829                  * TODO: space_limit's in delegations
3830                  */
3831                 *p++ = cpu_to_be32(NFS4_LIMIT_SIZE);
3832                 *p++ = cpu_to_be32(~(u32)0);
3833                 *p++ = cpu_to_be32(~(u32)0);
3834
3835                 /*
3836                  * TODO: ACE's in delegations
3837                  */
3838                 *p++ = cpu_to_be32(NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE);
3839                 *p++ = cpu_to_be32(0);
3840                 *p++ = cpu_to_be32(0);
3841                 *p++ = cpu_to_be32(0);   /* XXX: is NULL principal ok? */
3842                 break;
3843         case NFS4_OPEN_DELEGATE_NONE_EXT: /* 4.1 */
3844                 switch (open->op_why_no_deleg) {
3845                 case WND4_CONTENTION:
3846                 case WND4_RESOURCE:
3847                         p = xdr_reserve_space(xdr, 8);
3848                         if (!p)
3849                                 return nfserr_resource;
3850                         *p++ = cpu_to_be32(open->op_why_no_deleg);
3851                         /* deleg signaling not supported yet: */
3852                         *p++ = cpu_to_be32(0);
3853                         break;
3854                 default:
3855                         p = xdr_reserve_space(xdr, 4);
3856                         if (!p)
3857                                 return nfserr_resource;
3858                         *p++ = cpu_to_be32(open->op_why_no_deleg);
3859                 }
3860                 break;
3861         default:
3862                 BUG();
3863         }
3864         /* XXX save filehandle here */
3865         return 0;
3866 }
3867
3868 static __be32
3869 nfsd4_encode_open_confirm(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_open_confirm *oc)
3870 {
3871         struct xdr_stream *xdr = resp->xdr;
3872
3873         return nfsd4_encode_stateid(xdr, &oc->oc_resp_stateid);
3874 }
3875
3876 static __be32
3877 nfsd4_encode_open_downgrade(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_open_downgrade *od)
3878 {
3879         struct xdr_stream *xdr = resp->xdr;
3880
3881         return nfsd4_encode_stateid(xdr, &od->od_stateid);
3882 }
3883
3884 static __be32 nfsd4_encode_splice_read(
3885                                 struct nfsd4_compoundres *resp,
3886                                 struct nfsd4_read *read,
3887                                 struct file *file, unsigned long maxcount)
3888 {
3889         struct xdr_stream *xdr = resp->xdr;
3890         struct xdr_buf *buf = xdr->buf;
3891         int status, space_left;
3892         __be32 nfserr;
3893
3894         /* Make sure there will be room for padding if needed */
3895         if (xdr->end - xdr->p < 1)
3896                 return nfserr_resource;
3897
3898         nfserr = nfsd_splice_read(read->rd_rqstp, read->rd_fhp,
3899                                   file, read->rd_offset, &maxcount,
3900                                   &read->rd_eof);
3901         read->rd_length = maxcount;
3902         if (nfserr)
3903                 goto out_err;
3904         status = svc_encode_result_payload(read->rd_rqstp,
3905                                            buf->head[0].iov_len, maxcount);
3906         if (status) {
3907                 nfserr = nfserrno(status);
3908                 goto out_err;
3909         }
3910
3911         buf->page_len = maxcount;
3912         buf->len += maxcount;
3913         xdr->page_ptr += (buf->page_base + maxcount + PAGE_SIZE - 1)
3914                                                         / PAGE_SIZE;
3915
3916         /* Use rest of head for padding and remaining ops: */
3917         buf->tail[0].iov_base = xdr->p;
3918         buf->tail[0].iov_len = 0;
3919         xdr->iov = buf->tail;
3920         if (maxcount&3) {
3921                 int pad = 4 - (maxcount&3);
3922
3923                 *(xdr->p++) = 0;
3924
3925                 buf->tail[0].iov_base += maxcount&3;
3926                 buf->tail[0].iov_len = pad;
3927                 buf->len += pad;
3928         }
3929
3930         space_left = min_t(int, (void *)xdr->end - (void *)xdr->p,
3931                                 buf->buflen - buf->len);
3932         buf->buflen = buf->len + space_left;
3933         xdr->end = (__be32 *)((void *)xdr->end + space_left);
3934
3935         return 0;
3936
3937 out_err:
3938         /*
3939          * nfsd_splice_actor may have already messed with the
3940          * page length; reset it so as not to confuse
3941          * xdr_truncate_encode in our caller.
3942          */
3943         buf->page_len = 0;
3944         return nfserr;
3945 }
3946
3947 static __be32 nfsd4_encode_readv(struct nfsd4_compoundres *resp,
3948                                  struct nfsd4_read *read,
3949                                  struct file *file, unsigned long maxcount)
3950 {
3951         struct xdr_stream *xdr = resp->xdr;
3952         unsigned int starting_len = xdr->buf->len;
3953         __be32 zero = xdr_zero;
3954         __be32 nfserr;
3955
3956         read->rd_vlen = xdr_reserve_space_vec(xdr, resp->rqstp->rq_vec, maxcount);
3957         if (read->rd_vlen < 0)
3958                 return nfserr_resource;
3959
3960         nfserr = nfsd_readv(resp->rqstp, read->rd_fhp, file, read->rd_offset,
3961                             resp->rqstp->rq_vec, read->rd_vlen, &maxcount,
3962                             &read->rd_eof);
3963         read->rd_length = maxcount;
3964         if (nfserr)
3965                 return nfserr;
3966         if (svc_encode_result_payload(resp->rqstp, starting_len, maxcount))
3967                 return nfserr_io;
3968         xdr_truncate_encode(xdr, starting_len + xdr_align_size(maxcount));
3969
3970         write_bytes_to_xdr_buf(xdr->buf, starting_len + maxcount, &zero,
3971                                xdr_pad_size(maxcount));
3972         return nfs_ok;
3973 }
3974
3975 static __be32
3976 nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,
3977                   struct nfsd4_read *read)
3978 {
3979         bool splice_ok = test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags);
3980         unsigned long maxcount;
3981         struct xdr_stream *xdr = resp->xdr;
3982         struct file *file;
3983         int starting_len = xdr->buf->len;
3984         __be32 *p;
3985
3986         if (nfserr)
3987                 return nfserr;
3988         file = read->rd_nf->nf_file;
3989
3990         p = xdr_reserve_space(xdr, 8); /* eof flag and byte count */
3991         if (!p) {
3992                 WARN_ON_ONCE(splice_ok);
3993                 return nfserr_resource;
3994         }
3995         if (resp->xdr->buf->page_len && splice_ok) {
3996                 WARN_ON_ONCE(1);
3997                 return nfserr_resource;
3998         }
3999         xdr_commit_encode(xdr);
4000
4001         maxcount = min_t(unsigned long, read->rd_length,
4002                          (xdr->buf->buflen - xdr->buf->len));
4003
4004         if (file->f_op->splice_read && splice_ok)
4005                 nfserr = nfsd4_encode_splice_read(resp, read, file, maxcount);
4006         else
4007                 nfserr = nfsd4_encode_readv(resp, read, file, maxcount);
4008         if (nfserr) {
4009                 xdr_truncate_encode(xdr, starting_len);
4010                 return nfserr;
4011         }
4012
4013         p = xdr_encode_bool(p, read->rd_eof);
4014         *p = cpu_to_be32(read->rd_length);
4015         return nfs_ok;
4016 }
4017
4018 static __be32
4019 nfsd4_encode_readlink(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_readlink *readlink)
4020 {
4021         __be32 *p, *maxcount_p, zero = xdr_zero;
4022         struct xdr_stream *xdr = resp->xdr;
4023         int length_offset = xdr->buf->len;
4024         int maxcount, status;
4025
4026         maxcount_p = xdr_reserve_space(xdr, XDR_UNIT);
4027         if (!maxcount_p)
4028                 return nfserr_resource;
4029         maxcount = PAGE_SIZE;
4030
4031         p = xdr_reserve_space(xdr, maxcount);
4032         if (!p)
4033                 return nfserr_resource;
4034         /*
4035          * XXX: By default, vfs_readlink() will truncate symlinks if they
4036          * would overflow the buffer.  Is this kosher in NFSv4?  If not, one
4037          * easy fix is: if vfs_readlink() precisely fills the buffer, assume
4038          * that truncation occurred, and return NFS4ERR_RESOURCE.
4039          */
4040         nfserr = nfsd_readlink(readlink->rl_rqstp, readlink->rl_fhp,
4041                                                 (char *)p, &maxcount);
4042         if (nfserr == nfserr_isdir)
4043                 nfserr = nfserr_inval;
4044         if (nfserr)
4045                 goto out_err;
4046         status = svc_encode_result_payload(readlink->rl_rqstp, length_offset,
4047                                            maxcount);
4048         if (status) {
4049                 nfserr = nfserrno(status);
4050                 goto out_err;
4051         }
4052         *maxcount_p = cpu_to_be32(maxcount);
4053         xdr_truncate_encode(xdr, length_offset + 4 + xdr_align_size(maxcount));
4054         write_bytes_to_xdr_buf(xdr->buf, length_offset + 4 + maxcount, &zero,
4055                                xdr_pad_size(maxcount));
4056         return nfs_ok;
4057
4058 out_err:
4059         xdr_truncate_encode(xdr, length_offset);
4060         return nfserr;
4061 }
4062
4063 static __be32
4064 nfsd4_encode_readdir(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_readdir *readdir)
4065 {
4066         int maxcount;
4067         int bytes_left;
4068         loff_t offset;
4069         __be64 wire_offset;
4070         struct xdr_stream *xdr = resp->xdr;
4071         int starting_len = xdr->buf->len;
4072         __be32 *p;
4073
4074         p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE);
4075         if (!p)
4076                 return nfserr_resource;
4077
4078         /* XXX: Following NFSv3, we ignore the READDIR verifier for now. */
4079         *p++ = cpu_to_be32(0);
4080         *p++ = cpu_to_be32(0);
4081         xdr->buf->head[0].iov_len = (char *)xdr->p -
4082                                     (char *)xdr->buf->head[0].iov_base;
4083
4084         /*
4085          * Number of bytes left for directory entries allowing for the
4086          * final 8 bytes of the readdir and a following failed op:
4087          */
4088         bytes_left = xdr->buf->buflen - xdr->buf->len
4089                         - COMPOUND_ERR_SLACK_SPACE - 8;
4090         if (bytes_left < 0) {
4091                 nfserr = nfserr_resource;
4092                 goto err_no_verf;
4093         }
4094         maxcount = svc_max_payload(resp->rqstp);
4095         maxcount = min_t(u32, readdir->rd_maxcount, maxcount);
4096         /*
4097          * Note the rfc defines rd_maxcount as the size of the
4098          * READDIR4resok structure, which includes the verifier above
4099          * and the 8 bytes encoded at the end of this function:
4100          */
4101         if (maxcount < 16) {
4102                 nfserr = nfserr_toosmall;
4103                 goto err_no_verf;
4104         }
4105         maxcount = min_t(int, maxcount-16, bytes_left);
4106
4107         /* RFC 3530 14.2.24 allows us to ignore dircount when it's 0: */
4108         if (!readdir->rd_dircount)
4109                 readdir->rd_dircount = svc_max_payload(resp->rqstp);
4110
4111         readdir->xdr = xdr;
4112         readdir->rd_maxcount = maxcount;
4113         readdir->common.err = 0;
4114         readdir->cookie_offset = 0;
4115
4116         offset = readdir->rd_cookie;
4117         nfserr = nfsd_readdir(readdir->rd_rqstp, readdir->rd_fhp,
4118                               &offset,
4119                               &readdir->common, nfsd4_encode_dirent);
4120         if (nfserr == nfs_ok &&
4121             readdir->common.err == nfserr_toosmall &&
4122             xdr->buf->len == starting_len + 8) {
4123                 /* nothing encoded; which limit did we hit?: */
4124                 if (maxcount - 16 < bytes_left)
4125                         /* It was the fault of rd_maxcount: */
4126                         nfserr = nfserr_toosmall;
4127                 else
4128                         /* We ran out of buffer space: */
4129                         nfserr = nfserr_resource;
4130         }
4131         if (nfserr)
4132                 goto err_no_verf;
4133
4134         if (readdir->cookie_offset) {
4135                 wire_offset = cpu_to_be64(offset);
4136                 write_bytes_to_xdr_buf(xdr->buf, readdir->cookie_offset,
4137                                                         &wire_offset, 8);
4138         }
4139
4140         p = xdr_reserve_space(xdr, 8);
4141         if (!p) {
4142                 WARN_ON_ONCE(1);
4143                 goto err_no_verf;
4144         }
4145         *p++ = 0;       /* no more entries */
4146         *p++ = htonl(readdir->common.err == nfserr_eof);
4147
4148         return 0;
4149 err_no_verf:
4150         xdr_truncate_encode(xdr, starting_len);
4151         return nfserr;
4152 }
4153
4154 static __be32
4155 nfsd4_encode_remove(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_remove *remove)
4156 {
4157         struct xdr_stream *xdr = resp->xdr;
4158         __be32 *p;
4159
4160         p = xdr_reserve_space(xdr, 20);
4161         if (!p)
4162                 return nfserr_resource;
4163         p = encode_cinfo(p, &remove->rm_cinfo);
4164         return 0;
4165 }
4166
4167 static __be32
4168 nfsd4_encode_rename(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_rename *rename)
4169 {
4170         struct xdr_stream *xdr = resp->xdr;
4171         __be32 *p;
4172
4173         p = xdr_reserve_space(xdr, 40);
4174         if (!p)
4175                 return nfserr_resource;
4176         p = encode_cinfo(p, &rename->rn_sinfo);
4177         p = encode_cinfo(p, &rename->rn_tinfo);
4178         return 0;
4179 }
4180
4181 static __be32
4182 nfsd4_do_encode_secinfo(struct xdr_stream *xdr, struct svc_export *exp)
4183 {
4184         u32 i, nflavs, supported;
4185         struct exp_flavor_info *flavs;
4186         struct exp_flavor_info def_flavs[2];
4187         __be32 *p, *flavorsp;
4188         static bool report = true;
4189
4190         if (exp->ex_nflavors) {
4191                 flavs = exp->ex_flavors;
4192                 nflavs = exp->ex_nflavors;
4193         } else { /* Handling of some defaults in absence of real secinfo: */
4194                 flavs = def_flavs;
4195                 if (exp->ex_client->flavour->flavour == RPC_AUTH_UNIX) {
4196                         nflavs = 2;
4197                         flavs[0].pseudoflavor = RPC_AUTH_UNIX;
4198                         flavs[1].pseudoflavor = RPC_AUTH_NULL;
4199                 } else if (exp->ex_client->flavour->flavour == RPC_AUTH_GSS) {
4200                         nflavs = 1;
4201                         flavs[0].pseudoflavor
4202                                         = svcauth_gss_flavor(exp->ex_client);
4203                 } else {
4204                         nflavs = 1;
4205                         flavs[0].pseudoflavor
4206                                         = exp->ex_client->flavour->flavour;
4207                 }
4208         }
4209
4210         supported = 0;
4211         p = xdr_reserve_space(xdr, 4);
4212         if (!p)
4213                 return nfserr_resource;
4214         flavorsp = p++;         /* to be backfilled later */
4215
4216         for (i = 0; i < nflavs; i++) {
4217                 rpc_authflavor_t pf = flavs[i].pseudoflavor;
4218                 struct rpcsec_gss_info info;
4219
4220                 if (rpcauth_get_gssinfo(pf, &info) == 0) {
4221                         supported++;
4222                         p = xdr_reserve_space(xdr, 4 + 4 +
4223                                               XDR_LEN(info.oid.len) + 4 + 4);
4224                         if (!p)
4225                                 return nfserr_resource;
4226                         *p++ = cpu_to_be32(RPC_AUTH_GSS);
4227                         p = xdr_encode_opaque(p,  info.oid.data, info.oid.len);
4228                         *p++ = cpu_to_be32(info.qop);
4229                         *p++ = cpu_to_be32(info.service);
4230                 } else if (pf < RPC_AUTH_MAXFLAVOR) {
4231                         supported++;
4232                         p = xdr_reserve_space(xdr, 4);
4233                         if (!p)
4234                                 return nfserr_resource;
4235                         *p++ = cpu_to_be32(pf);
4236                 } else {
4237                         if (report)
4238                                 pr_warn("NFS: SECINFO: security flavor %u "
4239                                         "is not supported\n", pf);
4240                 }
4241         }
4242
4243         if (nflavs != supported)
4244                 report = false;
4245         *flavorsp = htonl(supported);
4246         return 0;
4247 }
4248
4249 static __be32
4250 nfsd4_encode_secinfo(struct nfsd4_compoundres *resp, __be32 nfserr,
4251                      struct nfsd4_secinfo *secinfo)
4252 {
4253         struct xdr_stream *xdr = resp->xdr;
4254
4255         return nfsd4_do_encode_secinfo(xdr, secinfo->si_exp);
4256 }
4257
4258 static __be32
4259 nfsd4_encode_secinfo_no_name(struct nfsd4_compoundres *resp, __be32 nfserr,
4260                      struct nfsd4_secinfo_no_name *secinfo)
4261 {
4262         struct xdr_stream *xdr = resp->xdr;
4263
4264         return nfsd4_do_encode_secinfo(xdr, secinfo->sin_exp);
4265 }
4266
4267 /*
4268  * The SETATTR encode routine is special -- it always encodes a bitmap,
4269  * regardless of the error status.
4270  */
4271 static __be32
4272 nfsd4_encode_setattr(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_setattr *setattr)
4273 {
4274         struct xdr_stream *xdr = resp->xdr;
4275         __be32 *p;
4276
4277         p = xdr_reserve_space(xdr, 16);
4278         if (!p)
4279                 return nfserr_resource;
4280         if (nfserr) {
4281                 *p++ = cpu_to_be32(3);
4282                 *p++ = cpu_to_be32(0);
4283                 *p++ = cpu_to_be32(0);
4284                 *p++ = cpu_to_be32(0);
4285         }
4286         else {
4287                 *p++ = cpu_to_be32(3);
4288                 *p++ = cpu_to_be32(setattr->sa_bmval[0]);
4289                 *p++ = cpu_to_be32(setattr->sa_bmval[1]);
4290                 *p++ = cpu_to_be32(setattr->sa_bmval[2]);
4291         }
4292         return nfserr;
4293 }
4294
4295 static __be32
4296 nfsd4_encode_setclientid(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_setclientid *scd)
4297 {
4298         struct xdr_stream *xdr = resp->xdr;
4299         __be32 *p;
4300
4301         if (!nfserr) {
4302                 p = xdr_reserve_space(xdr, 8 + NFS4_VERIFIER_SIZE);
4303                 if (!p)
4304                         return nfserr_resource;
4305                 p = xdr_encode_opaque_fixed(p, &scd->se_clientid, 8);
4306                 p = xdr_encode_opaque_fixed(p, &scd->se_confirm,
4307                                                 NFS4_VERIFIER_SIZE);
4308         }
4309         else if (nfserr == nfserr_clid_inuse) {
4310                 p = xdr_reserve_space(xdr, 8);
4311                 if (!p)
4312                         return nfserr_resource;
4313                 *p++ = cpu_to_be32(0);
4314                 *p++ = cpu_to_be32(0);
4315         }
4316         return nfserr;
4317 }
4318
4319 static __be32
4320 nfsd4_encode_write(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_write *write)
4321 {
4322         struct xdr_stream *xdr = resp->xdr;
4323         __be32 *p;
4324
4325         p = xdr_reserve_space(xdr, 16);
4326         if (!p)
4327                 return nfserr_resource;
4328         *p++ = cpu_to_be32(write->wr_bytes_written);
4329         *p++ = cpu_to_be32(write->wr_how_written);
4330         p = xdr_encode_opaque_fixed(p, write->wr_verifier.data,
4331                                                 NFS4_VERIFIER_SIZE);
4332         return 0;
4333 }
4334
4335 static __be32
4336 nfsd4_encode_exchange_id(struct nfsd4_compoundres *resp, __be32 nfserr,
4337                          struct nfsd4_exchange_id *exid)
4338 {
4339         struct xdr_stream *xdr = resp->xdr;
4340         __be32 *p;
4341         char *major_id;
4342         char *server_scope;
4343         int major_id_sz;
4344         int server_scope_sz;
4345         uint64_t minor_id = 0;
4346         struct nfsd_net *nn = net_generic(SVC_NET(resp->rqstp), nfsd_net_id);
4347
4348         major_id = nn->nfsd_name;
4349         major_id_sz = strlen(nn->nfsd_name);
4350         server_scope = nn->nfsd_name;
4351         server_scope_sz = strlen(nn->nfsd_name);
4352
4353         p = xdr_reserve_space(xdr,
4354                 8 /* eir_clientid */ +
4355                 4 /* eir_sequenceid */ +
4356                 4 /* eir_flags */ +
4357                 4 /* spr_how */);
4358         if (!p)
4359                 return nfserr_resource;
4360
4361         p = xdr_encode_opaque_fixed(p, &exid->clientid, 8);
4362         *p++ = cpu_to_be32(exid->seqid);
4363         *p++ = cpu_to_be32(exid->flags);
4364
4365         *p++ = cpu_to_be32(exid->spa_how);
4366
4367         switch (exid->spa_how) {
4368         case SP4_NONE:
4369                 break;
4370         case SP4_MACH_CRED:
4371                 /* spo_must_enforce bitmap: */
4372                 nfserr = nfsd4_encode_bitmap(xdr,
4373                                         exid->spo_must_enforce[0],
4374                                         exid->spo_must_enforce[1],
4375                                         exid->spo_must_enforce[2]);
4376                 if (nfserr)
4377                         return nfserr;
4378                 /* spo_must_allow bitmap: */
4379                 nfserr = nfsd4_encode_bitmap(xdr,
4380                                         exid->spo_must_allow[0],
4381                                         exid->spo_must_allow[1],
4382                                         exid->spo_must_allow[2]);
4383                 if (nfserr)
4384                         return nfserr;
4385                 break;
4386         default:
4387                 WARN_ON_ONCE(1);
4388         }
4389
4390         p = xdr_reserve_space(xdr,
4391                 8 /* so_minor_id */ +
4392                 4 /* so_major_id.len */ +
4393                 (XDR_QUADLEN(major_id_sz) * 4) +
4394                 4 /* eir_server_scope.len */ +
4395                 (XDR_QUADLEN(server_scope_sz) * 4) +
4396                 4 /* eir_server_impl_id.count (0) */);
4397         if (!p)
4398                 return nfserr_resource;
4399
4400         /* The server_owner struct */
4401         p = xdr_encode_hyper(p, minor_id);      /* Minor id */
4402         /* major id */
4403         p = xdr_encode_opaque(p, major_id, major_id_sz);
4404
4405         /* Server scope */
4406         p = xdr_encode_opaque(p, server_scope, server_scope_sz);
4407
4408         /* Implementation id */
4409         *p++ = cpu_to_be32(0);  /* zero length nfs_impl_id4 array */
4410         return 0;
4411 }
4412
4413 static __be32
4414 nfsd4_encode_create_session(struct nfsd4_compoundres *resp, __be32 nfserr,
4415                             struct nfsd4_create_session *sess)
4416 {
4417         struct xdr_stream *xdr = resp->xdr;
4418         __be32 *p;
4419
4420         p = xdr_reserve_space(xdr, 24);
4421         if (!p)
4422                 return nfserr_resource;
4423         p = xdr_encode_opaque_fixed(p, sess->sessionid.data,
4424                                         NFS4_MAX_SESSIONID_LEN);
4425         *p++ = cpu_to_be32(sess->seqid);
4426         *p++ = cpu_to_be32(sess->flags);
4427
4428         p = xdr_reserve_space(xdr, 28);
4429         if (!p)
4430                 return nfserr_resource;
4431         *p++ = cpu_to_be32(0); /* headerpadsz */
4432         *p++ = cpu_to_be32(sess->fore_channel.maxreq_sz);
4433         *p++ = cpu_to_be32(sess->fore_channel.maxresp_sz);
4434         *p++ = cpu_to_be32(sess->fore_channel.maxresp_cached);
4435         *p++ = cpu_to_be32(sess->fore_channel.maxops);
4436         *p++ = cpu_to_be32(sess->fore_channel.maxreqs);
4437         *p++ = cpu_to_be32(sess->fore_channel.nr_rdma_attrs);
4438
4439         if (sess->fore_channel.nr_rdma_attrs) {
4440                 p = xdr_reserve_space(xdr, 4);
4441                 if (!p)
4442                         return nfserr_resource;
4443                 *p++ = cpu_to_be32(sess->fore_channel.rdma_attrs);
4444         }
4445
4446         p = xdr_reserve_space(xdr, 28);
4447         if (!p)
4448                 return nfserr_resource;
4449         *p++ = cpu_to_be32(0); /* headerpadsz */
4450         *p++ = cpu_to_be32(sess->back_channel.maxreq_sz);
4451         *p++ = cpu_to_be32(sess->back_channel.maxresp_sz);
4452         *p++ = cpu_to_be32(sess->back_channel.maxresp_cached);
4453         *p++ = cpu_to_be32(sess->back_channel.maxops);
4454         *p++ = cpu_to_be32(sess->back_channel.maxreqs);
4455         *p++ = cpu_to_be32(sess->back_channel.nr_rdma_attrs);
4456
4457         if (sess->back_channel.nr_rdma_attrs) {
4458                 p = xdr_reserve_space(xdr, 4);
4459                 if (!p)
4460                         return nfserr_resource;
4461                 *p++ = cpu_to_be32(sess->back_channel.rdma_attrs);
4462         }
4463         return 0;
4464 }
4465
4466 static __be32
4467 nfsd4_encode_sequence(struct nfsd4_compoundres *resp, __be32 nfserr,
4468                       struct nfsd4_sequence *seq)
4469 {
4470         struct xdr_stream *xdr = resp->xdr;
4471         __be32 *p;
4472
4473         p = xdr_reserve_space(xdr, NFS4_MAX_SESSIONID_LEN + 20);
4474         if (!p)
4475                 return nfserr_resource;
4476         p = xdr_encode_opaque_fixed(p, seq->sessionid.data,
4477                                         NFS4_MAX_SESSIONID_LEN);
4478         *p++ = cpu_to_be32(seq->seqid);
4479         *p++ = cpu_to_be32(seq->slotid);
4480         /* Note slotid's are numbered from zero: */
4481         *p++ = cpu_to_be32(seq->maxslots - 1); /* sr_highest_slotid */
4482         *p++ = cpu_to_be32(seq->maxslots - 1); /* sr_target_highest_slotid */
4483         *p++ = cpu_to_be32(seq->status_flags);
4484
4485         resp->cstate.data_offset = xdr->buf->len; /* DRC cache data pointer */
4486         return 0;
4487 }
4488
4489 static __be32
4490 nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, __be32 nfserr,
4491                           struct nfsd4_test_stateid *test_stateid)
4492 {
4493         struct xdr_stream *xdr = resp->xdr;
4494         struct nfsd4_test_stateid_id *stateid, *next;
4495         __be32 *p;
4496
4497         p = xdr_reserve_space(xdr, 4 + (4 * test_stateid->ts_num_ids));
4498         if (!p)
4499                 return nfserr_resource;
4500         *p++ = htonl(test_stateid->ts_num_ids);
4501
4502         list_for_each_entry_safe(stateid, next, &test_stateid->ts_stateid_list, ts_id_list) {
4503                 *p++ = stateid->ts_id_status;
4504         }
4505
4506         return 0;
4507 }
4508
4509 #ifdef CONFIG_NFSD_PNFS
4510 static __be32
4511 nfsd4_encode_getdeviceinfo(struct nfsd4_compoundres *resp, __be32 nfserr,
4512                 struct nfsd4_getdeviceinfo *gdev)
4513 {
4514         struct xdr_stream *xdr = resp->xdr;
4515         const struct nfsd4_layout_ops *ops;
4516         u32 starting_len = xdr->buf->len, needed_len;
4517         __be32 *p;
4518
4519         p = xdr_reserve_space(xdr, 4);
4520         if (!p)
4521                 return nfserr_resource;
4522
4523         *p++ = cpu_to_be32(gdev->gd_layout_type);
4524
4525         /* If maxcount is 0 then just update notifications */
4526         if (gdev->gd_maxcount != 0) {
4527                 ops = nfsd4_layout_ops[gdev->gd_layout_type];
4528                 nfserr = ops->encode_getdeviceinfo(xdr, gdev);
4529                 if (nfserr) {
4530                         /*
4531                          * We don't bother to burden the layout drivers with
4532                          * enforcing gd_maxcount, just tell the client to
4533                          * come back with a bigger buffer if it's not enough.
4534                          */
4535                         if (xdr->buf->len + 4 > gdev->gd_maxcount)
4536                                 goto toosmall;
4537                         return nfserr;
4538                 }
4539         }
4540
4541         if (gdev->gd_notify_types) {
4542                 p = xdr_reserve_space(xdr, 4 + 4);
4543                 if (!p)
4544                         return nfserr_resource;
4545                 *p++ = cpu_to_be32(1);                  /* bitmap length */
4546                 *p++ = cpu_to_be32(gdev->gd_notify_types);
4547         } else {
4548                 p = xdr_reserve_space(xdr, 4);
4549                 if (!p)
4550                         return nfserr_resource;
4551                 *p++ = 0;
4552         }
4553
4554         return 0;
4555 toosmall:
4556         dprintk("%s: maxcount too small\n", __func__);
4557         needed_len = xdr->buf->len + 4 /* notifications */;
4558         xdr_truncate_encode(xdr, starting_len);
4559         p = xdr_reserve_space(xdr, 4);
4560         if (!p)
4561                 return nfserr_resource;
4562         *p++ = cpu_to_be32(needed_len);
4563         return nfserr_toosmall;
4564 }
4565
4566 static __be32
4567 nfsd4_encode_layoutget(struct nfsd4_compoundres *resp, __be32 nfserr,
4568                 struct nfsd4_layoutget *lgp)
4569 {
4570         struct xdr_stream *xdr = resp->xdr;
4571         const struct nfsd4_layout_ops *ops;
4572         __be32 *p;
4573
4574         p = xdr_reserve_space(xdr, 36 + sizeof(stateid_opaque_t));
4575         if (!p)
4576                 return nfserr_resource;
4577
4578         *p++ = cpu_to_be32(1);  /* we always set return-on-close */
4579         *p++ = cpu_to_be32(lgp->lg_sid.si_generation);
4580         p = xdr_encode_opaque_fixed(p, &lgp->lg_sid.si_opaque,
4581                                     sizeof(stateid_opaque_t));
4582
4583         *p++ = cpu_to_be32(1);  /* we always return a single layout */
4584         p = xdr_encode_hyper(p, lgp->lg_seg.offset);
4585         p = xdr_encode_hyper(p, lgp->lg_seg.length);
4586         *p++ = cpu_to_be32(lgp->lg_seg.iomode);
4587         *p++ = cpu_to_be32(lgp->lg_layout_type);
4588
4589         ops = nfsd4_layout_ops[lgp->lg_layout_type];
4590         return ops->encode_layoutget(xdr, lgp);
4591 }
4592
4593 static __be32
4594 nfsd4_encode_layoutcommit(struct nfsd4_compoundres *resp, __be32 nfserr,
4595                           struct nfsd4_layoutcommit *lcp)
4596 {
4597         struct xdr_stream *xdr = resp->xdr;
4598         __be32 *p;
4599
4600         p = xdr_reserve_space(xdr, 4);
4601         if (!p)
4602                 return nfserr_resource;
4603         *p++ = cpu_to_be32(lcp->lc_size_chg);
4604         if (lcp->lc_size_chg) {
4605                 p = xdr_reserve_space(xdr, 8);
4606                 if (!p)
4607                         return nfserr_resource;
4608                 p = xdr_encode_hyper(p, lcp->lc_newsize);
4609         }
4610
4611         return 0;
4612 }
4613
4614 static __be32
4615 nfsd4_encode_layoutreturn(struct nfsd4_compoundres *resp, __be32 nfserr,
4616                 struct nfsd4_layoutreturn *lrp)
4617 {
4618         struct xdr_stream *xdr = resp->xdr;
4619         __be32 *p;
4620
4621         p = xdr_reserve_space(xdr, 4);
4622         if (!p)
4623                 return nfserr_resource;
4624         *p++ = cpu_to_be32(lrp->lrs_present);
4625         if (lrp->lrs_present)
4626                 return nfsd4_encode_stateid(xdr, &lrp->lr_sid);
4627         return 0;
4628 }
4629 #endif /* CONFIG_NFSD_PNFS */
4630
4631 static __be32
4632 nfsd42_encode_write_res(struct nfsd4_compoundres *resp,
4633                 struct nfsd42_write_res *write, bool sync)
4634 {
4635         __be32 *p;
4636         p = xdr_reserve_space(resp->xdr, 4);
4637         if (!p)
4638                 return nfserr_resource;
4639
4640         if (sync)
4641                 *p++ = cpu_to_be32(0);
4642         else {
4643                 __be32 nfserr;
4644                 *p++ = cpu_to_be32(1);
4645                 nfserr = nfsd4_encode_stateid(resp->xdr, &write->cb_stateid);
4646                 if (nfserr)
4647                         return nfserr;
4648         }
4649         p = xdr_reserve_space(resp->xdr, 8 + 4 + NFS4_VERIFIER_SIZE);
4650         if (!p)
4651                 return nfserr_resource;
4652
4653         p = xdr_encode_hyper(p, write->wr_bytes_written);
4654         *p++ = cpu_to_be32(write->wr_stable_how);
4655         p = xdr_encode_opaque_fixed(p, write->wr_verifier.data,
4656                                     NFS4_VERIFIER_SIZE);
4657         return nfs_ok;
4658 }
4659
4660 static __be32
4661 nfsd42_encode_nl4_server(struct nfsd4_compoundres *resp, struct nl4_server *ns)
4662 {
4663         struct xdr_stream *xdr = resp->xdr;
4664         struct nfs42_netaddr *addr;
4665         __be32 *p;
4666
4667         p = xdr_reserve_space(xdr, 4);
4668         *p++ = cpu_to_be32(ns->nl4_type);
4669
4670         switch (ns->nl4_type) {
4671         case NL4_NETADDR:
4672                 addr = &ns->u.nl4_addr;
4673
4674                 /* netid_len, netid, uaddr_len, uaddr (port included
4675                  * in RPCBIND_MAXUADDRLEN)
4676                  */
4677                 p = xdr_reserve_space(xdr,
4678                         4 /* netid len */ +
4679                         (XDR_QUADLEN(addr->netid_len) * 4) +
4680                         4 /* uaddr len */ +
4681                         (XDR_QUADLEN(addr->addr_len) * 4));
4682                 if (!p)
4683                         return nfserr_resource;
4684
4685                 *p++ = cpu_to_be32(addr->netid_len);
4686                 p = xdr_encode_opaque_fixed(p, addr->netid,
4687                                             addr->netid_len);
4688                 *p++ = cpu_to_be32(addr->addr_len);
4689                 p = xdr_encode_opaque_fixed(p, addr->addr,
4690                                         addr->addr_len);
4691                 break;
4692         default:
4693                 WARN_ON_ONCE(ns->nl4_type != NL4_NETADDR);
4694                 return nfserr_inval;
4695         }
4696
4697         return 0;
4698 }
4699
4700 static __be32
4701 nfsd4_encode_copy(struct nfsd4_compoundres *resp, __be32 nfserr,
4702                   struct nfsd4_copy *copy)
4703 {
4704         __be32 *p;
4705
4706         nfserr = nfsd42_encode_write_res(resp, &copy->cp_res,
4707                                          nfsd4_copy_is_sync(copy));
4708         if (nfserr)
4709                 return nfserr;
4710
4711         p = xdr_reserve_space(resp->xdr, 4 + 4);
4712         *p++ = xdr_one; /* cr_consecutive */
4713         *p = nfsd4_copy_is_sync(copy) ? xdr_one : xdr_zero;
4714         return 0;
4715 }
4716
4717 static __be32
4718 nfsd4_encode_offload_status(struct nfsd4_compoundres *resp, __be32 nfserr,
4719                             struct nfsd4_offload_status *os)
4720 {
4721         struct xdr_stream *xdr = resp->xdr;
4722         __be32 *p;
4723
4724         p = xdr_reserve_space(xdr, 8 + 4);
4725         if (!p)
4726                 return nfserr_resource;
4727         p = xdr_encode_hyper(p, os->count);
4728         *p++ = cpu_to_be32(0);
4729         return nfserr;
4730 }
4731
4732 static __be32
4733 nfsd4_encode_read_plus_data(struct nfsd4_compoundres *resp,
4734                             struct nfsd4_read *read,
4735                             unsigned long *maxcount, u32 *eof,
4736                             loff_t *pos)
4737 {
4738         struct xdr_stream *xdr = resp->xdr;
4739         struct file *file = read->rd_nf->nf_file;
4740         int starting_len = xdr->buf->len;
4741         loff_t hole_pos;
4742         __be32 nfserr;
4743         __be32 *p, tmp;
4744         __be64 tmp64;
4745
4746         hole_pos = pos ? *pos : vfs_llseek(file, read->rd_offset, SEEK_HOLE);
4747         if (hole_pos > read->rd_offset)
4748                 *maxcount = min_t(unsigned long, *maxcount, hole_pos - read->rd_offset);
4749         *maxcount = min_t(unsigned long, *maxcount, (xdr->buf->buflen - xdr->buf->len));
4750
4751         /* Content type, offset, byte count */
4752         p = xdr_reserve_space(xdr, 4 + 8 + 4);
4753         if (!p)
4754                 return nfserr_resource;
4755
4756         read->rd_vlen = xdr_reserve_space_vec(xdr, resp->rqstp->rq_vec, *maxcount);
4757         if (read->rd_vlen < 0)
4758                 return nfserr_resource;
4759
4760         nfserr = nfsd_readv(resp->rqstp, read->rd_fhp, file, read->rd_offset,
4761                             resp->rqstp->rq_vec, read->rd_vlen, maxcount, eof);
4762         if (nfserr)
4763                 return nfserr;
4764         xdr_truncate_encode(xdr, starting_len + 16 + xdr_align_size(*maxcount));
4765
4766         tmp = htonl(NFS4_CONTENT_DATA);
4767         write_bytes_to_xdr_buf(xdr->buf, starting_len,      &tmp,   4);
4768         tmp64 = cpu_to_be64(read->rd_offset);
4769         write_bytes_to_xdr_buf(xdr->buf, starting_len + 4,  &tmp64, 8);
4770         tmp = htonl(*maxcount);
4771         write_bytes_to_xdr_buf(xdr->buf, starting_len + 12, &tmp,   4);
4772
4773         tmp = xdr_zero;
4774         write_bytes_to_xdr_buf(xdr->buf, starting_len + 16 + *maxcount, &tmp,
4775                                xdr_pad_size(*maxcount));
4776         return nfs_ok;
4777 }
4778
4779 static __be32
4780 nfsd4_encode_read_plus_hole(struct nfsd4_compoundres *resp,
4781                             struct nfsd4_read *read,
4782                             unsigned long *maxcount, u32 *eof)
4783 {
4784         struct file *file = read->rd_nf->nf_file;
4785         loff_t data_pos = vfs_llseek(file, read->rd_offset, SEEK_DATA);
4786         loff_t f_size = i_size_read(file_inode(file));
4787         unsigned long count;
4788         __be32 *p;
4789
4790         if (data_pos == -ENXIO)
4791                 data_pos = f_size;
4792         else if (data_pos <= read->rd_offset || (data_pos < f_size && data_pos % PAGE_SIZE))
4793                 return nfsd4_encode_read_plus_data(resp, read, maxcount, eof, &f_size);
4794         count = data_pos - read->rd_offset;
4795
4796         /* Content type, offset, byte count */
4797         p = xdr_reserve_space(resp->xdr, 4 + 8 + 8);
4798         if (!p)
4799                 return nfserr_resource;
4800
4801         *p++ = htonl(NFS4_CONTENT_HOLE);
4802         p = xdr_encode_hyper(p, read->rd_offset);
4803         p = xdr_encode_hyper(p, count);
4804
4805         *eof = (read->rd_offset + count) >= f_size;
4806         *maxcount = min_t(unsigned long, count, *maxcount);
4807         return nfs_ok;
4808 }
4809
4810 static __be32
4811 nfsd4_encode_read_plus(struct nfsd4_compoundres *resp, __be32 nfserr,
4812                        struct nfsd4_read *read)
4813 {
4814         unsigned long maxcount, count;
4815         struct xdr_stream *xdr = resp->xdr;
4816         struct file *file;
4817         int starting_len = xdr->buf->len;
4818         int last_segment = xdr->buf->len;
4819         int segments = 0;
4820         __be32 *p, tmp;
4821         bool is_data;
4822         loff_t pos;
4823         u32 eof;
4824
4825         if (nfserr)
4826                 return nfserr;
4827         file = read->rd_nf->nf_file;
4828
4829         /* eof flag, segment count */
4830         p = xdr_reserve_space(xdr, 4 + 4);
4831         if (!p)
4832                 return nfserr_resource;
4833         xdr_commit_encode(xdr);
4834
4835         maxcount = min_t(unsigned long, read->rd_length,
4836                          (xdr->buf->buflen - xdr->buf->len));
4837         count    = maxcount;
4838
4839         eof = read->rd_offset >= i_size_read(file_inode(file));
4840         if (eof)
4841                 goto out;
4842
4843         pos = vfs_llseek(file, read->rd_offset, SEEK_HOLE);
4844         is_data = pos > read->rd_offset;
4845
4846         while (count > 0 && !eof) {
4847                 maxcount = count;
4848                 if (is_data)
4849                         nfserr = nfsd4_encode_read_plus_data(resp, read, &maxcount, &eof,
4850                                                 segments == 0 ? &pos : NULL);
4851                 else
4852                         nfserr = nfsd4_encode_read_plus_hole(resp, read, &maxcount, &eof);
4853                 if (nfserr)
4854                         goto out;
4855                 count -= maxcount;
4856                 read->rd_offset += maxcount;
4857                 is_data = !is_data;
4858                 last_segment = xdr->buf->len;
4859                 segments++;
4860         }
4861
4862 out:
4863         if (nfserr && segments == 0)
4864                 xdr_truncate_encode(xdr, starting_len);
4865         else {
4866                 if (nfserr) {
4867                         xdr_truncate_encode(xdr, last_segment);
4868                         nfserr = nfs_ok;
4869                         eof = 0;
4870                 }
4871                 tmp = htonl(eof);
4872                 write_bytes_to_xdr_buf(xdr->buf, starting_len,     &tmp, 4);
4873                 tmp = htonl(segments);
4874                 write_bytes_to_xdr_buf(xdr->buf, starting_len + 4, &tmp, 4);
4875         }
4876
4877         return nfserr;
4878 }
4879
4880 static __be32
4881 nfsd4_encode_copy_notify(struct nfsd4_compoundres *resp, __be32 nfserr,
4882                          struct nfsd4_copy_notify *cn)
4883 {
4884         struct xdr_stream *xdr = resp->xdr;
4885         __be32 *p;
4886
4887         if (nfserr)
4888                 return nfserr;
4889
4890         /* 8 sec, 4 nsec */
4891         p = xdr_reserve_space(xdr, 12);
4892         if (!p)
4893                 return nfserr_resource;
4894
4895         /* cnr_lease_time */
4896         p = xdr_encode_hyper(p, cn->cpn_sec);
4897         *p++ = cpu_to_be32(cn->cpn_nsec);
4898
4899         /* cnr_stateid */
4900         nfserr = nfsd4_encode_stateid(xdr, &cn->cpn_cnr_stateid);
4901         if (nfserr)
4902                 return nfserr;
4903
4904         /* cnr_src.nl_nsvr */
4905         p = xdr_reserve_space(xdr, 4);
4906         if (!p)
4907                 return nfserr_resource;
4908
4909         *p++ = cpu_to_be32(1);
4910
4911         nfserr = nfsd42_encode_nl4_server(resp, cn->cpn_src);
4912         return nfserr;
4913 }
4914
4915 static __be32
4916 nfsd4_encode_seek(struct nfsd4_compoundres *resp, __be32 nfserr,
4917                   struct nfsd4_seek *seek)
4918 {
4919         __be32 *p;
4920
4921         p = xdr_reserve_space(resp->xdr, 4 + 8);
4922         *p++ = cpu_to_be32(seek->seek_eof);
4923         p = xdr_encode_hyper(p, seek->seek_pos);
4924
4925         return 0;
4926 }
4927
4928 static __be32
4929 nfsd4_encode_noop(struct nfsd4_compoundres *resp, __be32 nfserr, void *p)
4930 {
4931         return nfserr;
4932 }
4933
4934 /*
4935  * Encode kmalloc-ed buffer in to XDR stream.
4936  */
4937 static __be32
4938 nfsd4_vbuf_to_stream(struct xdr_stream *xdr, char *buf, u32 buflen)
4939 {
4940         u32 cplen;
4941         __be32 *p;
4942
4943         cplen = min_t(unsigned long, buflen,
4944                       ((void *)xdr->end - (void *)xdr->p));
4945         p = xdr_reserve_space(xdr, cplen);
4946         if (!p)
4947                 return nfserr_resource;
4948
4949         memcpy(p, buf, cplen);
4950         buf += cplen;
4951         buflen -= cplen;
4952
4953         while (buflen) {
4954                 cplen = min_t(u32, buflen, PAGE_SIZE);
4955                 p = xdr_reserve_space(xdr, cplen);
4956                 if (!p)
4957                         return nfserr_resource;
4958
4959                 memcpy(p, buf, cplen);
4960
4961                 if (cplen < PAGE_SIZE) {
4962                         /*
4963                          * We're done, with a length that wasn't page
4964                          * aligned, so possibly not word aligned. Pad
4965                          * any trailing bytes with 0.
4966                          */
4967                         xdr_encode_opaque_fixed(p, NULL, cplen);
4968                         break;
4969                 }
4970
4971                 buflen -= PAGE_SIZE;
4972                 buf += PAGE_SIZE;
4973         }
4974
4975         return 0;
4976 }
4977
4978 static __be32
4979 nfsd4_encode_getxattr(struct nfsd4_compoundres *resp, __be32 nfserr,
4980                       struct nfsd4_getxattr *getxattr)
4981 {
4982         struct xdr_stream *xdr = resp->xdr;
4983         __be32 *p, err;
4984
4985         p = xdr_reserve_space(xdr, 4);
4986         if (!p)
4987                 return nfserr_resource;
4988
4989         *p = cpu_to_be32(getxattr->getxa_len);
4990
4991         if (getxattr->getxa_len == 0)
4992                 return 0;
4993
4994         err = nfsd4_vbuf_to_stream(xdr, getxattr->getxa_buf,
4995                                     getxattr->getxa_len);
4996
4997         kvfree(getxattr->getxa_buf);
4998
4999         return err;
5000 }
5001
5002 static __be32
5003 nfsd4_encode_setxattr(struct nfsd4_compoundres *resp, __be32 nfserr,
5004                       struct nfsd4_setxattr *setxattr)
5005 {
5006         struct xdr_stream *xdr = resp->xdr;
5007         __be32 *p;
5008
5009         p = xdr_reserve_space(xdr, 20);
5010         if (!p)
5011                 return nfserr_resource;
5012
5013         encode_cinfo(p, &setxattr->setxa_cinfo);
5014
5015         return 0;
5016 }
5017
5018 /*
5019  * See if there are cookie values that can be rejected outright.
5020  */
5021 static __be32
5022 nfsd4_listxattr_validate_cookie(struct nfsd4_listxattrs *listxattrs,
5023                                 u32 *offsetp)
5024 {
5025         u64 cookie = listxattrs->lsxa_cookie;
5026
5027         /*
5028          * If the cookie is larger than the maximum number we can fit
5029          * in either the buffer we just got back from vfs_listxattr, or,
5030          * XDR-encoded, in the return buffer, it's invalid.
5031          */
5032         if (cookie > (listxattrs->lsxa_len) / (XATTR_USER_PREFIX_LEN + 2))
5033                 return nfserr_badcookie;
5034
5035         if (cookie > (listxattrs->lsxa_maxcount /
5036                       (XDR_QUADLEN(XATTR_USER_PREFIX_LEN + 2) + 4)))
5037                 return nfserr_badcookie;
5038
5039         *offsetp = (u32)cookie;
5040         return 0;
5041 }
5042
5043 static __be32
5044 nfsd4_encode_listxattrs(struct nfsd4_compoundres *resp, __be32 nfserr,
5045                         struct nfsd4_listxattrs *listxattrs)
5046 {
5047         struct xdr_stream *xdr = resp->xdr;
5048         u32 cookie_offset, count_offset, eof;
5049         u32 left, xdrleft, slen, count;
5050         u32 xdrlen, offset;
5051         u64 cookie;
5052         char *sp;
5053         __be32 status, tmp;
5054         __be32 *p;
5055         u32 nuser;
5056
5057         eof = 1;
5058
5059         status = nfsd4_listxattr_validate_cookie(listxattrs, &offset);
5060         if (status)
5061                 goto out;
5062
5063         /*
5064          * Reserve space for the cookie and the name array count. Record
5065          * the offsets to save them later.
5066          */
5067         cookie_offset = xdr->buf->len;
5068         count_offset = cookie_offset + 8;
5069         p = xdr_reserve_space(xdr, 12);
5070         if (!p) {
5071                 status = nfserr_resource;
5072                 goto out;
5073         }
5074
5075         count = 0;
5076         left = listxattrs->lsxa_len;
5077         sp = listxattrs->lsxa_buf;
5078         nuser = 0;
5079
5080         xdrleft = listxattrs->lsxa_maxcount;
5081
5082         while (left > 0 && xdrleft > 0) {
5083                 slen = strlen(sp);
5084
5085                 /*
5086                  * Check if this is a "user." attribute, skip it if not.
5087                  */
5088                 if (strncmp(sp, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN))
5089                         goto contloop;
5090
5091                 slen -= XATTR_USER_PREFIX_LEN;
5092                 xdrlen = 4 + ((slen + 3) & ~3);
5093                 if (xdrlen > xdrleft) {
5094                         if (count == 0) {
5095                                 /*
5096                                  * Can't even fit the first attribute name.
5097                                  */
5098                                 status = nfserr_toosmall;
5099                                 goto out;
5100                         }
5101                         eof = 0;
5102                         goto wreof;
5103                 }
5104
5105                 left -= XATTR_USER_PREFIX_LEN;
5106                 sp += XATTR_USER_PREFIX_LEN;
5107                 if (nuser++ < offset)
5108                         goto contloop;
5109
5110
5111                 p = xdr_reserve_space(xdr, xdrlen);
5112                 if (!p) {
5113                         status = nfserr_resource;
5114                         goto out;
5115                 }
5116
5117                 xdr_encode_opaque(p, sp, slen);
5118
5119                 xdrleft -= xdrlen;
5120                 count++;
5121 contloop:
5122                 sp += slen + 1;
5123                 left -= slen + 1;
5124         }
5125
5126         /*
5127          * If there were user attributes to copy, but we didn't copy
5128          * any, the offset was too large (e.g. the cookie was invalid).
5129          */
5130         if (nuser > 0 && count == 0) {
5131                 status = nfserr_badcookie;
5132                 goto out;
5133         }
5134
5135 wreof:
5136         p = xdr_reserve_space(xdr, 4);
5137         if (!p) {
5138                 status = nfserr_resource;
5139                 goto out;
5140         }
5141         *p = cpu_to_be32(eof);
5142
5143         cookie = offset + count;
5144
5145         write_bytes_to_xdr_buf(xdr->buf, cookie_offset, &cookie, 8);
5146         tmp = cpu_to_be32(count);
5147         write_bytes_to_xdr_buf(xdr->buf, count_offset, &tmp, 4);
5148 out:
5149         if (listxattrs->lsxa_len)
5150                 kvfree(listxattrs->lsxa_buf);
5151         return status;
5152 }
5153
5154 static __be32
5155 nfsd4_encode_removexattr(struct nfsd4_compoundres *resp, __be32 nfserr,
5156                          struct nfsd4_removexattr *removexattr)
5157 {
5158         struct xdr_stream *xdr = resp->xdr;
5159         __be32 *p;
5160
5161         p = xdr_reserve_space(xdr, 20);
5162         if (!p)
5163                 return nfserr_resource;
5164
5165         p = encode_cinfo(p, &removexattr->rmxa_cinfo);
5166         return 0;
5167 }
5168
5169 typedef __be32(* nfsd4_enc)(struct nfsd4_compoundres *, __be32, void *);
5170
5171 /*
5172  * Note: nfsd4_enc_ops vector is shared for v4.0 and v4.1
5173  * since we don't need to filter out obsolete ops as this is
5174  * done in the decoding phase.
5175  */
5176 static const nfsd4_enc nfsd4_enc_ops[] = {
5177         [OP_ACCESS]             = (nfsd4_enc)nfsd4_encode_access,
5178         [OP_CLOSE]              = (nfsd4_enc)nfsd4_encode_close,
5179         [OP_COMMIT]             = (nfsd4_enc)nfsd4_encode_commit,
5180         [OP_CREATE]             = (nfsd4_enc)nfsd4_encode_create,
5181         [OP_DELEGPURGE]         = (nfsd4_enc)nfsd4_encode_noop,
5182         [OP_DELEGRETURN]        = (nfsd4_enc)nfsd4_encode_noop,
5183         [OP_GETATTR]            = (nfsd4_enc)nfsd4_encode_getattr,
5184         [OP_GETFH]              = (nfsd4_enc)nfsd4_encode_getfh,
5185         [OP_LINK]               = (nfsd4_enc)nfsd4_encode_link,
5186         [OP_LOCK]               = (nfsd4_enc)nfsd4_encode_lock,
5187         [OP_LOCKT]              = (nfsd4_enc)nfsd4_encode_lockt,
5188         [OP_LOCKU]              = (nfsd4_enc)nfsd4_encode_locku,
5189         [OP_LOOKUP]             = (nfsd4_enc)nfsd4_encode_noop,
5190         [OP_LOOKUPP]            = (nfsd4_enc)nfsd4_encode_noop,
5191         [OP_NVERIFY]            = (nfsd4_enc)nfsd4_encode_noop,
5192         [OP_OPEN]               = (nfsd4_enc)nfsd4_encode_open,
5193         [OP_OPENATTR]           = (nfsd4_enc)nfsd4_encode_noop,
5194         [OP_OPEN_CONFIRM]       = (nfsd4_enc)nfsd4_encode_open_confirm,
5195         [OP_OPEN_DOWNGRADE]     = (nfsd4_enc)nfsd4_encode_open_downgrade,
5196         [OP_PUTFH]              = (nfsd4_enc)nfsd4_encode_noop,
5197         [OP_PUTPUBFH]           = (nfsd4_enc)nfsd4_encode_noop,
5198         [OP_PUTROOTFH]          = (nfsd4_enc)nfsd4_encode_noop,
5199         [OP_READ]               = (nfsd4_enc)nfsd4_encode_read,
5200         [OP_READDIR]            = (nfsd4_enc)nfsd4_encode_readdir,
5201         [OP_READLINK]           = (nfsd4_enc)nfsd4_encode_readlink,
5202         [OP_REMOVE]             = (nfsd4_enc)nfsd4_encode_remove,
5203         [OP_RENAME]             = (nfsd4_enc)nfsd4_encode_rename,
5204         [OP_RENEW]              = (nfsd4_enc)nfsd4_encode_noop,
5205         [OP_RESTOREFH]          = (nfsd4_enc)nfsd4_encode_noop,
5206         [OP_SAVEFH]             = (nfsd4_enc)nfsd4_encode_noop,
5207         [OP_SECINFO]            = (nfsd4_enc)nfsd4_encode_secinfo,
5208         [OP_SETATTR]            = (nfsd4_enc)nfsd4_encode_setattr,
5209         [OP_SETCLIENTID]        = (nfsd4_enc)nfsd4_encode_setclientid,
5210         [OP_SETCLIENTID_CONFIRM] = (nfsd4_enc)nfsd4_encode_noop,
5211         [OP_VERIFY]             = (nfsd4_enc)nfsd4_encode_noop,
5212         [OP_WRITE]              = (nfsd4_enc)nfsd4_encode_write,
5213         [OP_RELEASE_LOCKOWNER]  = (nfsd4_enc)nfsd4_encode_noop,
5214
5215         /* NFSv4.1 operations */
5216         [OP_BACKCHANNEL_CTL]    = (nfsd4_enc)nfsd4_encode_noop,
5217         [OP_BIND_CONN_TO_SESSION] = (nfsd4_enc)nfsd4_encode_bind_conn_to_session,
5218         [OP_EXCHANGE_ID]        = (nfsd4_enc)nfsd4_encode_exchange_id,
5219         [OP_CREATE_SESSION]     = (nfsd4_enc)nfsd4_encode_create_session,
5220         [OP_DESTROY_SESSION]    = (nfsd4_enc)nfsd4_encode_noop,
5221         [OP_FREE_STATEID]       = (nfsd4_enc)nfsd4_encode_noop,
5222         [OP_GET_DIR_DELEGATION] = (nfsd4_enc)nfsd4_encode_noop,
5223 #ifdef CONFIG_NFSD_PNFS
5224         [OP_GETDEVICEINFO]      = (nfsd4_enc)nfsd4_encode_getdeviceinfo,
5225         [OP_GETDEVICELIST]      = (nfsd4_enc)nfsd4_encode_noop,
5226         [OP_LAYOUTCOMMIT]       = (nfsd4_enc)nfsd4_encode_layoutcommit,
5227         [OP_LAYOUTGET]          = (nfsd4_enc)nfsd4_encode_layoutget,
5228         [OP_LAYOUTRETURN]       = (nfsd4_enc)nfsd4_encode_layoutreturn,
5229 #else
5230         [OP_GETDEVICEINFO]      = (nfsd4_enc)nfsd4_encode_noop,
5231         [OP_GETDEVICELIST]      = (nfsd4_enc)nfsd4_encode_noop,
5232         [OP_LAYOUTCOMMIT]       = (nfsd4_enc)nfsd4_encode_noop,
5233         [OP_LAYOUTGET]          = (nfsd4_enc)nfsd4_encode_noop,
5234         [OP_LAYOUTRETURN]       = (nfsd4_enc)nfsd4_encode_noop,
5235 #endif
5236         [OP_SECINFO_NO_NAME]    = (nfsd4_enc)nfsd4_encode_secinfo_no_name,
5237         [OP_SEQUENCE]           = (nfsd4_enc)nfsd4_encode_sequence,
5238         [OP_SET_SSV]            = (nfsd4_enc)nfsd4_encode_noop,
5239         [OP_TEST_STATEID]       = (nfsd4_enc)nfsd4_encode_test_stateid,
5240         [OP_WANT_DELEGATION]    = (nfsd4_enc)nfsd4_encode_noop,
5241         [OP_DESTROY_CLIENTID]   = (nfsd4_enc)nfsd4_encode_noop,
5242         [OP_RECLAIM_COMPLETE]   = (nfsd4_enc)nfsd4_encode_noop,
5243
5244         /* NFSv4.2 operations */
5245         [OP_ALLOCATE]           = (nfsd4_enc)nfsd4_encode_noop,
5246         [OP_COPY]               = (nfsd4_enc)nfsd4_encode_copy,
5247         [OP_COPY_NOTIFY]        = (nfsd4_enc)nfsd4_encode_copy_notify,
5248         [OP_DEALLOCATE]         = (nfsd4_enc)nfsd4_encode_noop,
5249         [OP_IO_ADVISE]          = (nfsd4_enc)nfsd4_encode_noop,
5250         [OP_LAYOUTERROR]        = (nfsd4_enc)nfsd4_encode_noop,
5251         [OP_LAYOUTSTATS]        = (nfsd4_enc)nfsd4_encode_noop,
5252         [OP_OFFLOAD_CANCEL]     = (nfsd4_enc)nfsd4_encode_noop,
5253         [OP_OFFLOAD_STATUS]     = (nfsd4_enc)nfsd4_encode_offload_status,
5254         [OP_READ_PLUS]          = (nfsd4_enc)nfsd4_encode_read_plus,
5255         [OP_SEEK]               = (nfsd4_enc)nfsd4_encode_seek,
5256         [OP_WRITE_SAME]         = (nfsd4_enc)nfsd4_encode_noop,
5257         [OP_CLONE]              = (nfsd4_enc)nfsd4_encode_noop,
5258
5259         /* RFC 8276 extended atributes operations */
5260         [OP_GETXATTR]           = (nfsd4_enc)nfsd4_encode_getxattr,
5261         [OP_SETXATTR]           = (nfsd4_enc)nfsd4_encode_setxattr,
5262         [OP_LISTXATTRS]         = (nfsd4_enc)nfsd4_encode_listxattrs,
5263         [OP_REMOVEXATTR]        = (nfsd4_enc)nfsd4_encode_removexattr,
5264 };
5265
5266 /*
5267  * Calculate whether we still have space to encode repsize bytes.
5268  * There are two considerations:
5269  *     - For NFS versions >=4.1, the size of the reply must stay within
5270  *       session limits
5271  *     - For all NFS versions, we must stay within limited preallocated
5272  *       buffer space.
5273  *
5274  * This is called before the operation is processed, so can only provide
5275  * an upper estimate.  For some nonidempotent operations (such as
5276  * getattr), it's not necessarily a problem if that estimate is wrong,
5277  * as we can fail it after processing without significant side effects.
5278  */
5279 __be32 nfsd4_check_resp_size(struct nfsd4_compoundres *resp, u32 respsize)
5280 {
5281         struct xdr_buf *buf = &resp->rqstp->rq_res;
5282         struct nfsd4_slot *slot = resp->cstate.slot;
5283
5284         if (buf->len + respsize <= buf->buflen)
5285                 return nfs_ok;
5286         if (!nfsd4_has_session(&resp->cstate))
5287                 return nfserr_resource;
5288         if (slot->sl_flags & NFSD4_SLOT_CACHETHIS) {
5289                 WARN_ON_ONCE(1);
5290                 return nfserr_rep_too_big_to_cache;
5291         }
5292         return nfserr_rep_too_big;
5293 }
5294
5295 void
5296 nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op)
5297 {
5298         struct xdr_stream *xdr = resp->xdr;
5299         struct nfs4_stateowner *so = resp->cstate.replay_owner;
5300         struct svc_rqst *rqstp = resp->rqstp;
5301         const struct nfsd4_operation *opdesc = op->opdesc;
5302         int post_err_offset;
5303         nfsd4_enc encoder;
5304         __be32 *p;
5305
5306         p = xdr_reserve_space(xdr, 8);
5307         if (!p) {
5308                 WARN_ON_ONCE(1);
5309                 return;
5310         }
5311         *p++ = cpu_to_be32(op->opnum);
5312         post_err_offset = xdr->buf->len;
5313
5314         if (op->opnum == OP_ILLEGAL)
5315                 goto status;
5316         if (op->status && opdesc &&
5317                         !(opdesc->op_flags & OP_NONTRIVIAL_ERROR_ENCODE))
5318                 goto status;
5319         BUG_ON(op->opnum >= ARRAY_SIZE(nfsd4_enc_ops) ||
5320                !nfsd4_enc_ops[op->opnum]);
5321         encoder = nfsd4_enc_ops[op->opnum];
5322         op->status = encoder(resp, op->status, &op->u);
5323         if (op->status)
5324                 trace_nfsd_compound_encode_err(rqstp, op->opnum, op->status);
5325         if (opdesc && opdesc->op_release)
5326                 opdesc->op_release(&op->u);
5327         xdr_commit_encode(xdr);
5328
5329         /* nfsd4_check_resp_size guarantees enough room for error status */
5330         if (!op->status) {
5331                 int space_needed = 0;
5332                 if (!nfsd4_last_compound_op(rqstp))
5333                         space_needed = COMPOUND_ERR_SLACK_SPACE;
5334                 op->status = nfsd4_check_resp_size(resp, space_needed);
5335         }
5336         if (op->status == nfserr_resource && nfsd4_has_session(&resp->cstate)) {
5337                 struct nfsd4_slot *slot = resp->cstate.slot;
5338
5339                 if (slot->sl_flags & NFSD4_SLOT_CACHETHIS)
5340                         op->status = nfserr_rep_too_big_to_cache;
5341                 else
5342                         op->status = nfserr_rep_too_big;
5343         }
5344         if (op->status == nfserr_resource ||
5345             op->status == nfserr_rep_too_big ||
5346             op->status == nfserr_rep_too_big_to_cache) {
5347                 /*
5348                  * The operation may have already been encoded or
5349                  * partially encoded.  No op returns anything additional
5350                  * in the case of one of these three errors, so we can
5351                  * just truncate back to after the status.  But it's a
5352                  * bug if we had to do this on a non-idempotent op:
5353                  */
5354                 warn_on_nonidempotent_op(op);
5355                 xdr_truncate_encode(xdr, post_err_offset);
5356         }
5357         if (so) {
5358                 int len = xdr->buf->len - post_err_offset;
5359
5360                 so->so_replay.rp_status = op->status;
5361                 so->so_replay.rp_buflen = len;
5362                 read_bytes_from_xdr_buf(xdr->buf, post_err_offset,
5363                                                 so->so_replay.rp_buf, len);
5364         }
5365 status:
5366         *p = op->status;
5367 }
5368
5369 /* 
5370  * Encode the reply stored in the stateowner reply cache 
5371  * 
5372  * XDR note: do not encode rp->rp_buflen: the buffer contains the
5373  * previously sent already encoded operation.
5374  */
5375 void
5376 nfsd4_encode_replay(struct xdr_stream *xdr, struct nfsd4_op *op)
5377 {
5378         __be32 *p;
5379         struct nfs4_replay *rp = op->replay;
5380
5381         p = xdr_reserve_space(xdr, 8 + rp->rp_buflen);
5382         if (!p) {
5383                 WARN_ON_ONCE(1);
5384                 return;
5385         }
5386         *p++ = cpu_to_be32(op->opnum);
5387         *p++ = rp->rp_status;  /* already xdr'ed */
5388
5389         p = xdr_encode_opaque_fixed(p, rp->rp_buf, rp->rp_buflen);
5390 }
5391
5392 void nfsd4_release_compoundargs(struct svc_rqst *rqstp)
5393 {
5394         struct nfsd4_compoundargs *args = rqstp->rq_argp;
5395
5396         if (args->ops != args->iops) {
5397                 kfree(args->ops);
5398                 args->ops = args->iops;
5399         }
5400         while (args->to_free) {
5401                 struct svcxdr_tmpbuf *tb = args->to_free;
5402                 args->to_free = tb->next;
5403                 kfree(tb);
5404         }
5405 }
5406
5407 bool
5408 nfs4svc_decode_compoundargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
5409 {
5410         struct nfsd4_compoundargs *args = rqstp->rq_argp;
5411
5412         /* svcxdr_tmp_alloc */
5413         args->to_free = NULL;
5414
5415         args->xdr = xdr;
5416         args->ops = args->iops;
5417         args->rqstp = rqstp;
5418
5419         return nfsd4_decode_compound(args);
5420 }
5421
5422 bool
5423 nfs4svc_encode_compoundres(struct svc_rqst *rqstp, struct xdr_stream *xdr)
5424 {
5425         struct nfsd4_compoundres *resp = rqstp->rq_resp;
5426         struct xdr_buf *buf = xdr->buf;
5427         __be32 *p;
5428
5429         WARN_ON_ONCE(buf->len != buf->head[0].iov_len + buf->page_len +
5430                                  buf->tail[0].iov_len);
5431
5432         /*
5433          * Send buffer space for the following items is reserved
5434          * at the top of nfsd4_proc_compound().
5435          */
5436         p = resp->statusp;
5437
5438         *p++ = resp->cstate.status;
5439
5440         rqstp->rq_next_page = xdr->page_ptr + 1;
5441
5442         *p++ = htonl(resp->taglen);
5443         memcpy(p, resp->tag, resp->taglen);
5444         p += XDR_QUADLEN(resp->taglen);
5445         *p++ = htonl(resp->opcnt);
5446
5447         nfsd4_sequence_done(resp);
5448         return true;
5449 }