Merge branch 'for-3.5-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj...
[firefly-linux-kernel-4.4.55.git] / fs / nfs / nfs2xdr.c
1 /*
2  * linux/fs/nfs/nfs2xdr.c
3  *
4  * XDR functions to encode/decode NFS RPC arguments and results.
5  *
6  * Copyright (C) 1992, 1993, 1994  Rick Sladkey
7  * Copyright (C) 1996 Olaf Kirch
8  * 04 Aug 1998  Ion Badulescu <ionut@cs.columbia.edu>
9  *              FIFO's need special handling in NFSv2
10  */
11
12 #include <linux/param.h>
13 #include <linux/time.h>
14 #include <linux/mm.h>
15 #include <linux/errno.h>
16 #include <linux/string.h>
17 #include <linux/in.h>
18 #include <linux/pagemap.h>
19 #include <linux/proc_fs.h>
20 #include <linux/sunrpc/clnt.h>
21 #include <linux/nfs.h>
22 #include <linux/nfs2.h>
23 #include <linux/nfs_fs.h>
24 #include "internal.h"
25
26 #define NFSDBG_FACILITY         NFSDBG_XDR
27
28 /* Mapping from NFS error code to "errno" error code. */
29 #define errno_NFSERR_IO         EIO
30
31 /*
32  * Declare the space requirements for NFS arguments and replies as
33  * number of 32bit-words
34  */
35 #define NFS_fhandle_sz          (8)
36 #define NFS_sattr_sz            (8)
37 #define NFS_filename_sz         (1+(NFS2_MAXNAMLEN>>2))
38 #define NFS_path_sz             (1+(NFS2_MAXPATHLEN>>2))
39 #define NFS_fattr_sz            (17)
40 #define NFS_info_sz             (5)
41 #define NFS_entry_sz            (NFS_filename_sz+3)
42
43 #define NFS_diropargs_sz        (NFS_fhandle_sz+NFS_filename_sz)
44 #define NFS_removeargs_sz       (NFS_fhandle_sz+NFS_filename_sz)
45 #define NFS_sattrargs_sz        (NFS_fhandle_sz+NFS_sattr_sz)
46 #define NFS_readlinkargs_sz     (NFS_fhandle_sz)
47 #define NFS_readargs_sz         (NFS_fhandle_sz+3)
48 #define NFS_writeargs_sz        (NFS_fhandle_sz+4)
49 #define NFS_createargs_sz       (NFS_diropargs_sz+NFS_sattr_sz)
50 #define NFS_renameargs_sz       (NFS_diropargs_sz+NFS_diropargs_sz)
51 #define NFS_linkargs_sz         (NFS_fhandle_sz+NFS_diropargs_sz)
52 #define NFS_symlinkargs_sz      (NFS_diropargs_sz+1+NFS_sattr_sz)
53 #define NFS_readdirargs_sz      (NFS_fhandle_sz+2)
54
55 #define NFS_attrstat_sz         (1+NFS_fattr_sz)
56 #define NFS_diropres_sz         (1+NFS_fhandle_sz+NFS_fattr_sz)
57 #define NFS_readlinkres_sz      (2)
58 #define NFS_readres_sz          (1+NFS_fattr_sz+1)
59 #define NFS_writeres_sz         (NFS_attrstat_sz)
60 #define NFS_stat_sz             (1)
61 #define NFS_readdirres_sz       (1)
62 #define NFS_statfsres_sz        (1+NFS_info_sz)
63
64 static int nfs_stat_to_errno(enum nfs_stat);
65
66 /*
67  * While encoding arguments, set up the reply buffer in advance to
68  * receive reply data directly into the page cache.
69  */
70 static void prepare_reply_buffer(struct rpc_rqst *req, struct page **pages,
71                                  unsigned int base, unsigned int len,
72                                  unsigned int bufsize)
73 {
74         struct rpc_auth *auth = req->rq_cred->cr_auth;
75         unsigned int replen;
76
77         replen = RPC_REPHDRSIZE + auth->au_rslack + bufsize;
78         xdr_inline_pages(&req->rq_rcv_buf, replen << 2, pages, base, len);
79 }
80
81 /*
82  * Handle decode buffer overflows out-of-line.
83  */
84 static void print_overflow_msg(const char *func, const struct xdr_stream *xdr)
85 {
86         dprintk("NFS: %s prematurely hit the end of our receive buffer. "
87                 "Remaining buffer length is %tu words.\n",
88                 func, xdr->end - xdr->p);
89 }
90
91
92 /*
93  * Encode/decode NFSv2 basic data types
94  *
95  * Basic NFSv2 data types are defined in section 2.3 of RFC 1094:
96  * "NFS: Network File System Protocol Specification".
97  *
98  * Not all basic data types have their own encoding and decoding
99  * functions.  For run-time efficiency, some data types are encoded
100  * or decoded inline.
101  */
102
103 /*
104  *      typedef opaque  nfsdata<>;
105  */
106 static int decode_nfsdata(struct xdr_stream *xdr, struct nfs_readres *result)
107 {
108         u32 recvd, count;
109         size_t hdrlen;
110         __be32 *p;
111
112         p = xdr_inline_decode(xdr, 4);
113         if (unlikely(p == NULL))
114                 goto out_overflow;
115         count = be32_to_cpup(p);
116         hdrlen = (u8 *)xdr->p - (u8 *)xdr->iov->iov_base;
117         recvd = xdr->buf->len - hdrlen;
118         if (unlikely(count > recvd))
119                 goto out_cheating;
120 out:
121         xdr_read_pages(xdr, count);
122         result->eof = 0;        /* NFSv2 does not pass EOF flag on the wire. */
123         result->count = count;
124         return count;
125 out_cheating:
126         dprintk("NFS: server cheating in read result: "
127                 "count %u > recvd %u\n", count, recvd);
128         count = recvd;
129         goto out;
130 out_overflow:
131         print_overflow_msg(__func__, xdr);
132         return -EIO;
133 }
134
135 /*
136  *      enum stat {
137  *              NFS_OK = 0,
138  *              NFSERR_PERM = 1,
139  *              NFSERR_NOENT = 2,
140  *              NFSERR_IO = 5,
141  *              NFSERR_NXIO = 6,
142  *              NFSERR_ACCES = 13,
143  *              NFSERR_EXIST = 17,
144  *              NFSERR_NODEV = 19,
145  *              NFSERR_NOTDIR = 20,
146  *              NFSERR_ISDIR = 21,
147  *              NFSERR_FBIG = 27,
148  *              NFSERR_NOSPC = 28,
149  *              NFSERR_ROFS = 30,
150  *              NFSERR_NAMETOOLONG = 63,
151  *              NFSERR_NOTEMPTY = 66,
152  *              NFSERR_DQUOT = 69,
153  *              NFSERR_STALE = 70,
154  *              NFSERR_WFLUSH = 99
155  *      };
156  */
157 static int decode_stat(struct xdr_stream *xdr, enum nfs_stat *status)
158 {
159         __be32 *p;
160
161         p = xdr_inline_decode(xdr, 4);
162         if (unlikely(p == NULL))
163                 goto out_overflow;
164         *status = be32_to_cpup(p);
165         return 0;
166 out_overflow:
167         print_overflow_msg(__func__, xdr);
168         return -EIO;
169 }
170
171 /*
172  * 2.3.2.  ftype
173  *
174  *      enum ftype {
175  *              NFNON = 0,
176  *              NFREG = 1,
177  *              NFDIR = 2,
178  *              NFBLK = 3,
179  *              NFCHR = 4,
180  *              NFLNK = 5
181  *      };
182  *
183  */
184 static __be32 *xdr_decode_ftype(__be32 *p, u32 *type)
185 {
186         *type = be32_to_cpup(p++);
187         if (unlikely(*type > NF2FIFO))
188                 *type = NFBAD;
189         return p;
190 }
191
192 /*
193  * 2.3.3.  fhandle
194  *
195  *      typedef opaque fhandle[FHSIZE];
196  */
197 static void encode_fhandle(struct xdr_stream *xdr, const struct nfs_fh *fh)
198 {
199         __be32 *p;
200
201         BUG_ON(fh->size != NFS2_FHSIZE);
202         p = xdr_reserve_space(xdr, NFS2_FHSIZE);
203         memcpy(p, fh->data, NFS2_FHSIZE);
204 }
205
206 static int decode_fhandle(struct xdr_stream *xdr, struct nfs_fh *fh)
207 {
208         __be32 *p;
209
210         p = xdr_inline_decode(xdr, NFS2_FHSIZE);
211         if (unlikely(p == NULL))
212                 goto out_overflow;
213         fh->size = NFS2_FHSIZE;
214         memcpy(fh->data, p, NFS2_FHSIZE);
215         return 0;
216 out_overflow:
217         print_overflow_msg(__func__, xdr);
218         return -EIO;
219 }
220
221 /*
222  * 2.3.4.  timeval
223  *
224  *      struct timeval {
225  *              unsigned int seconds;
226  *              unsigned int useconds;
227  *      };
228  */
229 static __be32 *xdr_encode_time(__be32 *p, const struct timespec *timep)
230 {
231         *p++ = cpu_to_be32(timep->tv_sec);
232         if (timep->tv_nsec != 0)
233                 *p++ = cpu_to_be32(timep->tv_nsec / NSEC_PER_USEC);
234         else
235                 *p++ = cpu_to_be32(0);
236         return p;
237 }
238
239 /*
240  * Passing the invalid value useconds=1000000 is a Sun convention for
241  * "set to current server time".  It's needed to make permissions checks
242  * for the "touch" program across v2 mounts to Solaris and Irix servers
243  * work correctly.  See description of sattr in section 6.1 of "NFS
244  * Illustrated" by Brent Callaghan, Addison-Wesley, ISBN 0-201-32750-5.
245  */
246 static __be32 *xdr_encode_current_server_time(__be32 *p,
247                                               const struct timespec *timep)
248 {
249         *p++ = cpu_to_be32(timep->tv_sec);
250         *p++ = cpu_to_be32(1000000);
251         return p;
252 }
253
254 static __be32 *xdr_decode_time(__be32 *p, struct timespec *timep)
255 {
256         timep->tv_sec = be32_to_cpup(p++);
257         timep->tv_nsec = be32_to_cpup(p++) * NSEC_PER_USEC;
258         return p;
259 }
260
261 /*
262  * 2.3.5.  fattr
263  *
264  *      struct fattr {
265  *              ftype           type;
266  *              unsigned int    mode;
267  *              unsigned int    nlink;
268  *              unsigned int    uid;
269  *              unsigned int    gid;
270  *              unsigned int    size;
271  *              unsigned int    blocksize;
272  *              unsigned int    rdev;
273  *              unsigned int    blocks;
274  *              unsigned int    fsid;
275  *              unsigned int    fileid;
276  *              timeval         atime;
277  *              timeval         mtime;
278  *              timeval         ctime;
279  *      };
280  *
281  */
282 static int decode_fattr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
283 {
284         u32 rdev, type;
285         __be32 *p;
286
287         p = xdr_inline_decode(xdr, NFS_fattr_sz << 2);
288         if (unlikely(p == NULL))
289                 goto out_overflow;
290
291         fattr->valid |= NFS_ATTR_FATTR_V2;
292
293         p = xdr_decode_ftype(p, &type);
294
295         fattr->mode = be32_to_cpup(p++);
296         fattr->nlink = be32_to_cpup(p++);
297         fattr->uid = be32_to_cpup(p++);
298         fattr->gid = be32_to_cpup(p++);
299         fattr->size = be32_to_cpup(p++);
300         fattr->du.nfs2.blocksize = be32_to_cpup(p++);
301
302         rdev = be32_to_cpup(p++);
303         fattr->rdev = new_decode_dev(rdev);
304         if (type == (u32)NFCHR && rdev == (u32)NFS2_FIFO_DEV) {
305                 fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO;
306                 fattr->rdev = 0;
307         }
308
309         fattr->du.nfs2.blocks = be32_to_cpup(p++);
310         fattr->fsid.major = be32_to_cpup(p++);
311         fattr->fsid.minor = 0;
312         fattr->fileid = be32_to_cpup(p++);
313
314         p = xdr_decode_time(p, &fattr->atime);
315         p = xdr_decode_time(p, &fattr->mtime);
316         xdr_decode_time(p, &fattr->ctime);
317         fattr->change_attr = nfs_timespec_to_change_attr(&fattr->ctime);
318
319         return 0;
320 out_overflow:
321         print_overflow_msg(__func__, xdr);
322         return -EIO;
323 }
324
325 /*
326  * 2.3.6.  sattr
327  *
328  *      struct sattr {
329  *              unsigned int    mode;
330  *              unsigned int    uid;
331  *              unsigned int    gid;
332  *              unsigned int    size;
333  *              timeval         atime;
334  *              timeval         mtime;
335  *      };
336  */
337
338 #define NFS2_SATTR_NOT_SET      (0xffffffff)
339
340 static __be32 *xdr_time_not_set(__be32 *p)
341 {
342         *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
343         *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
344         return p;
345 }
346
347 static void encode_sattr(struct xdr_stream *xdr, const struct iattr *attr)
348 {
349         __be32 *p;
350
351         p = xdr_reserve_space(xdr, NFS_sattr_sz << 2);
352
353         if (attr->ia_valid & ATTR_MODE)
354                 *p++ = cpu_to_be32(attr->ia_mode);
355         else
356                 *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
357         if (attr->ia_valid & ATTR_UID)
358                 *p++ = cpu_to_be32(attr->ia_uid);
359         else
360                 *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
361         if (attr->ia_valid & ATTR_GID)
362                 *p++ = cpu_to_be32(attr->ia_gid);
363         else
364                 *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
365         if (attr->ia_valid & ATTR_SIZE)
366                 *p++ = cpu_to_be32((u32)attr->ia_size);
367         else
368                 *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
369
370         if (attr->ia_valid & ATTR_ATIME_SET)
371                 p = xdr_encode_time(p, &attr->ia_atime);
372         else if (attr->ia_valid & ATTR_ATIME)
373                 p = xdr_encode_current_server_time(p, &attr->ia_atime);
374         else
375                 p = xdr_time_not_set(p);
376         if (attr->ia_valid & ATTR_MTIME_SET)
377                 xdr_encode_time(p, &attr->ia_mtime);
378         else if (attr->ia_valid & ATTR_MTIME)
379                 xdr_encode_current_server_time(p, &attr->ia_mtime);
380         else
381                 xdr_time_not_set(p);
382 }
383
384 /*
385  * 2.3.7.  filename
386  *
387  *      typedef string filename<MAXNAMLEN>;
388  */
389 static void encode_filename(struct xdr_stream *xdr,
390                             const char *name, u32 length)
391 {
392         __be32 *p;
393
394         BUG_ON(length > NFS2_MAXNAMLEN);
395         p = xdr_reserve_space(xdr, 4 + length);
396         xdr_encode_opaque(p, name, length);
397 }
398
399 static int decode_filename_inline(struct xdr_stream *xdr,
400                                   const char **name, u32 *length)
401 {
402         __be32 *p;
403         u32 count;
404
405         p = xdr_inline_decode(xdr, 4);
406         if (unlikely(p == NULL))
407                 goto out_overflow;
408         count = be32_to_cpup(p);
409         if (count > NFS3_MAXNAMLEN)
410                 goto out_nametoolong;
411         p = xdr_inline_decode(xdr, count);
412         if (unlikely(p == NULL))
413                 goto out_overflow;
414         *name = (const char *)p;
415         *length = count;
416         return 0;
417 out_nametoolong:
418         dprintk("NFS: returned filename too long: %u\n", count);
419         return -ENAMETOOLONG;
420 out_overflow:
421         print_overflow_msg(__func__, xdr);
422         return -EIO;
423 }
424
425 /*
426  * 2.3.8.  path
427  *
428  *      typedef string path<MAXPATHLEN>;
429  */
430 static void encode_path(struct xdr_stream *xdr, struct page **pages, u32 length)
431 {
432         __be32 *p;
433
434         BUG_ON(length > NFS2_MAXPATHLEN);
435         p = xdr_reserve_space(xdr, 4);
436         *p = cpu_to_be32(length);
437         xdr_write_pages(xdr, pages, 0, length);
438 }
439
440 static int decode_path(struct xdr_stream *xdr)
441 {
442         u32 length, recvd;
443         size_t hdrlen;
444         __be32 *p;
445
446         p = xdr_inline_decode(xdr, 4);
447         if (unlikely(p == NULL))
448                 goto out_overflow;
449         length = be32_to_cpup(p);
450         if (unlikely(length >= xdr->buf->page_len || length > NFS_MAXPATHLEN))
451                 goto out_size;
452         hdrlen = (u8 *)xdr->p - (u8 *)xdr->iov->iov_base;
453         recvd = xdr->buf->len - hdrlen;
454         if (unlikely(length > recvd))
455                 goto out_cheating;
456
457         xdr_read_pages(xdr, length);
458         xdr_terminate_string(xdr->buf, length);
459         return 0;
460 out_size:
461         dprintk("NFS: returned pathname too long: %u\n", length);
462         return -ENAMETOOLONG;
463 out_cheating:
464         dprintk("NFS: server cheating in pathname result: "
465                 "length %u > received %u\n", length, recvd);
466         return -EIO;
467 out_overflow:
468         print_overflow_msg(__func__, xdr);
469         return -EIO;
470 }
471
472 /*
473  * 2.3.9.  attrstat
474  *
475  *      union attrstat switch (stat status) {
476  *      case NFS_OK:
477  *              fattr attributes;
478  *      default:
479  *              void;
480  *      };
481  */
482 static int decode_attrstat(struct xdr_stream *xdr, struct nfs_fattr *result)
483 {
484         enum nfs_stat status;
485         int error;
486
487         error = decode_stat(xdr, &status);
488         if (unlikely(error))
489                 goto out;
490         if (status != NFS_OK)
491                 goto out_default;
492         error = decode_fattr(xdr, result);
493 out:
494         return error;
495 out_default:
496         return nfs_stat_to_errno(status);
497 }
498
499 /*
500  * 2.3.10.  diropargs
501  *
502  *      struct diropargs {
503  *              fhandle  dir;
504  *              filename name;
505  *      };
506  */
507 static void encode_diropargs(struct xdr_stream *xdr, const struct nfs_fh *fh,
508                              const char *name, u32 length)
509 {
510         encode_fhandle(xdr, fh);
511         encode_filename(xdr, name, length);
512 }
513
514 /*
515  * 2.3.11.  diropres
516  *
517  *      union diropres switch (stat status) {
518  *      case NFS_OK:
519  *              struct {
520  *                      fhandle file;
521  *                      fattr   attributes;
522  *              } diropok;
523  *      default:
524  *              void;
525  *      };
526  */
527 static int decode_diropok(struct xdr_stream *xdr, struct nfs_diropok *result)
528 {
529         int error;
530
531         error = decode_fhandle(xdr, result->fh);
532         if (unlikely(error))
533                 goto out;
534         error = decode_fattr(xdr, result->fattr);
535 out:
536         return error;
537 }
538
539 static int decode_diropres(struct xdr_stream *xdr, struct nfs_diropok *result)
540 {
541         enum nfs_stat status;
542         int error;
543
544         error = decode_stat(xdr, &status);
545         if (unlikely(error))
546                 goto out;
547         if (status != NFS_OK)
548                 goto out_default;
549         error = decode_diropok(xdr, result);
550 out:
551         return error;
552 out_default:
553         return nfs_stat_to_errno(status);
554 }
555
556
557 /*
558  * NFSv2 XDR encode functions
559  *
560  * NFSv2 argument types are defined in section 2.2 of RFC 1094:
561  * "NFS: Network File System Protocol Specification".
562  */
563
564 static void nfs2_xdr_enc_fhandle(struct rpc_rqst *req,
565                                  struct xdr_stream *xdr,
566                                  const struct nfs_fh *fh)
567 {
568         encode_fhandle(xdr, fh);
569 }
570
571 /*
572  * 2.2.3.  sattrargs
573  *
574  *      struct sattrargs {
575  *              fhandle file;
576  *              sattr attributes;
577  *      };
578  */
579 static void nfs2_xdr_enc_sattrargs(struct rpc_rqst *req,
580                                    struct xdr_stream *xdr,
581                                    const struct nfs_sattrargs *args)
582 {
583         encode_fhandle(xdr, args->fh);
584         encode_sattr(xdr, args->sattr);
585 }
586
587 static void nfs2_xdr_enc_diropargs(struct rpc_rqst *req,
588                                    struct xdr_stream *xdr,
589                                    const struct nfs_diropargs *args)
590 {
591         encode_diropargs(xdr, args->fh, args->name, args->len);
592 }
593
594 static void nfs2_xdr_enc_readlinkargs(struct rpc_rqst *req,
595                                       struct xdr_stream *xdr,
596                                       const struct nfs_readlinkargs *args)
597 {
598         encode_fhandle(xdr, args->fh);
599         prepare_reply_buffer(req, args->pages, args->pgbase,
600                                         args->pglen, NFS_readlinkres_sz);
601 }
602
603 /*
604  * 2.2.7.  readargs
605  *
606  *      struct readargs {
607  *              fhandle file;
608  *              unsigned offset;
609  *              unsigned count;
610  *              unsigned totalcount;
611  *      };
612  */
613 static void encode_readargs(struct xdr_stream *xdr,
614                             const struct nfs_readargs *args)
615 {
616         u32 offset = args->offset;
617         u32 count = args->count;
618         __be32 *p;
619
620         encode_fhandle(xdr, args->fh);
621
622         p = xdr_reserve_space(xdr, 4 + 4 + 4);
623         *p++ = cpu_to_be32(offset);
624         *p++ = cpu_to_be32(count);
625         *p = cpu_to_be32(count);
626 }
627
628 static void nfs2_xdr_enc_readargs(struct rpc_rqst *req,
629                                   struct xdr_stream *xdr,
630                                   const struct nfs_readargs *args)
631 {
632         encode_readargs(xdr, args);
633         prepare_reply_buffer(req, args->pages, args->pgbase,
634                                         args->count, NFS_readres_sz);
635         req->rq_rcv_buf.flags |= XDRBUF_READ;
636 }
637
638 /*
639  * 2.2.9.  writeargs
640  *
641  *      struct writeargs {
642  *              fhandle file;
643  *              unsigned beginoffset;
644  *              unsigned offset;
645  *              unsigned totalcount;
646  *              nfsdata data;
647  *      };
648  */
649 static void encode_writeargs(struct xdr_stream *xdr,
650                              const struct nfs_writeargs *args)
651 {
652         u32 offset = args->offset;
653         u32 count = args->count;
654         __be32 *p;
655
656         encode_fhandle(xdr, args->fh);
657
658         p = xdr_reserve_space(xdr, 4 + 4 + 4 + 4);
659         *p++ = cpu_to_be32(offset);
660         *p++ = cpu_to_be32(offset);
661         *p++ = cpu_to_be32(count);
662
663         /* nfsdata */
664         *p = cpu_to_be32(count);
665         xdr_write_pages(xdr, args->pages, args->pgbase, count);
666 }
667
668 static void nfs2_xdr_enc_writeargs(struct rpc_rqst *req,
669                                    struct xdr_stream *xdr,
670                                    const struct nfs_writeargs *args)
671 {
672         encode_writeargs(xdr, args);
673         xdr->buf->flags |= XDRBUF_WRITE;
674 }
675
676 /*
677  * 2.2.10.  createargs
678  *
679  *      struct createargs {
680  *              diropargs where;
681  *              sattr attributes;
682  *      };
683  */
684 static void nfs2_xdr_enc_createargs(struct rpc_rqst *req,
685                                     struct xdr_stream *xdr,
686                                     const struct nfs_createargs *args)
687 {
688         encode_diropargs(xdr, args->fh, args->name, args->len);
689         encode_sattr(xdr, args->sattr);
690 }
691
692 static void nfs2_xdr_enc_removeargs(struct rpc_rqst *req,
693                                     struct xdr_stream *xdr,
694                                     const struct nfs_removeargs *args)
695 {
696         encode_diropargs(xdr, args->fh, args->name.name, args->name.len);
697 }
698
699 /*
700  * 2.2.12.  renameargs
701  *
702  *      struct renameargs {
703  *              diropargs from;
704  *              diropargs to;
705  *      };
706  */
707 static void nfs2_xdr_enc_renameargs(struct rpc_rqst *req,
708                                     struct xdr_stream *xdr,
709                                     const struct nfs_renameargs *args)
710 {
711         const struct qstr *old = args->old_name;
712         const struct qstr *new = args->new_name;
713
714         encode_diropargs(xdr, args->old_dir, old->name, old->len);
715         encode_diropargs(xdr, args->new_dir, new->name, new->len);
716 }
717
718 /*
719  * 2.2.13.  linkargs
720  *
721  *      struct linkargs {
722  *              fhandle from;
723  *              diropargs to;
724  *      };
725  */
726 static void nfs2_xdr_enc_linkargs(struct rpc_rqst *req,
727                                   struct xdr_stream *xdr,
728                                   const struct nfs_linkargs *args)
729 {
730         encode_fhandle(xdr, args->fromfh);
731         encode_diropargs(xdr, args->tofh, args->toname, args->tolen);
732 }
733
734 /*
735  * 2.2.14.  symlinkargs
736  *
737  *      struct symlinkargs {
738  *              diropargs from;
739  *              path to;
740  *              sattr attributes;
741  *      };
742  */
743 static void nfs2_xdr_enc_symlinkargs(struct rpc_rqst *req,
744                                      struct xdr_stream *xdr,
745                                      const struct nfs_symlinkargs *args)
746 {
747         encode_diropargs(xdr, args->fromfh, args->fromname, args->fromlen);
748         encode_path(xdr, args->pages, args->pathlen);
749         encode_sattr(xdr, args->sattr);
750 }
751
752 /*
753  * 2.2.17.  readdirargs
754  *
755  *      struct readdirargs {
756  *              fhandle dir;
757  *              nfscookie cookie;
758  *              unsigned count;
759  *      };
760  */
761 static void encode_readdirargs(struct xdr_stream *xdr,
762                                const struct nfs_readdirargs *args)
763 {
764         __be32 *p;
765
766         encode_fhandle(xdr, args->fh);
767
768         p = xdr_reserve_space(xdr, 4 + 4);
769         *p++ = cpu_to_be32(args->cookie);
770         *p = cpu_to_be32(args->count);
771 }
772
773 static void nfs2_xdr_enc_readdirargs(struct rpc_rqst *req,
774                                      struct xdr_stream *xdr,
775                                      const struct nfs_readdirargs *args)
776 {
777         encode_readdirargs(xdr, args);
778         prepare_reply_buffer(req, args->pages, 0,
779                                         args->count, NFS_readdirres_sz);
780 }
781
782 /*
783  * NFSv2 XDR decode functions
784  *
785  * NFSv2 result types are defined in section 2.2 of RFC 1094:
786  * "NFS: Network File System Protocol Specification".
787  */
788
789 static int nfs2_xdr_dec_stat(struct rpc_rqst *req, struct xdr_stream *xdr,
790                              void *__unused)
791 {
792         enum nfs_stat status;
793         int error;
794
795         error = decode_stat(xdr, &status);
796         if (unlikely(error))
797                 goto out;
798         if (status != NFS_OK)
799                 goto out_default;
800 out:
801         return error;
802 out_default:
803         return nfs_stat_to_errno(status);
804 }
805
806 static int nfs2_xdr_dec_attrstat(struct rpc_rqst *req, struct xdr_stream *xdr,
807                                  struct nfs_fattr *result)
808 {
809         return decode_attrstat(xdr, result);
810 }
811
812 static int nfs2_xdr_dec_diropres(struct rpc_rqst *req, struct xdr_stream *xdr,
813                                  struct nfs_diropok *result)
814 {
815         return decode_diropres(xdr, result);
816 }
817
818 /*
819  * 2.2.6.  readlinkres
820  *
821  *      union readlinkres switch (stat status) {
822  *      case NFS_OK:
823  *              path data;
824  *      default:
825  *              void;
826  *      };
827  */
828 static int nfs2_xdr_dec_readlinkres(struct rpc_rqst *req,
829                                     struct xdr_stream *xdr, void *__unused)
830 {
831         enum nfs_stat status;
832         int error;
833
834         error = decode_stat(xdr, &status);
835         if (unlikely(error))
836                 goto out;
837         if (status != NFS_OK)
838                 goto out_default;
839         error = decode_path(xdr);
840 out:
841         return error;
842 out_default:
843         return nfs_stat_to_errno(status);
844 }
845
846 /*
847  * 2.2.7.  readres
848  *
849  *      union readres switch (stat status) {
850  *      case NFS_OK:
851  *              fattr attributes;
852  *              nfsdata data;
853  *      default:
854  *              void;
855  *      };
856  */
857 static int nfs2_xdr_dec_readres(struct rpc_rqst *req, struct xdr_stream *xdr,
858                                 struct nfs_readres *result)
859 {
860         enum nfs_stat status;
861         int error;
862
863         error = decode_stat(xdr, &status);
864         if (unlikely(error))
865                 goto out;
866         if (status != NFS_OK)
867                 goto out_default;
868         error = decode_fattr(xdr, result->fattr);
869         if (unlikely(error))
870                 goto out;
871         error = decode_nfsdata(xdr, result);
872 out:
873         return error;
874 out_default:
875         return nfs_stat_to_errno(status);
876 }
877
878 static int nfs2_xdr_dec_writeres(struct rpc_rqst *req, struct xdr_stream *xdr,
879                                  struct nfs_writeres *result)
880 {
881         /* All NFSv2 writes are "file sync" writes */
882         result->verf->committed = NFS_FILE_SYNC;
883         return decode_attrstat(xdr, result->fattr);
884 }
885
886 /**
887  * nfs2_decode_dirent - Decode a single NFSv2 directory entry stored in
888  *                      the local page cache.
889  * @xdr: XDR stream where entry resides
890  * @entry: buffer to fill in with entry data
891  * @plus: boolean indicating whether this should be a readdirplus entry
892  *
893  * Returns zero if successful, otherwise a negative errno value is
894  * returned.
895  *
896  * This function is not invoked during READDIR reply decoding, but
897  * rather whenever an application invokes the getdents(2) system call
898  * on a directory already in our cache.
899  *
900  * 2.2.17.  entry
901  *
902  *      struct entry {
903  *              unsigned        fileid;
904  *              filename        name;
905  *              nfscookie       cookie;
906  *              entry           *nextentry;
907  *      };
908  */
909 int nfs2_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
910                        int plus)
911 {
912         __be32 *p;
913         int error;
914
915         p = xdr_inline_decode(xdr, 4);
916         if (unlikely(p == NULL))
917                 goto out_overflow;
918         if (*p++ == xdr_zero) {
919                 p = xdr_inline_decode(xdr, 4);
920                 if (unlikely(p == NULL))
921                         goto out_overflow;
922                 if (*p++ == xdr_zero)
923                         return -EAGAIN;
924                 entry->eof = 1;
925                 return -EBADCOOKIE;
926         }
927
928         p = xdr_inline_decode(xdr, 4);
929         if (unlikely(p == NULL))
930                 goto out_overflow;
931         entry->ino = be32_to_cpup(p);
932
933         error = decode_filename_inline(xdr, &entry->name, &entry->len);
934         if (unlikely(error))
935                 return error;
936
937         /*
938          * The type (size and byte order) of nfscookie isn't defined in
939          * RFC 1094.  This implementation assumes that it's an XDR uint32.
940          */
941         entry->prev_cookie = entry->cookie;
942         p = xdr_inline_decode(xdr, 4);
943         if (unlikely(p == NULL))
944                 goto out_overflow;
945         entry->cookie = be32_to_cpup(p);
946
947         entry->d_type = DT_UNKNOWN;
948
949         return 0;
950
951 out_overflow:
952         print_overflow_msg(__func__, xdr);
953         return -EAGAIN;
954 }
955
956 /*
957  * 2.2.17.  readdirres
958  *
959  *      union readdirres switch (stat status) {
960  *      case NFS_OK:
961  *              struct {
962  *                      entry *entries;
963  *                      bool eof;
964  *              } readdirok;
965  *      default:
966  *              void;
967  *      };
968  *
969  * Read the directory contents into the page cache, but don't
970  * touch them.  The actual decoding is done by nfs2_decode_dirent()
971  * during subsequent nfs_readdir() calls.
972  */
973 static int decode_readdirok(struct xdr_stream *xdr)
974 {
975         u32 recvd, pglen;
976         size_t hdrlen;
977
978         pglen = xdr->buf->page_len;
979         hdrlen = (u8 *)xdr->p - (u8 *)xdr->iov->iov_base;
980         recvd = xdr->buf->len - hdrlen;
981         if (unlikely(pglen > recvd))
982                 goto out_cheating;
983 out:
984         xdr_read_pages(xdr, pglen);
985         return pglen;
986 out_cheating:
987         dprintk("NFS: server cheating in readdir result: "
988                 "pglen %u > recvd %u\n", pglen, recvd);
989         pglen = recvd;
990         goto out;
991 }
992
993 static int nfs2_xdr_dec_readdirres(struct rpc_rqst *req,
994                                    struct xdr_stream *xdr, void *__unused)
995 {
996         enum nfs_stat status;
997         int error;
998
999         error = decode_stat(xdr, &status);
1000         if (unlikely(error))
1001                 goto out;
1002         if (status != NFS_OK)
1003                 goto out_default;
1004         error = decode_readdirok(xdr);
1005 out:
1006         return error;
1007 out_default:
1008         return nfs_stat_to_errno(status);
1009 }
1010
1011 /*
1012  * 2.2.18.  statfsres
1013  *
1014  *      union statfsres (stat status) {
1015  *      case NFS_OK:
1016  *              struct {
1017  *                      unsigned tsize;
1018  *                      unsigned bsize;
1019  *                      unsigned blocks;
1020  *                      unsigned bfree;
1021  *                      unsigned bavail;
1022  *              } info;
1023  *      default:
1024  *              void;
1025  *      };
1026  */
1027 static int decode_info(struct xdr_stream *xdr, struct nfs2_fsstat *result)
1028 {
1029         __be32 *p;
1030
1031         p = xdr_inline_decode(xdr, NFS_info_sz << 2);
1032         if (unlikely(p == NULL))
1033                 goto out_overflow;
1034         result->tsize  = be32_to_cpup(p++);
1035         result->bsize  = be32_to_cpup(p++);
1036         result->blocks = be32_to_cpup(p++);
1037         result->bfree  = be32_to_cpup(p++);
1038         result->bavail = be32_to_cpup(p);
1039         return 0;
1040 out_overflow:
1041         print_overflow_msg(__func__, xdr);
1042         return -EIO;
1043 }
1044
1045 static int nfs2_xdr_dec_statfsres(struct rpc_rqst *req, struct xdr_stream *xdr,
1046                                   struct nfs2_fsstat *result)
1047 {
1048         enum nfs_stat status;
1049         int error;
1050
1051         error = decode_stat(xdr, &status);
1052         if (unlikely(error))
1053                 goto out;
1054         if (status != NFS_OK)
1055                 goto out_default;
1056         error = decode_info(xdr, result);
1057 out:
1058         return error;
1059 out_default:
1060         return nfs_stat_to_errno(status);
1061 }
1062
1063
1064 /*
1065  * We need to translate between nfs status return values and
1066  * the local errno values which may not be the same.
1067  */
1068 static const struct {
1069         int stat;
1070         int errno;
1071 } nfs_errtbl[] = {
1072         { NFS_OK,               0               },
1073         { NFSERR_PERM,          -EPERM          },
1074         { NFSERR_NOENT,         -ENOENT         },
1075         { NFSERR_IO,            -errno_NFSERR_IO},
1076         { NFSERR_NXIO,          -ENXIO          },
1077 /*      { NFSERR_EAGAIN,        -EAGAIN         }, */
1078         { NFSERR_ACCES,         -EACCES         },
1079         { NFSERR_EXIST,         -EEXIST         },
1080         { NFSERR_XDEV,          -EXDEV          },
1081         { NFSERR_NODEV,         -ENODEV         },
1082         { NFSERR_NOTDIR,        -ENOTDIR        },
1083         { NFSERR_ISDIR,         -EISDIR         },
1084         { NFSERR_INVAL,         -EINVAL         },
1085         { NFSERR_FBIG,          -EFBIG          },
1086         { NFSERR_NOSPC,         -ENOSPC         },
1087         { NFSERR_ROFS,          -EROFS          },
1088         { NFSERR_MLINK,         -EMLINK         },
1089         { NFSERR_NAMETOOLONG,   -ENAMETOOLONG   },
1090         { NFSERR_NOTEMPTY,      -ENOTEMPTY      },
1091         { NFSERR_DQUOT,         -EDQUOT         },
1092         { NFSERR_STALE,         -ESTALE         },
1093         { NFSERR_REMOTE,        -EREMOTE        },
1094 #ifdef EWFLUSH
1095         { NFSERR_WFLUSH,        -EWFLUSH        },
1096 #endif
1097         { NFSERR_BADHANDLE,     -EBADHANDLE     },
1098         { NFSERR_NOT_SYNC,      -ENOTSYNC       },
1099         { NFSERR_BAD_COOKIE,    -EBADCOOKIE     },
1100         { NFSERR_NOTSUPP,       -ENOTSUPP       },
1101         { NFSERR_TOOSMALL,      -ETOOSMALL      },
1102         { NFSERR_SERVERFAULT,   -EREMOTEIO      },
1103         { NFSERR_BADTYPE,       -EBADTYPE       },
1104         { NFSERR_JUKEBOX,       -EJUKEBOX       },
1105         { -1,                   -EIO            }
1106 };
1107
1108 /**
1109  * nfs_stat_to_errno - convert an NFS status code to a local errno
1110  * @status: NFS status code to convert
1111  *
1112  * Returns a local errno value, or -EIO if the NFS status code is
1113  * not recognized.  This function is used jointly by NFSv2 and NFSv3.
1114  */
1115 static int nfs_stat_to_errno(enum nfs_stat status)
1116 {
1117         int i;
1118
1119         for (i = 0; nfs_errtbl[i].stat != -1; i++) {
1120                 if (nfs_errtbl[i].stat == (int)status)
1121                         return nfs_errtbl[i].errno;
1122         }
1123         dprintk("NFS: Unrecognized nfs status value: %u\n", status);
1124         return nfs_errtbl[i].errno;
1125 }
1126
1127 #define PROC(proc, argtype, restype, timer)                             \
1128 [NFSPROC_##proc] = {                                                    \
1129         .p_proc     =  NFSPROC_##proc,                                  \
1130         .p_encode   =  (kxdreproc_t)nfs2_xdr_enc_##argtype,             \
1131         .p_decode   =  (kxdrdproc_t)nfs2_xdr_dec_##restype,             \
1132         .p_arglen   =  NFS_##argtype##_sz,                              \
1133         .p_replen   =  NFS_##restype##_sz,                              \
1134         .p_timer    =  timer,                                           \
1135         .p_statidx  =  NFSPROC_##proc,                                  \
1136         .p_name     =  #proc,                                           \
1137         }
1138 struct rpc_procinfo     nfs_procedures[] = {
1139         PROC(GETATTR,   fhandle,        attrstat,       1),
1140         PROC(SETATTR,   sattrargs,      attrstat,       0),
1141         PROC(LOOKUP,    diropargs,      diropres,       2),
1142         PROC(READLINK,  readlinkargs,   readlinkres,    3),
1143         PROC(READ,      readargs,       readres,        3),
1144         PROC(WRITE,     writeargs,      writeres,       4),
1145         PROC(CREATE,    createargs,     diropres,       0),
1146         PROC(REMOVE,    removeargs,     stat,           0),
1147         PROC(RENAME,    renameargs,     stat,           0),
1148         PROC(LINK,      linkargs,       stat,           0),
1149         PROC(SYMLINK,   symlinkargs,    stat,           0),
1150         PROC(MKDIR,     createargs,     diropres,       0),
1151         PROC(RMDIR,     diropargs,      stat,           0),
1152         PROC(READDIR,   readdirargs,    readdirres,     3),
1153         PROC(STATFS,    fhandle,        statfsres,      0),
1154 };
1155
1156 const struct rpc_version nfs_version2 = {
1157         .number                 = 2,
1158         .nrprocs                = ARRAY_SIZE(nfs_procedures),
1159         .procs                  = nfs_procedures
1160 };