2 * linux/fs/nfs/nfs2xdr.c
4 * XDR functions to encode/decode NFS RPC arguments and results.
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
12 #include <linux/param.h>
13 #include <linux/time.h>
15 #include <linux/errno.h>
16 #include <linux/string.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>
26 #define NFSDBG_FACILITY NFSDBG_XDR
28 /* Mapping from NFS error code to "errno" error code. */
29 #define errno_NFSERR_IO EIO
32 * Declare the space requirements for NFS arguments and replies as
33 * number of 32bit-words
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)
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)
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)
66 * While encoding arguments, set up the reply buffer in advance to
67 * receive reply data directly into the page cache.
69 static void prepare_reply_buffer(struct rpc_rqst *req, struct page **pages,
70 unsigned int base, unsigned int len,
73 struct rpc_auth *auth = req->rq_cred->cr_auth;
76 replen = RPC_REPHDRSIZE + auth->au_rslack + bufsize;
77 xdr_inline_pages(&req->rq_rcv_buf, replen << 2, pages, base, len);
81 * Handle decode buffer overflows out-of-line.
83 static void print_overflow_msg(const char *func, const struct xdr_stream *xdr)
85 dprintk("NFS: %s prematurely hit the end of our receive buffer. "
86 "Remaining buffer length is %tu words.\n",
87 func, xdr->end - xdr->p);
92 * Encode/decode NFSv2 basic data types
94 * Basic NFSv2 data types are defined in section 2.3 of RFC 1094:
95 * "NFS: Network File System Protocol Specification".
97 * Not all basic data types have their own encoding and decoding
98 * functions. For run-time efficiency, some data types are encoded
103 * typedef opaque nfsdata<>;
105 static int decode_nfsdata(struct xdr_stream *xdr, struct nfs_readres *result)
111 p = xdr_inline_decode(xdr, 4);
112 if (unlikely(p == NULL))
114 count = be32_to_cpup(p);
115 hdrlen = (u8 *)xdr->p - (u8 *)xdr->iov->iov_base;
116 recvd = xdr->buf->len - hdrlen;
117 if (unlikely(count > recvd))
120 xdr_read_pages(xdr, count);
121 result->eof = 0; /* NFSv2 does not pass EOF flag on the wire. */
122 result->count = count;
125 dprintk("NFS: server cheating in read result: "
126 "count %u > recvd %u\n", count, recvd);
130 print_overflow_msg(__func__, xdr);
144 * NFSERR_NOTDIR = 20,
149 * NFSERR_NAMETOOLONG = 63,
150 * NFSERR_NOTEMPTY = 66,
156 static int decode_stat(struct xdr_stream *xdr, enum nfs_stat *status)
160 p = xdr_inline_decode(xdr, 4);
161 if (unlikely(p == NULL))
163 *status = be32_to_cpup(p);
166 print_overflow_msg(__func__, xdr);
183 static __be32 *xdr_decode_ftype(__be32 *p, u32 *type)
185 *type = be32_to_cpup(p++);
186 if (unlikely(*type > NF2FIFO))
194 * typedef opaque fhandle[FHSIZE];
196 static void encode_fhandle(struct xdr_stream *xdr, const struct nfs_fh *fh)
200 BUG_ON(fh->size != NFS2_FHSIZE);
201 p = xdr_reserve_space(xdr, NFS2_FHSIZE);
202 memcpy(p, fh->data, NFS2_FHSIZE);
205 static int decode_fhandle(struct xdr_stream *xdr, struct nfs_fh *fh)
209 p = xdr_inline_decode(xdr, NFS2_FHSIZE);
210 if (unlikely(p == NULL))
212 fh->size = NFS2_FHSIZE;
213 memcpy(fh->data, p, NFS2_FHSIZE);
216 print_overflow_msg(__func__, xdr);
224 * unsigned int seconds;
225 * unsigned int useconds;
228 static __be32 *xdr_encode_time(__be32 *p, const struct timespec *timep)
230 *p++ = cpu_to_be32(timep->tv_sec);
231 if (timep->tv_nsec != 0)
232 *p++ = cpu_to_be32(timep->tv_nsec / NSEC_PER_USEC);
234 *p++ = cpu_to_be32(0);
239 * Passing the invalid value useconds=1000000 is a Sun convention for
240 * "set to current server time". It's needed to make permissions checks
241 * for the "touch" program across v2 mounts to Solaris and Irix servers
242 * work correctly. See description of sattr in section 6.1 of "NFS
243 * Illustrated" by Brent Callaghan, Addison-Wesley, ISBN 0-201-32750-5.
245 static __be32 *xdr_encode_current_server_time(__be32 *p,
246 const struct timespec *timep)
248 *p++ = cpu_to_be32(timep->tv_sec);
249 *p++ = cpu_to_be32(1000000);
253 static __be32 *xdr_decode_time(__be32 *p, struct timespec *timep)
255 timep->tv_sec = be32_to_cpup(p++);
256 timep->tv_nsec = be32_to_cpup(p++) * NSEC_PER_USEC;
266 * unsigned int nlink;
270 * unsigned int blocksize;
272 * unsigned int blocks;
274 * unsigned int fileid;
281 static int decode_fattr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
286 p = xdr_inline_decode(xdr, NFS_fattr_sz << 2);
287 if (unlikely(p == NULL))
290 fattr->valid |= NFS_ATTR_FATTR_V2;
292 p = xdr_decode_ftype(p, &type);
294 fattr->mode = be32_to_cpup(p++);
295 fattr->nlink = be32_to_cpup(p++);
296 fattr->uid = be32_to_cpup(p++);
297 fattr->gid = be32_to_cpup(p++);
298 fattr->size = be32_to_cpup(p++);
299 fattr->du.nfs2.blocksize = be32_to_cpup(p++);
301 rdev = be32_to_cpup(p++);
302 fattr->rdev = new_decode_dev(rdev);
303 if (type == (u32)NFCHR && rdev == (u32)NFS2_FIFO_DEV) {
304 fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO;
308 fattr->du.nfs2.blocks = be32_to_cpup(p++);
309 fattr->fsid.major = be32_to_cpup(p++);
310 fattr->fsid.minor = 0;
311 fattr->fileid = be32_to_cpup(p++);
313 p = xdr_decode_time(p, &fattr->atime);
314 p = xdr_decode_time(p, &fattr->mtime);
315 xdr_decode_time(p, &fattr->ctime);
318 print_overflow_msg(__func__, xdr);
335 #define NFS2_SATTR_NOT_SET (0xffffffff)
337 static __be32 *xdr_time_not_set(__be32 *p)
339 *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
340 *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
344 static void encode_sattr(struct xdr_stream *xdr, const struct iattr *attr)
348 p = xdr_reserve_space(xdr, NFS_sattr_sz << 2);
350 if (attr->ia_valid & ATTR_MODE)
351 *p++ = cpu_to_be32(attr->ia_mode);
353 *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
354 if (attr->ia_valid & ATTR_UID)
355 *p++ = cpu_to_be32(attr->ia_uid);
357 *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
358 if (attr->ia_valid & ATTR_GID)
359 *p++ = cpu_to_be32(attr->ia_gid);
361 *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
362 if (attr->ia_valid & ATTR_SIZE)
363 *p++ = cpu_to_be32((u32)attr->ia_size);
365 *p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
367 if (attr->ia_valid & ATTR_ATIME_SET)
368 p = xdr_encode_time(p, &attr->ia_atime);
369 else if (attr->ia_valid & ATTR_ATIME)
370 p = xdr_encode_current_server_time(p, &attr->ia_atime);
372 p = xdr_time_not_set(p);
373 if (attr->ia_valid & ATTR_MTIME_SET)
374 xdr_encode_time(p, &attr->ia_mtime);
375 else if (attr->ia_valid & ATTR_MTIME)
376 xdr_encode_current_server_time(p, &attr->ia_mtime);
384 * typedef string filename<MAXNAMLEN>;
386 static void encode_filename(struct xdr_stream *xdr,
387 const char *name, u32 length)
391 BUG_ON(length > NFS2_MAXNAMLEN);
392 p = xdr_reserve_space(xdr, 4 + length);
393 xdr_encode_opaque(p, name, length);
396 static int decode_filename_inline(struct xdr_stream *xdr,
397 const char **name, u32 *length)
402 p = xdr_inline_decode(xdr, 4);
403 if (unlikely(p == NULL))
405 count = be32_to_cpup(p);
406 if (count > NFS3_MAXNAMLEN)
407 goto out_nametoolong;
408 p = xdr_inline_decode(xdr, count);
409 if (unlikely(p == NULL))
411 *name = (const char *)p;
415 dprintk("NFS: returned filename too long: %u\n", count);
416 return -ENAMETOOLONG;
418 print_overflow_msg(__func__, xdr);
425 * typedef string path<MAXPATHLEN>;
427 static void encode_path(struct xdr_stream *xdr, struct page **pages, u32 length)
431 BUG_ON(length > NFS2_MAXPATHLEN);
432 p = xdr_reserve_space(xdr, 4);
433 *p = cpu_to_be32(length);
434 xdr_write_pages(xdr, pages, 0, length);
437 static int decode_path(struct xdr_stream *xdr)
443 p = xdr_inline_decode(xdr, 4);
444 if (unlikely(p == NULL))
446 length = be32_to_cpup(p);
447 if (unlikely(length >= xdr->buf->page_len || length > NFS_MAXPATHLEN))
449 hdrlen = (u8 *)xdr->p - (u8 *)xdr->iov->iov_base;
450 recvd = xdr->buf->len - hdrlen;
451 if (unlikely(length > recvd))
454 xdr_read_pages(xdr, length);
455 xdr_terminate_string(xdr->buf, length);
458 dprintk("NFS: returned pathname too long: %u\n", length);
459 return -ENAMETOOLONG;
461 dprintk("NFS: server cheating in pathname result: "
462 "length %u > received %u\n", length, recvd);
465 print_overflow_msg(__func__, xdr);
472 * union attrstat switch (stat status) {
479 static int decode_attrstat(struct xdr_stream *xdr, struct nfs_fattr *result)
481 enum nfs_stat status;
484 error = decode_stat(xdr, &status);
487 if (status != NFS_OK)
489 error = decode_fattr(xdr, result);
493 return nfs_stat_to_errno(status);
504 static void encode_diropargs(struct xdr_stream *xdr, const struct nfs_fh *fh,
505 const char *name, u32 length)
507 encode_fhandle(xdr, fh);
508 encode_filename(xdr, name, length);
514 * union diropres switch (stat status) {
524 static int decode_diropok(struct xdr_stream *xdr, struct nfs_diropok *result)
528 error = decode_fhandle(xdr, result->fh);
531 error = decode_fattr(xdr, result->fattr);
536 static int decode_diropres(struct xdr_stream *xdr, struct nfs_diropok *result)
538 enum nfs_stat status;
541 error = decode_stat(xdr, &status);
544 if (status != NFS_OK)
546 error = decode_diropok(xdr, result);
550 return nfs_stat_to_errno(status);
555 * NFSv2 XDR encode functions
557 * NFSv2 argument types are defined in section 2.2 of RFC 1094:
558 * "NFS: Network File System Protocol Specification".
561 static int nfs2_xdr_enc_fhandle(struct rpc_rqst *req, __be32 *p,
562 const struct nfs_fh *fh)
564 struct xdr_stream xdr;
566 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
567 encode_fhandle(&xdr, fh);
579 static int nfs2_xdr_enc_sattrargs(struct rpc_rqst *req, __be32 *p,
580 const struct nfs_sattrargs *args)
582 struct xdr_stream xdr;
584 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
585 encode_fhandle(&xdr, args->fh);
586 encode_sattr(&xdr, args->sattr);
590 static int nfs2_xdr_enc_diropargs(struct rpc_rqst *req, __be32 *p,
591 const struct nfs_diropargs *args)
593 struct xdr_stream xdr;
595 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
596 encode_diropargs(&xdr, args->fh, args->name, args->len);
600 static int nfs2_xdr_enc_readlinkargs(struct rpc_rqst *req, __be32 *p,
601 const struct nfs_readlinkargs *args)
603 struct xdr_stream xdr;
605 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
606 encode_fhandle(&xdr, args->fh);
607 prepare_reply_buffer(req, args->pages, args->pgbase,
608 args->pglen, NFS_readlinkres_sz);
619 * unsigned totalcount;
622 static void encode_readargs(struct xdr_stream *xdr,
623 const struct nfs_readargs *args)
625 u32 offset = args->offset;
626 u32 count = args->count;
629 encode_fhandle(xdr, args->fh);
631 p = xdr_reserve_space(xdr, 4 + 4 + 4);
632 *p++ = cpu_to_be32(offset);
633 *p++ = cpu_to_be32(count);
634 *p = cpu_to_be32(count);
637 static int nfs2_xdr_enc_readargs(struct rpc_rqst *req, __be32 *p,
638 const struct nfs_readargs *args)
640 struct xdr_stream xdr;
642 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
643 encode_readargs(&xdr, args);
644 prepare_reply_buffer(req, args->pages, args->pgbase,
645 args->count, NFS_readres_sz);
646 req->rq_rcv_buf.flags |= XDRBUF_READ;
655 * unsigned beginoffset;
657 * unsigned totalcount;
661 static void encode_writeargs(struct xdr_stream *xdr,
662 const struct nfs_writeargs *args)
664 u32 offset = args->offset;
665 u32 count = args->count;
668 encode_fhandle(xdr, args->fh);
670 p = xdr_reserve_space(xdr, 4 + 4 + 4 + 4);
671 *p++ = cpu_to_be32(offset);
672 *p++ = cpu_to_be32(offset);
673 *p++ = cpu_to_be32(count);
676 *p = cpu_to_be32(count);
677 xdr_write_pages(xdr, args->pages, args->pgbase, count);
680 static int nfs2_xdr_enc_writeargs(struct rpc_rqst *req, __be32 *p,
681 const struct nfs_writeargs *args)
683 struct xdr_stream xdr;
685 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
686 encode_writeargs(&xdr, args);
687 xdr.buf->flags |= XDRBUF_WRITE;
694 * struct createargs {
699 static int nfs2_xdr_enc_createargs(struct rpc_rqst *req, __be32 *p,
700 const struct nfs_createargs *args)
702 struct xdr_stream xdr;
704 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
705 encode_diropargs(&xdr, args->fh, args->name, args->len);
706 encode_sattr(&xdr, args->sattr);
710 static int nfs2_xdr_enc_removeargs(struct rpc_rqst *req, __be32 *p,
711 const struct nfs_removeargs *args)
713 struct xdr_stream xdr;
715 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
716 encode_diropargs(&xdr, args->fh, args->name.name, args->name.len);
723 * struct renameargs {
728 static int nfs2_xdr_enc_renameargs(struct rpc_rqst *req, __be32 *p,
729 const struct nfs_renameargs *args)
731 const struct qstr *old = args->old_name;
732 const struct qstr *new = args->new_name;
733 struct xdr_stream xdr;
735 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
736 encode_diropargs(&xdr, args->old_dir, old->name, old->len);
737 encode_diropargs(&xdr, args->new_dir, new->name, new->len);
749 static int nfs2_xdr_enc_linkargs(struct rpc_rqst *req, __be32 *p,
750 const struct nfs_linkargs *args)
752 struct xdr_stream xdr;
754 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
755 encode_fhandle(&xdr, args->fromfh);
756 encode_diropargs(&xdr, args->tofh, args->toname, args->tolen);
761 * 2.2.14. symlinkargs
763 * struct symlinkargs {
769 static int nfs2_xdr_enc_symlinkargs(struct rpc_rqst *req, __be32 *p,
770 const struct nfs_symlinkargs *args)
772 struct xdr_stream xdr;
774 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
775 encode_diropargs(&xdr, args->fromfh, args->fromname, args->fromlen);
776 encode_path(&xdr, args->pages, args->pathlen);
777 encode_sattr(&xdr, args->sattr);
782 * 2.2.17. readdirargs
784 * struct readdirargs {
790 static void encode_readdirargs(struct xdr_stream *xdr,
791 const struct nfs_readdirargs *args)
795 encode_fhandle(xdr, args->fh);
797 p = xdr_reserve_space(xdr, 4 + 4);
798 *p++ = cpu_to_be32(args->cookie);
799 *p = cpu_to_be32(args->count);
802 static int nfs2_xdr_enc_readdirargs(struct rpc_rqst *req, __be32 *p,
803 const struct nfs_readdirargs *args)
805 struct xdr_stream xdr;
807 xdr_init_encode(&xdr, &req->rq_snd_buf, p);
808 encode_readdirargs(&xdr, args);
809 prepare_reply_buffer(req, args->pages, 0,
810 args->count, NFS_readdirres_sz);
815 * NFSv2 XDR decode functions
817 * NFSv2 result types are defined in section 2.2 of RFC 1094:
818 * "NFS: Network File System Protocol Specification".
821 static int nfs2_xdr_dec_stat(struct rpc_rqst *req, __be32 *p,
824 struct xdr_stream xdr;
825 enum nfs_stat status;
828 xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
829 error = decode_stat(&xdr, &status);
832 if (status != NFS_OK)
837 return nfs_stat_to_errno(status);
840 static int nfs2_xdr_dec_attrstat(struct rpc_rqst *req, __be32 *p,
841 struct nfs_fattr *result)
843 struct xdr_stream xdr;
845 xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
846 return decode_attrstat(&xdr, result);
849 static int nfs2_xdr_dec_diropres(struct rpc_rqst *req, __be32 *p,
850 struct nfs_diropok *result)
852 struct xdr_stream xdr;
854 xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
855 return decode_diropres(&xdr, result);
861 * union readlinkres switch (stat status) {
868 static int nfs2_xdr_dec_readlinkres(struct rpc_rqst *req, __be32 *p,
871 struct xdr_stream xdr;
872 enum nfs_stat status;
875 xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
876 error = decode_stat(&xdr, &status);
879 if (status != NFS_OK)
881 error = decode_path(&xdr);
885 return nfs_stat_to_errno(status);
891 * union readres switch (stat status) {
899 static int nfs2_xdr_dec_readres(struct rpc_rqst *req, __be32 *p,
900 struct nfs_readres *result)
902 struct xdr_stream xdr;
903 enum nfs_stat status;
906 xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
907 error = decode_stat(&xdr, &status);
910 if (status != NFS_OK)
912 error = decode_fattr(&xdr, result->fattr);
915 error = decode_nfsdata(&xdr, result);
919 return nfs_stat_to_errno(status);
922 static int nfs2_xdr_dec_writeres(struct rpc_rqst *req, __be32 *p,
923 struct nfs_writeres *result)
925 struct xdr_stream xdr;
927 /* All NFSv2 writes are "file sync" writes */
928 result->verf->committed = NFS_FILE_SYNC;
930 xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
931 return decode_attrstat(&xdr, result->fattr);
935 * nfs2_decode_dirent - Decode a single NFSv2 directory entry stored in
936 * the local page cache.
937 * @xdr: XDR stream where entry resides
938 * @entry: buffer to fill in with entry data
939 * @plus: boolean indicating whether this should be a readdirplus entry
941 * Returns zero if successful, otherwise a negative errno value is
944 * This function is not invoked during READDIR reply decoding, but
945 * rather whenever an application invokes the getdents(2) system call
946 * on a directory already in our cache.
957 int nfs2_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
963 p = xdr_inline_decode(xdr, 4);
964 if (unlikely(p == NULL))
966 if (*p++ == xdr_zero) {
967 p = xdr_inline_decode(xdr, 4);
968 if (unlikely(p == NULL))
970 if (*p++ == xdr_zero)
976 p = xdr_inline_decode(xdr, 4);
977 if (unlikely(p == NULL))
979 entry->ino = be32_to_cpup(p);
981 error = decode_filename_inline(xdr, &entry->name, &entry->len);
986 * The type (size and byte order) of nfscookie isn't defined in
987 * RFC 1094. This implementation assumes that it's an XDR uint32.
989 entry->prev_cookie = entry->cookie;
990 p = xdr_inline_decode(xdr, 4);
991 if (unlikely(p == NULL))
993 entry->cookie = be32_to_cpup(p);
995 entry->d_type = DT_UNKNOWN;
997 /* Peek at the next entry to see if we're at EOD */
998 p = xdr_inline_peek(xdr, 4 + 4);
1001 entry->eof = (p[0] == xdr_zero) && (p[1] != xdr_zero);
1005 print_overflow_msg(__func__, xdr);
1010 * 2.2.17. readdirres
1012 * union readdirres switch (stat status) {
1022 * Read the directory contents into the page cache, but don't
1023 * touch them. The actual decoding is done by nfs2_decode_dirent()
1024 * during subsequent nfs_readdir() calls.
1026 static int decode_readdirok(struct xdr_stream *xdr)
1031 pglen = xdr->buf->page_len;
1032 hdrlen = (u8 *)xdr->p - (u8 *)xdr->iov->iov_base;
1033 recvd = xdr->buf->len - hdrlen;
1034 if (unlikely(pglen > recvd))
1037 xdr_read_pages(xdr, pglen);
1040 dprintk("NFS: server cheating in readdir result: "
1041 "pglen %u > recvd %u\n", pglen, recvd);
1046 static int nfs2_xdr_dec_readdirres(struct rpc_rqst *req, __be32 *p,
1049 struct xdr_stream xdr;
1050 enum nfs_stat status;
1053 xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
1054 error = decode_stat(&xdr, &status);
1055 if (unlikely(error))
1057 if (status != NFS_OK)
1059 error = decode_readdirok(&xdr);
1063 return nfs_stat_to_errno(status);
1069 * union statfsres (stat status) {
1082 static int decode_info(struct xdr_stream *xdr, struct nfs2_fsstat *result)
1086 p = xdr_inline_decode(xdr, NFS_info_sz << 2);
1087 if (unlikely(p == NULL))
1089 result->tsize = be32_to_cpup(p++);
1090 result->bsize = be32_to_cpup(p++);
1091 result->blocks = be32_to_cpup(p++);
1092 result->bfree = be32_to_cpup(p++);
1093 result->bavail = be32_to_cpup(p);
1096 print_overflow_msg(__func__, xdr);
1100 static int nfs2_xdr_dec_statfsres(struct rpc_rqst *req, __be32 *p,
1101 struct nfs2_fsstat *result)
1103 struct xdr_stream xdr;
1104 enum nfs_stat status;
1107 xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
1108 error = decode_stat(&xdr, &status);
1109 if (unlikely(error))
1111 if (status != NFS_OK)
1113 error = decode_info(&xdr, result);
1117 return nfs_stat_to_errno(status);
1122 * We need to translate between nfs status return values and
1123 * the local errno values which may not be the same.
1125 static const struct {
1130 { NFSERR_PERM, -EPERM },
1131 { NFSERR_NOENT, -ENOENT },
1132 { NFSERR_IO, -errno_NFSERR_IO},
1133 { NFSERR_NXIO, -ENXIO },
1134 /* { NFSERR_EAGAIN, -EAGAIN }, */
1135 { NFSERR_ACCES, -EACCES },
1136 { NFSERR_EXIST, -EEXIST },
1137 { NFSERR_XDEV, -EXDEV },
1138 { NFSERR_NODEV, -ENODEV },
1139 { NFSERR_NOTDIR, -ENOTDIR },
1140 { NFSERR_ISDIR, -EISDIR },
1141 { NFSERR_INVAL, -EINVAL },
1142 { NFSERR_FBIG, -EFBIG },
1143 { NFSERR_NOSPC, -ENOSPC },
1144 { NFSERR_ROFS, -EROFS },
1145 { NFSERR_MLINK, -EMLINK },
1146 { NFSERR_NAMETOOLONG, -ENAMETOOLONG },
1147 { NFSERR_NOTEMPTY, -ENOTEMPTY },
1148 { NFSERR_DQUOT, -EDQUOT },
1149 { NFSERR_STALE, -ESTALE },
1150 { NFSERR_REMOTE, -EREMOTE },
1152 { NFSERR_WFLUSH, -EWFLUSH },
1154 { NFSERR_BADHANDLE, -EBADHANDLE },
1155 { NFSERR_NOT_SYNC, -ENOTSYNC },
1156 { NFSERR_BAD_COOKIE, -EBADCOOKIE },
1157 { NFSERR_NOTSUPP, -ENOTSUPP },
1158 { NFSERR_TOOSMALL, -ETOOSMALL },
1159 { NFSERR_SERVERFAULT, -EREMOTEIO },
1160 { NFSERR_BADTYPE, -EBADTYPE },
1161 { NFSERR_JUKEBOX, -EJUKEBOX },
1166 * nfs_stat_to_errno - convert an NFS status code to a local errno
1167 * @status: NFS status code to convert
1169 * Returns a local errno value, or -EIO if the NFS status code is
1170 * not recognized. This function is used jointly by NFSv2 and NFSv3.
1172 int nfs_stat_to_errno(enum nfs_stat status)
1176 for (i = 0; nfs_errtbl[i].stat != -1; i++) {
1177 if (nfs_errtbl[i].stat == (int)status)
1178 return nfs_errtbl[i].errno;
1180 dprintk("NFS: Unrecognized nfs status value: %u\n", status);
1181 return nfs_errtbl[i].errno;
1184 #define PROC(proc, argtype, restype, timer) \
1185 [NFSPROC_##proc] = { \
1186 .p_proc = NFSPROC_##proc, \
1187 .p_encode = (kxdrproc_t)nfs2_xdr_enc_##argtype, \
1188 .p_decode = (kxdrproc_t)nfs2_xdr_dec_##restype, \
1189 .p_arglen = NFS_##argtype##_sz, \
1190 .p_replen = NFS_##restype##_sz, \
1192 .p_statidx = NFSPROC_##proc, \
1195 struct rpc_procinfo nfs_procedures[] = {
1196 PROC(GETATTR, fhandle, attrstat, 1),
1197 PROC(SETATTR, sattrargs, attrstat, 0),
1198 PROC(LOOKUP, diropargs, diropres, 2),
1199 PROC(READLINK, readlinkargs, readlinkres, 3),
1200 PROC(READ, readargs, readres, 3),
1201 PROC(WRITE, writeargs, writeres, 4),
1202 PROC(CREATE, createargs, diropres, 0),
1203 PROC(REMOVE, removeargs, stat, 0),
1204 PROC(RENAME, renameargs, stat, 0),
1205 PROC(LINK, linkargs, stat, 0),
1206 PROC(SYMLINK, symlinkargs, stat, 0),
1207 PROC(MKDIR, createargs, diropres, 0),
1208 PROC(RMDIR, diropargs, stat, 0),
1209 PROC(READDIR, readdirargs, readdirres, 3),
1210 PROC(STATFS, fhandle, statfsres, 0),
1213 struct rpc_version nfs_version2 = {
1215 .nrprocs = ARRAY_SIZE(nfs_procedures),
1216 .procs = nfs_procedures