nfsd4: kill READ32
[firefly-linux-kernel-4.4.55.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  * TODO: Neil Brown made the following observation:  We currently
36  * initially reserve NFSD_BUFSIZE space on the transmit queue and
37  * never release any of that until the request is complete.
38  * It would be good to calculate a new maximum response size while
39  * decoding the COMPOUND, and call svc_reserve with this number
40  * at the end of nfs4svc_decode_compoundargs.
41  */
42
43 #include <linux/slab.h>
44 #include <linux/namei.h>
45 #include <linux/statfs.h>
46 #include <linux/utsname.h>
47 #include <linux/pagemap.h>
48 #include <linux/sunrpc/svcauth_gss.h>
49
50 #include "idmap.h"
51 #include "acl.h"
52 #include "xdr4.h"
53 #include "vfs.h"
54 #include "state.h"
55 #include "cache.h"
56 #include "netns.h"
57
58 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
59 #include <linux/security.h>
60 #endif
61
62
63 #define NFSDDBG_FACILITY                NFSDDBG_XDR
64
65 /*
66  * As per referral draft, the fsid for a referral MUST be different from the fsid of the containing
67  * directory in order to indicate to the client that a filesystem boundary is present
68  * We use a fixed fsid for a referral
69  */
70 #define NFS4_REFERRAL_FSID_MAJOR        0x8000000ULL
71 #define NFS4_REFERRAL_FSID_MINOR        0x8000000ULL
72
73 static __be32
74 check_filename(char *str, int len)
75 {
76         int i;
77
78         if (len == 0)
79                 return nfserr_inval;
80         if (isdotent(str, len))
81                 return nfserr_badname;
82         for (i = 0; i < len; i++)
83                 if (str[i] == '/')
84                         return nfserr_badname;
85         return 0;
86 }
87
88 #define DECODE_HEAD                             \
89         __be32 *p;                              \
90         __be32 status
91 #define DECODE_TAIL                             \
92         status = 0;                             \
93 out:                                            \
94         return status;                          \
95 xdr_error:                                      \
96         dprintk("NFSD: xdr error (%s:%d)\n",    \
97                         __FILE__, __LINE__);    \
98         status = nfserr_bad_xdr;                \
99         goto out
100
101 #define READ64(x)         do {                  \
102         (x) = (u64)ntohl(*p++) << 32;           \
103         (x) |= ntohl(*p++);                     \
104 } while (0)
105 #define READMEM(x,nbytes) do {                  \
106         x = (char *)p;                          \
107         p += XDR_QUADLEN(nbytes);               \
108 } while (0)
109 #define SAVEMEM(x,nbytes) do {                  \
110         if (!(x = (p==argp->tmp || p == argp->tmpp) ? \
111                 savemem(argp, p, nbytes) :      \
112                 (char *)p)) {                   \
113                 dprintk("NFSD: xdr error (%s:%d)\n", \
114                                 __FILE__, __LINE__); \
115                 goto xdr_error;                 \
116                 }                               \
117         p += XDR_QUADLEN(nbytes);               \
118 } while (0)
119 #define COPYMEM(x,nbytes) do {                  \
120         memcpy((x), p, nbytes);                 \
121         p += XDR_QUADLEN(nbytes);               \
122 } while (0)
123
124 /* READ_BUF, read_buf(): nbytes must be <= PAGE_SIZE */
125 #define READ_BUF(nbytes)  do {                  \
126         if (nbytes <= (u32)((char *)argp->end - (char *)argp->p)) {     \
127                 p = argp->p;                    \
128                 argp->p += XDR_QUADLEN(nbytes); \
129         } else if (!(p = read_buf(argp, nbytes))) { \
130                 dprintk("NFSD: xdr error (%s:%d)\n", \
131                                 __FILE__, __LINE__); \
132                 goto xdr_error;                 \
133         }                                       \
134 } while (0)
135
136 static void next_decode_page(struct nfsd4_compoundargs *argp)
137 {
138         argp->p = page_address(argp->pagelist[0]);
139         argp->pagelist++;
140         if (argp->pagelen < PAGE_SIZE) {
141                 argp->end = argp->p + (argp->pagelen>>2);
142                 argp->pagelen = 0;
143         } else {
144                 argp->end = argp->p + (PAGE_SIZE>>2);
145                 argp->pagelen -= PAGE_SIZE;
146         }
147 }
148
149 static __be32 *read_buf(struct nfsd4_compoundargs *argp, u32 nbytes)
150 {
151         /* We want more bytes than seem to be available.
152          * Maybe we need a new page, maybe we have just run out
153          */
154         unsigned int avail = (char *)argp->end - (char *)argp->p;
155         __be32 *p;
156         if (avail + argp->pagelen < nbytes)
157                 return NULL;
158         if (avail + PAGE_SIZE < nbytes) /* need more than a page !! */
159                 return NULL;
160         /* ok, we can do it with the current plus the next page */
161         if (nbytes <= sizeof(argp->tmp))
162                 p = argp->tmp;
163         else {
164                 kfree(argp->tmpp);
165                 p = argp->tmpp = kmalloc(nbytes, GFP_KERNEL);
166                 if (!p)
167                         return NULL;
168                 
169         }
170         /*
171          * The following memcpy is safe because read_buf is always
172          * called with nbytes > avail, and the two cases above both
173          * guarantee p points to at least nbytes bytes.
174          */
175         memcpy(p, argp->p, avail);
176         next_decode_page(argp);
177         memcpy(((char*)p)+avail, argp->p, (nbytes - avail));
178         argp->p += XDR_QUADLEN(nbytes - avail);
179         return p;
180 }
181
182 static int zero_clientid(clientid_t *clid)
183 {
184         return (clid->cl_boot == 0) && (clid->cl_id == 0);
185 }
186
187 /**
188  * defer_free - mark an allocation as deferred freed
189  * @argp: NFSv4 compound argument structure to be freed with
190  * @release: release callback to free @p, typically kfree()
191  * @p: pointer to be freed
192  *
193  * Marks @p to be freed when processing the compound operation
194  * described in @argp finishes.
195  */
196 static int
197 defer_free(struct nfsd4_compoundargs *argp,
198                 void (*release)(const void *), void *p)
199 {
200         struct tmpbuf *tb;
201
202         tb = kmalloc(sizeof(*tb), GFP_KERNEL);
203         if (!tb)
204                 return -ENOMEM;
205         tb->buf = p;
206         tb->release = release;
207         tb->next = argp->to_free;
208         argp->to_free = tb;
209         return 0;
210 }
211
212 /**
213  * savemem - duplicate a chunk of memory for later processing
214  * @argp: NFSv4 compound argument structure to be freed with
215  * @p: pointer to be duplicated
216  * @nbytes: length to be duplicated
217  *
218  * Returns a pointer to a copy of @nbytes bytes of memory at @p
219  * that are preserved until processing of the NFSv4 compound
220  * operation described by @argp finishes.
221  */
222 static char *savemem(struct nfsd4_compoundargs *argp, __be32 *p, int nbytes)
223 {
224         if (p == argp->tmp) {
225                 p = kmemdup(argp->tmp, nbytes, GFP_KERNEL);
226                 if (!p)
227                         return NULL;
228         } else {
229                 BUG_ON(p != argp->tmpp);
230                 argp->tmpp = NULL;
231         }
232         if (defer_free(argp, kfree, p)) {
233                 kfree(p);
234                 return NULL;
235         } else
236                 return (char *)p;
237 }
238
239 static __be32
240 nfsd4_decode_bitmap(struct nfsd4_compoundargs *argp, u32 *bmval)
241 {
242         u32 bmlen;
243         DECODE_HEAD;
244
245         bmval[0] = 0;
246         bmval[1] = 0;
247         bmval[2] = 0;
248
249         READ_BUF(4);
250         bmlen = be32_to_cpup(p++);
251         if (bmlen > 1000)
252                 goto xdr_error;
253
254         READ_BUF(bmlen << 2);
255         if (bmlen > 0)
256                 bmval[0] = be32_to_cpup(p++);
257         if (bmlen > 1)
258                 bmval[1] = be32_to_cpup(p++);
259         if (bmlen > 2)
260                 bmval[2] = be32_to_cpup(p++);
261
262         DECODE_TAIL;
263 }
264
265 static __be32
266 nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
267                    struct iattr *iattr, struct nfs4_acl **acl,
268                    struct xdr_netobj *label)
269 {
270         int expected_len, len = 0;
271         u32 dummy32;
272         char *buf;
273
274         DECODE_HEAD;
275         iattr->ia_valid = 0;
276         if ((status = nfsd4_decode_bitmap(argp, bmval)))
277                 return status;
278
279         READ_BUF(4);
280         expected_len = be32_to_cpup(p++);
281
282         if (bmval[0] & FATTR4_WORD0_SIZE) {
283                 READ_BUF(8);
284                 len += 8;
285                 READ64(iattr->ia_size);
286                 iattr->ia_valid |= ATTR_SIZE;
287         }
288         if (bmval[0] & FATTR4_WORD0_ACL) {
289                 u32 nace;
290                 struct nfs4_ace *ace;
291
292                 READ_BUF(4); len += 4;
293                 nace = be32_to_cpup(p++);
294
295                 if (nace > NFS4_ACL_MAX)
296                         return nfserr_fbig;
297
298                 *acl = nfs4_acl_new(nace);
299                 if (*acl == NULL)
300                         return nfserr_jukebox;
301
302                 defer_free(argp, kfree, *acl);
303
304                 (*acl)->naces = nace;
305                 for (ace = (*acl)->aces; ace < (*acl)->aces + nace; ace++) {
306                         READ_BUF(16); len += 16;
307                         ace->type = be32_to_cpup(p++);
308                         ace->flag = be32_to_cpup(p++);
309                         ace->access_mask = be32_to_cpup(p++);
310                         dummy32 = be32_to_cpup(p++);
311                         READ_BUF(dummy32);
312                         len += XDR_QUADLEN(dummy32) << 2;
313                         READMEM(buf, dummy32);
314                         ace->whotype = nfs4_acl_get_whotype(buf, dummy32);
315                         status = nfs_ok;
316                         if (ace->whotype != NFS4_ACL_WHO_NAMED)
317                                 ;
318                         else if (ace->flag & NFS4_ACE_IDENTIFIER_GROUP)
319                                 status = nfsd_map_name_to_gid(argp->rqstp,
320                                                 buf, dummy32, &ace->who_gid);
321                         else
322                                 status = nfsd_map_name_to_uid(argp->rqstp,
323                                                 buf, dummy32, &ace->who_uid);
324                         if (status)
325                                 return status;
326                 }
327         } else
328                 *acl = NULL;
329         if (bmval[1] & FATTR4_WORD1_MODE) {
330                 READ_BUF(4);
331                 len += 4;
332                 iattr->ia_mode = be32_to_cpup(p++);
333                 iattr->ia_mode &= (S_IFMT | S_IALLUGO);
334                 iattr->ia_valid |= ATTR_MODE;
335         }
336         if (bmval[1] & FATTR4_WORD1_OWNER) {
337                 READ_BUF(4);
338                 len += 4;
339                 dummy32 = be32_to_cpup(p++);
340                 READ_BUF(dummy32);
341                 len += (XDR_QUADLEN(dummy32) << 2);
342                 READMEM(buf, dummy32);
343                 if ((status = nfsd_map_name_to_uid(argp->rqstp, buf, dummy32, &iattr->ia_uid)))
344                         return status;
345                 iattr->ia_valid |= ATTR_UID;
346         }
347         if (bmval[1] & FATTR4_WORD1_OWNER_GROUP) {
348                 READ_BUF(4);
349                 len += 4;
350                 dummy32 = be32_to_cpup(p++);
351                 READ_BUF(dummy32);
352                 len += (XDR_QUADLEN(dummy32) << 2);
353                 READMEM(buf, dummy32);
354                 if ((status = nfsd_map_name_to_gid(argp->rqstp, buf, dummy32, &iattr->ia_gid)))
355                         return status;
356                 iattr->ia_valid |= ATTR_GID;
357         }
358         if (bmval[1] & FATTR4_WORD1_TIME_ACCESS_SET) {
359                 READ_BUF(4);
360                 len += 4;
361                 dummy32 = be32_to_cpup(p++);
362                 switch (dummy32) {
363                 case NFS4_SET_TO_CLIENT_TIME:
364                         /* We require the high 32 bits of 'seconds' to be 0, and we ignore
365                            all 32 bits of 'nseconds'. */
366                         READ_BUF(12);
367                         len += 12;
368                         READ64(iattr->ia_atime.tv_sec);
369                         iattr->ia_atime.tv_nsec = be32_to_cpup(p++);
370                         if (iattr->ia_atime.tv_nsec >= (u32)1000000000)
371                                 return nfserr_inval;
372                         iattr->ia_valid |= (ATTR_ATIME | ATTR_ATIME_SET);
373                         break;
374                 case NFS4_SET_TO_SERVER_TIME:
375                         iattr->ia_valid |= ATTR_ATIME;
376                         break;
377                 default:
378                         goto xdr_error;
379                 }
380         }
381         if (bmval[1] & FATTR4_WORD1_TIME_MODIFY_SET) {
382                 READ_BUF(4);
383                 len += 4;
384                 dummy32 = be32_to_cpup(p++);
385                 switch (dummy32) {
386                 case NFS4_SET_TO_CLIENT_TIME:
387                         /* We require the high 32 bits of 'seconds' to be 0, and we ignore
388                            all 32 bits of 'nseconds'. */
389                         READ_BUF(12);
390                         len += 12;
391                         READ64(iattr->ia_mtime.tv_sec);
392                         iattr->ia_mtime.tv_nsec = be32_to_cpup(p++);
393                         if (iattr->ia_mtime.tv_nsec >= (u32)1000000000)
394                                 return nfserr_inval;
395                         iattr->ia_valid |= (ATTR_MTIME | ATTR_MTIME_SET);
396                         break;
397                 case NFS4_SET_TO_SERVER_TIME:
398                         iattr->ia_valid |= ATTR_MTIME;
399                         break;
400                 default:
401                         goto xdr_error;
402                 }
403         }
404
405         label->len = 0;
406 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
407         if (bmval[2] & FATTR4_WORD2_SECURITY_LABEL) {
408                 READ_BUF(4);
409                 len += 4;
410                 dummy32 = be32_to_cpup(p++); /* lfs: we don't use it */
411                 READ_BUF(4);
412                 len += 4;
413                 dummy32 = be32_to_cpup(p++); /* pi: we don't use it either */
414                 READ_BUF(4);
415                 len += 4;
416                 dummy32 = be32_to_cpup(p++);
417                 READ_BUF(dummy32);
418                 if (dummy32 > NFSD4_MAX_SEC_LABEL_LEN)
419                         return nfserr_badlabel;
420                 len += (XDR_QUADLEN(dummy32) << 2);
421                 READMEM(buf, dummy32);
422                 label->data = kzalloc(dummy32 + 1, GFP_KERNEL);
423                 if (!label->data)
424                         return nfserr_jukebox;
425                 label->len = dummy32;
426                 defer_free(argp, kfree, label->data);
427                 memcpy(label->data, buf, dummy32);
428         }
429 #endif
430
431         if (bmval[0] & ~NFSD_WRITEABLE_ATTRS_WORD0
432             || bmval[1] & ~NFSD_WRITEABLE_ATTRS_WORD1
433             || bmval[2] & ~NFSD_WRITEABLE_ATTRS_WORD2)
434                 READ_BUF(expected_len - len);
435         else if (len != expected_len)
436                 goto xdr_error;
437
438         DECODE_TAIL;
439 }
440
441 static __be32
442 nfsd4_decode_stateid(struct nfsd4_compoundargs *argp, stateid_t *sid)
443 {
444         DECODE_HEAD;
445
446         READ_BUF(sizeof(stateid_t));
447         sid->si_generation = be32_to_cpup(p++);
448         COPYMEM(&sid->si_opaque, sizeof(stateid_opaque_t));
449
450         DECODE_TAIL;
451 }
452
453 static __be32
454 nfsd4_decode_access(struct nfsd4_compoundargs *argp, struct nfsd4_access *access)
455 {
456         DECODE_HEAD;
457
458         READ_BUF(4);
459         access->ac_req_access = be32_to_cpup(p++);
460
461         DECODE_TAIL;
462 }
463
464 static __be32 nfsd4_decode_cb_sec(struct nfsd4_compoundargs *argp, struct nfsd4_cb_sec *cbs)
465 {
466         DECODE_HEAD;
467         u32 dummy, uid, gid;
468         char *machine_name;
469         int i;
470         int nr_secflavs;
471
472         /* callback_sec_params4 */
473         READ_BUF(4);
474         nr_secflavs = be32_to_cpup(p++);
475         if (nr_secflavs)
476                 cbs->flavor = (u32)(-1);
477         else
478                 /* Is this legal? Be generous, take it to mean AUTH_NONE: */
479                 cbs->flavor = 0;
480         for (i = 0; i < nr_secflavs; ++i) {
481                 READ_BUF(4);
482                 dummy = be32_to_cpup(p++);
483                 switch (dummy) {
484                 case RPC_AUTH_NULL:
485                         /* Nothing to read */
486                         if (cbs->flavor == (u32)(-1))
487                                 cbs->flavor = RPC_AUTH_NULL;
488                         break;
489                 case RPC_AUTH_UNIX:
490                         READ_BUF(8);
491                         /* stamp */
492                         dummy = be32_to_cpup(p++);
493
494                         /* machine name */
495                         dummy = be32_to_cpup(p++);
496                         READ_BUF(dummy);
497                         SAVEMEM(machine_name, dummy);
498
499                         /* uid, gid */
500                         READ_BUF(8);
501                         uid = be32_to_cpup(p++);
502                         gid = be32_to_cpup(p++);
503
504                         /* more gids */
505                         READ_BUF(4);
506                         dummy = be32_to_cpup(p++);
507                         READ_BUF(dummy * 4);
508                         if (cbs->flavor == (u32)(-1)) {
509                                 kuid_t kuid = make_kuid(&init_user_ns, uid);
510                                 kgid_t kgid = make_kgid(&init_user_ns, gid);
511                                 if (uid_valid(kuid) && gid_valid(kgid)) {
512                                         cbs->uid = kuid;
513                                         cbs->gid = kgid;
514                                         cbs->flavor = RPC_AUTH_UNIX;
515                                 } else {
516                                         dprintk("RPC_AUTH_UNIX with invalid"
517                                                 "uid or gid ignoring!\n");
518                                 }
519                         }
520                         break;
521                 case RPC_AUTH_GSS:
522                         dprintk("RPC_AUTH_GSS callback secflavor "
523                                 "not supported!\n");
524                         READ_BUF(8);
525                         /* gcbp_service */
526                         dummy = be32_to_cpup(p++);
527                         /* gcbp_handle_from_server */
528                         dummy = be32_to_cpup(p++);
529                         READ_BUF(dummy);
530                         p += XDR_QUADLEN(dummy);
531                         /* gcbp_handle_from_client */
532                         READ_BUF(4);
533                         dummy = be32_to_cpup(p++);
534                         READ_BUF(dummy);
535                         break;
536                 default:
537                         dprintk("Illegal callback secflavor\n");
538                         return nfserr_inval;
539                 }
540         }
541         DECODE_TAIL;
542 }
543
544 static __be32 nfsd4_decode_backchannel_ctl(struct nfsd4_compoundargs *argp, struct nfsd4_backchannel_ctl *bc)
545 {
546         DECODE_HEAD;
547
548         READ_BUF(4);
549         bc->bc_cb_program = be32_to_cpup(p++);
550         nfsd4_decode_cb_sec(argp, &bc->bc_cb_sec);
551
552         DECODE_TAIL;
553 }
554
555 static __be32 nfsd4_decode_bind_conn_to_session(struct nfsd4_compoundargs *argp, struct nfsd4_bind_conn_to_session *bcts)
556 {
557         DECODE_HEAD;
558
559         READ_BUF(NFS4_MAX_SESSIONID_LEN + 8);
560         COPYMEM(bcts->sessionid.data, NFS4_MAX_SESSIONID_LEN);
561         bcts->dir = be32_to_cpup(p++);
562         /* XXX: skipping ctsa_use_conn_in_rdma_mode.  Perhaps Tom Tucker
563          * could help us figure out we should be using it. */
564         DECODE_TAIL;
565 }
566
567 static __be32
568 nfsd4_decode_close(struct nfsd4_compoundargs *argp, struct nfsd4_close *close)
569 {
570         DECODE_HEAD;
571
572         READ_BUF(4);
573         close->cl_seqid = be32_to_cpup(p++);
574         return nfsd4_decode_stateid(argp, &close->cl_stateid);
575
576         DECODE_TAIL;
577 }
578
579
580 static __be32
581 nfsd4_decode_commit(struct nfsd4_compoundargs *argp, struct nfsd4_commit *commit)
582 {
583         DECODE_HEAD;
584
585         READ_BUF(12);
586         READ64(commit->co_offset);
587         commit->co_count = be32_to_cpup(p++);
588
589         DECODE_TAIL;
590 }
591
592 static __be32
593 nfsd4_decode_create(struct nfsd4_compoundargs *argp, struct nfsd4_create *create)
594 {
595         DECODE_HEAD;
596
597         READ_BUF(4);
598         create->cr_type = be32_to_cpup(p++);
599         switch (create->cr_type) {
600         case NF4LNK:
601                 READ_BUF(4);
602                 create->cr_linklen = be32_to_cpup(p++);
603                 READ_BUF(create->cr_linklen);
604                 SAVEMEM(create->cr_linkname, create->cr_linklen);
605                 break;
606         case NF4BLK:
607         case NF4CHR:
608                 READ_BUF(8);
609                 create->cr_specdata1 = be32_to_cpup(p++);
610                 create->cr_specdata2 = be32_to_cpup(p++);
611                 break;
612         case NF4SOCK:
613         case NF4FIFO:
614         case NF4DIR:
615         default:
616                 break;
617         }
618
619         READ_BUF(4);
620         create->cr_namelen = be32_to_cpup(p++);
621         READ_BUF(create->cr_namelen);
622         SAVEMEM(create->cr_name, create->cr_namelen);
623         if ((status = check_filename(create->cr_name, create->cr_namelen)))
624                 return status;
625
626         status = nfsd4_decode_fattr(argp, create->cr_bmval, &create->cr_iattr,
627                                     &create->cr_acl, &create->cr_label);
628         if (status)
629                 goto out;
630
631         DECODE_TAIL;
632 }
633
634 static inline __be32
635 nfsd4_decode_delegreturn(struct nfsd4_compoundargs *argp, struct nfsd4_delegreturn *dr)
636 {
637         return nfsd4_decode_stateid(argp, &dr->dr_stateid);
638 }
639
640 static inline __be32
641 nfsd4_decode_getattr(struct nfsd4_compoundargs *argp, struct nfsd4_getattr *getattr)
642 {
643         return nfsd4_decode_bitmap(argp, getattr->ga_bmval);
644 }
645
646 static __be32
647 nfsd4_decode_link(struct nfsd4_compoundargs *argp, struct nfsd4_link *link)
648 {
649         DECODE_HEAD;
650
651         READ_BUF(4);
652         link->li_namelen = be32_to_cpup(p++);
653         READ_BUF(link->li_namelen);
654         SAVEMEM(link->li_name, link->li_namelen);
655         if ((status = check_filename(link->li_name, link->li_namelen)))
656                 return status;
657
658         DECODE_TAIL;
659 }
660
661 static __be32
662 nfsd4_decode_lock(struct nfsd4_compoundargs *argp, struct nfsd4_lock *lock)
663 {
664         DECODE_HEAD;
665
666         /*
667         * type, reclaim(boolean), offset, length, new_lock_owner(boolean)
668         */
669         READ_BUF(28);
670         lock->lk_type = be32_to_cpup(p++);
671         if ((lock->lk_type < NFS4_READ_LT) || (lock->lk_type > NFS4_WRITEW_LT))
672                 goto xdr_error;
673         lock->lk_reclaim = be32_to_cpup(p++);
674         READ64(lock->lk_offset);
675         READ64(lock->lk_length);
676         lock->lk_is_new = be32_to_cpup(p++);
677
678         if (lock->lk_is_new) {
679                 READ_BUF(4);
680                 lock->lk_new_open_seqid = be32_to_cpup(p++);
681                 status = nfsd4_decode_stateid(argp, &lock->lk_new_open_stateid);
682                 if (status)
683                         return status;
684                 READ_BUF(8 + sizeof(clientid_t));
685                 lock->lk_new_lock_seqid = be32_to_cpup(p++);
686                 COPYMEM(&lock->lk_new_clientid, sizeof(clientid_t));
687                 lock->lk_new_owner.len = be32_to_cpup(p++);
688                 READ_BUF(lock->lk_new_owner.len);
689                 READMEM(lock->lk_new_owner.data, lock->lk_new_owner.len);
690         } else {
691                 status = nfsd4_decode_stateid(argp, &lock->lk_old_lock_stateid);
692                 if (status)
693                         return status;
694                 READ_BUF(4);
695                 lock->lk_old_lock_seqid = be32_to_cpup(p++);
696         }
697
698         DECODE_TAIL;
699 }
700
701 static __be32
702 nfsd4_decode_lockt(struct nfsd4_compoundargs *argp, struct nfsd4_lockt *lockt)
703 {
704         DECODE_HEAD;
705                         
706         READ_BUF(32);
707         lockt->lt_type = be32_to_cpup(p++);
708         if((lockt->lt_type < NFS4_READ_LT) || (lockt->lt_type > NFS4_WRITEW_LT))
709                 goto xdr_error;
710         READ64(lockt->lt_offset);
711         READ64(lockt->lt_length);
712         COPYMEM(&lockt->lt_clientid, 8);
713         lockt->lt_owner.len = be32_to_cpup(p++);
714         READ_BUF(lockt->lt_owner.len);
715         READMEM(lockt->lt_owner.data, lockt->lt_owner.len);
716
717         DECODE_TAIL;
718 }
719
720 static __be32
721 nfsd4_decode_locku(struct nfsd4_compoundargs *argp, struct nfsd4_locku *locku)
722 {
723         DECODE_HEAD;
724
725         READ_BUF(8);
726         locku->lu_type = be32_to_cpup(p++);
727         if ((locku->lu_type < NFS4_READ_LT) || (locku->lu_type > NFS4_WRITEW_LT))
728                 goto xdr_error;
729         locku->lu_seqid = be32_to_cpup(p++);
730         status = nfsd4_decode_stateid(argp, &locku->lu_stateid);
731         if (status)
732                 return status;
733         READ_BUF(16);
734         READ64(locku->lu_offset);
735         READ64(locku->lu_length);
736
737         DECODE_TAIL;
738 }
739
740 static __be32
741 nfsd4_decode_lookup(struct nfsd4_compoundargs *argp, struct nfsd4_lookup *lookup)
742 {
743         DECODE_HEAD;
744
745         READ_BUF(4);
746         lookup->lo_len = be32_to_cpup(p++);
747         READ_BUF(lookup->lo_len);
748         SAVEMEM(lookup->lo_name, lookup->lo_len);
749         if ((status = check_filename(lookup->lo_name, lookup->lo_len)))
750                 return status;
751
752         DECODE_TAIL;
753 }
754
755 static __be32 nfsd4_decode_share_access(struct nfsd4_compoundargs *argp, u32 *share_access, u32 *deleg_want, u32 *deleg_when)
756 {
757         __be32 *p;
758         u32 w;
759
760         READ_BUF(4);
761         w = be32_to_cpup(p++);
762         *share_access = w & NFS4_SHARE_ACCESS_MASK;
763         *deleg_want = w & NFS4_SHARE_WANT_MASK;
764         if (deleg_when)
765                 *deleg_when = w & NFS4_SHARE_WHEN_MASK;
766
767         switch (w & NFS4_SHARE_ACCESS_MASK) {
768         case NFS4_SHARE_ACCESS_READ:
769         case NFS4_SHARE_ACCESS_WRITE:
770         case NFS4_SHARE_ACCESS_BOTH:
771                 break;
772         default:
773                 return nfserr_bad_xdr;
774         }
775         w &= ~NFS4_SHARE_ACCESS_MASK;
776         if (!w)
777                 return nfs_ok;
778         if (!argp->minorversion)
779                 return nfserr_bad_xdr;
780         switch (w & NFS4_SHARE_WANT_MASK) {
781         case NFS4_SHARE_WANT_NO_PREFERENCE:
782         case NFS4_SHARE_WANT_READ_DELEG:
783         case NFS4_SHARE_WANT_WRITE_DELEG:
784         case NFS4_SHARE_WANT_ANY_DELEG:
785         case NFS4_SHARE_WANT_NO_DELEG:
786         case NFS4_SHARE_WANT_CANCEL:
787                 break;
788         default:
789                 return nfserr_bad_xdr;
790         }
791         w &= ~NFS4_SHARE_WANT_MASK;
792         if (!w)
793                 return nfs_ok;
794
795         if (!deleg_when)        /* open_downgrade */
796                 return nfserr_inval;
797         switch (w) {
798         case NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL:
799         case NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED:
800         case (NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL |
801               NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED):
802                 return nfs_ok;
803         }
804 xdr_error:
805         return nfserr_bad_xdr;
806 }
807
808 static __be32 nfsd4_decode_share_deny(struct nfsd4_compoundargs *argp, u32 *x)
809 {
810         __be32 *p;
811
812         READ_BUF(4);
813         *x = be32_to_cpup(p++);
814         /* Note: unlinke access bits, deny bits may be zero. */
815         if (*x & ~NFS4_SHARE_DENY_BOTH)
816                 return nfserr_bad_xdr;
817         return nfs_ok;
818 xdr_error:
819         return nfserr_bad_xdr;
820 }
821
822 static __be32 nfsd4_decode_opaque(struct nfsd4_compoundargs *argp, struct xdr_netobj *o)
823 {
824         __be32 *p;
825
826         READ_BUF(4);
827         o->len = be32_to_cpup(p++);
828
829         if (o->len == 0 || o->len > NFS4_OPAQUE_LIMIT)
830                 return nfserr_bad_xdr;
831
832         READ_BUF(o->len);
833         SAVEMEM(o->data, o->len);
834         return nfs_ok;
835 xdr_error:
836         return nfserr_bad_xdr;
837 }
838
839 static __be32
840 nfsd4_decode_open(struct nfsd4_compoundargs *argp, struct nfsd4_open *open)
841 {
842         DECODE_HEAD;
843         u32 dummy;
844
845         memset(open->op_bmval, 0, sizeof(open->op_bmval));
846         open->op_iattr.ia_valid = 0;
847         open->op_openowner = NULL;
848
849         open->op_xdr_error = 0;
850         /* seqid, share_access, share_deny, clientid, ownerlen */
851         READ_BUF(4);
852         open->op_seqid = be32_to_cpup(p++);
853         /* decode, yet ignore deleg_when until supported */
854         status = nfsd4_decode_share_access(argp, &open->op_share_access,
855                                            &open->op_deleg_want, &dummy);
856         if (status)
857                 goto xdr_error;
858         status = nfsd4_decode_share_deny(argp, &open->op_share_deny);
859         if (status)
860                 goto xdr_error;
861         READ_BUF(sizeof(clientid_t));
862         COPYMEM(&open->op_clientid, sizeof(clientid_t));
863         status = nfsd4_decode_opaque(argp, &open->op_owner);
864         if (status)
865                 goto xdr_error;
866         READ_BUF(4);
867         open->op_create = be32_to_cpup(p++);
868         switch (open->op_create) {
869         case NFS4_OPEN_NOCREATE:
870                 break;
871         case NFS4_OPEN_CREATE:
872                 READ_BUF(4);
873                 open->op_createmode = be32_to_cpup(p++);
874                 switch (open->op_createmode) {
875                 case NFS4_CREATE_UNCHECKED:
876                 case NFS4_CREATE_GUARDED:
877                         status = nfsd4_decode_fattr(argp, open->op_bmval,
878                                 &open->op_iattr, &open->op_acl, &open->op_label);
879                         if (status)
880                                 goto out;
881                         break;
882                 case NFS4_CREATE_EXCLUSIVE:
883                         READ_BUF(NFS4_VERIFIER_SIZE);
884                         COPYMEM(open->op_verf.data, NFS4_VERIFIER_SIZE);
885                         break;
886                 case NFS4_CREATE_EXCLUSIVE4_1:
887                         if (argp->minorversion < 1)
888                                 goto xdr_error;
889                         READ_BUF(NFS4_VERIFIER_SIZE);
890                         COPYMEM(open->op_verf.data, NFS4_VERIFIER_SIZE);
891                         status = nfsd4_decode_fattr(argp, open->op_bmval,
892                                 &open->op_iattr, &open->op_acl, &open->op_label);
893                         if (status)
894                                 goto out;
895                         break;
896                 default:
897                         goto xdr_error;
898                 }
899                 break;
900         default:
901                 goto xdr_error;
902         }
903
904         /* open_claim */
905         READ_BUF(4);
906         open->op_claim_type = be32_to_cpup(p++);
907         switch (open->op_claim_type) {
908         case NFS4_OPEN_CLAIM_NULL:
909         case NFS4_OPEN_CLAIM_DELEGATE_PREV:
910                 READ_BUF(4);
911                 open->op_fname.len = be32_to_cpup(p++);
912                 READ_BUF(open->op_fname.len);
913                 SAVEMEM(open->op_fname.data, open->op_fname.len);
914                 if ((status = check_filename(open->op_fname.data, open->op_fname.len)))
915                         return status;
916                 break;
917         case NFS4_OPEN_CLAIM_PREVIOUS:
918                 READ_BUF(4);
919                 open->op_delegate_type = be32_to_cpup(p++);
920                 break;
921         case NFS4_OPEN_CLAIM_DELEGATE_CUR:
922                 status = nfsd4_decode_stateid(argp, &open->op_delegate_stateid);
923                 if (status)
924                         return status;
925                 READ_BUF(4);
926                 open->op_fname.len = be32_to_cpup(p++);
927                 READ_BUF(open->op_fname.len);
928                 SAVEMEM(open->op_fname.data, open->op_fname.len);
929                 if ((status = check_filename(open->op_fname.data, open->op_fname.len)))
930                         return status;
931                 break;
932         case NFS4_OPEN_CLAIM_FH:
933         case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
934                 if (argp->minorversion < 1)
935                         goto xdr_error;
936                 /* void */
937                 break;
938         case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
939                 if (argp->minorversion < 1)
940                         goto xdr_error;
941                 status = nfsd4_decode_stateid(argp, &open->op_delegate_stateid);
942                 if (status)
943                         return status;
944                 break;
945         default:
946                 goto xdr_error;
947         }
948
949         DECODE_TAIL;
950 }
951
952 static __be32
953 nfsd4_decode_open_confirm(struct nfsd4_compoundargs *argp, struct nfsd4_open_confirm *open_conf)
954 {
955         DECODE_HEAD;
956
957         if (argp->minorversion >= 1)
958                 return nfserr_notsupp;
959
960         status = nfsd4_decode_stateid(argp, &open_conf->oc_req_stateid);
961         if (status)
962                 return status;
963         READ_BUF(4);
964         open_conf->oc_seqid = be32_to_cpup(p++);
965
966         DECODE_TAIL;
967 }
968
969 static __be32
970 nfsd4_decode_open_downgrade(struct nfsd4_compoundargs *argp, struct nfsd4_open_downgrade *open_down)
971 {
972         DECODE_HEAD;
973                     
974         status = nfsd4_decode_stateid(argp, &open_down->od_stateid);
975         if (status)
976                 return status;
977         READ_BUF(4);
978         open_down->od_seqid = be32_to_cpup(p++);
979         status = nfsd4_decode_share_access(argp, &open_down->od_share_access,
980                                            &open_down->od_deleg_want, NULL);
981         if (status)
982                 return status;
983         status = nfsd4_decode_share_deny(argp, &open_down->od_share_deny);
984         if (status)
985                 return status;
986         DECODE_TAIL;
987 }
988
989 static __be32
990 nfsd4_decode_putfh(struct nfsd4_compoundargs *argp, struct nfsd4_putfh *putfh)
991 {
992         DECODE_HEAD;
993
994         READ_BUF(4);
995         putfh->pf_fhlen = be32_to_cpup(p++);
996         if (putfh->pf_fhlen > NFS4_FHSIZE)
997                 goto xdr_error;
998         READ_BUF(putfh->pf_fhlen);
999         SAVEMEM(putfh->pf_fhval, putfh->pf_fhlen);
1000
1001         DECODE_TAIL;
1002 }
1003
1004 static __be32
1005 nfsd4_decode_putpubfh(struct nfsd4_compoundargs *argp, void *p)
1006 {
1007         if (argp->minorversion == 0)
1008                 return nfs_ok;
1009         return nfserr_notsupp;
1010 }
1011
1012 static __be32
1013 nfsd4_decode_read(struct nfsd4_compoundargs *argp, struct nfsd4_read *read)
1014 {
1015         DECODE_HEAD;
1016
1017         status = nfsd4_decode_stateid(argp, &read->rd_stateid);
1018         if (status)
1019                 return status;
1020         READ_BUF(12);
1021         READ64(read->rd_offset);
1022         read->rd_length = be32_to_cpup(p++);
1023
1024         DECODE_TAIL;
1025 }
1026
1027 static __be32
1028 nfsd4_decode_readdir(struct nfsd4_compoundargs *argp, struct nfsd4_readdir *readdir)
1029 {
1030         DECODE_HEAD;
1031
1032         READ_BUF(24);
1033         READ64(readdir->rd_cookie);
1034         COPYMEM(readdir->rd_verf.data, sizeof(readdir->rd_verf.data));
1035         readdir->rd_dircount = be32_to_cpup(p++);
1036         readdir->rd_maxcount = be32_to_cpup(p++);
1037         if ((status = nfsd4_decode_bitmap(argp, readdir->rd_bmval)))
1038                 goto out;
1039
1040         DECODE_TAIL;
1041 }
1042
1043 static __be32
1044 nfsd4_decode_remove(struct nfsd4_compoundargs *argp, struct nfsd4_remove *remove)
1045 {
1046         DECODE_HEAD;
1047
1048         READ_BUF(4);
1049         remove->rm_namelen = be32_to_cpup(p++);
1050         READ_BUF(remove->rm_namelen);
1051         SAVEMEM(remove->rm_name, remove->rm_namelen);
1052         if ((status = check_filename(remove->rm_name, remove->rm_namelen)))
1053                 return status;
1054
1055         DECODE_TAIL;
1056 }
1057
1058 static __be32
1059 nfsd4_decode_rename(struct nfsd4_compoundargs *argp, struct nfsd4_rename *rename)
1060 {
1061         DECODE_HEAD;
1062
1063         READ_BUF(4);
1064         rename->rn_snamelen = be32_to_cpup(p++);
1065         READ_BUF(rename->rn_snamelen + 4);
1066         SAVEMEM(rename->rn_sname, rename->rn_snamelen);
1067         rename->rn_tnamelen = be32_to_cpup(p++);
1068         READ_BUF(rename->rn_tnamelen);
1069         SAVEMEM(rename->rn_tname, rename->rn_tnamelen);
1070         if ((status = check_filename(rename->rn_sname, rename->rn_snamelen)))
1071                 return status;
1072         if ((status = check_filename(rename->rn_tname, rename->rn_tnamelen)))
1073                 return status;
1074
1075         DECODE_TAIL;
1076 }
1077
1078 static __be32
1079 nfsd4_decode_renew(struct nfsd4_compoundargs *argp, clientid_t *clientid)
1080 {
1081         DECODE_HEAD;
1082
1083         if (argp->minorversion >= 1)
1084                 return nfserr_notsupp;
1085
1086         READ_BUF(sizeof(clientid_t));
1087         COPYMEM(clientid, sizeof(clientid_t));
1088
1089         DECODE_TAIL;
1090 }
1091
1092 static __be32
1093 nfsd4_decode_secinfo(struct nfsd4_compoundargs *argp,
1094                      struct nfsd4_secinfo *secinfo)
1095 {
1096         DECODE_HEAD;
1097
1098         READ_BUF(4);
1099         secinfo->si_namelen = be32_to_cpup(p++);
1100         READ_BUF(secinfo->si_namelen);
1101         SAVEMEM(secinfo->si_name, secinfo->si_namelen);
1102         status = check_filename(secinfo->si_name, secinfo->si_namelen);
1103         if (status)
1104                 return status;
1105         DECODE_TAIL;
1106 }
1107
1108 static __be32
1109 nfsd4_decode_secinfo_no_name(struct nfsd4_compoundargs *argp,
1110                      struct nfsd4_secinfo_no_name *sin)
1111 {
1112         DECODE_HEAD;
1113
1114         READ_BUF(4);
1115         sin->sin_style = be32_to_cpup(p++);
1116         DECODE_TAIL;
1117 }
1118
1119 static __be32
1120 nfsd4_decode_setattr(struct nfsd4_compoundargs *argp, struct nfsd4_setattr *setattr)
1121 {
1122         __be32 status;
1123
1124         status = nfsd4_decode_stateid(argp, &setattr->sa_stateid);
1125         if (status)
1126                 return status;
1127         return nfsd4_decode_fattr(argp, setattr->sa_bmval, &setattr->sa_iattr,
1128                                   &setattr->sa_acl, &setattr->sa_label);
1129 }
1130
1131 static __be32
1132 nfsd4_decode_setclientid(struct nfsd4_compoundargs *argp, struct nfsd4_setclientid *setclientid)
1133 {
1134         DECODE_HEAD;
1135
1136         if (argp->minorversion >= 1)
1137                 return nfserr_notsupp;
1138
1139         READ_BUF(NFS4_VERIFIER_SIZE);
1140         COPYMEM(setclientid->se_verf.data, NFS4_VERIFIER_SIZE);
1141
1142         status = nfsd4_decode_opaque(argp, &setclientid->se_name);
1143         if (status)
1144                 return nfserr_bad_xdr;
1145         READ_BUF(8);
1146         setclientid->se_callback_prog = be32_to_cpup(p++);
1147         setclientid->se_callback_netid_len = be32_to_cpup(p++);
1148
1149         READ_BUF(setclientid->se_callback_netid_len + 4);
1150         SAVEMEM(setclientid->se_callback_netid_val, setclientid->se_callback_netid_len);
1151         setclientid->se_callback_addr_len = be32_to_cpup(p++);
1152
1153         READ_BUF(setclientid->se_callback_addr_len + 4);
1154         SAVEMEM(setclientid->se_callback_addr_val, setclientid->se_callback_addr_len);
1155         setclientid->se_callback_ident = be32_to_cpup(p++);
1156
1157         DECODE_TAIL;
1158 }
1159
1160 static __be32
1161 nfsd4_decode_setclientid_confirm(struct nfsd4_compoundargs *argp, struct nfsd4_setclientid_confirm *scd_c)
1162 {
1163         DECODE_HEAD;
1164
1165         if (argp->minorversion >= 1)
1166                 return nfserr_notsupp;
1167
1168         READ_BUF(8 + NFS4_VERIFIER_SIZE);
1169         COPYMEM(&scd_c->sc_clientid, 8);
1170         COPYMEM(&scd_c->sc_confirm, NFS4_VERIFIER_SIZE);
1171
1172         DECODE_TAIL;
1173 }
1174
1175 /* Also used for NVERIFY */
1176 static __be32
1177 nfsd4_decode_verify(struct nfsd4_compoundargs *argp, struct nfsd4_verify *verify)
1178 {
1179         DECODE_HEAD;
1180
1181         if ((status = nfsd4_decode_bitmap(argp, verify->ve_bmval)))
1182                 goto out;
1183
1184         /* For convenience's sake, we compare raw xdr'd attributes in
1185          * nfsd4_proc_verify */
1186
1187         READ_BUF(4);
1188         verify->ve_attrlen = be32_to_cpup(p++);
1189         READ_BUF(verify->ve_attrlen);
1190         SAVEMEM(verify->ve_attrval, verify->ve_attrlen);
1191
1192         DECODE_TAIL;
1193 }
1194
1195 static __be32
1196 nfsd4_decode_write(struct nfsd4_compoundargs *argp, struct nfsd4_write *write)
1197 {
1198         int avail;
1199         int len;
1200         DECODE_HEAD;
1201
1202         status = nfsd4_decode_stateid(argp, &write->wr_stateid);
1203         if (status)
1204                 return status;
1205         READ_BUF(16);
1206         READ64(write->wr_offset);
1207         write->wr_stable_how = be32_to_cpup(p++);
1208         if (write->wr_stable_how > 2)
1209                 goto xdr_error;
1210         write->wr_buflen = be32_to_cpup(p++);
1211
1212         /* Sorry .. no magic macros for this.. *
1213          * READ_BUF(write->wr_buflen);
1214          * SAVEMEM(write->wr_buf, write->wr_buflen);
1215          */
1216         avail = (char*)argp->end - (char*)argp->p;
1217         if (avail + argp->pagelen < write->wr_buflen) {
1218                 dprintk("NFSD: xdr error (%s:%d)\n",
1219                                 __FILE__, __LINE__);
1220                 goto xdr_error;
1221         }
1222         write->wr_head.iov_base = p;
1223         write->wr_head.iov_len = avail;
1224         write->wr_pagelist = argp->pagelist;
1225
1226         len = XDR_QUADLEN(write->wr_buflen) << 2;
1227         if (len >= avail) {
1228                 int pages;
1229
1230                 len -= avail;
1231
1232                 pages = len >> PAGE_SHIFT;
1233                 argp->pagelist += pages;
1234                 argp->pagelen -= pages * PAGE_SIZE;
1235                 len -= pages * PAGE_SIZE;
1236
1237                 argp->p = (__be32 *)page_address(argp->pagelist[0]);
1238                 argp->pagelist++;
1239                 argp->end = argp->p + XDR_QUADLEN(PAGE_SIZE);
1240         }
1241         argp->p += XDR_QUADLEN(len);
1242
1243         DECODE_TAIL;
1244 }
1245
1246 static __be32
1247 nfsd4_decode_release_lockowner(struct nfsd4_compoundargs *argp, struct nfsd4_release_lockowner *rlockowner)
1248 {
1249         DECODE_HEAD;
1250
1251         if (argp->minorversion >= 1)
1252                 return nfserr_notsupp;
1253
1254         READ_BUF(12);
1255         COPYMEM(&rlockowner->rl_clientid, sizeof(clientid_t));
1256         rlockowner->rl_owner.len = be32_to_cpup(p++);
1257         READ_BUF(rlockowner->rl_owner.len);
1258         READMEM(rlockowner->rl_owner.data, rlockowner->rl_owner.len);
1259
1260         if (argp->minorversion && !zero_clientid(&rlockowner->rl_clientid))
1261                 return nfserr_inval;
1262         DECODE_TAIL;
1263 }
1264
1265 static __be32
1266 nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp,
1267                          struct nfsd4_exchange_id *exid)
1268 {
1269         int dummy, tmp;
1270         DECODE_HEAD;
1271
1272         READ_BUF(NFS4_VERIFIER_SIZE);
1273         COPYMEM(exid->verifier.data, NFS4_VERIFIER_SIZE);
1274
1275         status = nfsd4_decode_opaque(argp, &exid->clname);
1276         if (status)
1277                 return nfserr_bad_xdr;
1278
1279         READ_BUF(4);
1280         exid->flags = be32_to_cpup(p++);
1281
1282         /* Ignore state_protect4_a */
1283         READ_BUF(4);
1284         exid->spa_how = be32_to_cpup(p++);
1285         switch (exid->spa_how) {
1286         case SP4_NONE:
1287                 break;
1288         case SP4_MACH_CRED:
1289                 /* spo_must_enforce */
1290                 READ_BUF(4);
1291                 dummy = be32_to_cpup(p++);
1292                 READ_BUF(dummy * 4);
1293                 p += dummy;
1294
1295                 /* spo_must_allow */
1296                 READ_BUF(4);
1297                 dummy = be32_to_cpup(p++);
1298                 READ_BUF(dummy * 4);
1299                 p += dummy;
1300                 break;
1301         case SP4_SSV:
1302                 /* ssp_ops */
1303                 READ_BUF(4);
1304                 dummy = be32_to_cpup(p++);
1305                 READ_BUF(dummy * 4);
1306                 p += dummy;
1307
1308                 READ_BUF(4);
1309                 dummy = be32_to_cpup(p++);
1310                 READ_BUF(dummy * 4);
1311                 p += dummy;
1312
1313                 /* ssp_hash_algs<> */
1314                 READ_BUF(4);
1315                 tmp = be32_to_cpup(p++);
1316                 while (tmp--) {
1317                         READ_BUF(4);
1318                         dummy = be32_to_cpup(p++);
1319                         READ_BUF(dummy);
1320                         p += XDR_QUADLEN(dummy);
1321                 }
1322
1323                 /* ssp_encr_algs<> */
1324                 READ_BUF(4);
1325                 tmp = be32_to_cpup(p++);
1326                 while (tmp--) {
1327                         READ_BUF(4);
1328                         dummy = be32_to_cpup(p++);
1329                         READ_BUF(dummy);
1330                         p += XDR_QUADLEN(dummy);
1331                 }
1332
1333                 /* ssp_window and ssp_num_gss_handles */
1334                 READ_BUF(8);
1335                 dummy = be32_to_cpup(p++);
1336                 dummy = be32_to_cpup(p++);
1337                 break;
1338         default:
1339                 goto xdr_error;
1340         }
1341
1342         /* Ignore Implementation ID */
1343         READ_BUF(4);    /* nfs_impl_id4 array length */
1344         dummy = be32_to_cpup(p++);
1345
1346         if (dummy > 1)
1347                 goto xdr_error;
1348
1349         if (dummy == 1) {
1350                 /* nii_domain */
1351                 READ_BUF(4);
1352                 dummy = be32_to_cpup(p++);
1353                 READ_BUF(dummy);
1354                 p += XDR_QUADLEN(dummy);
1355
1356                 /* nii_name */
1357                 READ_BUF(4);
1358                 dummy = be32_to_cpup(p++);
1359                 READ_BUF(dummy);
1360                 p += XDR_QUADLEN(dummy);
1361
1362                 /* nii_date */
1363                 READ_BUF(12);
1364                 p += 3;
1365         }
1366         DECODE_TAIL;
1367 }
1368
1369 static __be32
1370 nfsd4_decode_create_session(struct nfsd4_compoundargs *argp,
1371                             struct nfsd4_create_session *sess)
1372 {
1373         DECODE_HEAD;
1374         u32 dummy;
1375
1376         READ_BUF(16);
1377         COPYMEM(&sess->clientid, 8);
1378         sess->seqid = be32_to_cpup(p++);
1379         sess->flags = be32_to_cpup(p++);
1380
1381         /* Fore channel attrs */
1382         READ_BUF(28);
1383         dummy = be32_to_cpup(p++); /* headerpadsz is always 0 */
1384         sess->fore_channel.maxreq_sz = be32_to_cpup(p++);
1385         sess->fore_channel.maxresp_sz = be32_to_cpup(p++);
1386         sess->fore_channel.maxresp_cached = be32_to_cpup(p++);
1387         sess->fore_channel.maxops = be32_to_cpup(p++);
1388         sess->fore_channel.maxreqs = be32_to_cpup(p++);
1389         sess->fore_channel.nr_rdma_attrs = be32_to_cpup(p++);
1390         if (sess->fore_channel.nr_rdma_attrs == 1) {
1391                 READ_BUF(4);
1392                 sess->fore_channel.rdma_attrs = be32_to_cpup(p++);
1393         } else if (sess->fore_channel.nr_rdma_attrs > 1) {
1394                 dprintk("Too many fore channel attr bitmaps!\n");
1395                 goto xdr_error;
1396         }
1397
1398         /* Back channel attrs */
1399         READ_BUF(28);
1400         dummy = be32_to_cpup(p++); /* headerpadsz is always 0 */
1401         sess->back_channel.maxreq_sz = be32_to_cpup(p++);
1402         sess->back_channel.maxresp_sz = be32_to_cpup(p++);
1403         sess->back_channel.maxresp_cached = be32_to_cpup(p++);
1404         sess->back_channel.maxops = be32_to_cpup(p++);
1405         sess->back_channel.maxreqs = be32_to_cpup(p++);
1406         sess->back_channel.nr_rdma_attrs = be32_to_cpup(p++);
1407         if (sess->back_channel.nr_rdma_attrs == 1) {
1408                 READ_BUF(4);
1409                 sess->back_channel.rdma_attrs = be32_to_cpup(p++);
1410         } else if (sess->back_channel.nr_rdma_attrs > 1) {
1411                 dprintk("Too many back channel attr bitmaps!\n");
1412                 goto xdr_error;
1413         }
1414
1415         READ_BUF(4);
1416         sess->callback_prog = be32_to_cpup(p++);
1417         nfsd4_decode_cb_sec(argp, &sess->cb_sec);
1418         DECODE_TAIL;
1419 }
1420
1421 static __be32
1422 nfsd4_decode_destroy_session(struct nfsd4_compoundargs *argp,
1423                              struct nfsd4_destroy_session *destroy_session)
1424 {
1425         DECODE_HEAD;
1426         READ_BUF(NFS4_MAX_SESSIONID_LEN);
1427         COPYMEM(destroy_session->sessionid.data, NFS4_MAX_SESSIONID_LEN);
1428
1429         DECODE_TAIL;
1430 }
1431
1432 static __be32
1433 nfsd4_decode_free_stateid(struct nfsd4_compoundargs *argp,
1434                           struct nfsd4_free_stateid *free_stateid)
1435 {
1436         DECODE_HEAD;
1437
1438         READ_BUF(sizeof(stateid_t));
1439         free_stateid->fr_stateid.si_generation = be32_to_cpup(p++);
1440         COPYMEM(&free_stateid->fr_stateid.si_opaque, sizeof(stateid_opaque_t));
1441
1442         DECODE_TAIL;
1443 }
1444
1445 static __be32
1446 nfsd4_decode_sequence(struct nfsd4_compoundargs *argp,
1447                       struct nfsd4_sequence *seq)
1448 {
1449         DECODE_HEAD;
1450
1451         READ_BUF(NFS4_MAX_SESSIONID_LEN + 16);
1452         COPYMEM(seq->sessionid.data, NFS4_MAX_SESSIONID_LEN);
1453         seq->seqid = be32_to_cpup(p++);
1454         seq->slotid = be32_to_cpup(p++);
1455         seq->maxslots = be32_to_cpup(p++);
1456         seq->cachethis = be32_to_cpup(p++);
1457
1458         DECODE_TAIL;
1459 }
1460
1461 static __be32
1462 nfsd4_decode_test_stateid(struct nfsd4_compoundargs *argp, struct nfsd4_test_stateid *test_stateid)
1463 {
1464         int i;
1465         __be32 *p, status;
1466         struct nfsd4_test_stateid_id *stateid;
1467
1468         READ_BUF(4);
1469         test_stateid->ts_num_ids = ntohl(*p++);
1470
1471         INIT_LIST_HEAD(&test_stateid->ts_stateid_list);
1472
1473         for (i = 0; i < test_stateid->ts_num_ids; i++) {
1474                 stateid = kmalloc(sizeof(struct nfsd4_test_stateid_id), GFP_KERNEL);
1475                 if (!stateid) {
1476                         status = nfserrno(-ENOMEM);
1477                         goto out;
1478                 }
1479
1480                 defer_free(argp, kfree, stateid);
1481                 INIT_LIST_HEAD(&stateid->ts_id_list);
1482                 list_add_tail(&stateid->ts_id_list, &test_stateid->ts_stateid_list);
1483
1484                 status = nfsd4_decode_stateid(argp, &stateid->ts_id_stateid);
1485                 if (status)
1486                         goto out;
1487         }
1488
1489         status = 0;
1490 out:
1491         return status;
1492 xdr_error:
1493         dprintk("NFSD: xdr error (%s:%d)\n", __FILE__, __LINE__);
1494         status = nfserr_bad_xdr;
1495         goto out;
1496 }
1497
1498 static __be32 nfsd4_decode_destroy_clientid(struct nfsd4_compoundargs *argp, struct nfsd4_destroy_clientid *dc)
1499 {
1500         DECODE_HEAD;
1501
1502         READ_BUF(8);
1503         COPYMEM(&dc->clientid, 8);
1504
1505         DECODE_TAIL;
1506 }
1507
1508 static __be32 nfsd4_decode_reclaim_complete(struct nfsd4_compoundargs *argp, struct nfsd4_reclaim_complete *rc)
1509 {
1510         DECODE_HEAD;
1511
1512         READ_BUF(4);
1513         rc->rca_one_fs = be32_to_cpup(p++);
1514
1515         DECODE_TAIL;
1516 }
1517
1518 static __be32
1519 nfsd4_decode_noop(struct nfsd4_compoundargs *argp, void *p)
1520 {
1521         return nfs_ok;
1522 }
1523
1524 static __be32
1525 nfsd4_decode_notsupp(struct nfsd4_compoundargs *argp, void *p)
1526 {
1527         return nfserr_notsupp;
1528 }
1529
1530 typedef __be32(*nfsd4_dec)(struct nfsd4_compoundargs *argp, void *);
1531
1532 static nfsd4_dec nfsd4_dec_ops[] = {
1533         [OP_ACCESS]             = (nfsd4_dec)nfsd4_decode_access,
1534         [OP_CLOSE]              = (nfsd4_dec)nfsd4_decode_close,
1535         [OP_COMMIT]             = (nfsd4_dec)nfsd4_decode_commit,
1536         [OP_CREATE]             = (nfsd4_dec)nfsd4_decode_create,
1537         [OP_DELEGPURGE]         = (nfsd4_dec)nfsd4_decode_notsupp,
1538         [OP_DELEGRETURN]        = (nfsd4_dec)nfsd4_decode_delegreturn,
1539         [OP_GETATTR]            = (nfsd4_dec)nfsd4_decode_getattr,
1540         [OP_GETFH]              = (nfsd4_dec)nfsd4_decode_noop,
1541         [OP_LINK]               = (nfsd4_dec)nfsd4_decode_link,
1542         [OP_LOCK]               = (nfsd4_dec)nfsd4_decode_lock,
1543         [OP_LOCKT]              = (nfsd4_dec)nfsd4_decode_lockt,
1544         [OP_LOCKU]              = (nfsd4_dec)nfsd4_decode_locku,
1545         [OP_LOOKUP]             = (nfsd4_dec)nfsd4_decode_lookup,
1546         [OP_LOOKUPP]            = (nfsd4_dec)nfsd4_decode_noop,
1547         [OP_NVERIFY]            = (nfsd4_dec)nfsd4_decode_verify,
1548         [OP_OPEN]               = (nfsd4_dec)nfsd4_decode_open,
1549         [OP_OPENATTR]           = (nfsd4_dec)nfsd4_decode_notsupp,
1550         [OP_OPEN_CONFIRM]       = (nfsd4_dec)nfsd4_decode_open_confirm,
1551         [OP_OPEN_DOWNGRADE]     = (nfsd4_dec)nfsd4_decode_open_downgrade,
1552         [OP_PUTFH]              = (nfsd4_dec)nfsd4_decode_putfh,
1553         [OP_PUTPUBFH]           = (nfsd4_dec)nfsd4_decode_putpubfh,
1554         [OP_PUTROOTFH]          = (nfsd4_dec)nfsd4_decode_noop,
1555         [OP_READ]               = (nfsd4_dec)nfsd4_decode_read,
1556         [OP_READDIR]            = (nfsd4_dec)nfsd4_decode_readdir,
1557         [OP_READLINK]           = (nfsd4_dec)nfsd4_decode_noop,
1558         [OP_REMOVE]             = (nfsd4_dec)nfsd4_decode_remove,
1559         [OP_RENAME]             = (nfsd4_dec)nfsd4_decode_rename,
1560         [OP_RENEW]              = (nfsd4_dec)nfsd4_decode_renew,
1561         [OP_RESTOREFH]          = (nfsd4_dec)nfsd4_decode_noop,
1562         [OP_SAVEFH]             = (nfsd4_dec)nfsd4_decode_noop,
1563         [OP_SECINFO]            = (nfsd4_dec)nfsd4_decode_secinfo,
1564         [OP_SETATTR]            = (nfsd4_dec)nfsd4_decode_setattr,
1565         [OP_SETCLIENTID]        = (nfsd4_dec)nfsd4_decode_setclientid,
1566         [OP_SETCLIENTID_CONFIRM] = (nfsd4_dec)nfsd4_decode_setclientid_confirm,
1567         [OP_VERIFY]             = (nfsd4_dec)nfsd4_decode_verify,
1568         [OP_WRITE]              = (nfsd4_dec)nfsd4_decode_write,
1569         [OP_RELEASE_LOCKOWNER]  = (nfsd4_dec)nfsd4_decode_release_lockowner,
1570
1571         /* new operations for NFSv4.1 */
1572         [OP_BACKCHANNEL_CTL]    = (nfsd4_dec)nfsd4_decode_backchannel_ctl,
1573         [OP_BIND_CONN_TO_SESSION]= (nfsd4_dec)nfsd4_decode_bind_conn_to_session,
1574         [OP_EXCHANGE_ID]        = (nfsd4_dec)nfsd4_decode_exchange_id,
1575         [OP_CREATE_SESSION]     = (nfsd4_dec)nfsd4_decode_create_session,
1576         [OP_DESTROY_SESSION]    = (nfsd4_dec)nfsd4_decode_destroy_session,
1577         [OP_FREE_STATEID]       = (nfsd4_dec)nfsd4_decode_free_stateid,
1578         [OP_GET_DIR_DELEGATION] = (nfsd4_dec)nfsd4_decode_notsupp,
1579         [OP_GETDEVICEINFO]      = (nfsd4_dec)nfsd4_decode_notsupp,
1580         [OP_GETDEVICELIST]      = (nfsd4_dec)nfsd4_decode_notsupp,
1581         [OP_LAYOUTCOMMIT]       = (nfsd4_dec)nfsd4_decode_notsupp,
1582         [OP_LAYOUTGET]          = (nfsd4_dec)nfsd4_decode_notsupp,
1583         [OP_LAYOUTRETURN]       = (nfsd4_dec)nfsd4_decode_notsupp,
1584         [OP_SECINFO_NO_NAME]    = (nfsd4_dec)nfsd4_decode_secinfo_no_name,
1585         [OP_SEQUENCE]           = (nfsd4_dec)nfsd4_decode_sequence,
1586         [OP_SET_SSV]            = (nfsd4_dec)nfsd4_decode_notsupp,
1587         [OP_TEST_STATEID]       = (nfsd4_dec)nfsd4_decode_test_stateid,
1588         [OP_WANT_DELEGATION]    = (nfsd4_dec)nfsd4_decode_notsupp,
1589         [OP_DESTROY_CLIENTID]   = (nfsd4_dec)nfsd4_decode_destroy_clientid,
1590         [OP_RECLAIM_COMPLETE]   = (nfsd4_dec)nfsd4_decode_reclaim_complete,
1591 };
1592
1593 static inline bool
1594 nfsd4_opnum_in_range(struct nfsd4_compoundargs *argp, struct nfsd4_op *op)
1595 {
1596         if (op->opnum < FIRST_NFS4_OP)
1597                 return false;
1598         else if (argp->minorversion == 0 && op->opnum > LAST_NFS40_OP)
1599                 return false;
1600         else if (argp->minorversion == 1 && op->opnum > LAST_NFS41_OP)
1601                 return false;
1602         else if (argp->minorversion == 2 && op->opnum > LAST_NFS42_OP)
1603                 return false;
1604         return true;
1605 }
1606
1607 static __be32
1608 nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
1609 {
1610         DECODE_HEAD;
1611         struct nfsd4_op *op;
1612         bool cachethis = false;
1613         int auth_slack= argp->rqstp->rq_auth_slack;
1614         int max_reply = auth_slack + 8; /* opcnt, status */
1615         int readcount = 0;
1616         int readbytes = 0;
1617         int i;
1618
1619         READ_BUF(4);
1620         argp->taglen = be32_to_cpup(p++);
1621         READ_BUF(argp->taglen + 8);
1622         SAVEMEM(argp->tag, argp->taglen);
1623         argp->minorversion = be32_to_cpup(p++);
1624         argp->opcnt = be32_to_cpup(p++);
1625         max_reply += 4 + (XDR_QUADLEN(argp->taglen) << 2);
1626
1627         if (argp->taglen > NFSD4_MAX_TAGLEN)
1628                 goto xdr_error;
1629         if (argp->opcnt > 100)
1630                 goto xdr_error;
1631
1632         if (argp->opcnt > ARRAY_SIZE(argp->iops)) {
1633                 argp->ops = kmalloc(argp->opcnt * sizeof(*argp->ops), GFP_KERNEL);
1634                 if (!argp->ops) {
1635                         argp->ops = argp->iops;
1636                         dprintk("nfsd: couldn't allocate room for COMPOUND\n");
1637                         goto xdr_error;
1638                 }
1639         }
1640
1641         if (argp->minorversion > NFSD_SUPPORTED_MINOR_VERSION)
1642                 argp->opcnt = 0;
1643
1644         for (i = 0; i < argp->opcnt; i++) {
1645                 op = &argp->ops[i];
1646                 op->replay = NULL;
1647
1648                 READ_BUF(4);
1649                 op->opnum = be32_to_cpup(p++);
1650
1651                 if (nfsd4_opnum_in_range(argp, op))
1652                         op->status = nfsd4_dec_ops[op->opnum](argp, &op->u);
1653                 else {
1654                         op->opnum = OP_ILLEGAL;
1655                         op->status = nfserr_op_illegal;
1656                 }
1657                 /*
1658                  * We'll try to cache the result in the DRC if any one
1659                  * op in the compound wants to be cached:
1660                  */
1661                 cachethis |= nfsd4_cache_this_op(op);
1662
1663                 if (op->opnum == OP_READ) {
1664                         readcount++;
1665                         readbytes += nfsd4_max_reply(argp->rqstp, op);
1666                 } else
1667                         max_reply += nfsd4_max_reply(argp->rqstp, op);
1668
1669                 if (op->status) {
1670                         argp->opcnt = i+1;
1671                         break;
1672                 }
1673         }
1674         /* Sessions make the DRC unnecessary: */
1675         if (argp->minorversion)
1676                 cachethis = false;
1677         svc_reserve(argp->rqstp, max_reply + readbytes);
1678         argp->rqstp->rq_cachetype = cachethis ? RC_REPLBUFF : RC_NOCACHE;
1679
1680         if (readcount > 1 || max_reply > PAGE_SIZE - auth_slack)
1681                 argp->rqstp->rq_splice_ok = false;
1682
1683         DECODE_TAIL;
1684 }
1685
1686 static __be32 *encode_change(__be32 *p, struct kstat *stat, struct inode *inode)
1687 {
1688         if (IS_I_VERSION(inode)) {
1689                 p = xdr_encode_hyper(p, inode->i_version);
1690         } else {
1691                 *p++ = cpu_to_be32(stat->ctime.tv_sec);
1692                 *p++ = cpu_to_be32(stat->ctime.tv_nsec);
1693         }
1694         return p;
1695 }
1696
1697 static __be32 *encode_cinfo(__be32 *p, struct nfsd4_change_info *c)
1698 {
1699         *p++ = cpu_to_be32(c->atomic);
1700         if (c->change_supported) {
1701                 p = xdr_encode_hyper(p, c->before_change);
1702                 p = xdr_encode_hyper(p, c->after_change);
1703         } else {
1704                 *p++ = cpu_to_be32(c->before_ctime_sec);
1705                 *p++ = cpu_to_be32(c->before_ctime_nsec);
1706                 *p++ = cpu_to_be32(c->after_ctime_sec);
1707                 *p++ = cpu_to_be32(c->after_ctime_nsec);
1708         }
1709         return p;
1710 }
1711
1712 /* Encode as an array of strings the string given with components
1713  * separated @sep, escaped with esc_enter and esc_exit.
1714  */
1715 static __be32 nfsd4_encode_components_esc(struct xdr_stream *xdr, char sep,
1716                                           char *components, char esc_enter,
1717                                           char esc_exit)
1718 {
1719         __be32 *p;
1720         __be32 pathlen;
1721         int pathlen_offset;
1722         int strlen, count=0;
1723         char *str, *end, *next;
1724
1725         dprintk("nfsd4_encode_components(%s)\n", components);
1726
1727         pathlen_offset = xdr->buf->len;
1728         p = xdr_reserve_space(xdr, 4);
1729         if (!p)
1730                 return nfserr_resource;
1731         p++; /* We will fill this in with @count later */
1732
1733         end = str = components;
1734         while (*end) {
1735                 bool found_esc = false;
1736
1737                 /* try to parse as esc_start, ..., esc_end, sep */
1738                 if (*str == esc_enter) {
1739                         for (; *end && (*end != esc_exit); end++)
1740                                 /* find esc_exit or end of string */;
1741                         next = end + 1;
1742                         if (*end && (!*next || *next == sep)) {
1743                                 str++;
1744                                 found_esc = true;
1745                         }
1746                 }
1747
1748                 if (!found_esc)
1749                         for (; *end && (*end != sep); end++)
1750                                 /* find sep or end of string */;
1751
1752                 strlen = end - str;
1753                 if (strlen) {
1754                         p = xdr_reserve_space(xdr, strlen + 4);
1755                         if (!p)
1756                                 return nfserr_resource;
1757                         p = xdr_encode_opaque(p, str, strlen);
1758                         count++;
1759                 }
1760                 else
1761                         end++;
1762                 str = end;
1763         }
1764         pathlen = htonl(xdr->buf->len - pathlen_offset);
1765         write_bytes_to_xdr_buf(xdr->buf, pathlen_offset, &pathlen, 4);
1766         return 0;
1767 }
1768
1769 /* Encode as an array of strings the string given with components
1770  * separated @sep.
1771  */
1772 static __be32 nfsd4_encode_components(struct xdr_stream *xdr, char sep,
1773                                       char *components)
1774 {
1775         return nfsd4_encode_components_esc(xdr, sep, components, 0, 0);
1776 }
1777
1778 /*
1779  * encode a location element of a fs_locations structure
1780  */
1781 static __be32 nfsd4_encode_fs_location4(struct xdr_stream *xdr,
1782                                         struct nfsd4_fs_location *location)
1783 {
1784         __be32 status;
1785
1786         status = nfsd4_encode_components_esc(xdr, ':', location->hosts,
1787                                                 '[', ']');
1788         if (status)
1789                 return status;
1790         status = nfsd4_encode_components(xdr, '/', location->path);
1791         if (status)
1792                 return status;
1793         return 0;
1794 }
1795
1796 /*
1797  * Encode a path in RFC3530 'pathname4' format
1798  */
1799 static __be32 nfsd4_encode_path(struct xdr_stream *xdr,
1800                                 const struct path *root,
1801                                 const struct path *path)
1802 {
1803         struct path cur = *path;
1804         __be32 *p;
1805         struct dentry **components = NULL;
1806         unsigned int ncomponents = 0;
1807         __be32 err = nfserr_jukebox;
1808
1809         dprintk("nfsd4_encode_components(");
1810
1811         path_get(&cur);
1812         /* First walk the path up to the nfsd root, and store the
1813          * dentries/path components in an array.
1814          */
1815         for (;;) {
1816                 if (cur.dentry == root->dentry && cur.mnt == root->mnt)
1817                         break;
1818                 if (cur.dentry == cur.mnt->mnt_root) {
1819                         if (follow_up(&cur))
1820                                 continue;
1821                         goto out_free;
1822                 }
1823                 if ((ncomponents & 15) == 0) {
1824                         struct dentry **new;
1825                         new = krealloc(components,
1826                                         sizeof(*new) * (ncomponents + 16),
1827                                         GFP_KERNEL);
1828                         if (!new)
1829                                 goto out_free;
1830                         components = new;
1831                 }
1832                 components[ncomponents++] = cur.dentry;
1833                 cur.dentry = dget_parent(cur.dentry);
1834         }
1835         err = nfserr_resource;
1836         p = xdr_reserve_space(xdr, 4);
1837         if (!p)
1838                 goto out_free;
1839         *p++ = cpu_to_be32(ncomponents);
1840
1841         while (ncomponents) {
1842                 struct dentry *dentry = components[ncomponents - 1];
1843                 unsigned int len;
1844
1845                 spin_lock(&dentry->d_lock);
1846                 len = dentry->d_name.len;
1847                 p = xdr_reserve_space(xdr, len + 4);
1848                 if (!p) {
1849                         spin_unlock(&dentry->d_lock);
1850                         goto out_free;
1851                 }
1852                 p = xdr_encode_opaque(p, dentry->d_name.name, len);
1853                 dprintk("/%s", dentry->d_name.name);
1854                 spin_unlock(&dentry->d_lock);
1855                 dput(dentry);
1856                 ncomponents--;
1857         }
1858
1859         err = 0;
1860 out_free:
1861         dprintk(")\n");
1862         while (ncomponents)
1863                 dput(components[--ncomponents]);
1864         kfree(components);
1865         path_put(&cur);
1866         return err;
1867 }
1868
1869 static __be32 nfsd4_encode_fsloc_fsroot(struct xdr_stream *xdr,
1870                         struct svc_rqst *rqstp, const struct path *path)
1871 {
1872         struct svc_export *exp_ps;
1873         __be32 res;
1874
1875         exp_ps = rqst_find_fsidzero_export(rqstp);
1876         if (IS_ERR(exp_ps))
1877                 return nfserrno(PTR_ERR(exp_ps));
1878         res = nfsd4_encode_path(xdr, &exp_ps->ex_path, path);
1879         exp_put(exp_ps);
1880         return res;
1881 }
1882
1883 /*
1884  *  encode a fs_locations structure
1885  */
1886 static __be32 nfsd4_encode_fs_locations(struct xdr_stream *xdr,
1887                         struct svc_rqst *rqstp, struct svc_export *exp)
1888 {
1889         __be32 status;
1890         int i;
1891         __be32 *p;
1892         struct nfsd4_fs_locations *fslocs = &exp->ex_fslocs;
1893
1894         status = nfsd4_encode_fsloc_fsroot(xdr, rqstp, &exp->ex_path);
1895         if (status)
1896                 return status;
1897         p = xdr_reserve_space(xdr, 4);
1898         if (!p)
1899                 return nfserr_resource;
1900         *p++ = cpu_to_be32(fslocs->locations_count);
1901         for (i=0; i<fslocs->locations_count; i++) {
1902                 status = nfsd4_encode_fs_location4(xdr, &fslocs->locations[i]);
1903                 if (status)
1904                         return status;
1905         }
1906         return 0;
1907 }
1908
1909 static u32 nfs4_file_type(umode_t mode)
1910 {
1911         switch (mode & S_IFMT) {
1912         case S_IFIFO:   return NF4FIFO;
1913         case S_IFCHR:   return NF4CHR;
1914         case S_IFDIR:   return NF4DIR;
1915         case S_IFBLK:   return NF4BLK;
1916         case S_IFLNK:   return NF4LNK;
1917         case S_IFREG:   return NF4REG;
1918         case S_IFSOCK:  return NF4SOCK;
1919         default:        return NF4BAD;
1920         };
1921 }
1922
1923 static inline __be32
1924 nfsd4_encode_aclname(struct xdr_stream *xdr, struct svc_rqst *rqstp,
1925                      struct nfs4_ace *ace)
1926 {
1927         if (ace->whotype != NFS4_ACL_WHO_NAMED)
1928                 return nfs4_acl_write_who(xdr, ace->whotype);
1929         else if (ace->flag & NFS4_ACE_IDENTIFIER_GROUP)
1930                 return nfsd4_encode_group(xdr, rqstp, ace->who_gid);
1931         else
1932                 return nfsd4_encode_user(xdr, rqstp, ace->who_uid);
1933 }
1934
1935 #define WORD0_ABSENT_FS_ATTRS (FATTR4_WORD0_FS_LOCATIONS | FATTR4_WORD0_FSID | \
1936                               FATTR4_WORD0_RDATTR_ERROR)
1937 #define WORD1_ABSENT_FS_ATTRS FATTR4_WORD1_MOUNTED_ON_FILEID
1938
1939 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
1940 static inline __be32
1941 nfsd4_encode_security_label(struct xdr_stream *xdr, struct svc_rqst *rqstp,
1942                             void *context, int len)
1943 {
1944         __be32 *p;
1945
1946         p = xdr_reserve_space(xdr, len + 4 + 4 + 4);
1947         if (!p)
1948                 return nfserr_resource;
1949
1950         /*
1951          * For now we use a 0 here to indicate the null translation; in
1952          * the future we may place a call to translation code here.
1953          */
1954         *p++ = cpu_to_be32(0); /* lfs */
1955         *p++ = cpu_to_be32(0); /* pi */
1956         p = xdr_encode_opaque(p, context, len);
1957         return 0;
1958 }
1959 #else
1960 static inline __be32
1961 nfsd4_encode_security_label(struct xdr_stream *xdr, struct svc_rqst *rqstp,
1962                             void *context, int len)
1963 { return 0; }
1964 #endif
1965
1966 static __be32 fattr_handle_absent_fs(u32 *bmval0, u32 *bmval1, u32 *rdattr_err)
1967 {
1968         /* As per referral draft:  */
1969         if (*bmval0 & ~WORD0_ABSENT_FS_ATTRS ||
1970             *bmval1 & ~WORD1_ABSENT_FS_ATTRS) {
1971                 if (*bmval0 & FATTR4_WORD0_RDATTR_ERROR ||
1972                     *bmval0 & FATTR4_WORD0_FS_LOCATIONS)
1973                         *rdattr_err = NFSERR_MOVED;
1974                 else
1975                         return nfserr_moved;
1976         }
1977         *bmval0 &= WORD0_ABSENT_FS_ATTRS;
1978         *bmval1 &= WORD1_ABSENT_FS_ATTRS;
1979         return 0;
1980 }
1981
1982
1983 static int get_parent_attributes(struct svc_export *exp, struct kstat *stat)
1984 {
1985         struct path path = exp->ex_path;
1986         int err;
1987
1988         path_get(&path);
1989         while (follow_up(&path)) {
1990                 if (path.dentry != path.mnt->mnt_root)
1991                         break;
1992         }
1993         err = vfs_getattr(&path, stat);
1994         path_put(&path);
1995         return err;
1996 }
1997
1998 /*
1999  * Note: @fhp can be NULL; in this case, we might have to compose the filehandle
2000  * ourselves.
2001  */
2002 static __be32
2003 nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp,
2004                 struct svc_export *exp,
2005                 struct dentry *dentry, u32 *bmval,
2006                 struct svc_rqst *rqstp, int ignore_crossmnt)
2007 {
2008         u32 bmval0 = bmval[0];
2009         u32 bmval1 = bmval[1];
2010         u32 bmval2 = bmval[2];
2011         struct kstat stat;
2012         struct svc_fh *tempfh = NULL;
2013         struct kstatfs statfs;
2014         __be32 *p;
2015         int starting_len = xdr->buf->len;
2016         int attrlen_offset;
2017         __be32 attrlen;
2018         u32 dummy;
2019         u64 dummy64;
2020         u32 rdattr_err = 0;
2021         __be32 status;
2022         int err;
2023         int aclsupport = 0;
2024         struct nfs4_acl *acl = NULL;
2025         void *context = NULL;
2026         int contextlen;
2027         bool contextsupport = false;
2028         struct nfsd4_compoundres *resp = rqstp->rq_resp;
2029         u32 minorversion = resp->cstate.minorversion;
2030         struct path path = {
2031                 .mnt    = exp->ex_path.mnt,
2032                 .dentry = dentry,
2033         };
2034         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
2035
2036         BUG_ON(bmval1 & NFSD_WRITEONLY_ATTRS_WORD1);
2037         BUG_ON(bmval0 & ~nfsd_suppattrs0(minorversion));
2038         BUG_ON(bmval1 & ~nfsd_suppattrs1(minorversion));
2039         BUG_ON(bmval2 & ~nfsd_suppattrs2(minorversion));
2040
2041         if (exp->ex_fslocs.migrated) {
2042                 BUG_ON(bmval[2]);
2043                 status = fattr_handle_absent_fs(&bmval0, &bmval1, &rdattr_err);
2044                 if (status)
2045                         goto out;
2046         }
2047
2048         err = vfs_getattr(&path, &stat);
2049         if (err)
2050                 goto out_nfserr;
2051         if ((bmval0 & (FATTR4_WORD0_FILES_AVAIL | FATTR4_WORD0_FILES_FREE |
2052                         FATTR4_WORD0_FILES_TOTAL | FATTR4_WORD0_MAXNAME)) ||
2053             (bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE |
2054                        FATTR4_WORD1_SPACE_TOTAL))) {
2055                 err = vfs_statfs(&path, &statfs);
2056                 if (err)
2057                         goto out_nfserr;
2058         }
2059         if ((bmval0 & (FATTR4_WORD0_FILEHANDLE | FATTR4_WORD0_FSID)) && !fhp) {
2060                 tempfh = kmalloc(sizeof(struct svc_fh), GFP_KERNEL);
2061                 status = nfserr_jukebox;
2062                 if (!tempfh)
2063                         goto out;
2064                 fh_init(tempfh, NFS4_FHSIZE);
2065                 status = fh_compose(tempfh, exp, dentry, NULL);
2066                 if (status)
2067                         goto out;
2068                 fhp = tempfh;
2069         }
2070         if (bmval0 & (FATTR4_WORD0_ACL | FATTR4_WORD0_ACLSUPPORT
2071                         | FATTR4_WORD0_SUPPORTED_ATTRS)) {
2072                 err = nfsd4_get_nfs4_acl(rqstp, dentry, &acl);
2073                 aclsupport = (err == 0);
2074                 if (bmval0 & FATTR4_WORD0_ACL) {
2075                         if (err == -EOPNOTSUPP)
2076                                 bmval0 &= ~FATTR4_WORD0_ACL;
2077                         else if (err == -EINVAL) {
2078                                 status = nfserr_attrnotsupp;
2079                                 goto out;
2080                         } else if (err != 0)
2081                                 goto out_nfserr;
2082                 }
2083         }
2084
2085 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
2086         if ((bmval[2] & FATTR4_WORD2_SECURITY_LABEL) ||
2087                         bmval[0] & FATTR4_WORD0_SUPPORTED_ATTRS) {
2088                 err = security_inode_getsecctx(dentry->d_inode,
2089                                                 &context, &contextlen);
2090                 contextsupport = (err == 0);
2091                 if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) {
2092                         if (err == -EOPNOTSUPP)
2093                                 bmval2 &= ~FATTR4_WORD2_SECURITY_LABEL;
2094                         else if (err)
2095                                 goto out_nfserr;
2096                 }
2097         }
2098 #endif /* CONFIG_NFSD_V4_SECURITY_LABEL */
2099
2100         if (bmval2) {
2101                 p = xdr_reserve_space(xdr, 16);
2102                 if (!p)
2103                         goto out_resource;
2104                 *p++ = cpu_to_be32(3);
2105                 *p++ = cpu_to_be32(bmval0);
2106                 *p++ = cpu_to_be32(bmval1);
2107                 *p++ = cpu_to_be32(bmval2);
2108         } else if (bmval1) {
2109                 p = xdr_reserve_space(xdr, 12);
2110                 if (!p)
2111                         goto out_resource;
2112                 *p++ = cpu_to_be32(2);
2113                 *p++ = cpu_to_be32(bmval0);
2114                 *p++ = cpu_to_be32(bmval1);
2115         } else {
2116                 p = xdr_reserve_space(xdr, 8);
2117                 if (!p)
2118                         goto out_resource;
2119                 *p++ = cpu_to_be32(1);
2120                 *p++ = cpu_to_be32(bmval0);
2121         }
2122
2123         attrlen_offset = xdr->buf->len;
2124         p = xdr_reserve_space(xdr, 4);
2125         if (!p)
2126                 goto out_resource;
2127         p++;                /* to be backfilled later */
2128
2129         if (bmval0 & FATTR4_WORD0_SUPPORTED_ATTRS) {
2130                 u32 word0 = nfsd_suppattrs0(minorversion);
2131                 u32 word1 = nfsd_suppattrs1(minorversion);
2132                 u32 word2 = nfsd_suppattrs2(minorversion);
2133
2134                 if (!aclsupport)
2135                         word0 &= ~FATTR4_WORD0_ACL;
2136                 if (!contextsupport)
2137                         word2 &= ~FATTR4_WORD2_SECURITY_LABEL;
2138                 if (!word2) {
2139                         p = xdr_reserve_space(xdr, 12);
2140                         if (!p)
2141                                 goto out_resource;
2142                         *p++ = cpu_to_be32(2);
2143                         *p++ = cpu_to_be32(word0);
2144                         *p++ = cpu_to_be32(word1);
2145                 } else {
2146                         p = xdr_reserve_space(xdr, 16);
2147                         if (!p)
2148                                 goto out_resource;
2149                         *p++ = cpu_to_be32(3);
2150                         *p++ = cpu_to_be32(word0);
2151                         *p++ = cpu_to_be32(word1);
2152                         *p++ = cpu_to_be32(word2);
2153                 }
2154         }
2155         if (bmval0 & FATTR4_WORD0_TYPE) {
2156                 p = xdr_reserve_space(xdr, 4);
2157                 if (!p)
2158                         goto out_resource;
2159                 dummy = nfs4_file_type(stat.mode);
2160                 if (dummy == NF4BAD) {
2161                         status = nfserr_serverfault;
2162                         goto out;
2163                 }
2164                 *p++ = cpu_to_be32(dummy);
2165         }
2166         if (bmval0 & FATTR4_WORD0_FH_EXPIRE_TYPE) {
2167                 p = xdr_reserve_space(xdr, 4);
2168                 if (!p)
2169                         goto out_resource;
2170                 if (exp->ex_flags & NFSEXP_NOSUBTREECHECK)
2171                         *p++ = cpu_to_be32(NFS4_FH_PERSISTENT);
2172                 else
2173                         *p++ = cpu_to_be32(NFS4_FH_PERSISTENT|
2174                                                 NFS4_FH_VOL_RENAME);
2175         }
2176         if (bmval0 & FATTR4_WORD0_CHANGE) {
2177                 p = xdr_reserve_space(xdr, 8);
2178                 if (!p)
2179                         goto out_resource;
2180                 p = encode_change(p, &stat, dentry->d_inode);
2181         }
2182         if (bmval0 & FATTR4_WORD0_SIZE) {
2183                 p = xdr_reserve_space(xdr, 8);
2184                 if (!p)
2185                         goto out_resource;
2186                 p = xdr_encode_hyper(p, stat.size);
2187         }
2188         if (bmval0 & FATTR4_WORD0_LINK_SUPPORT) {
2189                 p = xdr_reserve_space(xdr, 4);
2190                 if (!p)
2191                         goto out_resource;
2192                 *p++ = cpu_to_be32(1);
2193         }
2194         if (bmval0 & FATTR4_WORD0_SYMLINK_SUPPORT) {
2195                 p = xdr_reserve_space(xdr, 4);
2196                 if (!p)
2197                         goto out_resource;
2198                 *p++ = cpu_to_be32(1);
2199         }
2200         if (bmval0 & FATTR4_WORD0_NAMED_ATTR) {
2201                 p = xdr_reserve_space(xdr, 4);
2202                 if (!p)
2203                         goto out_resource;
2204                 *p++ = cpu_to_be32(0);
2205         }
2206         if (bmval0 & FATTR4_WORD0_FSID) {
2207                 p = xdr_reserve_space(xdr, 16);
2208                 if (!p)
2209                         goto out_resource;
2210                 if (exp->ex_fslocs.migrated) {
2211                         p = xdr_encode_hyper(p, NFS4_REFERRAL_FSID_MAJOR);
2212                         p = xdr_encode_hyper(p, NFS4_REFERRAL_FSID_MINOR);
2213                 } else switch(fsid_source(fhp)) {
2214                 case FSIDSOURCE_FSID:
2215                         p = xdr_encode_hyper(p, (u64)exp->ex_fsid);
2216                         p = xdr_encode_hyper(p, (u64)0);
2217                         break;
2218                 case FSIDSOURCE_DEV:
2219                         *p++ = cpu_to_be32(0);
2220                         *p++ = cpu_to_be32(MAJOR(stat.dev));
2221                         *p++ = cpu_to_be32(0);
2222                         *p++ = cpu_to_be32(MINOR(stat.dev));
2223                         break;
2224                 case FSIDSOURCE_UUID:
2225                         p = xdr_encode_opaque_fixed(p, exp->ex_uuid,
2226                                                                 EX_UUID_LEN);
2227                         break;
2228                 }
2229         }
2230         if (bmval0 & FATTR4_WORD0_UNIQUE_HANDLES) {
2231                 p = xdr_reserve_space(xdr, 4);
2232                 if (!p)
2233                         goto out_resource;
2234                 *p++ = cpu_to_be32(0);
2235         }
2236         if (bmval0 & FATTR4_WORD0_LEASE_TIME) {
2237                 p = xdr_reserve_space(xdr, 4);
2238                 if (!p)
2239                         goto out_resource;
2240                 *p++ = cpu_to_be32(nn->nfsd4_lease);
2241         }
2242         if (bmval0 & FATTR4_WORD0_RDATTR_ERROR) {
2243                 p = xdr_reserve_space(xdr, 4);
2244                 if (!p)
2245                         goto out_resource;
2246                 *p++ = cpu_to_be32(rdattr_err);
2247         }
2248         if (bmval0 & FATTR4_WORD0_ACL) {
2249                 struct nfs4_ace *ace;
2250
2251                 if (acl == NULL) {
2252                         p = xdr_reserve_space(xdr, 4);
2253                         if (!p)
2254                                 goto out_resource;
2255
2256                         *p++ = cpu_to_be32(0);
2257                         goto out_acl;
2258                 }
2259                 p = xdr_reserve_space(xdr, 4);
2260                 if (!p)
2261                         goto out_resource;
2262                 *p++ = cpu_to_be32(acl->naces);
2263
2264                 for (ace = acl->aces; ace < acl->aces + acl->naces; ace++) {
2265                         p = xdr_reserve_space(xdr, 4*3);
2266                         if (!p)
2267                                 goto out_resource;
2268                         *p++ = cpu_to_be32(ace->type);
2269                         *p++ = cpu_to_be32(ace->flag);
2270                         *p++ = cpu_to_be32(ace->access_mask &
2271                                                         NFS4_ACE_MASK_ALL);
2272                         status = nfsd4_encode_aclname(xdr, rqstp, ace);
2273                         if (status)
2274                                 goto out;
2275                 }
2276         }
2277 out_acl:
2278         if (bmval0 & FATTR4_WORD0_ACLSUPPORT) {
2279                 p = xdr_reserve_space(xdr, 4);
2280                 if (!p)
2281                         goto out_resource;
2282                 *p++ = cpu_to_be32(aclsupport ?
2283                         ACL4_SUPPORT_ALLOW_ACL|ACL4_SUPPORT_DENY_ACL : 0);
2284         }
2285         if (bmval0 & FATTR4_WORD0_CANSETTIME) {
2286                 p = xdr_reserve_space(xdr, 4);
2287                 if (!p)
2288                         goto out_resource;
2289                 *p++ = cpu_to_be32(1);
2290         }
2291         if (bmval0 & FATTR4_WORD0_CASE_INSENSITIVE) {
2292                 p = xdr_reserve_space(xdr, 4);
2293                 if (!p)
2294                         goto out_resource;
2295                 *p++ = cpu_to_be32(0);
2296         }
2297         if (bmval0 & FATTR4_WORD0_CASE_PRESERVING) {
2298                 p = xdr_reserve_space(xdr, 4);
2299                 if (!p)
2300                         goto out_resource;
2301                 *p++ = cpu_to_be32(1);
2302         }
2303         if (bmval0 & FATTR4_WORD0_CHOWN_RESTRICTED) {
2304                 p = xdr_reserve_space(xdr, 4);
2305                 if (!p)
2306                         goto out_resource;
2307                 *p++ = cpu_to_be32(1);
2308         }
2309         if (bmval0 & FATTR4_WORD0_FILEHANDLE) {
2310                 p = xdr_reserve_space(xdr, fhp->fh_handle.fh_size + 4);
2311                 if (!p)
2312                         goto out_resource;
2313                 p = xdr_encode_opaque(p, &fhp->fh_handle.fh_base,
2314                                         fhp->fh_handle.fh_size);
2315         }
2316         if (bmval0 & FATTR4_WORD0_FILEID) {
2317                 p = xdr_reserve_space(xdr, 8);
2318                 if (!p)
2319                         goto out_resource;
2320                 p = xdr_encode_hyper(p, stat.ino);
2321         }
2322         if (bmval0 & FATTR4_WORD0_FILES_AVAIL) {
2323                 p = xdr_reserve_space(xdr, 8);
2324                 if (!p)
2325                         goto out_resource;
2326                 p = xdr_encode_hyper(p, (u64) statfs.f_ffree);
2327         }
2328         if (bmval0 & FATTR4_WORD0_FILES_FREE) {
2329                 p = xdr_reserve_space(xdr, 8);
2330                 if (!p)
2331                         goto out_resource;
2332                 p = xdr_encode_hyper(p, (u64) statfs.f_ffree);
2333         }
2334         if (bmval0 & FATTR4_WORD0_FILES_TOTAL) {
2335                 p = xdr_reserve_space(xdr, 8);
2336                 if (!p)
2337                         goto out_resource;
2338                 p = xdr_encode_hyper(p, (u64) statfs.f_files);
2339         }
2340         if (bmval0 & FATTR4_WORD0_FS_LOCATIONS) {
2341                 status = nfsd4_encode_fs_locations(xdr, rqstp, exp);
2342                 if (status)
2343                         goto out;
2344         }
2345         if (bmval0 & FATTR4_WORD0_HOMOGENEOUS) {
2346                 p = xdr_reserve_space(xdr, 4);
2347                 if (!p)
2348                         goto out_resource;
2349                 *p++ = cpu_to_be32(1);
2350         }
2351         if (bmval0 & FATTR4_WORD0_MAXFILESIZE) {
2352                 p = xdr_reserve_space(xdr, 8);
2353                 if (!p)
2354                         goto out_resource;
2355                 p = xdr_encode_hyper(p, exp->ex_path.mnt->mnt_sb->s_maxbytes);
2356         }
2357         if (bmval0 & FATTR4_WORD0_MAXLINK) {
2358                 p = xdr_reserve_space(xdr, 4);
2359                 if (!p)
2360                         goto out_resource;
2361                 *p++ = cpu_to_be32(255);
2362         }
2363         if (bmval0 & FATTR4_WORD0_MAXNAME) {
2364                 p = xdr_reserve_space(xdr, 4);
2365                 if (!p)
2366                         goto out_resource;
2367                 *p++ = cpu_to_be32(statfs.f_namelen);
2368         }
2369         if (bmval0 & FATTR4_WORD0_MAXREAD) {
2370                 p = xdr_reserve_space(xdr, 8);
2371                 if (!p)
2372                         goto out_resource;
2373                 p = xdr_encode_hyper(p, (u64) svc_max_payload(rqstp));
2374         }
2375         if (bmval0 & FATTR4_WORD0_MAXWRITE) {
2376                 p = xdr_reserve_space(xdr, 8);
2377                 if (!p)
2378                         goto out_resource;
2379                 p = xdr_encode_hyper(p, (u64) svc_max_payload(rqstp));
2380         }
2381         if (bmval1 & FATTR4_WORD1_MODE) {
2382                 p = xdr_reserve_space(xdr, 4);
2383                 if (!p)
2384                         goto out_resource;
2385                 *p++ = cpu_to_be32(stat.mode & S_IALLUGO);
2386         }
2387         if (bmval1 & FATTR4_WORD1_NO_TRUNC) {
2388                 p = xdr_reserve_space(xdr, 4);
2389                 if (!p)
2390                         goto out_resource;
2391                 *p++ = cpu_to_be32(1);
2392         }
2393         if (bmval1 & FATTR4_WORD1_NUMLINKS) {
2394                 p = xdr_reserve_space(xdr, 4);
2395                 if (!p)
2396                         goto out_resource;
2397                 *p++ = cpu_to_be32(stat.nlink);
2398         }
2399         if (bmval1 & FATTR4_WORD1_OWNER) {
2400                 status = nfsd4_encode_user(xdr, rqstp, stat.uid);
2401                 if (status)
2402                         goto out;
2403         }
2404         if (bmval1 & FATTR4_WORD1_OWNER_GROUP) {
2405                 status = nfsd4_encode_group(xdr, rqstp, stat.gid);
2406                 if (status)
2407                         goto out;
2408         }
2409         if (bmval1 & FATTR4_WORD1_RAWDEV) {
2410                 p = xdr_reserve_space(xdr, 8);
2411                 if (!p)
2412                         goto out_resource;
2413                 *p++ = cpu_to_be32((u32) MAJOR(stat.rdev));
2414                 *p++ = cpu_to_be32((u32) MINOR(stat.rdev));
2415         }
2416         if (bmval1 & FATTR4_WORD1_SPACE_AVAIL) {
2417                 p = xdr_reserve_space(xdr, 8);
2418                 if (!p)
2419                         goto out_resource;
2420                 dummy64 = (u64)statfs.f_bavail * (u64)statfs.f_bsize;
2421                 p = xdr_encode_hyper(p, dummy64);
2422         }
2423         if (bmval1 & FATTR4_WORD1_SPACE_FREE) {
2424                 p = xdr_reserve_space(xdr, 8);
2425                 if (!p)
2426                         goto out_resource;
2427                 dummy64 = (u64)statfs.f_bfree * (u64)statfs.f_bsize;
2428                 p = xdr_encode_hyper(p, dummy64);
2429         }
2430         if (bmval1 & FATTR4_WORD1_SPACE_TOTAL) {
2431                 p = xdr_reserve_space(xdr, 8);
2432                 if (!p)
2433                         goto out_resource;
2434                 dummy64 = (u64)statfs.f_blocks * (u64)statfs.f_bsize;
2435                 p = xdr_encode_hyper(p, dummy64);
2436         }
2437         if (bmval1 & FATTR4_WORD1_SPACE_USED) {
2438                 p = xdr_reserve_space(xdr, 8);
2439                 if (!p)
2440                         goto out_resource;
2441                 dummy64 = (u64)stat.blocks << 9;
2442                 p = xdr_encode_hyper(p, dummy64);
2443         }
2444         if (bmval1 & FATTR4_WORD1_TIME_ACCESS) {
2445                 p = xdr_reserve_space(xdr, 12);
2446                 if (!p)
2447                         goto out_resource;
2448                 p = xdr_encode_hyper(p, (s64)stat.atime.tv_sec);
2449                 *p++ = cpu_to_be32(stat.atime.tv_nsec);
2450         }
2451         if (bmval1 & FATTR4_WORD1_TIME_DELTA) {
2452                 p = xdr_reserve_space(xdr, 12);
2453                 if (!p)
2454                         goto out_resource;
2455                 *p++ = cpu_to_be32(0);
2456                 *p++ = cpu_to_be32(1);
2457                 *p++ = cpu_to_be32(0);
2458         }
2459         if (bmval1 & FATTR4_WORD1_TIME_METADATA) {
2460                 p = xdr_reserve_space(xdr, 12);
2461                 if (!p)
2462                         goto out_resource;
2463                 p = xdr_encode_hyper(p, (s64)stat.ctime.tv_sec);
2464                 *p++ = cpu_to_be32(stat.ctime.tv_nsec);
2465         }
2466         if (bmval1 & FATTR4_WORD1_TIME_MODIFY) {
2467                 p = xdr_reserve_space(xdr, 12);
2468                 if (!p)
2469                         goto out_resource;
2470                 p = xdr_encode_hyper(p, (s64)stat.mtime.tv_sec);
2471                 *p++ = cpu_to_be32(stat.mtime.tv_nsec);
2472         }
2473         if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) {
2474                 p = xdr_reserve_space(xdr, 8);
2475                 if (!p)
2476                         goto out_resource;
2477                 /*
2478                  * Get parent's attributes if not ignoring crossmount
2479                  * and this is the root of a cross-mounted filesystem.
2480                  */
2481                 if (ignore_crossmnt == 0 &&
2482                     dentry == exp->ex_path.mnt->mnt_root)
2483                         get_parent_attributes(exp, &stat);
2484                 p = xdr_encode_hyper(p, stat.ino);
2485         }
2486         if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) {
2487                 status = nfsd4_encode_security_label(xdr, rqstp, context,
2488                                                                 contextlen);
2489                 if (status)
2490                         goto out;
2491         }
2492         if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) {
2493                 p = xdr_reserve_space(xdr, 16);
2494                 if (!p)
2495                         goto out_resource;
2496                 *p++ = cpu_to_be32(3);
2497                 *p++ = cpu_to_be32(NFSD_SUPPATTR_EXCLCREAT_WORD0);
2498                 *p++ = cpu_to_be32(NFSD_SUPPATTR_EXCLCREAT_WORD1);
2499                 *p++ = cpu_to_be32(NFSD_SUPPATTR_EXCLCREAT_WORD2);
2500         }
2501
2502         attrlen = htonl(xdr->buf->len - attrlen_offset - 4);
2503         write_bytes_to_xdr_buf(xdr->buf, attrlen_offset, &attrlen, 4);
2504         status = nfs_ok;
2505
2506 out:
2507 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
2508         if (context)
2509                 security_release_secctx(context, contextlen);
2510 #endif /* CONFIG_NFSD_V4_SECURITY_LABEL */
2511         kfree(acl);
2512         if (tempfh) {
2513                 fh_put(tempfh);
2514                 kfree(tempfh);
2515         }
2516         if (status)
2517                 xdr_truncate_encode(xdr, starting_len);
2518         return status;
2519 out_nfserr:
2520         status = nfserrno(err);
2521         goto out;
2522 out_resource:
2523         status = nfserr_resource;
2524         goto out;
2525 }
2526
2527 static void svcxdr_init_encode_from_buffer(struct xdr_stream *xdr,
2528                                 struct xdr_buf *buf, __be32 *p, int bytes)
2529 {
2530         xdr->scratch.iov_len = 0;
2531         memset(buf, 0, sizeof(struct xdr_buf));
2532         buf->head[0].iov_base = p;
2533         buf->head[0].iov_len = 0;
2534         buf->len = 0;
2535         xdr->buf = buf;
2536         xdr->iov = buf->head;
2537         xdr->p = p;
2538         xdr->end = (void *)p + bytes;
2539         buf->buflen = bytes;
2540 }
2541
2542 __be32 nfsd4_encode_fattr_to_buf(__be32 **p, int words,
2543                         struct svc_fh *fhp, struct svc_export *exp,
2544                         struct dentry *dentry, u32 *bmval,
2545                         struct svc_rqst *rqstp, int ignore_crossmnt)
2546 {
2547         struct xdr_buf dummy;
2548         struct xdr_stream xdr;
2549         __be32 ret;
2550
2551         svcxdr_init_encode_from_buffer(&xdr, &dummy, *p, words << 2);
2552         ret = nfsd4_encode_fattr(&xdr, fhp, exp, dentry, bmval, rqstp,
2553                                                         ignore_crossmnt);
2554         *p = xdr.p;
2555         return ret;
2556 }
2557
2558 static inline int attributes_need_mount(u32 *bmval)
2559 {
2560         if (bmval[0] & ~(FATTR4_WORD0_RDATTR_ERROR | FATTR4_WORD0_LEASE_TIME))
2561                 return 1;
2562         if (bmval[1] & ~FATTR4_WORD1_MOUNTED_ON_FILEID)
2563                 return 1;
2564         return 0;
2565 }
2566
2567 static __be32
2568 nfsd4_encode_dirent_fattr(struct xdr_stream *xdr, struct nfsd4_readdir *cd,
2569                         const char *name, int namlen)
2570 {
2571         struct svc_export *exp = cd->rd_fhp->fh_export;
2572         struct dentry *dentry;
2573         __be32 nfserr;
2574         int ignore_crossmnt = 0;
2575
2576         dentry = lookup_one_len(name, cd->rd_fhp->fh_dentry, namlen);
2577         if (IS_ERR(dentry))
2578                 return nfserrno(PTR_ERR(dentry));
2579         if (!dentry->d_inode) {
2580                 /*
2581                  * nfsd_buffered_readdir drops the i_mutex between
2582                  * readdir and calling this callback, leaving a window
2583                  * where this directory entry could have gone away.
2584                  */
2585                 dput(dentry);
2586                 return nfserr_noent;
2587         }
2588
2589         exp_get(exp);
2590         /*
2591          * In the case of a mountpoint, the client may be asking for
2592          * attributes that are only properties of the underlying filesystem
2593          * as opposed to the cross-mounted file system. In such a case,
2594          * we will not follow the cross mount and will fill the attribtutes
2595          * directly from the mountpoint dentry.
2596          */
2597         if (nfsd_mountpoint(dentry, exp)) {
2598                 int err;
2599
2600                 if (!(exp->ex_flags & NFSEXP_V4ROOT)
2601                                 && !attributes_need_mount(cd->rd_bmval)) {
2602                         ignore_crossmnt = 1;
2603                         goto out_encode;
2604                 }
2605                 /*
2606                  * Why the heck aren't we just using nfsd_lookup??
2607                  * Different "."/".." handling?  Something else?
2608                  * At least, add a comment here to explain....
2609                  */
2610                 err = nfsd_cross_mnt(cd->rd_rqstp, &dentry, &exp);
2611                 if (err) {
2612                         nfserr = nfserrno(err);
2613                         goto out_put;
2614                 }
2615                 nfserr = check_nfsd_access(exp, cd->rd_rqstp);
2616                 if (nfserr)
2617                         goto out_put;
2618
2619         }
2620 out_encode:
2621         nfserr = nfsd4_encode_fattr(xdr, NULL, exp, dentry, cd->rd_bmval,
2622                                         cd->rd_rqstp, ignore_crossmnt);
2623 out_put:
2624         dput(dentry);
2625         exp_put(exp);
2626         return nfserr;
2627 }
2628
2629 static __be32 *
2630 nfsd4_encode_rdattr_error(struct xdr_stream *xdr, __be32 nfserr)
2631 {
2632         __be32 *p;
2633
2634         p = xdr_reserve_space(xdr, 6);
2635         if (!p)
2636                 return NULL;
2637         *p++ = htonl(2);
2638         *p++ = htonl(FATTR4_WORD0_RDATTR_ERROR); /* bmval0 */
2639         *p++ = htonl(0);                         /* bmval1 */
2640
2641         *p++ = htonl(4);     /* attribute length */
2642         *p++ = nfserr;       /* no htonl */
2643         return p;
2644 }
2645
2646 static int
2647 nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
2648                     loff_t offset, u64 ino, unsigned int d_type)
2649 {
2650         struct readdir_cd *ccd = ccdv;
2651         struct nfsd4_readdir *cd = container_of(ccd, struct nfsd4_readdir, common);
2652         struct xdr_stream *xdr = cd->xdr;
2653         int start_offset = xdr->buf->len;
2654         int cookie_offset;
2655         int entry_bytes;
2656         __be32 nfserr = nfserr_toosmall;
2657         __be64 wire_offset;
2658         __be32 *p;
2659
2660         /* In nfsv4, "." and ".." never make it onto the wire.. */
2661         if (name && isdotent(name, namlen)) {
2662                 cd->common.err = nfs_ok;
2663                 return 0;
2664         }
2665
2666         if (cd->cookie_offset) {
2667                 wire_offset = cpu_to_be64(offset);
2668                 write_bytes_to_xdr_buf(xdr->buf, cd->cookie_offset,
2669                                                         &wire_offset, 8);
2670         }
2671
2672         p = xdr_reserve_space(xdr, 4);
2673         if (!p)
2674                 goto fail;
2675         *p++ = xdr_one;                             /* mark entry present */
2676         cookie_offset = xdr->buf->len;
2677         p = xdr_reserve_space(xdr, 3*4 + namlen);
2678         if (!p)
2679                 goto fail;
2680         p = xdr_encode_hyper(p, NFS_OFFSET_MAX);    /* offset of next entry */
2681         p = xdr_encode_array(p, name, namlen);      /* name length & name */
2682
2683         nfserr = nfsd4_encode_dirent_fattr(xdr, cd, name, namlen);
2684         switch (nfserr) {
2685         case nfs_ok:
2686                 break;
2687         case nfserr_resource:
2688                 nfserr = nfserr_toosmall;
2689                 goto fail;
2690         case nfserr_noent:
2691                 goto skip_entry;
2692         default:
2693                 /*
2694                  * If the client requested the RDATTR_ERROR attribute,
2695                  * we stuff the error code into this attribute
2696                  * and continue.  If this attribute was not requested,
2697                  * then in accordance with the spec, we fail the
2698                  * entire READDIR operation(!)
2699                  */
2700                 if (!(cd->rd_bmval[0] & FATTR4_WORD0_RDATTR_ERROR))
2701                         goto fail;
2702                 p = nfsd4_encode_rdattr_error(xdr, nfserr);
2703                 if (p == NULL) {
2704                         nfserr = nfserr_toosmall;
2705                         goto fail;
2706                 }
2707         }
2708         nfserr = nfserr_toosmall;
2709         entry_bytes = xdr->buf->len - start_offset;
2710         if (entry_bytes > cd->rd_maxcount)
2711                 goto fail;
2712         cd->rd_maxcount -= entry_bytes;
2713         if (!cd->rd_dircount)
2714                 goto fail;
2715         cd->rd_dircount--;
2716         cd->cookie_offset = cookie_offset;
2717 skip_entry:
2718         cd->common.err = nfs_ok;
2719         return 0;
2720 fail:
2721         xdr_truncate_encode(xdr, start_offset);
2722         cd->common.err = nfserr;
2723         return -EINVAL;
2724 }
2725
2726 static __be32
2727 nfsd4_encode_stateid(struct xdr_stream *xdr, stateid_t *sid)
2728 {
2729         __be32 *p;
2730
2731         p = xdr_reserve_space(xdr, sizeof(stateid_t));
2732         if (!p)
2733                 return nfserr_resource;
2734         *p++ = cpu_to_be32(sid->si_generation);
2735         p = xdr_encode_opaque_fixed(p, &sid->si_opaque,
2736                                         sizeof(stateid_opaque_t));
2737         return 0;
2738 }
2739
2740 static __be32
2741 nfsd4_encode_access(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_access *access)
2742 {
2743         struct xdr_stream *xdr = &resp->xdr;
2744         __be32 *p;
2745
2746         if (!nfserr) {
2747                 p = xdr_reserve_space(xdr, 8);
2748                 if (!p)
2749                         return nfserr_resource;
2750                 *p++ = cpu_to_be32(access->ac_supported);
2751                 *p++ = cpu_to_be32(access->ac_resp_access);
2752         }
2753         return nfserr;
2754 }
2755
2756 static __be32 nfsd4_encode_bind_conn_to_session(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_bind_conn_to_session *bcts)
2757 {
2758         struct xdr_stream *xdr = &resp->xdr;
2759         __be32 *p;
2760
2761         if (!nfserr) {
2762                 p = xdr_reserve_space(xdr, NFS4_MAX_SESSIONID_LEN + 8);
2763                 if (!p)
2764                         return nfserr_resource;
2765                 p = xdr_encode_opaque_fixed(p, bcts->sessionid.data,
2766                                                 NFS4_MAX_SESSIONID_LEN);
2767                 *p++ = cpu_to_be32(bcts->dir);
2768                 /* Sorry, we do not yet support RDMA over 4.1: */
2769                 *p++ = cpu_to_be32(0);
2770         }
2771         return nfserr;
2772 }
2773
2774 static __be32
2775 nfsd4_encode_close(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_close *close)
2776 {
2777         struct xdr_stream *xdr = &resp->xdr;
2778
2779         if (!nfserr)
2780                 nfserr = nfsd4_encode_stateid(xdr, &close->cl_stateid);
2781
2782         return nfserr;
2783 }
2784
2785
2786 static __be32
2787 nfsd4_encode_commit(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_commit *commit)
2788 {
2789         struct xdr_stream *xdr = &resp->xdr;
2790         __be32 *p;
2791
2792         if (!nfserr) {
2793                 p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE);
2794                 if (!p)
2795                         return nfserr_resource;
2796                 p = xdr_encode_opaque_fixed(p, commit->co_verf.data,
2797                                                 NFS4_VERIFIER_SIZE);
2798         }
2799         return nfserr;
2800 }
2801
2802 static __be32
2803 nfsd4_encode_create(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_create *create)
2804 {
2805         struct xdr_stream *xdr = &resp->xdr;
2806         __be32 *p;
2807
2808         if (!nfserr) {
2809                 p = xdr_reserve_space(xdr, 32);
2810                 if (!p)
2811                         return nfserr_resource;
2812                 p = encode_cinfo(p, &create->cr_cinfo);
2813                 *p++ = cpu_to_be32(2);
2814                 *p++ = cpu_to_be32(create->cr_bmval[0]);
2815                 *p++ = cpu_to_be32(create->cr_bmval[1]);
2816         }
2817         return nfserr;
2818 }
2819
2820 static __be32
2821 nfsd4_encode_getattr(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_getattr *getattr)
2822 {
2823         struct svc_fh *fhp = getattr->ga_fhp;
2824         struct xdr_stream *xdr = &resp->xdr;
2825
2826         if (nfserr)
2827                 return nfserr;
2828
2829         nfserr = nfsd4_encode_fattr(xdr, fhp, fhp->fh_export, fhp->fh_dentry,
2830                                     getattr->ga_bmval,
2831                                     resp->rqstp, 0);
2832         return nfserr;
2833 }
2834
2835 static __be32
2836 nfsd4_encode_getfh(struct nfsd4_compoundres *resp, __be32 nfserr, struct svc_fh **fhpp)
2837 {
2838         struct xdr_stream *xdr = &resp->xdr;
2839         struct svc_fh *fhp = *fhpp;
2840         unsigned int len;
2841         __be32 *p;
2842
2843         if (!nfserr) {
2844                 len = fhp->fh_handle.fh_size;
2845                 p = xdr_reserve_space(xdr, len + 4);
2846                 if (!p)
2847                         return nfserr_resource;
2848                 p = xdr_encode_opaque(p, &fhp->fh_handle.fh_base, len);
2849         }
2850         return nfserr;
2851 }
2852
2853 /*
2854 * Including all fields other than the name, a LOCK4denied structure requires
2855 *   8(clientid) + 4(namelen) + 8(offset) + 8(length) + 4(type) = 32 bytes.
2856 */
2857 static __be32
2858 nfsd4_encode_lock_denied(struct xdr_stream *xdr, struct nfsd4_lock_denied *ld)
2859 {
2860         struct xdr_netobj *conf = &ld->ld_owner;
2861         __be32 *p;
2862
2863 again:
2864         p = xdr_reserve_space(xdr, 32 + XDR_LEN(conf->len));
2865         if (!p) {
2866                 /*
2867                  * Don't fail to return the result just because we can't
2868                  * return the conflicting open:
2869                  */
2870                 if (conf->len) {
2871                         conf->len = 0;
2872                         conf->data = NULL;
2873                         goto again;
2874                 }
2875                 return nfserr_resource;
2876         }
2877         p = xdr_encode_hyper(p, ld->ld_start);
2878         p = xdr_encode_hyper(p, ld->ld_length);
2879         *p++ = cpu_to_be32(ld->ld_type);
2880         if (conf->len) {
2881                 p = xdr_encode_opaque_fixed(p, &ld->ld_clientid, 8);
2882                 p = xdr_encode_opaque(p, conf->data, conf->len);
2883         }  else {  /* non - nfsv4 lock in conflict, no clientid nor owner */
2884                 p = xdr_encode_hyper(p, (u64)0); /* clientid */
2885                 *p++ = cpu_to_be32(0); /* length of owner name */
2886         }
2887         return nfserr_denied;
2888 }
2889
2890 static __be32
2891 nfsd4_encode_lock(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_lock *lock)
2892 {
2893         struct xdr_stream *xdr = &resp->xdr;
2894
2895         if (!nfserr)
2896                 nfserr = nfsd4_encode_stateid(xdr, &lock->lk_resp_stateid);
2897         else if (nfserr == nfserr_denied)
2898                 nfserr = nfsd4_encode_lock_denied(xdr, &lock->lk_denied);
2899         kfree(lock->lk_denied.ld_owner.data);
2900         return nfserr;
2901 }
2902
2903 static __be32
2904 nfsd4_encode_lockt(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_lockt *lockt)
2905 {
2906         struct xdr_stream *xdr = &resp->xdr;
2907
2908         if (nfserr == nfserr_denied)
2909                 nfsd4_encode_lock_denied(xdr, &lockt->lt_denied);
2910         return nfserr;
2911 }
2912
2913 static __be32
2914 nfsd4_encode_locku(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_locku *locku)
2915 {
2916         struct xdr_stream *xdr = &resp->xdr;
2917
2918         if (!nfserr)
2919                 nfserr = nfsd4_encode_stateid(xdr, &locku->lu_stateid);
2920
2921         return nfserr;
2922 }
2923
2924
2925 static __be32
2926 nfsd4_encode_link(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_link *link)
2927 {
2928         struct xdr_stream *xdr = &resp->xdr;
2929         __be32 *p;
2930
2931         if (!nfserr) {
2932                 p = xdr_reserve_space(xdr, 20);
2933                 if (!p)
2934                         return nfserr_resource;
2935                 p = encode_cinfo(p, &link->li_cinfo);
2936         }
2937         return nfserr;
2938 }
2939
2940
2941 static __be32
2942 nfsd4_encode_open(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_open *open)
2943 {
2944         struct xdr_stream *xdr = &resp->xdr;
2945         __be32 *p;
2946
2947         if (nfserr)
2948                 goto out;
2949
2950         nfserr = nfsd4_encode_stateid(xdr, &open->op_stateid);
2951         if (nfserr)
2952                 goto out;
2953         p = xdr_reserve_space(xdr, 40);
2954         if (!p)
2955                 return nfserr_resource;
2956         p = encode_cinfo(p, &open->op_cinfo);
2957         *p++ = cpu_to_be32(open->op_rflags);
2958         *p++ = cpu_to_be32(2);
2959         *p++ = cpu_to_be32(open->op_bmval[0]);
2960         *p++ = cpu_to_be32(open->op_bmval[1]);
2961         *p++ = cpu_to_be32(open->op_delegate_type);
2962
2963         switch (open->op_delegate_type) {
2964         case NFS4_OPEN_DELEGATE_NONE:
2965                 break;
2966         case NFS4_OPEN_DELEGATE_READ:
2967                 nfserr = nfsd4_encode_stateid(xdr, &open->op_delegate_stateid);
2968                 if (nfserr)
2969                         return nfserr;
2970                 p = xdr_reserve_space(xdr, 20);
2971                 if (!p)
2972                         return nfserr_resource;
2973                 *p++ = cpu_to_be32(open->op_recall);
2974
2975                 /*
2976                  * TODO: ACE's in delegations
2977                  */
2978                 *p++ = cpu_to_be32(NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE);
2979                 *p++ = cpu_to_be32(0);
2980                 *p++ = cpu_to_be32(0);
2981                 *p++ = cpu_to_be32(0);   /* XXX: is NULL principal ok? */
2982                 break;
2983         case NFS4_OPEN_DELEGATE_WRITE:
2984                 nfserr = nfsd4_encode_stateid(xdr, &open->op_delegate_stateid);
2985                 if (nfserr)
2986                         return nfserr;
2987                 p = xdr_reserve_space(xdr, 32);
2988                 if (!p)
2989                         return nfserr_resource;
2990                 *p++ = cpu_to_be32(0);
2991
2992                 /*
2993                  * TODO: space_limit's in delegations
2994                  */
2995                 *p++ = cpu_to_be32(NFS4_LIMIT_SIZE);
2996                 *p++ = cpu_to_be32(~(u32)0);
2997                 *p++ = cpu_to_be32(~(u32)0);
2998
2999                 /*
3000                  * TODO: ACE's in delegations
3001                  */
3002                 *p++ = cpu_to_be32(NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE);
3003                 *p++ = cpu_to_be32(0);
3004                 *p++ = cpu_to_be32(0);
3005                 *p++ = cpu_to_be32(0);   /* XXX: is NULL principal ok? */
3006                 break;
3007         case NFS4_OPEN_DELEGATE_NONE_EXT: /* 4.1 */
3008                 switch (open->op_why_no_deleg) {
3009                 case WND4_CONTENTION:
3010                 case WND4_RESOURCE:
3011                         p = xdr_reserve_space(xdr, 8);
3012                         if (!p)
3013                                 return nfserr_resource;
3014                         *p++ = cpu_to_be32(open->op_why_no_deleg);
3015                         /* deleg signaling not supported yet: */
3016                         *p++ = cpu_to_be32(0);
3017                         break;
3018                 default:
3019                         p = xdr_reserve_space(xdr, 4);
3020                         if (!p)
3021                                 return nfserr_resource;
3022                         *p++ = cpu_to_be32(open->op_why_no_deleg);
3023                 }
3024                 break;
3025         default:
3026                 BUG();
3027         }
3028         /* XXX save filehandle here */
3029 out:
3030         return nfserr;
3031 }
3032
3033 static __be32
3034 nfsd4_encode_open_confirm(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_open_confirm *oc)
3035 {
3036         struct xdr_stream *xdr = &resp->xdr;
3037
3038         if (!nfserr)
3039                 nfserr = nfsd4_encode_stateid(xdr, &oc->oc_resp_stateid);
3040
3041         return nfserr;
3042 }
3043
3044 static __be32
3045 nfsd4_encode_open_downgrade(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_open_downgrade *od)
3046 {
3047         struct xdr_stream *xdr = &resp->xdr;
3048
3049         if (!nfserr)
3050                 nfserr = nfsd4_encode_stateid(xdr, &od->od_stateid);
3051
3052         return nfserr;
3053 }
3054
3055 static __be32 nfsd4_encode_splice_read(
3056                                 struct nfsd4_compoundres *resp,
3057                                 struct nfsd4_read *read,
3058                                 struct file *file, unsigned long maxcount)
3059 {
3060         struct xdr_stream *xdr = &resp->xdr;
3061         struct xdr_buf *buf = xdr->buf;
3062         u32 eof;
3063         int space_left;
3064         __be32 nfserr;
3065         __be32 *p = xdr->p - 2;
3066
3067         /*
3068          * Don't inline pages unless we know there's room for eof,
3069          * count, and possible padding:
3070          */
3071         if (xdr->end - xdr->p < 3)
3072                 return nfserr_resource;
3073
3074         nfserr = nfsd_splice_read(read->rd_rqstp, file,
3075                                   read->rd_offset, &maxcount);
3076         if (nfserr) {
3077                 /*
3078                  * nfsd_splice_actor may have already messed with the
3079                  * page length; reset it so as not to confuse
3080                  * xdr_truncate_encode:
3081                  */
3082                 buf->page_len = 0;
3083                 return nfserr;
3084         }
3085
3086         eof = (read->rd_offset + maxcount >=
3087                read->rd_fhp->fh_dentry->d_inode->i_size);
3088
3089         *(p++) = htonl(eof);
3090         *(p++) = htonl(maxcount);
3091
3092         buf->page_len = maxcount;
3093         buf->len += maxcount;
3094         xdr->page_ptr += (maxcount + PAGE_SIZE - 1) / PAGE_SIZE;
3095
3096         /* Use rest of head for padding and remaining ops: */
3097         buf->tail[0].iov_base = xdr->p;
3098         buf->tail[0].iov_len = 0;
3099         xdr->iov = buf->tail;
3100         if (maxcount&3) {
3101                 int pad = 4 - (maxcount&3);
3102
3103                 *(xdr->p++) = 0;
3104
3105                 buf->tail[0].iov_base += maxcount&3;
3106                 buf->tail[0].iov_len = pad;
3107                 buf->len += pad;
3108         }
3109
3110         space_left = min_t(int, (void *)xdr->end - (void *)xdr->p,
3111                                 buf->buflen - buf->len);
3112         buf->buflen = buf->len + space_left;
3113         xdr->end = (__be32 *)((void *)xdr->end + space_left);
3114
3115         return 0;
3116 }
3117
3118 static __be32 nfsd4_encode_readv(struct nfsd4_compoundres *resp,
3119                                  struct nfsd4_read *read,
3120                                  struct file *file, unsigned long maxcount)
3121 {
3122         struct xdr_stream *xdr = &resp->xdr;
3123         u32 eof;
3124         int v;
3125         int starting_len = xdr->buf->len - 8;
3126         long len;
3127         int thislen;
3128         __be32 nfserr;
3129         __be32 tmp;
3130         __be32 *p;
3131         u32 zzz = 0;
3132         int pad;
3133
3134         len = maxcount;
3135         v = 0;
3136
3137         thislen = (void *)xdr->end - (void *)xdr->p;
3138         if (len < thislen)
3139                 thislen = len;
3140         p = xdr_reserve_space(xdr, (thislen+3)&~3);
3141         WARN_ON_ONCE(!p);
3142         resp->rqstp->rq_vec[v].iov_base = p;
3143         resp->rqstp->rq_vec[v].iov_len = thislen;
3144         v++;
3145         len -= thislen;
3146
3147         while (len) {
3148                 thislen = min_t(long, len, PAGE_SIZE);
3149                 p = xdr_reserve_space(xdr, (thislen+3)&~3);
3150                 WARN_ON_ONCE(!p);
3151                 resp->rqstp->rq_vec[v].iov_base = p;
3152                 resp->rqstp->rq_vec[v].iov_len = thislen;
3153                 v++;
3154                 len -= thislen;
3155         }
3156         read->rd_vlen = v;
3157
3158         nfserr = nfsd_readv(file, read->rd_offset, resp->rqstp->rq_vec,
3159                         read->rd_vlen, &maxcount);
3160         if (nfserr)
3161                 return nfserr;
3162         xdr_truncate_encode(xdr, starting_len + 8 + ((maxcount+3)&~3));
3163
3164         eof = (read->rd_offset + maxcount >=
3165                read->rd_fhp->fh_dentry->d_inode->i_size);
3166
3167         tmp = htonl(eof);
3168         write_bytes_to_xdr_buf(xdr->buf, starting_len    , &tmp, 4);
3169         tmp = htonl(maxcount);
3170         write_bytes_to_xdr_buf(xdr->buf, starting_len + 4, &tmp, 4);
3171
3172         pad = (maxcount&3) ? 4 - (maxcount&3) : 0;
3173         write_bytes_to_xdr_buf(xdr->buf, starting_len + 8 + maxcount,
3174                                                                 &zzz, pad);
3175         return 0;
3176
3177 }
3178
3179 static __be32
3180 nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,
3181                   struct nfsd4_read *read)
3182 {
3183         unsigned long maxcount;
3184         struct xdr_stream *xdr = &resp->xdr;
3185         struct file *file = read->rd_filp;
3186         int starting_len = xdr->buf->len;
3187         struct raparms *ra;
3188         __be32 *p;
3189         __be32 err;
3190
3191         if (nfserr)
3192                 return nfserr;
3193
3194         p = xdr_reserve_space(xdr, 8); /* eof flag and byte count */
3195         if (!p) {
3196                 WARN_ON_ONCE(resp->rqstp->rq_splice_ok);
3197                 return nfserr_resource;
3198         }
3199         if (resp->xdr.buf->page_len && resp->rqstp->rq_splice_ok) {
3200                 WARN_ON_ONCE(1);
3201                 return nfserr_resource;
3202         }
3203         xdr_commit_encode(xdr);
3204
3205         maxcount = svc_max_payload(resp->rqstp);
3206         if (maxcount > xdr->buf->buflen - xdr->buf->len)
3207                 maxcount = xdr->buf->buflen - xdr->buf->len;
3208         if (maxcount > read->rd_length)
3209                 maxcount = read->rd_length;
3210
3211         if (!read->rd_filp) {
3212                 err = nfsd_get_tmp_read_open(resp->rqstp, read->rd_fhp,
3213                                                 &file, &ra);
3214                 if (err)
3215                         goto err_truncate;
3216         }
3217
3218         if (file->f_op->splice_read && resp->rqstp->rq_splice_ok)
3219                 err = nfsd4_encode_splice_read(resp, read, file, maxcount);
3220         else
3221                 err = nfsd4_encode_readv(resp, read, file, maxcount);
3222
3223         if (!read->rd_filp)
3224                 nfsd_put_tmp_read_open(file, ra);
3225
3226 err_truncate:
3227         if (err)
3228                 xdr_truncate_encode(xdr, starting_len);
3229         return err;
3230 }
3231
3232 static __be32
3233 nfsd4_encode_readlink(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_readlink *readlink)
3234 {
3235         int maxcount;
3236         __be32 wire_count;
3237         int zero = 0;
3238         struct xdr_stream *xdr = &resp->xdr;
3239         int length_offset = xdr->buf->len;
3240         __be32 *p;
3241
3242         if (nfserr)
3243                 return nfserr;
3244
3245         p = xdr_reserve_space(xdr, 4);
3246         if (!p)
3247                 return nfserr_resource;
3248         maxcount = PAGE_SIZE;
3249
3250         p = xdr_reserve_space(xdr, maxcount);
3251         if (!p)
3252                 return nfserr_resource;
3253         /*
3254          * XXX: By default, the ->readlink() VFS op will truncate symlinks
3255          * if they would overflow the buffer.  Is this kosher in NFSv4?  If
3256          * not, one easy fix is: if ->readlink() precisely fills the buffer,
3257          * assume that truncation occurred, and return NFS4ERR_RESOURCE.
3258          */
3259         nfserr = nfsd_readlink(readlink->rl_rqstp, readlink->rl_fhp,
3260                                                 (char *)p, &maxcount);
3261         if (nfserr == nfserr_isdir)
3262                 nfserr = nfserr_inval;
3263         if (nfserr) {
3264                 xdr_truncate_encode(xdr, length_offset);
3265                 return nfserr;
3266         }
3267
3268         wire_count = htonl(maxcount);
3269         write_bytes_to_xdr_buf(xdr->buf, length_offset, &wire_count, 4);
3270         xdr_truncate_encode(xdr, length_offset + 4 + maxcount);
3271         if (maxcount & 3)
3272                 write_bytes_to_xdr_buf(xdr->buf, length_offset + 4 + maxcount,
3273                                                 &zero, 4 - (maxcount&3));
3274         return 0;
3275 }
3276
3277 static __be32
3278 nfsd4_encode_readdir(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_readdir *readdir)
3279 {
3280         int maxcount;
3281         int bytes_left;
3282         loff_t offset;
3283         __be64 wire_offset;
3284         struct xdr_stream *xdr = &resp->xdr;
3285         int starting_len = xdr->buf->len;
3286         __be32 *p;
3287
3288         if (nfserr)
3289                 return nfserr;
3290
3291         p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE);
3292         if (!p)
3293                 return nfserr_resource;
3294
3295         /* XXX: Following NFSv3, we ignore the READDIR verifier for now. */
3296         *p++ = cpu_to_be32(0);
3297         *p++ = cpu_to_be32(0);
3298         resp->xdr.buf->head[0].iov_len = ((char *)resp->xdr.p)
3299                                 - (char *)resp->xdr.buf->head[0].iov_base;
3300
3301         /*
3302          * Number of bytes left for directory entries allowing for the
3303          * final 8 bytes of the readdir and a following failed op:
3304          */
3305         bytes_left = xdr->buf->buflen - xdr->buf->len
3306                         - COMPOUND_ERR_SLACK_SPACE - 8;
3307         if (bytes_left < 0) {
3308                 nfserr = nfserr_resource;
3309                 goto err_no_verf;
3310         }
3311         maxcount = min_t(u32, readdir->rd_maxcount, INT_MAX);
3312         /*
3313          * Note the rfc defines rd_maxcount as the size of the
3314          * READDIR4resok structure, which includes the verifier above
3315          * and the 8 bytes encoded at the end of this function:
3316          */
3317         if (maxcount < 16) {
3318                 nfserr = nfserr_toosmall;
3319                 goto err_no_verf;
3320         }
3321         maxcount = min_t(int, maxcount-16, bytes_left);
3322
3323         readdir->xdr = xdr;
3324         readdir->rd_maxcount = maxcount;
3325         readdir->common.err = 0;
3326         readdir->cookie_offset = 0;
3327
3328         offset = readdir->rd_cookie;
3329         nfserr = nfsd_readdir(readdir->rd_rqstp, readdir->rd_fhp,
3330                               &offset,
3331                               &readdir->common, nfsd4_encode_dirent);
3332         if (nfserr == nfs_ok &&
3333             readdir->common.err == nfserr_toosmall &&
3334             xdr->buf->len == starting_len + 8) {
3335                 /* nothing encoded; which limit did we hit?: */
3336                 if (maxcount - 16 < bytes_left)
3337                         /* It was the fault of rd_maxcount: */
3338                         nfserr = nfserr_toosmall;
3339                 else
3340                         /* We ran out of buffer space: */
3341                         nfserr = nfserr_resource;
3342         }
3343         if (nfserr)
3344                 goto err_no_verf;
3345
3346         if (readdir->cookie_offset) {
3347                 wire_offset = cpu_to_be64(offset);
3348                 write_bytes_to_xdr_buf(xdr->buf, readdir->cookie_offset,
3349                                                         &wire_offset, 8);
3350         }
3351
3352         p = xdr_reserve_space(xdr, 8);
3353         if (!p) {
3354                 WARN_ON_ONCE(1);
3355                 goto err_no_verf;
3356         }
3357         *p++ = 0;       /* no more entries */
3358         *p++ = htonl(readdir->common.err == nfserr_eof);
3359
3360         return 0;
3361 err_no_verf:
3362         xdr_truncate_encode(xdr, starting_len);
3363         return nfserr;
3364 }
3365
3366 static __be32
3367 nfsd4_encode_remove(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_remove *remove)
3368 {
3369         struct xdr_stream *xdr = &resp->xdr;
3370         __be32 *p;
3371
3372         if (!nfserr) {
3373                 p = xdr_reserve_space(xdr, 20);
3374                 if (!p)
3375                         return nfserr_resource;
3376                 p = encode_cinfo(p, &remove->rm_cinfo);
3377         }
3378         return nfserr;
3379 }
3380
3381 static __be32
3382 nfsd4_encode_rename(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_rename *rename)
3383 {
3384         struct xdr_stream *xdr = &resp->xdr;
3385         __be32 *p;
3386
3387         if (!nfserr) {
3388                 p = xdr_reserve_space(xdr, 40);
3389                 if (!p)
3390                         return nfserr_resource;
3391                 p = encode_cinfo(p, &rename->rn_sinfo);
3392                 p = encode_cinfo(p, &rename->rn_tinfo);
3393         }
3394         return nfserr;
3395 }
3396
3397 static __be32
3398 nfsd4_do_encode_secinfo(struct xdr_stream *xdr,
3399                          __be32 nfserr, struct svc_export *exp)
3400 {
3401         u32 i, nflavs, supported;
3402         struct exp_flavor_info *flavs;
3403         struct exp_flavor_info def_flavs[2];
3404         __be32 *p, *flavorsp;
3405         static bool report = true;
3406
3407         if (nfserr)
3408                 goto out;
3409         nfserr = nfserr_resource;
3410         if (exp->ex_nflavors) {
3411                 flavs = exp->ex_flavors;
3412                 nflavs = exp->ex_nflavors;
3413         } else { /* Handling of some defaults in absence of real secinfo: */
3414                 flavs = def_flavs;
3415                 if (exp->ex_client->flavour->flavour == RPC_AUTH_UNIX) {
3416                         nflavs = 2;
3417                         flavs[0].pseudoflavor = RPC_AUTH_UNIX;
3418                         flavs[1].pseudoflavor = RPC_AUTH_NULL;
3419                 } else if (exp->ex_client->flavour->flavour == RPC_AUTH_GSS) {
3420                         nflavs = 1;
3421                         flavs[0].pseudoflavor
3422                                         = svcauth_gss_flavor(exp->ex_client);
3423                 } else {
3424                         nflavs = 1;
3425                         flavs[0].pseudoflavor
3426                                         = exp->ex_client->flavour->flavour;
3427                 }
3428         }
3429
3430         supported = 0;
3431         p = xdr_reserve_space(xdr, 4);
3432         if (!p)
3433                 goto out;
3434         flavorsp = p++;         /* to be backfilled later */
3435
3436         for (i = 0; i < nflavs; i++) {
3437                 rpc_authflavor_t pf = flavs[i].pseudoflavor;
3438                 struct rpcsec_gss_info info;
3439
3440                 if (rpcauth_get_gssinfo(pf, &info) == 0) {
3441                         supported++;
3442                         p = xdr_reserve_space(xdr, 4 + 4 +
3443                                               XDR_LEN(info.oid.len) + 4 + 4);
3444                         if (!p)
3445                                 goto out;
3446                         *p++ = cpu_to_be32(RPC_AUTH_GSS);
3447                         p = xdr_encode_opaque(p,  info.oid.data, info.oid.len);
3448                         *p++ = cpu_to_be32(info.qop);
3449                         *p++ = cpu_to_be32(info.service);
3450                 } else if (pf < RPC_AUTH_MAXFLAVOR) {
3451                         supported++;
3452                         p = xdr_reserve_space(xdr, 4);
3453                         if (!p)
3454                                 goto out;
3455                         *p++ = cpu_to_be32(pf);
3456                 } else {
3457                         if (report)
3458                                 pr_warn("NFS: SECINFO: security flavor %u "
3459                                         "is not supported\n", pf);
3460                 }
3461         }
3462
3463         if (nflavs != supported)
3464                 report = false;
3465         *flavorsp = htonl(supported);
3466         nfserr = 0;
3467 out:
3468         if (exp)
3469                 exp_put(exp);
3470         return nfserr;
3471 }
3472
3473 static __be32
3474 nfsd4_encode_secinfo(struct nfsd4_compoundres *resp, __be32 nfserr,
3475                      struct nfsd4_secinfo *secinfo)
3476 {
3477         struct xdr_stream *xdr = &resp->xdr;
3478
3479         return nfsd4_do_encode_secinfo(xdr, nfserr, secinfo->si_exp);
3480 }
3481
3482 static __be32
3483 nfsd4_encode_secinfo_no_name(struct nfsd4_compoundres *resp, __be32 nfserr,
3484                      struct nfsd4_secinfo_no_name *secinfo)
3485 {
3486         struct xdr_stream *xdr = &resp->xdr;
3487
3488         return nfsd4_do_encode_secinfo(xdr, nfserr, secinfo->sin_exp);
3489 }
3490
3491 /*
3492  * The SETATTR encode routine is special -- it always encodes a bitmap,
3493  * regardless of the error status.
3494  */
3495 static __be32
3496 nfsd4_encode_setattr(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_setattr *setattr)
3497 {
3498         struct xdr_stream *xdr = &resp->xdr;
3499         __be32 *p;
3500
3501         p = xdr_reserve_space(xdr, 16);
3502         if (!p)
3503                 return nfserr_resource;
3504         if (nfserr) {
3505                 *p++ = cpu_to_be32(3);
3506                 *p++ = cpu_to_be32(0);
3507                 *p++ = cpu_to_be32(0);
3508                 *p++ = cpu_to_be32(0);
3509         }
3510         else {
3511                 *p++ = cpu_to_be32(3);
3512                 *p++ = cpu_to_be32(setattr->sa_bmval[0]);
3513                 *p++ = cpu_to_be32(setattr->sa_bmval[1]);
3514                 *p++ = cpu_to_be32(setattr->sa_bmval[2]);
3515         }
3516         return nfserr;
3517 }
3518
3519 static __be32
3520 nfsd4_encode_setclientid(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_setclientid *scd)
3521 {
3522         struct xdr_stream *xdr = &resp->xdr;
3523         __be32 *p;
3524
3525         if (!nfserr) {
3526                 p = xdr_reserve_space(xdr, 8 + NFS4_VERIFIER_SIZE);
3527                 if (!p)
3528                         return nfserr_resource;
3529                 p = xdr_encode_opaque_fixed(p, &scd->se_clientid, 8);
3530                 p = xdr_encode_opaque_fixed(p, &scd->se_confirm,
3531                                                 NFS4_VERIFIER_SIZE);
3532         }
3533         else if (nfserr == nfserr_clid_inuse) {
3534                 p = xdr_reserve_space(xdr, 8);
3535                 if (!p)
3536                         return nfserr_resource;
3537                 *p++ = cpu_to_be32(0);
3538                 *p++ = cpu_to_be32(0);
3539         }
3540         return nfserr;
3541 }
3542
3543 static __be32
3544 nfsd4_encode_write(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_write *write)
3545 {
3546         struct xdr_stream *xdr = &resp->xdr;
3547         __be32 *p;
3548
3549         if (!nfserr) {
3550                 p = xdr_reserve_space(xdr, 16);
3551                 if (!p)
3552                         return nfserr_resource;
3553                 *p++ = cpu_to_be32(write->wr_bytes_written);
3554                 *p++ = cpu_to_be32(write->wr_how_written);
3555                 p = xdr_encode_opaque_fixed(p, write->wr_verifier.data,
3556                                                         NFS4_VERIFIER_SIZE);
3557         }
3558         return nfserr;
3559 }
3560
3561 static const u32 nfs4_minimal_spo_must_enforce[2] = {
3562         [1] = 1 << (OP_BIND_CONN_TO_SESSION - 32) |
3563               1 << (OP_EXCHANGE_ID - 32) |
3564               1 << (OP_CREATE_SESSION - 32) |
3565               1 << (OP_DESTROY_SESSION - 32) |
3566               1 << (OP_DESTROY_CLIENTID - 32)
3567 };
3568
3569 static __be32
3570 nfsd4_encode_exchange_id(struct nfsd4_compoundres *resp, __be32 nfserr,
3571                          struct nfsd4_exchange_id *exid)
3572 {
3573         struct xdr_stream *xdr = &resp->xdr;
3574         __be32 *p;
3575         char *major_id;
3576         char *server_scope;
3577         int major_id_sz;
3578         int server_scope_sz;
3579         uint64_t minor_id = 0;
3580
3581         if (nfserr)
3582                 return nfserr;
3583
3584         major_id = utsname()->nodename;
3585         major_id_sz = strlen(major_id);
3586         server_scope = utsname()->nodename;
3587         server_scope_sz = strlen(server_scope);
3588
3589         p = xdr_reserve_space(xdr,
3590                 8 /* eir_clientid */ +
3591                 4 /* eir_sequenceid */ +
3592                 4 /* eir_flags */ +
3593                 4 /* spr_how */);
3594         if (!p)
3595                 return nfserr_resource;
3596
3597         p = xdr_encode_opaque_fixed(p, &exid->clientid, 8);
3598         *p++ = cpu_to_be32(exid->seqid);
3599         *p++ = cpu_to_be32(exid->flags);
3600
3601         *p++ = cpu_to_be32(exid->spa_how);
3602
3603         switch (exid->spa_how) {
3604         case SP4_NONE:
3605                 break;
3606         case SP4_MACH_CRED:
3607                 /* spo_must_enforce, spo_must_allow */
3608                 p = xdr_reserve_space(xdr, 16);
3609                 if (!p)
3610                         return nfserr_resource;
3611
3612                 /* spo_must_enforce bitmap: */
3613                 *p++ = cpu_to_be32(2);
3614                 *p++ = cpu_to_be32(nfs4_minimal_spo_must_enforce[0]);
3615                 *p++ = cpu_to_be32(nfs4_minimal_spo_must_enforce[1]);
3616                 /* empty spo_must_allow bitmap: */
3617                 *p++ = cpu_to_be32(0);
3618
3619                 break;
3620         default:
3621                 WARN_ON_ONCE(1);
3622         }
3623
3624         p = xdr_reserve_space(xdr,
3625                 8 /* so_minor_id */ +
3626                 4 /* so_major_id.len */ +
3627                 (XDR_QUADLEN(major_id_sz) * 4) +
3628                 4 /* eir_server_scope.len */ +
3629                 (XDR_QUADLEN(server_scope_sz) * 4) +
3630                 4 /* eir_server_impl_id.count (0) */);
3631         if (!p)
3632                 return nfserr_resource;
3633
3634         /* The server_owner struct */
3635         p = xdr_encode_hyper(p, minor_id);      /* Minor id */
3636         /* major id */
3637         p = xdr_encode_opaque(p, major_id, major_id_sz);
3638
3639         /* Server scope */
3640         p = xdr_encode_opaque(p, server_scope, server_scope_sz);
3641
3642         /* Implementation id */
3643         *p++ = cpu_to_be32(0);  /* zero length nfs_impl_id4 array */
3644         return 0;
3645 }
3646
3647 static __be32
3648 nfsd4_encode_create_session(struct nfsd4_compoundres *resp, __be32 nfserr,
3649                             struct nfsd4_create_session *sess)
3650 {
3651         struct xdr_stream *xdr = &resp->xdr;
3652         __be32 *p;
3653
3654         if (nfserr)
3655                 return nfserr;
3656
3657         p = xdr_reserve_space(xdr, 24);
3658         if (!p)
3659                 return nfserr_resource;
3660         p = xdr_encode_opaque_fixed(p, sess->sessionid.data,
3661                                         NFS4_MAX_SESSIONID_LEN);
3662         *p++ = cpu_to_be32(sess->seqid);
3663         *p++ = cpu_to_be32(sess->flags);
3664
3665         p = xdr_reserve_space(xdr, 28);
3666         if (!p)
3667                 return nfserr_resource;
3668         *p++ = cpu_to_be32(0); /* headerpadsz */
3669         *p++ = cpu_to_be32(sess->fore_channel.maxreq_sz);
3670         *p++ = cpu_to_be32(sess->fore_channel.maxresp_sz);
3671         *p++ = cpu_to_be32(sess->fore_channel.maxresp_cached);
3672         *p++ = cpu_to_be32(sess->fore_channel.maxops);
3673         *p++ = cpu_to_be32(sess->fore_channel.maxreqs);
3674         *p++ = cpu_to_be32(sess->fore_channel.nr_rdma_attrs);
3675
3676         if (sess->fore_channel.nr_rdma_attrs) {
3677                 p = xdr_reserve_space(xdr, 4);
3678                 if (!p)
3679                         return nfserr_resource;
3680                 *p++ = cpu_to_be32(sess->fore_channel.rdma_attrs);
3681         }
3682
3683         p = xdr_reserve_space(xdr, 28);
3684         if (!p)
3685                 return nfserr_resource;
3686         *p++ = cpu_to_be32(0); /* headerpadsz */
3687         *p++ = cpu_to_be32(sess->back_channel.maxreq_sz);
3688         *p++ = cpu_to_be32(sess->back_channel.maxresp_sz);
3689         *p++ = cpu_to_be32(sess->back_channel.maxresp_cached);
3690         *p++ = cpu_to_be32(sess->back_channel.maxops);
3691         *p++ = cpu_to_be32(sess->back_channel.maxreqs);
3692         *p++ = cpu_to_be32(sess->back_channel.nr_rdma_attrs);
3693
3694         if (sess->back_channel.nr_rdma_attrs) {
3695                 p = xdr_reserve_space(xdr, 4);
3696                 if (!p)
3697                         return nfserr_resource;
3698                 *p++ = cpu_to_be32(sess->back_channel.rdma_attrs);
3699         }
3700         return 0;
3701 }
3702
3703 static __be32
3704 nfsd4_encode_sequence(struct nfsd4_compoundres *resp, __be32 nfserr,
3705                       struct nfsd4_sequence *seq)
3706 {
3707         struct xdr_stream *xdr = &resp->xdr;
3708         __be32 *p;
3709
3710         if (nfserr)
3711                 return nfserr;
3712
3713         p = xdr_reserve_space(xdr, NFS4_MAX_SESSIONID_LEN + 20);
3714         if (!p)
3715                 return nfserr_resource;
3716         p = xdr_encode_opaque_fixed(p, seq->sessionid.data,
3717                                         NFS4_MAX_SESSIONID_LEN);
3718         *p++ = cpu_to_be32(seq->seqid);
3719         *p++ = cpu_to_be32(seq->slotid);
3720         /* Note slotid's are numbered from zero: */
3721         *p++ = cpu_to_be32(seq->maxslots - 1); /* sr_highest_slotid */
3722         *p++ = cpu_to_be32(seq->maxslots - 1); /* sr_target_highest_slotid */
3723         *p++ = cpu_to_be32(seq->status_flags);
3724
3725         resp->cstate.data_offset = xdr->buf->len; /* DRC cache data pointer */
3726         return 0;
3727 }
3728
3729 static __be32
3730 nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, __be32 nfserr,
3731                           struct nfsd4_test_stateid *test_stateid)
3732 {
3733         struct xdr_stream *xdr = &resp->xdr;
3734         struct nfsd4_test_stateid_id *stateid, *next;
3735         __be32 *p;
3736
3737         if (nfserr)
3738                 return nfserr;
3739
3740         p = xdr_reserve_space(xdr, 4 + (4 * test_stateid->ts_num_ids));
3741         if (!p)
3742                 return nfserr_resource;
3743         *p++ = htonl(test_stateid->ts_num_ids);
3744
3745         list_for_each_entry_safe(stateid, next, &test_stateid->ts_stateid_list, ts_id_list) {
3746                 *p++ = stateid->ts_id_status;
3747         }
3748
3749         return nfserr;
3750 }
3751
3752 static __be32
3753 nfsd4_encode_noop(struct nfsd4_compoundres *resp, __be32 nfserr, void *p)
3754 {
3755         return nfserr;
3756 }
3757
3758 typedef __be32(* nfsd4_enc)(struct nfsd4_compoundres *, __be32, void *);
3759
3760 /*
3761  * Note: nfsd4_enc_ops vector is shared for v4.0 and v4.1
3762  * since we don't need to filter out obsolete ops as this is
3763  * done in the decoding phase.
3764  */
3765 static nfsd4_enc nfsd4_enc_ops[] = {
3766         [OP_ACCESS]             = (nfsd4_enc)nfsd4_encode_access,
3767         [OP_CLOSE]              = (nfsd4_enc)nfsd4_encode_close,
3768         [OP_COMMIT]             = (nfsd4_enc)nfsd4_encode_commit,
3769         [OP_CREATE]             = (nfsd4_enc)nfsd4_encode_create,
3770         [OP_DELEGPURGE]         = (nfsd4_enc)nfsd4_encode_noop,
3771         [OP_DELEGRETURN]        = (nfsd4_enc)nfsd4_encode_noop,
3772         [OP_GETATTR]            = (nfsd4_enc)nfsd4_encode_getattr,
3773         [OP_GETFH]              = (nfsd4_enc)nfsd4_encode_getfh,
3774         [OP_LINK]               = (nfsd4_enc)nfsd4_encode_link,
3775         [OP_LOCK]               = (nfsd4_enc)nfsd4_encode_lock,
3776         [OP_LOCKT]              = (nfsd4_enc)nfsd4_encode_lockt,
3777         [OP_LOCKU]              = (nfsd4_enc)nfsd4_encode_locku,
3778         [OP_LOOKUP]             = (nfsd4_enc)nfsd4_encode_noop,
3779         [OP_LOOKUPP]            = (nfsd4_enc)nfsd4_encode_noop,
3780         [OP_NVERIFY]            = (nfsd4_enc)nfsd4_encode_noop,
3781         [OP_OPEN]               = (nfsd4_enc)nfsd4_encode_open,
3782         [OP_OPENATTR]           = (nfsd4_enc)nfsd4_encode_noop,
3783         [OP_OPEN_CONFIRM]       = (nfsd4_enc)nfsd4_encode_open_confirm,
3784         [OP_OPEN_DOWNGRADE]     = (nfsd4_enc)nfsd4_encode_open_downgrade,
3785         [OP_PUTFH]              = (nfsd4_enc)nfsd4_encode_noop,
3786         [OP_PUTPUBFH]           = (nfsd4_enc)nfsd4_encode_noop,
3787         [OP_PUTROOTFH]          = (nfsd4_enc)nfsd4_encode_noop,
3788         [OP_READ]               = (nfsd4_enc)nfsd4_encode_read,
3789         [OP_READDIR]            = (nfsd4_enc)nfsd4_encode_readdir,
3790         [OP_READLINK]           = (nfsd4_enc)nfsd4_encode_readlink,
3791         [OP_REMOVE]             = (nfsd4_enc)nfsd4_encode_remove,
3792         [OP_RENAME]             = (nfsd4_enc)nfsd4_encode_rename,
3793         [OP_RENEW]              = (nfsd4_enc)nfsd4_encode_noop,
3794         [OP_RESTOREFH]          = (nfsd4_enc)nfsd4_encode_noop,
3795         [OP_SAVEFH]             = (nfsd4_enc)nfsd4_encode_noop,
3796         [OP_SECINFO]            = (nfsd4_enc)nfsd4_encode_secinfo,
3797         [OP_SETATTR]            = (nfsd4_enc)nfsd4_encode_setattr,
3798         [OP_SETCLIENTID]        = (nfsd4_enc)nfsd4_encode_setclientid,
3799         [OP_SETCLIENTID_CONFIRM] = (nfsd4_enc)nfsd4_encode_noop,
3800         [OP_VERIFY]             = (nfsd4_enc)nfsd4_encode_noop,
3801         [OP_WRITE]              = (nfsd4_enc)nfsd4_encode_write,
3802         [OP_RELEASE_LOCKOWNER]  = (nfsd4_enc)nfsd4_encode_noop,
3803
3804         /* NFSv4.1 operations */
3805         [OP_BACKCHANNEL_CTL]    = (nfsd4_enc)nfsd4_encode_noop,
3806         [OP_BIND_CONN_TO_SESSION] = (nfsd4_enc)nfsd4_encode_bind_conn_to_session,
3807         [OP_EXCHANGE_ID]        = (nfsd4_enc)nfsd4_encode_exchange_id,
3808         [OP_CREATE_SESSION]     = (nfsd4_enc)nfsd4_encode_create_session,
3809         [OP_DESTROY_SESSION]    = (nfsd4_enc)nfsd4_encode_noop,
3810         [OP_FREE_STATEID]       = (nfsd4_enc)nfsd4_encode_noop,
3811         [OP_GET_DIR_DELEGATION] = (nfsd4_enc)nfsd4_encode_noop,
3812         [OP_GETDEVICEINFO]      = (nfsd4_enc)nfsd4_encode_noop,
3813         [OP_GETDEVICELIST]      = (nfsd4_enc)nfsd4_encode_noop,
3814         [OP_LAYOUTCOMMIT]       = (nfsd4_enc)nfsd4_encode_noop,
3815         [OP_LAYOUTGET]          = (nfsd4_enc)nfsd4_encode_noop,
3816         [OP_LAYOUTRETURN]       = (nfsd4_enc)nfsd4_encode_noop,
3817         [OP_SECINFO_NO_NAME]    = (nfsd4_enc)nfsd4_encode_secinfo_no_name,
3818         [OP_SEQUENCE]           = (nfsd4_enc)nfsd4_encode_sequence,
3819         [OP_SET_SSV]            = (nfsd4_enc)nfsd4_encode_noop,
3820         [OP_TEST_STATEID]       = (nfsd4_enc)nfsd4_encode_test_stateid,
3821         [OP_WANT_DELEGATION]    = (nfsd4_enc)nfsd4_encode_noop,
3822         [OP_DESTROY_CLIENTID]   = (nfsd4_enc)nfsd4_encode_noop,
3823         [OP_RECLAIM_COMPLETE]   = (nfsd4_enc)nfsd4_encode_noop,
3824 };
3825
3826 /*
3827  * Calculate whether we still have space to encode repsize bytes.
3828  * There are two considerations:
3829  *     - For NFS versions >=4.1, the size of the reply must stay within
3830  *       session limits
3831  *     - For all NFS versions, we must stay within limited preallocated
3832  *       buffer space.
3833  *
3834  * This is called before the operation is processed, so can only provide
3835  * an upper estimate.  For some nonidempotent operations (such as
3836  * getattr), it's not necessarily a problem if that estimate is wrong,
3837  * as we can fail it after processing without significant side effects.
3838  */
3839 __be32 nfsd4_check_resp_size(struct nfsd4_compoundres *resp, u32 respsize)
3840 {
3841         struct xdr_buf *buf = &resp->rqstp->rq_res;
3842         struct nfsd4_slot *slot = resp->cstate.slot;
3843
3844         if (buf->len + respsize <= buf->buflen)
3845                 return nfs_ok;
3846         if (!nfsd4_has_session(&resp->cstate))
3847                 return nfserr_resource;
3848         if (slot->sl_flags & NFSD4_SLOT_CACHETHIS) {
3849                 WARN_ON_ONCE(1);
3850                 return nfserr_rep_too_big_to_cache;
3851         }
3852         return nfserr_rep_too_big;
3853 }
3854
3855 void
3856 nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op)
3857 {
3858         struct xdr_stream *xdr = &resp->xdr;
3859         struct nfs4_stateowner *so = resp->cstate.replay_owner;
3860         struct svc_rqst *rqstp = resp->rqstp;
3861         int post_err_offset;
3862         nfsd4_enc encoder;
3863         __be32 *p;
3864
3865         p = xdr_reserve_space(xdr, 8);
3866         if (!p) {
3867                 WARN_ON_ONCE(1);
3868                 return;
3869         }
3870         *p++ = cpu_to_be32(op->opnum);
3871         post_err_offset = xdr->buf->len;
3872
3873         if (op->opnum == OP_ILLEGAL)
3874                 goto status;
3875         BUG_ON(op->opnum < 0 || op->opnum >= ARRAY_SIZE(nfsd4_enc_ops) ||
3876                !nfsd4_enc_ops[op->opnum]);
3877         encoder = nfsd4_enc_ops[op->opnum];
3878         op->status = encoder(resp, op->status, &op->u);
3879         xdr_commit_encode(xdr);
3880
3881         /* nfsd4_check_resp_size guarantees enough room for error status */
3882         if (!op->status) {
3883                 int space_needed = 0;
3884                 if (!nfsd4_last_compound_op(rqstp))
3885                         space_needed = COMPOUND_ERR_SLACK_SPACE;
3886                 op->status = nfsd4_check_resp_size(resp, space_needed);
3887         }
3888         if (op->status == nfserr_resource && nfsd4_has_session(&resp->cstate)) {
3889                 struct nfsd4_slot *slot = resp->cstate.slot;
3890
3891                 if (slot->sl_flags & NFSD4_SLOT_CACHETHIS)
3892                         op->status = nfserr_rep_too_big_to_cache;
3893                 else
3894                         op->status = nfserr_rep_too_big;
3895         }
3896         if (op->status == nfserr_resource ||
3897             op->status == nfserr_rep_too_big ||
3898             op->status == nfserr_rep_too_big_to_cache) {
3899                 /*
3900                  * The operation may have already been encoded or
3901                  * partially encoded.  No op returns anything additional
3902                  * in the case of one of these three errors, so we can
3903                  * just truncate back to after the status.  But it's a
3904                  * bug if we had to do this on a non-idempotent op:
3905                  */
3906                 warn_on_nonidempotent_op(op);
3907                 xdr_truncate_encode(xdr, post_err_offset);
3908         }
3909         if (so) {
3910                 int len = xdr->buf->len - post_err_offset;
3911
3912                 so->so_replay.rp_status = op->status;
3913                 so->so_replay.rp_buflen = len;
3914                 read_bytes_from_xdr_buf(xdr->buf, post_err_offset,
3915                                                 so->so_replay.rp_buf, len);
3916         }
3917 status:
3918         /* Note that op->status is already in network byte order: */
3919         write_bytes_to_xdr_buf(xdr->buf, post_err_offset - 4, &op->status, 4);
3920 }
3921
3922 /* 
3923  * Encode the reply stored in the stateowner reply cache 
3924  * 
3925  * XDR note: do not encode rp->rp_buflen: the buffer contains the
3926  * previously sent already encoded operation.
3927  *
3928  * called with nfs4_lock_state() held
3929  */
3930 void
3931 nfsd4_encode_replay(struct xdr_stream *xdr, struct nfsd4_op *op)
3932 {
3933         __be32 *p;
3934         struct nfs4_replay *rp = op->replay;
3935
3936         BUG_ON(!rp);
3937
3938         p = xdr_reserve_space(xdr, 8 + rp->rp_buflen);
3939         if (!p) {
3940                 WARN_ON_ONCE(1);
3941                 return;
3942         }
3943         *p++ = cpu_to_be32(op->opnum);
3944         *p++ = rp->rp_status;  /* already xdr'ed */
3945
3946         p = xdr_encode_opaque_fixed(p, rp->rp_buf, rp->rp_buflen);
3947 }
3948
3949 int
3950 nfs4svc_encode_voidres(struct svc_rqst *rqstp, __be32 *p, void *dummy)
3951 {
3952         return xdr_ressize_check(rqstp, p);
3953 }
3954
3955 int nfsd4_release_compoundargs(void *rq, __be32 *p, void *resp)
3956 {
3957         struct svc_rqst *rqstp = rq;
3958         struct nfsd4_compoundargs *args = rqstp->rq_argp;
3959
3960         if (args->ops != args->iops) {
3961                 kfree(args->ops);
3962                 args->ops = args->iops;
3963         }
3964         kfree(args->tmpp);
3965         args->tmpp = NULL;
3966         while (args->to_free) {
3967                 struct tmpbuf *tb = args->to_free;
3968                 args->to_free = tb->next;
3969                 tb->release(tb->buf);
3970                 kfree(tb);
3971         }
3972         return 1;
3973 }
3974
3975 int
3976 nfs4svc_decode_compoundargs(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compoundargs *args)
3977 {
3978         if (rqstp->rq_arg.head[0].iov_len % 4) {
3979                 /* client is nuts */
3980                 dprintk("%s: compound not properly padded! (peeraddr=%pISc xid=0x%x)",
3981                         __func__, svc_addr(rqstp), be32_to_cpu(rqstp->rq_xid));
3982                 return 0;
3983         }
3984         args->p = p;
3985         args->end = rqstp->rq_arg.head[0].iov_base + rqstp->rq_arg.head[0].iov_len;
3986         args->pagelist = rqstp->rq_arg.pages;
3987         args->pagelen = rqstp->rq_arg.page_len;
3988         args->tmpp = NULL;
3989         args->to_free = NULL;
3990         args->ops = args->iops;
3991         args->rqstp = rqstp;
3992
3993         return !nfsd4_decode_compound(args);
3994 }
3995
3996 int
3997 nfs4svc_encode_compoundres(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compoundres *resp)
3998 {
3999         /*
4000          * All that remains is to write the tag and operation count...
4001          */
4002         struct nfsd4_compound_state *cs = &resp->cstate;
4003         struct xdr_buf *buf = resp->xdr.buf;
4004
4005         WARN_ON_ONCE(buf->len != buf->head[0].iov_len + buf->page_len +
4006                                  buf->tail[0].iov_len);
4007
4008         rqstp->rq_next_page = resp->xdr.page_ptr + 1;
4009
4010         p = resp->tagp;
4011         *p++ = htonl(resp->taglen);
4012         memcpy(p, resp->tag, resp->taglen);
4013         p += XDR_QUADLEN(resp->taglen);
4014         *p++ = htonl(resp->opcnt);
4015
4016         if (nfsd4_has_session(cs)) {
4017                 struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
4018                 struct nfs4_client *clp = cs->session->se_client;
4019                 if (cs->status != nfserr_replay_cache) {
4020                         nfsd4_store_cache_entry(resp);
4021                         cs->slot->sl_flags &= ~NFSD4_SLOT_INUSE;
4022                 }
4023                 /* Renew the clientid on success and on replay */
4024                 spin_lock(&nn->client_lock);
4025                 nfsd4_put_session(cs->session);
4026                 spin_unlock(&nn->client_lock);
4027                 put_client_renew(clp);
4028         }
4029         return 1;
4030 }
4031
4032 /*
4033  * Local variables:
4034  *  c-basic-offset: 8
4035  * End:
4036  */