1 // SPDX-License-Identifier: GPL-2.0
3 * linux/fs/nfs/nfs3xdr.c
5 * XDR functions to encode/decode NFSv3 RPC arguments and results.
7 * Copyright (C) 1996, 1997 Olaf Kirch
10 #include <linux/param.h>
11 #include <linux/time.h>
13 #include <linux/errno.h>
14 #include <linux/string.h>
16 #include <linux/pagemap.h>
17 #include <linux/proc_fs.h>
18 #include <linux/kdev_t.h>
19 #include <linux/sunrpc/clnt.h>
20 #include <linux/nfs.h>
21 #include <linux/nfs3.h>
22 #include <linux/nfs_fs.h>
23 #include <linux/nfsacl.h>
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 NFS3_fhandle_sz (1+16)
36 #define NFS3_fh_sz (NFS3_fhandle_sz) /* shorthand */
37 #define NFS3_sattr_sz (15)
38 #define NFS3_filename_sz (1+(NFS3_MAXNAMLEN>>2))
39 #define NFS3_path_sz (1+(NFS3_MAXPATHLEN>>2))
40 #define NFS3_fattr_sz (21)
41 #define NFS3_cookieverf_sz (NFS3_COOKIEVERFSIZE>>2)
42 #define NFS3_wcc_attr_sz (6)
43 #define NFS3_pre_op_attr_sz (1+NFS3_wcc_attr_sz)
44 #define NFS3_post_op_attr_sz (1+NFS3_fattr_sz)
45 #define NFS3_wcc_data_sz (NFS3_pre_op_attr_sz+NFS3_post_op_attr_sz)
46 #define NFS3_diropargs_sz (NFS3_fh_sz+NFS3_filename_sz)
48 #define NFS3_getattrargs_sz (NFS3_fh_sz)
49 #define NFS3_setattrargs_sz (NFS3_fh_sz+NFS3_sattr_sz+3)
50 #define NFS3_lookupargs_sz (NFS3_fh_sz+NFS3_filename_sz)
51 #define NFS3_accessargs_sz (NFS3_fh_sz+1)
52 #define NFS3_readlinkargs_sz (NFS3_fh_sz)
53 #define NFS3_readargs_sz (NFS3_fh_sz+3)
54 #define NFS3_writeargs_sz (NFS3_fh_sz+5)
55 #define NFS3_createargs_sz (NFS3_diropargs_sz+NFS3_sattr_sz)
56 #define NFS3_mkdirargs_sz (NFS3_diropargs_sz+NFS3_sattr_sz)
57 #define NFS3_symlinkargs_sz (NFS3_diropargs_sz+1+NFS3_sattr_sz)
58 #define NFS3_mknodargs_sz (NFS3_diropargs_sz+2+NFS3_sattr_sz)
59 #define NFS3_removeargs_sz (NFS3_fh_sz+NFS3_filename_sz)
60 #define NFS3_renameargs_sz (NFS3_diropargs_sz+NFS3_diropargs_sz)
61 #define NFS3_linkargs_sz (NFS3_fh_sz+NFS3_diropargs_sz)
62 #define NFS3_readdirargs_sz (NFS3_fh_sz+NFS3_cookieverf_sz+3)
63 #define NFS3_readdirplusargs_sz (NFS3_fh_sz+NFS3_cookieverf_sz+4)
64 #define NFS3_commitargs_sz (NFS3_fh_sz+3)
66 #define NFS3_getattrres_sz (1+NFS3_fattr_sz)
67 #define NFS3_setattrres_sz (1+NFS3_wcc_data_sz)
68 #define NFS3_removeres_sz (NFS3_setattrres_sz)
69 #define NFS3_lookupres_sz (1+NFS3_fh_sz+(2 * NFS3_post_op_attr_sz))
70 #define NFS3_accessres_sz (1+NFS3_post_op_attr_sz+1)
71 #define NFS3_readlinkres_sz (1+NFS3_post_op_attr_sz+1)
72 #define NFS3_readres_sz (1+NFS3_post_op_attr_sz+3)
73 #define NFS3_writeres_sz (1+NFS3_wcc_data_sz+4)
74 #define NFS3_createres_sz (1+NFS3_fh_sz+NFS3_post_op_attr_sz+NFS3_wcc_data_sz)
75 #define NFS3_renameres_sz (1+(2 * NFS3_wcc_data_sz))
76 #define NFS3_linkres_sz (1+NFS3_post_op_attr_sz+NFS3_wcc_data_sz)
77 #define NFS3_readdirres_sz (1+NFS3_post_op_attr_sz+2)
78 #define NFS3_fsstatres_sz (1+NFS3_post_op_attr_sz+13)
79 #define NFS3_fsinfores_sz (1+NFS3_post_op_attr_sz+12)
80 #define NFS3_pathconfres_sz (1+NFS3_post_op_attr_sz+6)
81 #define NFS3_commitres_sz (1+NFS3_wcc_data_sz+2)
83 #define ACL3_getaclargs_sz (NFS3_fh_sz+1)
84 #define ACL3_setaclargs_sz (NFS3_fh_sz+1+ \
85 XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
86 #define ACL3_getaclres_sz (1+NFS3_post_op_attr_sz+1+ \
87 XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
88 #define ACL3_setaclres_sz (1+NFS3_post_op_attr_sz)
90 static int nfs3_stat_to_errno(enum nfs_stat
);
93 * Map file type to S_IFMT bits
95 static const umode_t nfs_type2fmt
[] = {
102 [NF3SOCK
] = S_IFSOCK
,
107 * While encoding arguments, set up the reply buffer in advance to
108 * receive reply data directly into the page cache.
110 static void prepare_reply_buffer(struct rpc_rqst
*req
, struct page
**pages
,
111 unsigned int base
, unsigned int len
,
112 unsigned int bufsize
)
114 struct rpc_auth
*auth
= req
->rq_cred
->cr_auth
;
117 replen
= RPC_REPHDRSIZE
+ auth
->au_rslack
+ bufsize
;
118 xdr_inline_pages(&req
->rq_rcv_buf
, replen
<< 2, pages
, base
, len
);
122 * Handle decode buffer overflows out-of-line.
124 static void print_overflow_msg(const char *func
, const struct xdr_stream
*xdr
)
126 dprintk("NFS: %s prematurely hit the end of our receive buffer. "
127 "Remaining buffer length is %tu words.\n",
128 func
, xdr
->end
- xdr
->p
);
133 * Encode/decode NFSv3 basic data types
135 * Basic NFSv3 data types are defined in section 2.5 of RFC 1813:
136 * "NFS Version 3 Protocol Specification".
138 * Not all basic data types have their own encoding and decoding
139 * functions. For run-time efficiency, some data types are encoded
143 static void encode_uint32(struct xdr_stream
*xdr
, u32 value
)
145 __be32
*p
= xdr_reserve_space(xdr
, 4);
146 *p
= cpu_to_be32(value
);
149 static int decode_uint32(struct xdr_stream
*xdr
, u32
*value
)
153 p
= xdr_inline_decode(xdr
, 4);
154 if (unlikely(p
== NULL
))
156 *value
= be32_to_cpup(p
);
159 print_overflow_msg(__func__
, xdr
);
163 static int decode_uint64(struct xdr_stream
*xdr
, u64
*value
)
167 p
= xdr_inline_decode(xdr
, 8);
168 if (unlikely(p
== NULL
))
170 xdr_decode_hyper(p
, value
);
173 print_overflow_msg(__func__
, xdr
);
180 * typedef uint64 fileid3;
182 static __be32
*xdr_decode_fileid3(__be32
*p
, u64
*fileid
)
184 return xdr_decode_hyper(p
, fileid
);
187 static int decode_fileid3(struct xdr_stream
*xdr
, u64
*fileid
)
189 return decode_uint64(xdr
, fileid
);
195 * typedef string filename3<>;
197 static void encode_filename3(struct xdr_stream
*xdr
,
198 const char *name
, u32 length
)
202 WARN_ON_ONCE(length
> NFS3_MAXNAMLEN
);
203 p
= xdr_reserve_space(xdr
, 4 + length
);
204 xdr_encode_opaque(p
, name
, length
);
207 static int decode_inline_filename3(struct xdr_stream
*xdr
,
208 const char **name
, u32
*length
)
213 p
= xdr_inline_decode(xdr
, 4);
214 if (unlikely(p
== NULL
))
216 count
= be32_to_cpup(p
);
217 if (count
> NFS3_MAXNAMLEN
)
218 goto out_nametoolong
;
219 p
= xdr_inline_decode(xdr
, count
);
220 if (unlikely(p
== NULL
))
222 *name
= (const char *)p
;
227 dprintk("NFS: returned filename too long: %u\n", count
);
228 return -ENAMETOOLONG
;
230 print_overflow_msg(__func__
, xdr
);
237 * typedef string nfspath3<>;
239 static void encode_nfspath3(struct xdr_stream
*xdr
, struct page
**pages
,
242 encode_uint32(xdr
, length
);
243 xdr_write_pages(xdr
, pages
, 0, length
);
246 static int decode_nfspath3(struct xdr_stream
*xdr
)
251 p
= xdr_inline_decode(xdr
, 4);
252 if (unlikely(p
== NULL
))
254 count
= be32_to_cpup(p
);
255 if (unlikely(count
>= xdr
->buf
->page_len
|| count
> NFS3_MAXPATHLEN
))
256 goto out_nametoolong
;
257 recvd
= xdr_read_pages(xdr
, count
);
258 if (unlikely(count
> recvd
))
260 xdr_terminate_string(xdr
->buf
, count
);
264 dprintk("NFS: returned pathname too long: %u\n", count
);
265 return -ENAMETOOLONG
;
267 dprintk("NFS: server cheating in pathname result: "
268 "count %u > recvd %u\n", count
, recvd
);
271 print_overflow_msg(__func__
, xdr
);
278 * typedef uint64 cookie3
280 static __be32
*xdr_encode_cookie3(__be32
*p
, u64 cookie
)
282 return xdr_encode_hyper(p
, cookie
);
285 static int decode_cookie3(struct xdr_stream
*xdr
, u64
*cookie
)
287 return decode_uint64(xdr
, cookie
);
293 * typedef opaque cookieverf3[NFS3_COOKIEVERFSIZE];
295 static __be32
*xdr_encode_cookieverf3(__be32
*p
, const __be32
*verifier
)
297 memcpy(p
, verifier
, NFS3_COOKIEVERFSIZE
);
298 return p
+ XDR_QUADLEN(NFS3_COOKIEVERFSIZE
);
301 static int decode_cookieverf3(struct xdr_stream
*xdr
, __be32
*verifier
)
305 p
= xdr_inline_decode(xdr
, NFS3_COOKIEVERFSIZE
);
306 if (unlikely(p
== NULL
))
308 memcpy(verifier
, p
, NFS3_COOKIEVERFSIZE
);
311 print_overflow_msg(__func__
, xdr
);
318 * typedef opaque createverf3[NFS3_CREATEVERFSIZE];
320 static void encode_createverf3(struct xdr_stream
*xdr
, const __be32
*verifier
)
324 p
= xdr_reserve_space(xdr
, NFS3_CREATEVERFSIZE
);
325 memcpy(p
, verifier
, NFS3_CREATEVERFSIZE
);
328 static int decode_writeverf3(struct xdr_stream
*xdr
, struct nfs_write_verifier
*verifier
)
332 p
= xdr_inline_decode(xdr
, NFS3_WRITEVERFSIZE
);
333 if (unlikely(p
== NULL
))
335 memcpy(verifier
->data
, p
, NFS3_WRITEVERFSIZE
);
338 print_overflow_msg(__func__
, xdr
);
345 * typedef uint64 size3;
347 static __be32
*xdr_decode_size3(__be32
*p
, u64
*size
)
349 return xdr_decode_hyper(p
, size
);
360 #define NFS3_OK NFS_OK
362 static int decode_nfsstat3(struct xdr_stream
*xdr
, enum nfs_stat
*status
)
366 p
= xdr_inline_decode(xdr
, 4);
367 if (unlikely(p
== NULL
))
369 *status
= be32_to_cpup(p
);
372 print_overflow_msg(__func__
, xdr
);
389 static void encode_ftype3(struct xdr_stream
*xdr
, const u32 type
)
391 encode_uint32(xdr
, type
);
394 static __be32
*xdr_decode_ftype3(__be32
*p
, umode_t
*mode
)
398 type
= be32_to_cpup(p
++);
401 *mode
= nfs_type2fmt
[type
];
413 static void encode_specdata3(struct xdr_stream
*xdr
, const dev_t rdev
)
417 p
= xdr_reserve_space(xdr
, 8);
418 *p
++ = cpu_to_be32(MAJOR(rdev
));
419 *p
= cpu_to_be32(MINOR(rdev
));
422 static __be32
*xdr_decode_specdata3(__be32
*p
, dev_t
*rdev
)
424 unsigned int major
, minor
;
426 major
= be32_to_cpup(p
++);
427 minor
= be32_to_cpup(p
++);
428 *rdev
= MKDEV(major
, minor
);
429 if (MAJOR(*rdev
) != major
|| MINOR(*rdev
) != minor
)
438 * opaque data<NFS3_FHSIZE>;
441 static void encode_nfs_fh3(struct xdr_stream
*xdr
, const struct nfs_fh
*fh
)
445 WARN_ON_ONCE(fh
->size
> NFS3_FHSIZE
);
446 p
= xdr_reserve_space(xdr
, 4 + fh
->size
);
447 xdr_encode_opaque(p
, fh
->data
, fh
->size
);
450 static int decode_nfs_fh3(struct xdr_stream
*xdr
, struct nfs_fh
*fh
)
455 p
= xdr_inline_decode(xdr
, 4);
456 if (unlikely(p
== NULL
))
458 length
= be32_to_cpup(p
++);
459 if (unlikely(length
> NFS3_FHSIZE
))
461 p
= xdr_inline_decode(xdr
, length
);
462 if (unlikely(p
== NULL
))
465 memcpy(fh
->data
, p
, length
);
468 dprintk("NFS: file handle size (%u) too big\n", length
);
471 print_overflow_msg(__func__
, xdr
);
475 static void zero_nfs_fh3(struct nfs_fh
*fh
)
477 memset(fh
, 0, sizeof(*fh
));
488 static __be32
*xdr_encode_nfstime3(__be32
*p
, const struct timespec
*timep
)
490 *p
++ = cpu_to_be32(timep
->tv_sec
);
491 *p
++ = cpu_to_be32(timep
->tv_nsec
);
495 static __be32
*xdr_decode_nfstime3(__be32
*p
, struct timespec
*timep
)
497 timep
->tv_sec
= be32_to_cpup(p
++);
498 timep
->tv_nsec
= be32_to_cpup(p
++);
507 * SET_TO_SERVER_TIME = 1,
508 * SET_TO_CLIENT_TIME = 2
511 * union set_mode3 switch (bool set_it) {
518 * union set_uid3 switch (bool set_it) {
525 * union set_gid3 switch (bool set_it) {
532 * union set_size3 switch (bool set_it) {
539 * union set_atime switch (time_how set_it) {
540 * case SET_TO_CLIENT_TIME:
546 * union set_mtime switch (time_how set_it) {
547 * case SET_TO_CLIENT_TIME:
562 static void encode_sattr3(struct xdr_stream
*xdr
, const struct iattr
*attr
)
569 * In order to make only a single xdr_reserve_space() call,
570 * pre-compute the total number of bytes to be reserved.
571 * Six boolean values, one for each set_foo field, are always
572 * present in the encoded result, so start there.
575 if (attr
->ia_valid
& ATTR_MODE
)
577 if (attr
->ia_valid
& ATTR_UID
)
579 if (attr
->ia_valid
& ATTR_GID
)
581 if (attr
->ia_valid
& ATTR_SIZE
)
583 if (attr
->ia_valid
& ATTR_ATIME_SET
)
585 if (attr
->ia_valid
& ATTR_MTIME_SET
)
587 p
= xdr_reserve_space(xdr
, nbytes
);
589 if (attr
->ia_valid
& ATTR_MODE
) {
591 *p
++ = cpu_to_be32(attr
->ia_mode
& S_IALLUGO
);
595 if (attr
->ia_valid
& ATTR_UID
) {
597 *p
++ = cpu_to_be32(from_kuid(&init_user_ns
, attr
->ia_uid
));
601 if (attr
->ia_valid
& ATTR_GID
) {
603 *p
++ = cpu_to_be32(from_kgid(&init_user_ns
, attr
->ia_gid
));
607 if (attr
->ia_valid
& ATTR_SIZE
) {
609 p
= xdr_encode_hyper(p
, (u64
)attr
->ia_size
);
613 if (attr
->ia_valid
& ATTR_ATIME_SET
) {
616 ts
= timespec64_to_timespec(attr
->ia_atime
);
617 p
= xdr_encode_nfstime3(p
, &ts
);
618 } else if (attr
->ia_valid
& ATTR_ATIME
) {
623 if (attr
->ia_valid
& ATTR_MTIME_SET
) {
625 ts
= timespec64_to_timespec(attr
->ia_mtime
);
626 xdr_encode_nfstime3(p
, &ts
);
627 } else if (attr
->ia_valid
& ATTR_MTIME
) {
652 static int decode_fattr3(struct xdr_stream
*xdr
, struct nfs_fattr
*fattr
)
657 p
= xdr_inline_decode(xdr
, NFS3_fattr_sz
<< 2);
658 if (unlikely(p
== NULL
))
661 p
= xdr_decode_ftype3(p
, &fmode
);
663 fattr
->mode
= (be32_to_cpup(p
++) & ~S_IFMT
) | fmode
;
664 fattr
->nlink
= be32_to_cpup(p
++);
665 fattr
->uid
= make_kuid(&init_user_ns
, be32_to_cpup(p
++));
666 if (!uid_valid(fattr
->uid
))
668 fattr
->gid
= make_kgid(&init_user_ns
, be32_to_cpup(p
++));
669 if (!gid_valid(fattr
->gid
))
672 p
= xdr_decode_size3(p
, &fattr
->size
);
673 p
= xdr_decode_size3(p
, &fattr
->du
.nfs3
.used
);
674 p
= xdr_decode_specdata3(p
, &fattr
->rdev
);
676 p
= xdr_decode_hyper(p
, &fattr
->fsid
.major
);
677 fattr
->fsid
.minor
= 0;
679 p
= xdr_decode_fileid3(p
, &fattr
->fileid
);
680 p
= xdr_decode_nfstime3(p
, &fattr
->atime
);
681 p
= xdr_decode_nfstime3(p
, &fattr
->mtime
);
682 xdr_decode_nfstime3(p
, &fattr
->ctime
);
683 fattr
->change_attr
= nfs_timespec_to_change_attr(&fattr
->ctime
);
685 fattr
->valid
|= NFS_ATTR_FATTR_V3
;
688 dprintk("NFS: returned invalid uid\n");
691 dprintk("NFS: returned invalid gid\n");
694 print_overflow_msg(__func__
, xdr
);
701 * union post_op_attr switch (bool attributes_follow) {
708 static int decode_post_op_attr(struct xdr_stream
*xdr
, struct nfs_fattr
*fattr
)
712 p
= xdr_inline_decode(xdr
, 4);
713 if (unlikely(p
== NULL
))
716 return decode_fattr3(xdr
, fattr
);
719 print_overflow_msg(__func__
, xdr
);
731 static int decode_wcc_attr(struct xdr_stream
*xdr
, struct nfs_fattr
*fattr
)
735 p
= xdr_inline_decode(xdr
, NFS3_wcc_attr_sz
<< 2);
736 if (unlikely(p
== NULL
))
739 fattr
->valid
|= NFS_ATTR_FATTR_PRESIZE
740 | NFS_ATTR_FATTR_PRECHANGE
741 | NFS_ATTR_FATTR_PREMTIME
742 | NFS_ATTR_FATTR_PRECTIME
;
744 p
= xdr_decode_size3(p
, &fattr
->pre_size
);
745 p
= xdr_decode_nfstime3(p
, &fattr
->pre_mtime
);
746 xdr_decode_nfstime3(p
, &fattr
->pre_ctime
);
747 fattr
->pre_change_attr
= nfs_timespec_to_change_attr(&fattr
->pre_ctime
);
751 print_overflow_msg(__func__
, xdr
);
757 * union pre_op_attr switch (bool attributes_follow) {
759 * wcc_attr attributes;
767 * pre_op_attr before;
768 * post_op_attr after;
771 static int decode_pre_op_attr(struct xdr_stream
*xdr
, struct nfs_fattr
*fattr
)
775 p
= xdr_inline_decode(xdr
, 4);
776 if (unlikely(p
== NULL
))
779 return decode_wcc_attr(xdr
, fattr
);
782 print_overflow_msg(__func__
, xdr
);
786 static int decode_wcc_data(struct xdr_stream
*xdr
, struct nfs_fattr
*fattr
)
790 error
= decode_pre_op_attr(xdr
, fattr
);
793 error
= decode_post_op_attr(xdr
, fattr
);
801 * union post_op_fh3 switch (bool handle_follows) {
808 static int decode_post_op_fh3(struct xdr_stream
*xdr
, struct nfs_fh
*fh
)
810 __be32
*p
= xdr_inline_decode(xdr
, 4);
811 if (unlikely(p
== NULL
))
814 return decode_nfs_fh3(xdr
, fh
);
818 print_overflow_msg(__func__
, xdr
);
825 * struct diropargs3 {
830 static void encode_diropargs3(struct xdr_stream
*xdr
, const struct nfs_fh
*fh
,
831 const char *name
, u32 length
)
833 encode_nfs_fh3(xdr
, fh
);
834 encode_filename3(xdr
, name
, length
);
839 * NFSv3 XDR encode functions
841 * NFSv3 argument types are defined in section 3.3 of RFC 1813:
842 * "NFS Version 3 Protocol Specification".
848 * struct GETATTR3args {
852 static void nfs3_xdr_enc_getattr3args(struct rpc_rqst
*req
,
853 struct xdr_stream
*xdr
,
856 const struct nfs_fh
*fh
= data
;
858 encode_nfs_fh3(xdr
, fh
);
864 * union sattrguard3 switch (bool check) {
866 * nfstime3 obj_ctime;
871 * struct SETATTR3args {
873 * sattr3 new_attributes;
877 static void encode_sattrguard3(struct xdr_stream
*xdr
,
878 const struct nfs3_sattrargs
*args
)
883 p
= xdr_reserve_space(xdr
, 4 + 8);
885 xdr_encode_nfstime3(p
, &args
->guardtime
);
887 p
= xdr_reserve_space(xdr
, 4);
892 static void nfs3_xdr_enc_setattr3args(struct rpc_rqst
*req
,
893 struct xdr_stream
*xdr
,
896 const struct nfs3_sattrargs
*args
= data
;
897 encode_nfs_fh3(xdr
, args
->fh
);
898 encode_sattr3(xdr
, args
->sattr
);
899 encode_sattrguard3(xdr
, args
);
905 * struct LOOKUP3args {
909 static void nfs3_xdr_enc_lookup3args(struct rpc_rqst
*req
,
910 struct xdr_stream
*xdr
,
913 const struct nfs3_diropargs
*args
= data
;
915 encode_diropargs3(xdr
, args
->fh
, args
->name
, args
->len
);
921 * struct ACCESS3args {
926 static void encode_access3args(struct xdr_stream
*xdr
,
927 const struct nfs3_accessargs
*args
)
929 encode_nfs_fh3(xdr
, args
->fh
);
930 encode_uint32(xdr
, args
->access
);
933 static void nfs3_xdr_enc_access3args(struct rpc_rqst
*req
,
934 struct xdr_stream
*xdr
,
937 const struct nfs3_accessargs
*args
= data
;
939 encode_access3args(xdr
, args
);
943 * 3.3.5 READLINK3args
945 * struct READLINK3args {
949 static void nfs3_xdr_enc_readlink3args(struct rpc_rqst
*req
,
950 struct xdr_stream
*xdr
,
953 const struct nfs3_readlinkargs
*args
= data
;
955 encode_nfs_fh3(xdr
, args
->fh
);
956 prepare_reply_buffer(req
, args
->pages
, args
->pgbase
,
957 args
->pglen
, NFS3_readlinkres_sz
);
969 static void encode_read3args(struct xdr_stream
*xdr
,
970 const struct nfs_pgio_args
*args
)
974 encode_nfs_fh3(xdr
, args
->fh
);
976 p
= xdr_reserve_space(xdr
, 8 + 4);
977 p
= xdr_encode_hyper(p
, args
->offset
);
978 *p
= cpu_to_be32(args
->count
);
981 static void nfs3_xdr_enc_read3args(struct rpc_rqst
*req
,
982 struct xdr_stream
*xdr
,
985 const struct nfs_pgio_args
*args
= data
;
986 unsigned int replen
= args
->replen
? args
->replen
: NFS3_readres_sz
;
988 encode_read3args(xdr
, args
);
989 prepare_reply_buffer(req
, args
->pages
, args
->pgbase
,
990 args
->count
, replen
);
991 req
->rq_rcv_buf
.flags
|= XDRBUF_READ
;
1003 * struct WRITE3args {
1007 * stable_how stable;
1011 static void encode_write3args(struct xdr_stream
*xdr
,
1012 const struct nfs_pgio_args
*args
)
1016 encode_nfs_fh3(xdr
, args
->fh
);
1018 p
= xdr_reserve_space(xdr
, 8 + 4 + 4 + 4);
1019 p
= xdr_encode_hyper(p
, args
->offset
);
1020 *p
++ = cpu_to_be32(args
->count
);
1021 *p
++ = cpu_to_be32(args
->stable
);
1022 *p
= cpu_to_be32(args
->count
);
1023 xdr_write_pages(xdr
, args
->pages
, args
->pgbase
, args
->count
);
1026 static void nfs3_xdr_enc_write3args(struct rpc_rqst
*req
,
1027 struct xdr_stream
*xdr
,
1030 const struct nfs_pgio_args
*args
= data
;
1032 encode_write3args(xdr
, args
);
1033 xdr
->buf
->flags
|= XDRBUF_WRITE
;
1039 * enum createmode3 {
1045 * union createhow3 switch (createmode3 mode) {
1048 * sattr3 obj_attributes;
1053 * struct CREATE3args {
1058 static void encode_createhow3(struct xdr_stream
*xdr
,
1059 const struct nfs3_createargs
*args
)
1061 encode_uint32(xdr
, args
->createmode
);
1062 switch (args
->createmode
) {
1063 case NFS3_CREATE_UNCHECKED
:
1064 case NFS3_CREATE_GUARDED
:
1065 encode_sattr3(xdr
, args
->sattr
);
1067 case NFS3_CREATE_EXCLUSIVE
:
1068 encode_createverf3(xdr
, args
->verifier
);
1075 static void nfs3_xdr_enc_create3args(struct rpc_rqst
*req
,
1076 struct xdr_stream
*xdr
,
1079 const struct nfs3_createargs
*args
= data
;
1081 encode_diropargs3(xdr
, args
->fh
, args
->name
, args
->len
);
1082 encode_createhow3(xdr
, args
);
1088 * struct MKDIR3args {
1090 * sattr3 attributes;
1093 static void nfs3_xdr_enc_mkdir3args(struct rpc_rqst
*req
,
1094 struct xdr_stream
*xdr
,
1097 const struct nfs3_mkdirargs
*args
= data
;
1099 encode_diropargs3(xdr
, args
->fh
, args
->name
, args
->len
);
1100 encode_sattr3(xdr
, args
->sattr
);
1104 * 3.3.10 SYMLINK3args
1106 * struct symlinkdata3 {
1107 * sattr3 symlink_attributes;
1108 * nfspath3 symlink_data;
1111 * struct SYMLINK3args {
1113 * symlinkdata3 symlink;
1116 static void encode_symlinkdata3(struct xdr_stream
*xdr
,
1119 const struct nfs3_symlinkargs
*args
= data
;
1121 encode_sattr3(xdr
, args
->sattr
);
1122 encode_nfspath3(xdr
, args
->pages
, args
->pathlen
);
1125 static void nfs3_xdr_enc_symlink3args(struct rpc_rqst
*req
,
1126 struct xdr_stream
*xdr
,
1129 const struct nfs3_symlinkargs
*args
= data
;
1131 encode_diropargs3(xdr
, args
->fromfh
, args
->fromname
, args
->fromlen
);
1132 encode_symlinkdata3(xdr
, args
);
1133 xdr
->buf
->flags
|= XDRBUF_WRITE
;
1139 * struct devicedata3 {
1140 * sattr3 dev_attributes;
1144 * union mknoddata3 switch (ftype3 type) {
1147 * devicedata3 device;
1150 * sattr3 pipe_attributes;
1155 * struct MKNOD3args {
1160 static void encode_devicedata3(struct xdr_stream
*xdr
,
1161 const struct nfs3_mknodargs
*args
)
1163 encode_sattr3(xdr
, args
->sattr
);
1164 encode_specdata3(xdr
, args
->rdev
);
1167 static void encode_mknoddata3(struct xdr_stream
*xdr
,
1168 const struct nfs3_mknodargs
*args
)
1170 encode_ftype3(xdr
, args
->type
);
1171 switch (args
->type
) {
1174 encode_devicedata3(xdr
, args
);
1178 encode_sattr3(xdr
, args
->sattr
);
1188 static void nfs3_xdr_enc_mknod3args(struct rpc_rqst
*req
,
1189 struct xdr_stream
*xdr
,
1192 const struct nfs3_mknodargs
*args
= data
;
1194 encode_diropargs3(xdr
, args
->fh
, args
->name
, args
->len
);
1195 encode_mknoddata3(xdr
, args
);
1199 * 3.3.12 REMOVE3args
1201 * struct REMOVE3args {
1202 * diropargs3 object;
1205 static void nfs3_xdr_enc_remove3args(struct rpc_rqst
*req
,
1206 struct xdr_stream
*xdr
,
1209 const struct nfs_removeargs
*args
= data
;
1211 encode_diropargs3(xdr
, args
->fh
, args
->name
.name
, args
->name
.len
);
1215 * 3.3.14 RENAME3args
1217 * struct RENAME3args {
1222 static void nfs3_xdr_enc_rename3args(struct rpc_rqst
*req
,
1223 struct xdr_stream
*xdr
,
1226 const struct nfs_renameargs
*args
= data
;
1227 const struct qstr
*old
= args
->old_name
;
1228 const struct qstr
*new = args
->new_name
;
1230 encode_diropargs3(xdr
, args
->old_dir
, old
->name
, old
->len
);
1231 encode_diropargs3(xdr
, args
->new_dir
, new->name
, new->len
);
1237 * struct LINK3args {
1242 static void nfs3_xdr_enc_link3args(struct rpc_rqst
*req
,
1243 struct xdr_stream
*xdr
,
1246 const struct nfs3_linkargs
*args
= data
;
1248 encode_nfs_fh3(xdr
, args
->fromfh
);
1249 encode_diropargs3(xdr
, args
->tofh
, args
->toname
, args
->tolen
);
1253 * 3.3.16 READDIR3args
1255 * struct READDIR3args {
1258 * cookieverf3 cookieverf;
1262 static void encode_readdir3args(struct xdr_stream
*xdr
,
1263 const struct nfs3_readdirargs
*args
)
1267 encode_nfs_fh3(xdr
, args
->fh
);
1269 p
= xdr_reserve_space(xdr
, 8 + NFS3_COOKIEVERFSIZE
+ 4);
1270 p
= xdr_encode_cookie3(p
, args
->cookie
);
1271 p
= xdr_encode_cookieverf3(p
, args
->verf
);
1272 *p
= cpu_to_be32(args
->count
);
1275 static void nfs3_xdr_enc_readdir3args(struct rpc_rqst
*req
,
1276 struct xdr_stream
*xdr
,
1279 const struct nfs3_readdirargs
*args
= data
;
1281 encode_readdir3args(xdr
, args
);
1282 prepare_reply_buffer(req
, args
->pages
, 0,
1283 args
->count
, NFS3_readdirres_sz
);
1287 * 3.3.17 READDIRPLUS3args
1289 * struct READDIRPLUS3args {
1292 * cookieverf3 cookieverf;
1297 static void encode_readdirplus3args(struct xdr_stream
*xdr
,
1298 const struct nfs3_readdirargs
*args
)
1302 encode_nfs_fh3(xdr
, args
->fh
);
1304 p
= xdr_reserve_space(xdr
, 8 + NFS3_COOKIEVERFSIZE
+ 4 + 4);
1305 p
= xdr_encode_cookie3(p
, args
->cookie
);
1306 p
= xdr_encode_cookieverf3(p
, args
->verf
);
1309 * readdirplus: need dircount + buffer size.
1310 * We just make sure we make dircount big enough
1312 *p
++ = cpu_to_be32(args
->count
>> 3);
1314 *p
= cpu_to_be32(args
->count
);
1317 static void nfs3_xdr_enc_readdirplus3args(struct rpc_rqst
*req
,
1318 struct xdr_stream
*xdr
,
1321 const struct nfs3_readdirargs
*args
= data
;
1323 encode_readdirplus3args(xdr
, args
);
1324 prepare_reply_buffer(req
, args
->pages
, 0,
1325 args
->count
, NFS3_readdirres_sz
);
1329 * 3.3.21 COMMIT3args
1331 * struct COMMIT3args {
1337 static void encode_commit3args(struct xdr_stream
*xdr
,
1338 const struct nfs_commitargs
*args
)
1342 encode_nfs_fh3(xdr
, args
->fh
);
1344 p
= xdr_reserve_space(xdr
, 8 + 4);
1345 p
= xdr_encode_hyper(p
, args
->offset
);
1346 *p
= cpu_to_be32(args
->count
);
1349 static void nfs3_xdr_enc_commit3args(struct rpc_rqst
*req
,
1350 struct xdr_stream
*xdr
,
1353 const struct nfs_commitargs
*args
= data
;
1355 encode_commit3args(xdr
, args
);
1358 #ifdef CONFIG_NFS_V3_ACL
1360 static void nfs3_xdr_enc_getacl3args(struct rpc_rqst
*req
,
1361 struct xdr_stream
*xdr
,
1364 const struct nfs3_getaclargs
*args
= data
;
1366 encode_nfs_fh3(xdr
, args
->fh
);
1367 encode_uint32(xdr
, args
->mask
);
1368 if (args
->mask
& (NFS_ACL
| NFS_DFACL
)) {
1369 prepare_reply_buffer(req
, args
->pages
, 0,
1370 NFSACL_MAXPAGES
<< PAGE_SHIFT
,
1372 req
->rq_rcv_buf
.flags
|= XDRBUF_SPARSE_PAGES
;
1376 static void nfs3_xdr_enc_setacl3args(struct rpc_rqst
*req
,
1377 struct xdr_stream
*xdr
,
1380 const struct nfs3_setaclargs
*args
= data
;
1384 encode_nfs_fh3(xdr
, NFS_FH(args
->inode
));
1385 encode_uint32(xdr
, args
->mask
);
1387 base
= req
->rq_slen
;
1388 if (args
->npages
!= 0)
1389 xdr_write_pages(xdr
, args
->pages
, 0, args
->len
);
1391 xdr_reserve_space(xdr
, args
->len
);
1393 error
= nfsacl_encode(xdr
->buf
, base
, args
->inode
,
1394 (args
->mask
& NFS_ACL
) ?
1395 args
->acl_access
: NULL
, 1, 0);
1396 /* FIXME: this is just broken */
1398 error
= nfsacl_encode(xdr
->buf
, base
+ error
, args
->inode
,
1399 (args
->mask
& NFS_DFACL
) ?
1400 args
->acl_default
: NULL
, 1,
1405 #endif /* CONFIG_NFS_V3_ACL */
1408 * NFSv3 XDR decode functions
1410 * NFSv3 result types are defined in section 3.3 of RFC 1813:
1411 * "NFS Version 3 Protocol Specification".
1417 * struct GETATTR3resok {
1418 * fattr3 obj_attributes;
1421 * union GETATTR3res switch (nfsstat3 status) {
1423 * GETATTR3resok resok;
1428 static int nfs3_xdr_dec_getattr3res(struct rpc_rqst
*req
,
1429 struct xdr_stream
*xdr
,
1432 enum nfs_stat status
;
1435 error
= decode_nfsstat3(xdr
, &status
);
1436 if (unlikely(error
))
1438 if (status
!= NFS3_OK
)
1440 error
= decode_fattr3(xdr
, result
);
1444 return nfs3_stat_to_errno(status
);
1450 * struct SETATTR3resok {
1454 * struct SETATTR3resfail {
1458 * union SETATTR3res switch (nfsstat3 status) {
1460 * SETATTR3resok resok;
1462 * SETATTR3resfail resfail;
1465 static int nfs3_xdr_dec_setattr3res(struct rpc_rqst
*req
,
1466 struct xdr_stream
*xdr
,
1469 enum nfs_stat status
;
1472 error
= decode_nfsstat3(xdr
, &status
);
1473 if (unlikely(error
))
1475 error
= decode_wcc_data(xdr
, result
);
1476 if (unlikely(error
))
1478 if (status
!= NFS3_OK
)
1483 return nfs3_stat_to_errno(status
);
1489 * struct LOOKUP3resok {
1491 * post_op_attr obj_attributes;
1492 * post_op_attr dir_attributes;
1495 * struct LOOKUP3resfail {
1496 * post_op_attr dir_attributes;
1499 * union LOOKUP3res switch (nfsstat3 status) {
1501 * LOOKUP3resok resok;
1503 * LOOKUP3resfail resfail;
1506 static int nfs3_xdr_dec_lookup3res(struct rpc_rqst
*req
,
1507 struct xdr_stream
*xdr
,
1510 struct nfs3_diropres
*result
= data
;
1511 enum nfs_stat status
;
1514 error
= decode_nfsstat3(xdr
, &status
);
1515 if (unlikely(error
))
1517 if (status
!= NFS3_OK
)
1519 error
= decode_nfs_fh3(xdr
, result
->fh
);
1520 if (unlikely(error
))
1522 error
= decode_post_op_attr(xdr
, result
->fattr
);
1523 if (unlikely(error
))
1525 error
= decode_post_op_attr(xdr
, result
->dir_attr
);
1529 error
= decode_post_op_attr(xdr
, result
->dir_attr
);
1530 if (unlikely(error
))
1532 return nfs3_stat_to_errno(status
);
1538 * struct ACCESS3resok {
1539 * post_op_attr obj_attributes;
1543 * struct ACCESS3resfail {
1544 * post_op_attr obj_attributes;
1547 * union ACCESS3res switch (nfsstat3 status) {
1549 * ACCESS3resok resok;
1551 * ACCESS3resfail resfail;
1554 static int nfs3_xdr_dec_access3res(struct rpc_rqst
*req
,
1555 struct xdr_stream
*xdr
,
1558 struct nfs3_accessres
*result
= data
;
1559 enum nfs_stat status
;
1562 error
= decode_nfsstat3(xdr
, &status
);
1563 if (unlikely(error
))
1565 error
= decode_post_op_attr(xdr
, result
->fattr
);
1566 if (unlikely(error
))
1568 if (status
!= NFS3_OK
)
1570 error
= decode_uint32(xdr
, &result
->access
);
1574 return nfs3_stat_to_errno(status
);
1578 * 3.3.5 READLINK3res
1580 * struct READLINK3resok {
1581 * post_op_attr symlink_attributes;
1585 * struct READLINK3resfail {
1586 * post_op_attr symlink_attributes;
1589 * union READLINK3res switch (nfsstat3 status) {
1591 * READLINK3resok resok;
1593 * READLINK3resfail resfail;
1596 static int nfs3_xdr_dec_readlink3res(struct rpc_rqst
*req
,
1597 struct xdr_stream
*xdr
,
1600 enum nfs_stat status
;
1603 error
= decode_nfsstat3(xdr
, &status
);
1604 if (unlikely(error
))
1606 error
= decode_post_op_attr(xdr
, result
);
1607 if (unlikely(error
))
1609 if (status
!= NFS3_OK
)
1611 error
= decode_nfspath3(xdr
);
1615 return nfs3_stat_to_errno(status
);
1621 * struct READ3resok {
1622 * post_op_attr file_attributes;
1628 * struct READ3resfail {
1629 * post_op_attr file_attributes;
1632 * union READ3res switch (nfsstat3 status) {
1636 * READ3resfail resfail;
1639 static int decode_read3resok(struct xdr_stream
*xdr
,
1640 struct nfs_pgio_res
*result
)
1642 u32 eof
, count
, ocount
, recvd
;
1645 p
= xdr_inline_decode(xdr
, 4 + 4 + 4);
1646 if (unlikely(p
== NULL
))
1648 count
= be32_to_cpup(p
++);
1649 eof
= be32_to_cpup(p
++);
1650 ocount
= be32_to_cpup(p
++);
1651 if (unlikely(ocount
!= count
))
1653 recvd
= xdr_read_pages(xdr
, count
);
1654 if (unlikely(count
> recvd
))
1658 result
->count
= count
;
1661 dprintk("NFS: READ count doesn't match length of opaque: "
1662 "count %u != ocount %u\n", count
, ocount
);
1665 dprintk("NFS: server cheating in read result: "
1666 "count %u > recvd %u\n", count
, recvd
);
1671 print_overflow_msg(__func__
, xdr
);
1675 static int nfs3_xdr_dec_read3res(struct rpc_rqst
*req
, struct xdr_stream
*xdr
,
1678 struct nfs_pgio_res
*result
= data
;
1680 enum nfs_stat status
;
1683 pos
= xdr_stream_pos(xdr
);
1684 error
= decode_nfsstat3(xdr
, &status
);
1685 if (unlikely(error
))
1687 error
= decode_post_op_attr(xdr
, result
->fattr
);
1688 if (unlikely(error
))
1690 result
->op_status
= status
;
1691 if (status
!= NFS3_OK
)
1693 result
->replen
= 3 + ((xdr_stream_pos(xdr
) - pos
) >> 2);
1694 error
= decode_read3resok(xdr
, result
);
1698 return nfs3_stat_to_errno(status
);
1710 * struct WRITE3resok {
1711 * wcc_data file_wcc;
1713 * stable_how committed;
1717 * struct WRITE3resfail {
1718 * wcc_data file_wcc;
1721 * union WRITE3res switch (nfsstat3 status) {
1723 * WRITE3resok resok;
1725 * WRITE3resfail resfail;
1728 static int decode_write3resok(struct xdr_stream
*xdr
,
1729 struct nfs_pgio_res
*result
)
1733 p
= xdr_inline_decode(xdr
, 4 + 4);
1734 if (unlikely(p
== NULL
))
1736 result
->count
= be32_to_cpup(p
++);
1737 result
->verf
->committed
= be32_to_cpup(p
++);
1738 if (unlikely(result
->verf
->committed
> NFS_FILE_SYNC
))
1740 if (decode_writeverf3(xdr
, &result
->verf
->verifier
))
1742 return result
->count
;
1744 dprintk("NFS: bad stable_how value: %u\n", result
->verf
->committed
);
1747 print_overflow_msg(__func__
, xdr
);
1752 static int nfs3_xdr_dec_write3res(struct rpc_rqst
*req
, struct xdr_stream
*xdr
,
1755 struct nfs_pgio_res
*result
= data
;
1756 enum nfs_stat status
;
1759 error
= decode_nfsstat3(xdr
, &status
);
1760 if (unlikely(error
))
1762 error
= decode_wcc_data(xdr
, result
->fattr
);
1763 if (unlikely(error
))
1765 result
->op_status
= status
;
1766 if (status
!= NFS3_OK
)
1768 error
= decode_write3resok(xdr
, result
);
1772 return nfs3_stat_to_errno(status
);
1778 * struct CREATE3resok {
1780 * post_op_attr obj_attributes;
1784 * struct CREATE3resfail {
1788 * union CREATE3res switch (nfsstat3 status) {
1790 * CREATE3resok resok;
1792 * CREATE3resfail resfail;
1795 static int decode_create3resok(struct xdr_stream
*xdr
,
1796 struct nfs3_diropres
*result
)
1800 error
= decode_post_op_fh3(xdr
, result
->fh
);
1801 if (unlikely(error
))
1803 error
= decode_post_op_attr(xdr
, result
->fattr
);
1804 if (unlikely(error
))
1806 /* The server isn't required to return a file handle.
1807 * If it didn't, force the client to perform a LOOKUP
1808 * to determine the correct file handle and attribute
1809 * values for the new object. */
1810 if (result
->fh
->size
== 0)
1811 result
->fattr
->valid
= 0;
1812 error
= decode_wcc_data(xdr
, result
->dir_attr
);
1817 static int nfs3_xdr_dec_create3res(struct rpc_rqst
*req
,
1818 struct xdr_stream
*xdr
,
1821 struct nfs3_diropres
*result
= data
;
1822 enum nfs_stat status
;
1825 error
= decode_nfsstat3(xdr
, &status
);
1826 if (unlikely(error
))
1828 if (status
!= NFS3_OK
)
1830 error
= decode_create3resok(xdr
, result
);
1834 error
= decode_wcc_data(xdr
, result
->dir_attr
);
1835 if (unlikely(error
))
1837 return nfs3_stat_to_errno(status
);
1843 * struct REMOVE3resok {
1847 * struct REMOVE3resfail {
1851 * union REMOVE3res switch (nfsstat3 status) {
1853 * REMOVE3resok resok;
1855 * REMOVE3resfail resfail;
1858 static int nfs3_xdr_dec_remove3res(struct rpc_rqst
*req
,
1859 struct xdr_stream
*xdr
,
1862 struct nfs_removeres
*result
= data
;
1863 enum nfs_stat status
;
1866 error
= decode_nfsstat3(xdr
, &status
);
1867 if (unlikely(error
))
1869 error
= decode_wcc_data(xdr
, result
->dir_attr
);
1870 if (unlikely(error
))
1872 if (status
!= NFS3_OK
)
1877 return nfs3_stat_to_errno(status
);
1883 * struct RENAME3resok {
1884 * wcc_data fromdir_wcc;
1885 * wcc_data todir_wcc;
1888 * struct RENAME3resfail {
1889 * wcc_data fromdir_wcc;
1890 * wcc_data todir_wcc;
1893 * union RENAME3res switch (nfsstat3 status) {
1895 * RENAME3resok resok;
1897 * RENAME3resfail resfail;
1900 static int nfs3_xdr_dec_rename3res(struct rpc_rqst
*req
,
1901 struct xdr_stream
*xdr
,
1904 struct nfs_renameres
*result
= data
;
1905 enum nfs_stat status
;
1908 error
= decode_nfsstat3(xdr
, &status
);
1909 if (unlikely(error
))
1911 error
= decode_wcc_data(xdr
, result
->old_fattr
);
1912 if (unlikely(error
))
1914 error
= decode_wcc_data(xdr
, result
->new_fattr
);
1915 if (unlikely(error
))
1917 if (status
!= NFS3_OK
)
1922 return nfs3_stat_to_errno(status
);
1928 * struct LINK3resok {
1929 * post_op_attr file_attributes;
1930 * wcc_data linkdir_wcc;
1933 * struct LINK3resfail {
1934 * post_op_attr file_attributes;
1935 * wcc_data linkdir_wcc;
1938 * union LINK3res switch (nfsstat3 status) {
1942 * LINK3resfail resfail;
1945 static int nfs3_xdr_dec_link3res(struct rpc_rqst
*req
, struct xdr_stream
*xdr
,
1948 struct nfs3_linkres
*result
= data
;
1949 enum nfs_stat status
;
1952 error
= decode_nfsstat3(xdr
, &status
);
1953 if (unlikely(error
))
1955 error
= decode_post_op_attr(xdr
, result
->fattr
);
1956 if (unlikely(error
))
1958 error
= decode_wcc_data(xdr
, result
->dir_attr
);
1959 if (unlikely(error
))
1961 if (status
!= NFS3_OK
)
1966 return nfs3_stat_to_errno(status
);
1970 * nfs3_decode_dirent - Decode a single NFSv3 directory entry stored in
1971 * the local page cache
1972 * @xdr: XDR stream where entry resides
1973 * @entry: buffer to fill in with entry data
1974 * @plus: boolean indicating whether this should be a readdirplus entry
1976 * Returns zero if successful, otherwise a negative errno value is
1979 * This function is not invoked during READDIR reply decoding, but
1980 * rather whenever an application invokes the getdents(2) system call
1981 * on a directory already in our cache.
1989 * fhandle3 filehandle;
1990 * post_op_attr3 attributes;
1991 * entry3 *nextentry;
1995 * struct entryplus3 {
1999 * post_op_attr name_attributes;
2000 * post_op_fh3 name_handle;
2001 * entryplus3 *nextentry;
2004 int nfs3_decode_dirent(struct xdr_stream
*xdr
, struct nfs_entry
*entry
,
2007 struct nfs_entry old
= *entry
;
2012 p
= xdr_inline_decode(xdr
, 4);
2013 if (unlikely(p
== NULL
))
2015 if (*p
== xdr_zero
) {
2016 p
= xdr_inline_decode(xdr
, 4);
2017 if (unlikely(p
== NULL
))
2025 error
= decode_fileid3(xdr
, &entry
->ino
);
2026 if (unlikely(error
))
2029 error
= decode_inline_filename3(xdr
, &entry
->name
, &entry
->len
);
2030 if (unlikely(error
))
2033 error
= decode_cookie3(xdr
, &new_cookie
);
2034 if (unlikely(error
))
2037 entry
->d_type
= DT_UNKNOWN
;
2040 entry
->fattr
->valid
= 0;
2041 error
= decode_post_op_attr(xdr
, entry
->fattr
);
2042 if (unlikely(error
))
2044 if (entry
->fattr
->valid
& NFS_ATTR_FATTR_V3
)
2045 entry
->d_type
= nfs_umode_to_dtype(entry
->fattr
->mode
);
2047 if (entry
->fattr
->fileid
!= entry
->ino
) {
2048 entry
->fattr
->mounted_on_fileid
= entry
->ino
;
2049 entry
->fattr
->valid
|= NFS_ATTR_FATTR_MOUNTED_ON_FILEID
;
2052 /* In fact, a post_op_fh3: */
2053 p
= xdr_inline_decode(xdr
, 4);
2054 if (unlikely(p
== NULL
))
2056 if (*p
!= xdr_zero
) {
2057 error
= decode_nfs_fh3(xdr
, entry
->fh
);
2058 if (unlikely(error
)) {
2059 if (error
== -E2BIG
)
2064 zero_nfs_fh3(entry
->fh
);
2067 entry
->prev_cookie
= entry
->cookie
;
2068 entry
->cookie
= new_cookie
;
2073 print_overflow_msg(__func__
, xdr
);
2076 dprintk("NFS: directory entry contains invalid file handle\n");
2082 * 3.3.16 READDIR3res
2089 * struct READDIR3resok {
2090 * post_op_attr dir_attributes;
2091 * cookieverf3 cookieverf;
2095 * struct READDIR3resfail {
2096 * post_op_attr dir_attributes;
2099 * union READDIR3res switch (nfsstat3 status) {
2101 * READDIR3resok resok;
2103 * READDIR3resfail resfail;
2106 * Read the directory contents into the page cache, but otherwise
2107 * don't touch them. The actual decoding is done by nfs3_decode_entry()
2108 * during subsequent nfs_readdir() calls.
2110 static int decode_dirlist3(struct xdr_stream
*xdr
)
2112 return xdr_read_pages(xdr
, xdr
->buf
->page_len
);
2115 static int decode_readdir3resok(struct xdr_stream
*xdr
,
2116 struct nfs3_readdirres
*result
)
2120 error
= decode_post_op_attr(xdr
, result
->dir_attr
);
2121 if (unlikely(error
))
2123 /* XXX: do we need to check if result->verf != NULL ? */
2124 error
= decode_cookieverf3(xdr
, result
->verf
);
2125 if (unlikely(error
))
2127 error
= decode_dirlist3(xdr
);
2132 static int nfs3_xdr_dec_readdir3res(struct rpc_rqst
*req
,
2133 struct xdr_stream
*xdr
,
2136 struct nfs3_readdirres
*result
= data
;
2137 enum nfs_stat status
;
2140 error
= decode_nfsstat3(xdr
, &status
);
2141 if (unlikely(error
))
2143 if (status
!= NFS3_OK
)
2145 error
= decode_readdir3resok(xdr
, result
);
2149 error
= decode_post_op_attr(xdr
, result
->dir_attr
);
2150 if (unlikely(error
))
2152 return nfs3_stat_to_errno(status
);
2158 * struct FSSTAT3resok {
2159 * post_op_attr obj_attributes;
2169 * struct FSSTAT3resfail {
2170 * post_op_attr obj_attributes;
2173 * union FSSTAT3res switch (nfsstat3 status) {
2175 * FSSTAT3resok resok;
2177 * FSSTAT3resfail resfail;
2180 static int decode_fsstat3resok(struct xdr_stream
*xdr
,
2181 struct nfs_fsstat
*result
)
2185 p
= xdr_inline_decode(xdr
, 8 * 6 + 4);
2186 if (unlikely(p
== NULL
))
2188 p
= xdr_decode_size3(p
, &result
->tbytes
);
2189 p
= xdr_decode_size3(p
, &result
->fbytes
);
2190 p
= xdr_decode_size3(p
, &result
->abytes
);
2191 p
= xdr_decode_size3(p
, &result
->tfiles
);
2192 p
= xdr_decode_size3(p
, &result
->ffiles
);
2193 xdr_decode_size3(p
, &result
->afiles
);
2194 /* ignore invarsec */
2197 print_overflow_msg(__func__
, xdr
);
2201 static int nfs3_xdr_dec_fsstat3res(struct rpc_rqst
*req
,
2202 struct xdr_stream
*xdr
,
2205 struct nfs_fsstat
*result
= data
;
2206 enum nfs_stat status
;
2209 error
= decode_nfsstat3(xdr
, &status
);
2210 if (unlikely(error
))
2212 error
= decode_post_op_attr(xdr
, result
->fattr
);
2213 if (unlikely(error
))
2215 if (status
!= NFS3_OK
)
2217 error
= decode_fsstat3resok(xdr
, result
);
2221 return nfs3_stat_to_errno(status
);
2227 * struct FSINFO3resok {
2228 * post_op_attr obj_attributes;
2236 * size3 maxfilesize;
2237 * nfstime3 time_delta;
2238 * uint32 properties;
2241 * struct FSINFO3resfail {
2242 * post_op_attr obj_attributes;
2245 * union FSINFO3res switch (nfsstat3 status) {
2247 * FSINFO3resok resok;
2249 * FSINFO3resfail resfail;
2252 static int decode_fsinfo3resok(struct xdr_stream
*xdr
,
2253 struct nfs_fsinfo
*result
)
2257 p
= xdr_inline_decode(xdr
, 4 * 7 + 8 + 8 + 4);
2258 if (unlikely(p
== NULL
))
2260 result
->rtmax
= be32_to_cpup(p
++);
2261 result
->rtpref
= be32_to_cpup(p
++);
2262 result
->rtmult
= be32_to_cpup(p
++);
2263 result
->wtmax
= be32_to_cpup(p
++);
2264 result
->wtpref
= be32_to_cpup(p
++);
2265 result
->wtmult
= be32_to_cpup(p
++);
2266 result
->dtpref
= be32_to_cpup(p
++);
2267 p
= xdr_decode_size3(p
, &result
->maxfilesize
);
2268 xdr_decode_nfstime3(p
, &result
->time_delta
);
2270 /* ignore properties */
2271 result
->lease_time
= 0;
2274 print_overflow_msg(__func__
, xdr
);
2278 static int nfs3_xdr_dec_fsinfo3res(struct rpc_rqst
*req
,
2279 struct xdr_stream
*xdr
,
2282 struct nfs_fsinfo
*result
= data
;
2283 enum nfs_stat status
;
2286 error
= decode_nfsstat3(xdr
, &status
);
2287 if (unlikely(error
))
2289 error
= decode_post_op_attr(xdr
, result
->fattr
);
2290 if (unlikely(error
))
2292 if (status
!= NFS3_OK
)
2294 error
= decode_fsinfo3resok(xdr
, result
);
2298 return nfs3_stat_to_errno(status
);
2302 * 3.3.20 PATHCONF3res
2304 * struct PATHCONF3resok {
2305 * post_op_attr obj_attributes;
2309 * bool chown_restricted;
2310 * bool case_insensitive;
2311 * bool case_preserving;
2314 * struct PATHCONF3resfail {
2315 * post_op_attr obj_attributes;
2318 * union PATHCONF3res switch (nfsstat3 status) {
2320 * PATHCONF3resok resok;
2322 * PATHCONF3resfail resfail;
2325 static int decode_pathconf3resok(struct xdr_stream
*xdr
,
2326 struct nfs_pathconf
*result
)
2330 p
= xdr_inline_decode(xdr
, 4 * 6);
2331 if (unlikely(p
== NULL
))
2333 result
->max_link
= be32_to_cpup(p
++);
2334 result
->max_namelen
= be32_to_cpup(p
);
2335 /* ignore remaining fields */
2338 print_overflow_msg(__func__
, xdr
);
2342 static int nfs3_xdr_dec_pathconf3res(struct rpc_rqst
*req
,
2343 struct xdr_stream
*xdr
,
2346 struct nfs_pathconf
*result
= data
;
2347 enum nfs_stat status
;
2350 error
= decode_nfsstat3(xdr
, &status
);
2351 if (unlikely(error
))
2353 error
= decode_post_op_attr(xdr
, result
->fattr
);
2354 if (unlikely(error
))
2356 if (status
!= NFS3_OK
)
2358 error
= decode_pathconf3resok(xdr
, result
);
2362 return nfs3_stat_to_errno(status
);
2368 * struct COMMIT3resok {
2369 * wcc_data file_wcc;
2373 * struct COMMIT3resfail {
2374 * wcc_data file_wcc;
2377 * union COMMIT3res switch (nfsstat3 status) {
2379 * COMMIT3resok resok;
2381 * COMMIT3resfail resfail;
2384 static int nfs3_xdr_dec_commit3res(struct rpc_rqst
*req
,
2385 struct xdr_stream
*xdr
,
2388 struct nfs_commitres
*result
= data
;
2389 enum nfs_stat status
;
2392 error
= decode_nfsstat3(xdr
, &status
);
2393 if (unlikely(error
))
2395 error
= decode_wcc_data(xdr
, result
->fattr
);
2396 if (unlikely(error
))
2398 result
->op_status
= status
;
2399 if (status
!= NFS3_OK
)
2401 error
= decode_writeverf3(xdr
, &result
->verf
->verifier
);
2405 return nfs3_stat_to_errno(status
);
2408 #ifdef CONFIG_NFS_V3_ACL
2410 static inline int decode_getacl3resok(struct xdr_stream
*xdr
,
2411 struct nfs3_getaclres
*result
)
2413 struct posix_acl
**acl
;
2414 unsigned int *aclcnt
;
2418 error
= decode_post_op_attr(xdr
, result
->fattr
);
2419 if (unlikely(error
))
2421 error
= decode_uint32(xdr
, &result
->mask
);
2422 if (unlikely(error
))
2425 if (result
->mask
& ~(NFS_ACL
|NFS_ACLCNT
|NFS_DFACL
|NFS_DFACLCNT
))
2428 hdrlen
= xdr_stream_pos(xdr
);
2431 if (result
->mask
& NFS_ACL
)
2432 acl
= &result
->acl_access
;
2434 if (result
->mask
& NFS_ACLCNT
)
2435 aclcnt
= &result
->acl_access_count
;
2436 error
= nfsacl_decode(xdr
->buf
, hdrlen
, aclcnt
, acl
);
2437 if (unlikely(error
<= 0))
2441 if (result
->mask
& NFS_DFACL
)
2442 acl
= &result
->acl_default
;
2444 if (result
->mask
& NFS_DFACLCNT
)
2445 aclcnt
= &result
->acl_default_count
;
2446 error
= nfsacl_decode(xdr
->buf
, hdrlen
+ error
, aclcnt
, acl
);
2447 if (unlikely(error
<= 0))
2454 static int nfs3_xdr_dec_getacl3res(struct rpc_rqst
*req
,
2455 struct xdr_stream
*xdr
,
2458 enum nfs_stat status
;
2461 error
= decode_nfsstat3(xdr
, &status
);
2462 if (unlikely(error
))
2464 if (status
!= NFS3_OK
)
2466 error
= decode_getacl3resok(xdr
, result
);
2470 return nfs3_stat_to_errno(status
);
2473 static int nfs3_xdr_dec_setacl3res(struct rpc_rqst
*req
,
2474 struct xdr_stream
*xdr
,
2477 enum nfs_stat status
;
2480 error
= decode_nfsstat3(xdr
, &status
);
2481 if (unlikely(error
))
2483 if (status
!= NFS3_OK
)
2485 error
= decode_post_op_attr(xdr
, result
);
2489 return nfs3_stat_to_errno(status
);
2492 #endif /* CONFIG_NFS_V3_ACL */
2496 * We need to translate between nfs status return values and
2497 * the local errno values which may not be the same.
2499 static const struct {
2504 { NFSERR_PERM
, -EPERM
},
2505 { NFSERR_NOENT
, -ENOENT
},
2506 { NFSERR_IO
, -errno_NFSERR_IO
},
2507 { NFSERR_NXIO
, -ENXIO
},
2508 /* { NFSERR_EAGAIN, -EAGAIN }, */
2509 { NFSERR_ACCES
, -EACCES
},
2510 { NFSERR_EXIST
, -EEXIST
},
2511 { NFSERR_XDEV
, -EXDEV
},
2512 { NFSERR_NODEV
, -ENODEV
},
2513 { NFSERR_NOTDIR
, -ENOTDIR
},
2514 { NFSERR_ISDIR
, -EISDIR
},
2515 { NFSERR_INVAL
, -EINVAL
},
2516 { NFSERR_FBIG
, -EFBIG
},
2517 { NFSERR_NOSPC
, -ENOSPC
},
2518 { NFSERR_ROFS
, -EROFS
},
2519 { NFSERR_MLINK
, -EMLINK
},
2520 { NFSERR_NAMETOOLONG
, -ENAMETOOLONG
},
2521 { NFSERR_NOTEMPTY
, -ENOTEMPTY
},
2522 { NFSERR_DQUOT
, -EDQUOT
},
2523 { NFSERR_STALE
, -ESTALE
},
2524 { NFSERR_REMOTE
, -EREMOTE
},
2526 { NFSERR_WFLUSH
, -EWFLUSH
},
2528 { NFSERR_BADHANDLE
, -EBADHANDLE
},
2529 { NFSERR_NOT_SYNC
, -ENOTSYNC
},
2530 { NFSERR_BAD_COOKIE
, -EBADCOOKIE
},
2531 { NFSERR_NOTSUPP
, -ENOTSUPP
},
2532 { NFSERR_TOOSMALL
, -ETOOSMALL
},
2533 { NFSERR_SERVERFAULT
, -EREMOTEIO
},
2534 { NFSERR_BADTYPE
, -EBADTYPE
},
2535 { NFSERR_JUKEBOX
, -EJUKEBOX
},
2540 * nfs3_stat_to_errno - convert an NFS status code to a local errno
2541 * @status: NFS status code to convert
2543 * Returns a local errno value, or -EIO if the NFS status code is
2544 * not recognized. This function is used jointly by NFSv2 and NFSv3.
2546 static int nfs3_stat_to_errno(enum nfs_stat status
)
2550 for (i
= 0; nfs_errtbl
[i
].stat
!= -1; i
++) {
2551 if (nfs_errtbl
[i
].stat
== (int)status
)
2552 return nfs_errtbl
[i
].errno
;
2554 dprintk("NFS: Unrecognized nfs status value: %u\n", status
);
2555 return nfs_errtbl
[i
].errno
;
2559 #define PROC(proc, argtype, restype, timer) \
2560 [NFS3PROC_##proc] = { \
2561 .p_proc = NFS3PROC_##proc, \
2562 .p_encode = nfs3_xdr_enc_##argtype##3args, \
2563 .p_decode = nfs3_xdr_dec_##restype##3res, \
2564 .p_arglen = NFS3_##argtype##args_sz, \
2565 .p_replen = NFS3_##restype##res_sz, \
2567 .p_statidx = NFS3PROC_##proc, \
2571 const struct rpc_procinfo nfs3_procedures
[] = {
2572 PROC(GETATTR
, getattr
, getattr
, 1),
2573 PROC(SETATTR
, setattr
, setattr
, 0),
2574 PROC(LOOKUP
, lookup
, lookup
, 2),
2575 PROC(ACCESS
, access
, access
, 1),
2576 PROC(READLINK
, readlink
, readlink
, 3),
2577 PROC(READ
, read
, read
, 3),
2578 PROC(WRITE
, write
, write
, 4),
2579 PROC(CREATE
, create
, create
, 0),
2580 PROC(MKDIR
, mkdir
, create
, 0),
2581 PROC(SYMLINK
, symlink
, create
, 0),
2582 PROC(MKNOD
, mknod
, create
, 0),
2583 PROC(REMOVE
, remove
, remove
, 0),
2584 PROC(RMDIR
, lookup
, setattr
, 0),
2585 PROC(RENAME
, rename
, rename
, 0),
2586 PROC(LINK
, link
, link
, 0),
2587 PROC(READDIR
, readdir
, readdir
, 3),
2588 PROC(READDIRPLUS
, readdirplus
, readdir
, 3),
2589 PROC(FSSTAT
, getattr
, fsstat
, 0),
2590 PROC(FSINFO
, getattr
, fsinfo
, 0),
2591 PROC(PATHCONF
, getattr
, pathconf
, 0),
2592 PROC(COMMIT
, commit
, commit
, 5),
2595 static unsigned int nfs_version3_counts
[ARRAY_SIZE(nfs3_procedures
)];
2596 const struct rpc_version nfs_version3
= {
2598 .nrprocs
= ARRAY_SIZE(nfs3_procedures
),
2599 .procs
= nfs3_procedures
,
2600 .counts
= nfs_version3_counts
,
2603 #ifdef CONFIG_NFS_V3_ACL
2604 static const struct rpc_procinfo nfs3_acl_procedures
[] = {
2605 [ACLPROC3_GETACL
] = {
2606 .p_proc
= ACLPROC3_GETACL
,
2607 .p_encode
= nfs3_xdr_enc_getacl3args
,
2608 .p_decode
= nfs3_xdr_dec_getacl3res
,
2609 .p_arglen
= ACL3_getaclargs_sz
,
2610 .p_replen
= ACL3_getaclres_sz
,
2614 [ACLPROC3_SETACL
] = {
2615 .p_proc
= ACLPROC3_SETACL
,
2616 .p_encode
= nfs3_xdr_enc_setacl3args
,
2617 .p_decode
= nfs3_xdr_dec_setacl3res
,
2618 .p_arglen
= ACL3_setaclargs_sz
,
2619 .p_replen
= ACL3_setaclres_sz
,
2625 static unsigned int nfs3_acl_counts
[ARRAY_SIZE(nfs3_acl_procedures
)];
2626 const struct rpc_version nfsacl_version3
= {
2628 .nrprocs
= ARRAY_SIZE(nfs3_acl_procedures
),
2629 .procs
= nfs3_acl_procedures
,
2630 .counts
= nfs3_acl_counts
,
2632 #endif /* CONFIG_NFS_V3_ACL */