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>
24 #include <linux/nfs_common.h>
29 #define NFSDBG_FACILITY NFSDBG_XDR
32 * Declare the space requirements for NFS arguments and replies as
33 * number of 32bit-words
35 #define NFS3_pagepad_sz (1) /* Page padding */
36 #define NFS3_fhandle_sz (1+16)
37 #define NFS3_fh_sz (NFS3_fhandle_sz) /* shorthand */
38 #define NFS3_post_op_fh_sz (1+NFS3_fh_sz)
39 #define NFS3_sattr_sz (15)
40 #define NFS3_filename_sz (1+(NFS3_MAXNAMLEN>>2))
41 #define NFS3_path_sz (1+(NFS3_MAXPATHLEN>>2))
42 #define NFS3_fattr_sz (21)
43 #define NFS3_cookieverf_sz (NFS3_COOKIEVERFSIZE>>2)
44 #define NFS3_wcc_attr_sz (6)
45 #define NFS3_pre_op_attr_sz (1+NFS3_wcc_attr_sz)
46 #define NFS3_post_op_attr_sz (1+NFS3_fattr_sz)
47 #define NFS3_wcc_data_sz (NFS3_pre_op_attr_sz+NFS3_post_op_attr_sz)
48 #define NFS3_diropargs_sz (NFS3_fh_sz+NFS3_filename_sz)
50 #define NFS3_getattrargs_sz (NFS3_fh_sz)
51 #define NFS3_setattrargs_sz (NFS3_fh_sz+NFS3_sattr_sz+3)
52 #define NFS3_lookupargs_sz (NFS3_fh_sz+NFS3_filename_sz)
53 #define NFS3_accessargs_sz (NFS3_fh_sz+1)
54 #define NFS3_readlinkargs_sz (NFS3_fh_sz)
55 #define NFS3_readargs_sz (NFS3_fh_sz+3)
56 #define NFS3_writeargs_sz (NFS3_fh_sz+5)
57 #define NFS3_createargs_sz (NFS3_diropargs_sz+NFS3_sattr_sz)
58 #define NFS3_mkdirargs_sz (NFS3_diropargs_sz+NFS3_sattr_sz)
59 #define NFS3_symlinkargs_sz (NFS3_diropargs_sz+1+NFS3_sattr_sz)
60 #define NFS3_mknodargs_sz (NFS3_diropargs_sz+2+NFS3_sattr_sz)
61 #define NFS3_removeargs_sz (NFS3_fh_sz+NFS3_filename_sz)
62 #define NFS3_renameargs_sz (NFS3_diropargs_sz+NFS3_diropargs_sz)
63 #define NFS3_linkargs_sz (NFS3_fh_sz+NFS3_diropargs_sz)
64 #define NFS3_readdirargs_sz (NFS3_fh_sz+NFS3_cookieverf_sz+3)
65 #define NFS3_readdirplusargs_sz (NFS3_fh_sz+NFS3_cookieverf_sz+4)
66 #define NFS3_commitargs_sz (NFS3_fh_sz+3)
68 #define NFS3_getattrres_sz (1+NFS3_fattr_sz)
69 #define NFS3_setattrres_sz (1+NFS3_wcc_data_sz)
70 #define NFS3_removeres_sz (NFS3_setattrres_sz)
71 #define NFS3_lookupres_sz (1+NFS3_fh_sz+(2 * NFS3_post_op_attr_sz))
72 #define NFS3_accessres_sz (1+NFS3_post_op_attr_sz+1)
73 #define NFS3_readlinkres_sz (1+NFS3_post_op_attr_sz+1+NFS3_pagepad_sz)
74 #define NFS3_readres_sz (1+NFS3_post_op_attr_sz+3+NFS3_pagepad_sz)
75 #define NFS3_writeres_sz (1+NFS3_wcc_data_sz+4)
76 #define NFS3_createres_sz (1+NFS3_post_op_fh_sz+NFS3_post_op_attr_sz+NFS3_wcc_data_sz)
77 #define NFS3_renameres_sz (1+(2 * NFS3_wcc_data_sz))
78 #define NFS3_linkres_sz (1+NFS3_post_op_attr_sz+NFS3_wcc_data_sz)
79 #define NFS3_readdirres_sz (1+NFS3_post_op_attr_sz+2+NFS3_pagepad_sz)
80 #define NFS3_fsstatres_sz (1+NFS3_post_op_attr_sz+13)
81 #define NFS3_fsinfores_sz (1+NFS3_post_op_attr_sz+12)
82 #define NFS3_pathconfres_sz (1+NFS3_post_op_attr_sz+6)
83 #define NFS3_commitres_sz (1+NFS3_wcc_data_sz+2)
85 #define ACL3_getaclargs_sz (NFS3_fh_sz+1)
86 #define ACL3_setaclargs_sz (NFS3_fh_sz+1+ \
87 XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
88 #define ACL3_getaclres_sz (1+NFS3_post_op_attr_sz+1+ \
89 XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE)+\
91 #define ACL3_setaclres_sz (1+NFS3_post_op_attr_sz)
94 * Map file type to S_IFMT bits
96 static const umode_t nfs_type2fmt
[] = {
103 [NF3SOCK
] = S_IFSOCK
,
107 static struct user_namespace
*rpc_userns(const struct rpc_clnt
*clnt
)
109 if (clnt
&& clnt
->cl_cred
)
110 return clnt
->cl_cred
->user_ns
;
111 return &init_user_ns
;
114 static struct user_namespace
*rpc_rqst_userns(const struct rpc_rqst
*rqstp
)
117 return rpc_userns(rqstp
->rq_task
->tk_client
);
118 return &init_user_ns
;
122 * Encode/decode NFSv3 basic data types
124 * Basic NFSv3 data types are defined in section 2.5 of RFC 1813:
125 * "NFS Version 3 Protocol Specification".
127 * Not all basic data types have their own encoding and decoding
128 * functions. For run-time efficiency, some data types are encoded
132 static void encode_uint32(struct xdr_stream
*xdr
, u32 value
)
134 __be32
*p
= xdr_reserve_space(xdr
, 4);
135 *p
= cpu_to_be32(value
);
138 static int decode_uint32(struct xdr_stream
*xdr
, u32
*value
)
142 p
= xdr_inline_decode(xdr
, 4);
145 *value
= be32_to_cpup(p
);
149 static int decode_uint64(struct xdr_stream
*xdr
, u64
*value
)
153 p
= xdr_inline_decode(xdr
, 8);
156 xdr_decode_hyper(p
, value
);
163 * typedef uint64 fileid3;
165 static __be32
*xdr_decode_fileid3(__be32
*p
, u64
*fileid
)
167 return xdr_decode_hyper(p
, fileid
);
170 static int decode_fileid3(struct xdr_stream
*xdr
, u64
*fileid
)
172 return decode_uint64(xdr
, fileid
);
178 * typedef string filename3<>;
180 static void encode_filename3(struct xdr_stream
*xdr
,
181 const char *name
, u32 length
)
185 WARN_ON_ONCE(length
> NFS3_MAXNAMLEN
);
186 p
= xdr_reserve_space(xdr
, 4 + length
);
187 xdr_encode_opaque(p
, name
, length
);
190 static int decode_inline_filename3(struct xdr_stream
*xdr
,
191 const char **name
, u32
*length
)
196 p
= xdr_inline_decode(xdr
, 4);
199 count
= be32_to_cpup(p
);
200 if (count
> NFS3_MAXNAMLEN
)
201 goto out_nametoolong
;
202 p
= xdr_inline_decode(xdr
, count
);
205 *name
= (const char *)p
;
210 dprintk("NFS: returned filename too long: %u\n", count
);
211 return -ENAMETOOLONG
;
217 * typedef string nfspath3<>;
219 static void encode_nfspath3(struct xdr_stream
*xdr
, struct page
**pages
,
222 encode_uint32(xdr
, length
);
223 xdr_write_pages(xdr
, pages
, 0, length
);
226 static int decode_nfspath3(struct xdr_stream
*xdr
)
231 p
= xdr_inline_decode(xdr
, 4);
234 count
= be32_to_cpup(p
);
235 if (unlikely(count
>= xdr
->buf
->page_len
|| count
> NFS3_MAXPATHLEN
))
236 goto out_nametoolong
;
237 recvd
= xdr_read_pages(xdr
, count
);
238 if (unlikely(count
> recvd
))
240 xdr_terminate_string(xdr
->buf
, count
);
244 dprintk("NFS: returned pathname too long: %u\n", count
);
245 return -ENAMETOOLONG
;
247 dprintk("NFS: server cheating in pathname result: "
248 "count %u > recvd %u\n", count
, recvd
);
255 * typedef uint64 cookie3
257 static __be32
*xdr_encode_cookie3(__be32
*p
, u64 cookie
)
259 return xdr_encode_hyper(p
, cookie
);
262 static int decode_cookie3(struct xdr_stream
*xdr
, u64
*cookie
)
264 return decode_uint64(xdr
, cookie
);
270 * typedef opaque cookieverf3[NFS3_COOKIEVERFSIZE];
272 static __be32
*xdr_encode_cookieverf3(__be32
*p
, const __be32
*verifier
)
274 memcpy(p
, verifier
, NFS3_COOKIEVERFSIZE
);
275 return p
+ XDR_QUADLEN(NFS3_COOKIEVERFSIZE
);
278 static int decode_cookieverf3(struct xdr_stream
*xdr
, __be32
*verifier
)
282 p
= xdr_inline_decode(xdr
, NFS3_COOKIEVERFSIZE
);
285 memcpy(verifier
, p
, NFS3_COOKIEVERFSIZE
);
292 * typedef opaque createverf3[NFS3_CREATEVERFSIZE];
294 static void encode_createverf3(struct xdr_stream
*xdr
, const __be32
*verifier
)
298 p
= xdr_reserve_space(xdr
, NFS3_CREATEVERFSIZE
);
299 memcpy(p
, verifier
, NFS3_CREATEVERFSIZE
);
302 static int decode_writeverf3(struct xdr_stream
*xdr
, struct nfs_write_verifier
*verifier
)
306 p
= xdr_inline_decode(xdr
, NFS3_WRITEVERFSIZE
);
309 memcpy(verifier
->data
, p
, NFS3_WRITEVERFSIZE
);
316 * typedef uint64 size3;
318 static __be32
*xdr_decode_size3(__be32
*p
, u64
*size
)
320 return xdr_decode_hyper(p
, size
);
331 #define NFS3_OK NFS_OK
333 static int decode_nfsstat3(struct xdr_stream
*xdr
, enum nfs_stat
*status
)
337 p
= xdr_inline_decode(xdr
, 4);
340 if (unlikely(*p
!= cpu_to_be32(NFS3_OK
)))
345 *status
= be32_to_cpup(p
);
346 trace_nfs_xdr_status(xdr
, (int)*status
);
363 static void encode_ftype3(struct xdr_stream
*xdr
, const u32 type
)
365 encode_uint32(xdr
, type
);
368 static __be32
*xdr_decode_ftype3(__be32
*p
, umode_t
*mode
)
372 type
= be32_to_cpup(p
++);
375 *mode
= nfs_type2fmt
[type
];
387 static void encode_specdata3(struct xdr_stream
*xdr
, const dev_t rdev
)
391 p
= xdr_reserve_space(xdr
, 8);
392 *p
++ = cpu_to_be32(MAJOR(rdev
));
393 *p
= cpu_to_be32(MINOR(rdev
));
396 static __be32
*xdr_decode_specdata3(__be32
*p
, dev_t
*rdev
)
398 unsigned int major
, minor
;
400 major
= be32_to_cpup(p
++);
401 minor
= be32_to_cpup(p
++);
402 *rdev
= MKDEV(major
, minor
);
403 if (MAJOR(*rdev
) != major
|| MINOR(*rdev
) != minor
)
412 * opaque data<NFS3_FHSIZE>;
415 static void encode_nfs_fh3(struct xdr_stream
*xdr
, const struct nfs_fh
*fh
)
419 WARN_ON_ONCE(fh
->size
> NFS3_FHSIZE
);
420 p
= xdr_reserve_space(xdr
, 4 + fh
->size
);
421 xdr_encode_opaque(p
, fh
->data
, fh
->size
);
424 static int decode_nfs_fh3(struct xdr_stream
*xdr
, struct nfs_fh
*fh
)
429 p
= xdr_inline_decode(xdr
, 4);
432 length
= be32_to_cpup(p
++);
433 if (unlikely(length
> NFS3_FHSIZE
|| length
== 0))
435 p
= xdr_inline_decode(xdr
, length
);
439 memcpy(fh
->data
, p
, length
);
442 trace_nfs_xdr_bad_filehandle(xdr
, NFSERR_BADHANDLE
);
446 static void zero_nfs_fh3(struct nfs_fh
*fh
)
448 memset(fh
, 0, sizeof(*fh
));
459 static __be32
*xdr_encode_nfstime3(__be32
*p
, const struct timespec64
*timep
)
461 *p
++ = cpu_to_be32((u32
)timep
->tv_sec
);
462 *p
++ = cpu_to_be32(timep
->tv_nsec
);
466 static __be32
*xdr_decode_nfstime3(__be32
*p
, struct timespec64
*timep
)
468 timep
->tv_sec
= be32_to_cpup(p
++);
469 timep
->tv_nsec
= be32_to_cpup(p
++);
478 * SET_TO_SERVER_TIME = 1,
479 * SET_TO_CLIENT_TIME = 2
482 * union set_mode3 switch (bool set_it) {
489 * union set_uid3 switch (bool set_it) {
496 * union set_gid3 switch (bool set_it) {
503 * union set_size3 switch (bool set_it) {
510 * union set_atime switch (time_how set_it) {
511 * case SET_TO_CLIENT_TIME:
517 * union set_mtime switch (time_how set_it) {
518 * case SET_TO_CLIENT_TIME:
533 static void encode_sattr3(struct xdr_stream
*xdr
, const struct iattr
*attr
,
534 struct user_namespace
*userns
)
540 * In order to make only a single xdr_reserve_space() call,
541 * pre-compute the total number of bytes to be reserved.
542 * Six boolean values, one for each set_foo field, are always
543 * present in the encoded result, so start there.
546 if (attr
->ia_valid
& ATTR_MODE
)
548 if (attr
->ia_valid
& ATTR_UID
)
550 if (attr
->ia_valid
& ATTR_GID
)
552 if (attr
->ia_valid
& ATTR_SIZE
)
554 if (attr
->ia_valid
& ATTR_ATIME_SET
)
556 if (attr
->ia_valid
& ATTR_MTIME_SET
)
558 p
= xdr_reserve_space(xdr
, nbytes
);
560 if (attr
->ia_valid
& ATTR_MODE
) {
562 *p
++ = cpu_to_be32(attr
->ia_mode
& S_IALLUGO
);
566 if (attr
->ia_valid
& ATTR_UID
) {
568 *p
++ = cpu_to_be32(from_kuid_munged(userns
, attr
->ia_uid
));
572 if (attr
->ia_valid
& ATTR_GID
) {
574 *p
++ = cpu_to_be32(from_kgid_munged(userns
, attr
->ia_gid
));
578 if (attr
->ia_valid
& ATTR_SIZE
) {
580 p
= xdr_encode_hyper(p
, (u64
)attr
->ia_size
);
584 if (attr
->ia_valid
& ATTR_ATIME_SET
) {
586 p
= xdr_encode_nfstime3(p
, &attr
->ia_atime
);
587 } else if (attr
->ia_valid
& ATTR_ATIME
) {
592 if (attr
->ia_valid
& ATTR_MTIME_SET
) {
594 xdr_encode_nfstime3(p
, &attr
->ia_mtime
);
595 } else if (attr
->ia_valid
& ATTR_MTIME
) {
620 static int decode_fattr3(struct xdr_stream
*xdr
, struct nfs_fattr
*fattr
,
621 struct user_namespace
*userns
)
626 p
= xdr_inline_decode(xdr
, NFS3_fattr_sz
<< 2);
630 p
= xdr_decode_ftype3(p
, &fmode
);
632 fattr
->mode
= (be32_to_cpup(p
++) & ~S_IFMT
) | fmode
;
633 fattr
->nlink
= be32_to_cpup(p
++);
634 fattr
->uid
= make_kuid(userns
, be32_to_cpup(p
++));
635 if (!uid_valid(fattr
->uid
))
637 fattr
->gid
= make_kgid(userns
, be32_to_cpup(p
++));
638 if (!gid_valid(fattr
->gid
))
641 p
= xdr_decode_size3(p
, &fattr
->size
);
642 p
= xdr_decode_size3(p
, &fattr
->du
.nfs3
.used
);
643 p
= xdr_decode_specdata3(p
, &fattr
->rdev
);
645 p
= xdr_decode_hyper(p
, &fattr
->fsid
.major
);
646 fattr
->fsid
.minor
= 0;
648 p
= xdr_decode_fileid3(p
, &fattr
->fileid
);
649 p
= xdr_decode_nfstime3(p
, &fattr
->atime
);
650 p
= xdr_decode_nfstime3(p
, &fattr
->mtime
);
651 xdr_decode_nfstime3(p
, &fattr
->ctime
);
652 fattr
->change_attr
= nfs_timespec_to_change_attr(&fattr
->ctime
);
654 fattr
->valid
|= NFS_ATTR_FATTR_V3
;
657 dprintk("NFS: returned invalid uid\n");
660 dprintk("NFS: returned invalid gid\n");
667 * union post_op_attr switch (bool attributes_follow) {
674 static int decode_post_op_attr(struct xdr_stream
*xdr
, struct nfs_fattr
*fattr
,
675 struct user_namespace
*userns
)
679 p
= xdr_inline_decode(xdr
, 4);
683 return decode_fattr3(xdr
, fattr
, userns
);
695 static int decode_wcc_attr(struct xdr_stream
*xdr
, struct nfs_fattr
*fattr
)
699 p
= xdr_inline_decode(xdr
, NFS3_wcc_attr_sz
<< 2);
703 fattr
->valid
|= NFS_ATTR_FATTR_PRESIZE
704 | NFS_ATTR_FATTR_PRECHANGE
705 | NFS_ATTR_FATTR_PREMTIME
706 | NFS_ATTR_FATTR_PRECTIME
;
708 p
= xdr_decode_size3(p
, &fattr
->pre_size
);
709 p
= xdr_decode_nfstime3(p
, &fattr
->pre_mtime
);
710 xdr_decode_nfstime3(p
, &fattr
->pre_ctime
);
711 fattr
->pre_change_attr
= nfs_timespec_to_change_attr(&fattr
->pre_ctime
);
718 * union pre_op_attr switch (bool attributes_follow) {
720 * wcc_attr attributes;
728 * pre_op_attr before;
729 * post_op_attr after;
732 static int decode_pre_op_attr(struct xdr_stream
*xdr
, struct nfs_fattr
*fattr
)
736 p
= xdr_inline_decode(xdr
, 4);
740 return decode_wcc_attr(xdr
, fattr
);
744 static int decode_wcc_data(struct xdr_stream
*xdr
, struct nfs_fattr
*fattr
,
745 struct user_namespace
*userns
)
749 error
= decode_pre_op_attr(xdr
, fattr
);
752 error
= decode_post_op_attr(xdr
, fattr
, userns
);
760 * union post_op_fh3 switch (bool handle_follows) {
767 static int decode_post_op_fh3(struct xdr_stream
*xdr
, struct nfs_fh
*fh
)
769 __be32
*p
= xdr_inline_decode(xdr
, 4);
773 return decode_nfs_fh3(xdr
, fh
);
781 * struct diropargs3 {
786 static void encode_diropargs3(struct xdr_stream
*xdr
, const struct nfs_fh
*fh
,
787 const char *name
, u32 length
)
789 encode_nfs_fh3(xdr
, fh
);
790 encode_filename3(xdr
, name
, length
);
795 * NFSv3 XDR encode functions
797 * NFSv3 argument types are defined in section 3.3 of RFC 1813:
798 * "NFS Version 3 Protocol Specification".
804 * struct GETATTR3args {
808 static void nfs3_xdr_enc_getattr3args(struct rpc_rqst
*req
,
809 struct xdr_stream
*xdr
,
812 const struct nfs_fh
*fh
= data
;
814 encode_nfs_fh3(xdr
, fh
);
820 * union sattrguard3 switch (bool check) {
822 * nfstime3 obj_ctime;
827 * struct SETATTR3args {
829 * sattr3 new_attributes;
833 static void encode_sattrguard3(struct xdr_stream
*xdr
,
834 const struct nfs3_sattrargs
*args
)
839 p
= xdr_reserve_space(xdr
, 4 + 8);
841 xdr_encode_nfstime3(p
, &args
->guardtime
);
843 p
= xdr_reserve_space(xdr
, 4);
848 static void nfs3_xdr_enc_setattr3args(struct rpc_rqst
*req
,
849 struct xdr_stream
*xdr
,
852 const struct nfs3_sattrargs
*args
= data
;
853 encode_nfs_fh3(xdr
, args
->fh
);
854 encode_sattr3(xdr
, args
->sattr
, rpc_rqst_userns(req
));
855 encode_sattrguard3(xdr
, args
);
861 * struct LOOKUP3args {
865 static void nfs3_xdr_enc_lookup3args(struct rpc_rqst
*req
,
866 struct xdr_stream
*xdr
,
869 const struct nfs3_diropargs
*args
= data
;
871 encode_diropargs3(xdr
, args
->fh
, args
->name
, args
->len
);
877 * struct ACCESS3args {
882 static void encode_access3args(struct xdr_stream
*xdr
,
883 const struct nfs3_accessargs
*args
)
885 encode_nfs_fh3(xdr
, args
->fh
);
886 encode_uint32(xdr
, args
->access
);
889 static void nfs3_xdr_enc_access3args(struct rpc_rqst
*req
,
890 struct xdr_stream
*xdr
,
893 const struct nfs3_accessargs
*args
= data
;
895 encode_access3args(xdr
, args
);
899 * 3.3.5 READLINK3args
901 * struct READLINK3args {
905 static void nfs3_xdr_enc_readlink3args(struct rpc_rqst
*req
,
906 struct xdr_stream
*xdr
,
909 const struct nfs3_readlinkargs
*args
= data
;
911 encode_nfs_fh3(xdr
, args
->fh
);
912 rpc_prepare_reply_pages(req
, args
->pages
, args
->pgbase
, args
->pglen
,
913 NFS3_readlinkres_sz
- NFS3_pagepad_sz
);
925 static void encode_read3args(struct xdr_stream
*xdr
,
926 const struct nfs_pgio_args
*args
)
930 encode_nfs_fh3(xdr
, args
->fh
);
932 p
= xdr_reserve_space(xdr
, 8 + 4);
933 p
= xdr_encode_hyper(p
, args
->offset
);
934 *p
= cpu_to_be32(args
->count
);
937 static void nfs3_xdr_enc_read3args(struct rpc_rqst
*req
,
938 struct xdr_stream
*xdr
,
941 const struct nfs_pgio_args
*args
= data
;
942 unsigned int replen
= args
->replen
? args
->replen
:
943 NFS3_readres_sz
- NFS3_pagepad_sz
;
945 encode_read3args(xdr
, args
);
946 rpc_prepare_reply_pages(req
, args
->pages
, args
->pgbase
,
947 args
->count
, replen
);
948 req
->rq_rcv_buf
.flags
|= XDRBUF_READ
;
960 * struct WRITE3args {
968 static void encode_write3args(struct xdr_stream
*xdr
,
969 const struct nfs_pgio_args
*args
)
973 encode_nfs_fh3(xdr
, args
->fh
);
975 p
= xdr_reserve_space(xdr
, 8 + 4 + 4 + 4);
976 p
= xdr_encode_hyper(p
, args
->offset
);
977 *p
++ = cpu_to_be32(args
->count
);
978 *p
++ = cpu_to_be32(args
->stable
);
979 *p
= cpu_to_be32(args
->count
);
980 xdr_write_pages(xdr
, args
->pages
, args
->pgbase
, args
->count
);
983 static void nfs3_xdr_enc_write3args(struct rpc_rqst
*req
,
984 struct xdr_stream
*xdr
,
987 const struct nfs_pgio_args
*args
= data
;
989 encode_write3args(xdr
, args
);
990 xdr
->buf
->flags
|= XDRBUF_WRITE
;
1002 * union createhow3 switch (createmode3 mode) {
1005 * sattr3 obj_attributes;
1010 * struct CREATE3args {
1015 static void encode_createhow3(struct xdr_stream
*xdr
,
1016 const struct nfs3_createargs
*args
,
1017 struct user_namespace
*userns
)
1019 encode_uint32(xdr
, args
->createmode
);
1020 switch (args
->createmode
) {
1021 case NFS3_CREATE_UNCHECKED
:
1022 case NFS3_CREATE_GUARDED
:
1023 encode_sattr3(xdr
, args
->sattr
, userns
);
1025 case NFS3_CREATE_EXCLUSIVE
:
1026 encode_createverf3(xdr
, args
->verifier
);
1033 static void nfs3_xdr_enc_create3args(struct rpc_rqst
*req
,
1034 struct xdr_stream
*xdr
,
1037 const struct nfs3_createargs
*args
= data
;
1039 encode_diropargs3(xdr
, args
->fh
, args
->name
, args
->len
);
1040 encode_createhow3(xdr
, args
, rpc_rqst_userns(req
));
1046 * struct MKDIR3args {
1048 * sattr3 attributes;
1051 static void nfs3_xdr_enc_mkdir3args(struct rpc_rqst
*req
,
1052 struct xdr_stream
*xdr
,
1055 const struct nfs3_mkdirargs
*args
= data
;
1057 encode_diropargs3(xdr
, args
->fh
, args
->name
, args
->len
);
1058 encode_sattr3(xdr
, args
->sattr
, rpc_rqst_userns(req
));
1062 * 3.3.10 SYMLINK3args
1064 * struct symlinkdata3 {
1065 * sattr3 symlink_attributes;
1066 * nfspath3 symlink_data;
1069 * struct SYMLINK3args {
1071 * symlinkdata3 symlink;
1074 static void encode_symlinkdata3(struct xdr_stream
*xdr
,
1076 struct user_namespace
*userns
)
1078 const struct nfs3_symlinkargs
*args
= data
;
1080 encode_sattr3(xdr
, args
->sattr
, userns
);
1081 encode_nfspath3(xdr
, args
->pages
, args
->pathlen
);
1084 static void nfs3_xdr_enc_symlink3args(struct rpc_rqst
*req
,
1085 struct xdr_stream
*xdr
,
1088 const struct nfs3_symlinkargs
*args
= data
;
1090 encode_diropargs3(xdr
, args
->fromfh
, args
->fromname
, args
->fromlen
);
1091 encode_symlinkdata3(xdr
, args
, rpc_rqst_userns(req
));
1092 xdr
->buf
->flags
|= XDRBUF_WRITE
;
1098 * struct devicedata3 {
1099 * sattr3 dev_attributes;
1103 * union mknoddata3 switch (ftype3 type) {
1106 * devicedata3 device;
1109 * sattr3 pipe_attributes;
1114 * struct MKNOD3args {
1119 static void encode_devicedata3(struct xdr_stream
*xdr
,
1120 const struct nfs3_mknodargs
*args
,
1121 struct user_namespace
*userns
)
1123 encode_sattr3(xdr
, args
->sattr
, userns
);
1124 encode_specdata3(xdr
, args
->rdev
);
1127 static void encode_mknoddata3(struct xdr_stream
*xdr
,
1128 const struct nfs3_mknodargs
*args
,
1129 struct user_namespace
*userns
)
1131 encode_ftype3(xdr
, args
->type
);
1132 switch (args
->type
) {
1135 encode_devicedata3(xdr
, args
, userns
);
1139 encode_sattr3(xdr
, args
->sattr
, userns
);
1149 static void nfs3_xdr_enc_mknod3args(struct rpc_rqst
*req
,
1150 struct xdr_stream
*xdr
,
1153 const struct nfs3_mknodargs
*args
= data
;
1155 encode_diropargs3(xdr
, args
->fh
, args
->name
, args
->len
);
1156 encode_mknoddata3(xdr
, args
, rpc_rqst_userns(req
));
1160 * 3.3.12 REMOVE3args
1162 * struct REMOVE3args {
1163 * diropargs3 object;
1166 static void nfs3_xdr_enc_remove3args(struct rpc_rqst
*req
,
1167 struct xdr_stream
*xdr
,
1170 const struct nfs_removeargs
*args
= data
;
1172 encode_diropargs3(xdr
, args
->fh
, args
->name
.name
, args
->name
.len
);
1176 * 3.3.14 RENAME3args
1178 * struct RENAME3args {
1183 static void nfs3_xdr_enc_rename3args(struct rpc_rqst
*req
,
1184 struct xdr_stream
*xdr
,
1187 const struct nfs_renameargs
*args
= data
;
1188 const struct qstr
*old
= args
->old_name
;
1189 const struct qstr
*new = args
->new_name
;
1191 encode_diropargs3(xdr
, args
->old_dir
, old
->name
, old
->len
);
1192 encode_diropargs3(xdr
, args
->new_dir
, new->name
, new->len
);
1198 * struct LINK3args {
1203 static void nfs3_xdr_enc_link3args(struct rpc_rqst
*req
,
1204 struct xdr_stream
*xdr
,
1207 const struct nfs3_linkargs
*args
= data
;
1209 encode_nfs_fh3(xdr
, args
->fromfh
);
1210 encode_diropargs3(xdr
, args
->tofh
, args
->toname
, args
->tolen
);
1214 * 3.3.16 READDIR3args
1216 * struct READDIR3args {
1219 * cookieverf3 cookieverf;
1223 static void encode_readdir3args(struct xdr_stream
*xdr
,
1224 const struct nfs3_readdirargs
*args
)
1228 encode_nfs_fh3(xdr
, args
->fh
);
1230 p
= xdr_reserve_space(xdr
, 8 + NFS3_COOKIEVERFSIZE
+ 4);
1231 p
= xdr_encode_cookie3(p
, args
->cookie
);
1232 p
= xdr_encode_cookieverf3(p
, args
->verf
);
1233 *p
= cpu_to_be32(args
->count
);
1236 static void nfs3_xdr_enc_readdir3args(struct rpc_rqst
*req
,
1237 struct xdr_stream
*xdr
,
1240 const struct nfs3_readdirargs
*args
= data
;
1242 encode_readdir3args(xdr
, args
);
1243 rpc_prepare_reply_pages(req
, args
->pages
, 0, args
->count
,
1244 NFS3_readdirres_sz
- NFS3_pagepad_sz
);
1248 * 3.3.17 READDIRPLUS3args
1250 * struct READDIRPLUS3args {
1253 * cookieverf3 cookieverf;
1258 static void encode_readdirplus3args(struct xdr_stream
*xdr
,
1259 const struct nfs3_readdirargs
*args
)
1261 uint32_t dircount
= args
->count
;
1262 uint32_t maxcount
= args
->count
;
1265 encode_nfs_fh3(xdr
, args
->fh
);
1267 p
= xdr_reserve_space(xdr
, 8 + NFS3_COOKIEVERFSIZE
+ 4 + 4);
1268 p
= xdr_encode_cookie3(p
, args
->cookie
);
1269 p
= xdr_encode_cookieverf3(p
, args
->verf
);
1272 * readdirplus: need dircount + buffer size.
1273 * We just make sure we make dircount big enough
1275 *p
++ = cpu_to_be32(dircount
);
1276 *p
= cpu_to_be32(maxcount
);
1279 static void nfs3_xdr_enc_readdirplus3args(struct rpc_rqst
*req
,
1280 struct xdr_stream
*xdr
,
1283 const struct nfs3_readdirargs
*args
= data
;
1285 encode_readdirplus3args(xdr
, args
);
1286 rpc_prepare_reply_pages(req
, args
->pages
, 0, args
->count
,
1287 NFS3_readdirres_sz
- NFS3_pagepad_sz
);
1291 * 3.3.21 COMMIT3args
1293 * struct COMMIT3args {
1299 static void encode_commit3args(struct xdr_stream
*xdr
,
1300 const struct nfs_commitargs
*args
)
1304 encode_nfs_fh3(xdr
, args
->fh
);
1306 p
= xdr_reserve_space(xdr
, 8 + 4);
1307 p
= xdr_encode_hyper(p
, args
->offset
);
1308 *p
= cpu_to_be32(args
->count
);
1311 static void nfs3_xdr_enc_commit3args(struct rpc_rqst
*req
,
1312 struct xdr_stream
*xdr
,
1315 const struct nfs_commitargs
*args
= data
;
1317 encode_commit3args(xdr
, args
);
1320 #ifdef CONFIG_NFS_V3_ACL
1322 static void nfs3_xdr_enc_getacl3args(struct rpc_rqst
*req
,
1323 struct xdr_stream
*xdr
,
1326 const struct nfs3_getaclargs
*args
= data
;
1328 encode_nfs_fh3(xdr
, args
->fh
);
1329 encode_uint32(xdr
, args
->mask
);
1330 if (args
->mask
& (NFS_ACL
| NFS_DFACL
)) {
1331 rpc_prepare_reply_pages(req
, args
->pages
, 0,
1332 NFSACL_MAXPAGES
<< PAGE_SHIFT
,
1333 ACL3_getaclres_sz
- NFS3_pagepad_sz
);
1334 req
->rq_rcv_buf
.flags
|= XDRBUF_SPARSE_PAGES
;
1338 static void nfs3_xdr_enc_setacl3args(struct rpc_rqst
*req
,
1339 struct xdr_stream
*xdr
,
1342 const struct nfs3_setaclargs
*args
= data
;
1346 encode_nfs_fh3(xdr
, NFS_FH(args
->inode
));
1347 encode_uint32(xdr
, args
->mask
);
1349 base
= req
->rq_slen
;
1350 if (args
->npages
!= 0)
1351 xdr_write_pages(xdr
, args
->pages
, 0, args
->len
);
1353 xdr_reserve_space(xdr
, args
->len
);
1355 error
= nfsacl_encode(xdr
->buf
, base
, args
->inode
,
1356 (args
->mask
& NFS_ACL
) ?
1357 args
->acl_access
: NULL
, 1, 0);
1358 /* FIXME: this is just broken */
1360 error
= nfsacl_encode(xdr
->buf
, base
+ error
, args
->inode
,
1361 (args
->mask
& NFS_DFACL
) ?
1362 args
->acl_default
: NULL
, 1,
1367 #endif /* CONFIG_NFS_V3_ACL */
1370 * NFSv3 XDR decode functions
1372 * NFSv3 result types are defined in section 3.3 of RFC 1813:
1373 * "NFS Version 3 Protocol Specification".
1379 * struct GETATTR3resok {
1380 * fattr3 obj_attributes;
1383 * union GETATTR3res switch (nfsstat3 status) {
1385 * GETATTR3resok resok;
1390 static int nfs3_xdr_dec_getattr3res(struct rpc_rqst
*req
,
1391 struct xdr_stream
*xdr
,
1394 enum nfs_stat status
;
1397 error
= decode_nfsstat3(xdr
, &status
);
1398 if (unlikely(error
))
1400 if (status
!= NFS3_OK
)
1402 error
= decode_fattr3(xdr
, result
, rpc_rqst_userns(req
));
1406 return nfs_stat_to_errno(status
);
1412 * struct SETATTR3resok {
1416 * struct SETATTR3resfail {
1420 * union SETATTR3res switch (nfsstat3 status) {
1422 * SETATTR3resok resok;
1424 * SETATTR3resfail resfail;
1427 static int nfs3_xdr_dec_setattr3res(struct rpc_rqst
*req
,
1428 struct xdr_stream
*xdr
,
1431 enum nfs_stat status
;
1434 error
= decode_nfsstat3(xdr
, &status
);
1435 if (unlikely(error
))
1437 error
= decode_wcc_data(xdr
, result
, rpc_rqst_userns(req
));
1438 if (unlikely(error
))
1440 if (status
!= NFS3_OK
)
1445 return nfs_stat_to_errno(status
);
1451 * struct LOOKUP3resok {
1453 * post_op_attr obj_attributes;
1454 * post_op_attr dir_attributes;
1457 * struct LOOKUP3resfail {
1458 * post_op_attr dir_attributes;
1461 * union LOOKUP3res switch (nfsstat3 status) {
1463 * LOOKUP3resok resok;
1465 * LOOKUP3resfail resfail;
1468 static int nfs3_xdr_dec_lookup3res(struct rpc_rqst
*req
,
1469 struct xdr_stream
*xdr
,
1472 struct user_namespace
*userns
= rpc_rqst_userns(req
);
1473 struct nfs3_diropres
*result
= data
;
1474 enum nfs_stat status
;
1477 error
= decode_nfsstat3(xdr
, &status
);
1478 if (unlikely(error
))
1480 if (status
!= NFS3_OK
)
1482 error
= decode_nfs_fh3(xdr
, result
->fh
);
1483 if (unlikely(error
))
1485 error
= decode_post_op_attr(xdr
, result
->fattr
, userns
);
1486 if (unlikely(error
))
1488 error
= decode_post_op_attr(xdr
, result
->dir_attr
, userns
);
1492 error
= decode_post_op_attr(xdr
, result
->dir_attr
, userns
);
1493 if (unlikely(error
))
1495 return nfs_stat_to_errno(status
);
1501 * struct ACCESS3resok {
1502 * post_op_attr obj_attributes;
1506 * struct ACCESS3resfail {
1507 * post_op_attr obj_attributes;
1510 * union ACCESS3res switch (nfsstat3 status) {
1512 * ACCESS3resok resok;
1514 * ACCESS3resfail resfail;
1517 static int nfs3_xdr_dec_access3res(struct rpc_rqst
*req
,
1518 struct xdr_stream
*xdr
,
1521 struct nfs3_accessres
*result
= data
;
1522 enum nfs_stat status
;
1525 error
= decode_nfsstat3(xdr
, &status
);
1526 if (unlikely(error
))
1528 error
= decode_post_op_attr(xdr
, result
->fattr
, rpc_rqst_userns(req
));
1529 if (unlikely(error
))
1531 if (status
!= NFS3_OK
)
1533 error
= decode_uint32(xdr
, &result
->access
);
1537 return nfs_stat_to_errno(status
);
1541 * 3.3.5 READLINK3res
1543 * struct READLINK3resok {
1544 * post_op_attr symlink_attributes;
1548 * struct READLINK3resfail {
1549 * post_op_attr symlink_attributes;
1552 * union READLINK3res switch (nfsstat3 status) {
1554 * READLINK3resok resok;
1556 * READLINK3resfail resfail;
1559 static int nfs3_xdr_dec_readlink3res(struct rpc_rqst
*req
,
1560 struct xdr_stream
*xdr
,
1563 enum nfs_stat status
;
1566 error
= decode_nfsstat3(xdr
, &status
);
1567 if (unlikely(error
))
1569 error
= decode_post_op_attr(xdr
, result
, rpc_rqst_userns(req
));
1570 if (unlikely(error
))
1572 if (status
!= NFS3_OK
)
1574 error
= decode_nfspath3(xdr
);
1578 return nfs_stat_to_errno(status
);
1584 * struct READ3resok {
1585 * post_op_attr file_attributes;
1591 * struct READ3resfail {
1592 * post_op_attr file_attributes;
1595 * union READ3res switch (nfsstat3 status) {
1599 * READ3resfail resfail;
1602 static int decode_read3resok(struct xdr_stream
*xdr
,
1603 struct nfs_pgio_res
*result
)
1605 u32 eof
, count
, ocount
, recvd
;
1608 p
= xdr_inline_decode(xdr
, 4 + 4 + 4);
1611 count
= be32_to_cpup(p
++);
1612 eof
= be32_to_cpup(p
++);
1613 ocount
= be32_to_cpup(p
++);
1614 if (unlikely(ocount
!= count
))
1616 recvd
= xdr_read_pages(xdr
, count
);
1617 if (unlikely(count
> recvd
))
1621 result
->count
= count
;
1624 dprintk("NFS: READ count doesn't match length of opaque: "
1625 "count %u != ocount %u\n", count
, ocount
);
1628 dprintk("NFS: server cheating in read result: "
1629 "count %u > recvd %u\n", count
, recvd
);
1635 static int nfs3_xdr_dec_read3res(struct rpc_rqst
*req
, struct xdr_stream
*xdr
,
1638 struct nfs_pgio_res
*result
= data
;
1640 enum nfs_stat status
;
1643 pos
= xdr_stream_pos(xdr
);
1644 error
= decode_nfsstat3(xdr
, &status
);
1645 if (unlikely(error
))
1647 error
= decode_post_op_attr(xdr
, result
->fattr
, rpc_rqst_userns(req
));
1648 if (unlikely(error
))
1650 result
->op_status
= status
;
1651 if (status
!= NFS3_OK
)
1653 result
->replen
= 3 + ((xdr_stream_pos(xdr
) - pos
) >> 2);
1654 error
= decode_read3resok(xdr
, result
);
1658 return nfs_stat_to_errno(status
);
1670 * struct WRITE3resok {
1671 * wcc_data file_wcc;
1673 * stable_how committed;
1677 * struct WRITE3resfail {
1678 * wcc_data file_wcc;
1681 * union WRITE3res switch (nfsstat3 status) {
1683 * WRITE3resok resok;
1685 * WRITE3resfail resfail;
1688 static int decode_write3resok(struct xdr_stream
*xdr
,
1689 struct nfs_pgio_res
*result
)
1693 p
= xdr_inline_decode(xdr
, 4 + 4);
1696 result
->count
= be32_to_cpup(p
++);
1697 result
->verf
->committed
= be32_to_cpup(p
++);
1698 if (unlikely(result
->verf
->committed
> NFS_FILE_SYNC
))
1700 if (decode_writeverf3(xdr
, &result
->verf
->verifier
))
1702 return result
->count
;
1704 dprintk("NFS: bad stable_how value: %u\n", result
->verf
->committed
);
1708 static int nfs3_xdr_dec_write3res(struct rpc_rqst
*req
, struct xdr_stream
*xdr
,
1711 struct nfs_pgio_res
*result
= data
;
1712 enum nfs_stat status
;
1715 error
= decode_nfsstat3(xdr
, &status
);
1716 if (unlikely(error
))
1718 error
= decode_wcc_data(xdr
, result
->fattr
, rpc_rqst_userns(req
));
1719 if (unlikely(error
))
1721 result
->op_status
= status
;
1722 if (status
!= NFS3_OK
)
1724 error
= decode_write3resok(xdr
, result
);
1728 return nfs_stat_to_errno(status
);
1734 * struct CREATE3resok {
1736 * post_op_attr obj_attributes;
1740 * struct CREATE3resfail {
1744 * union CREATE3res switch (nfsstat3 status) {
1746 * CREATE3resok resok;
1748 * CREATE3resfail resfail;
1751 static int decode_create3resok(struct xdr_stream
*xdr
,
1752 struct nfs3_diropres
*result
,
1753 struct user_namespace
*userns
)
1757 error
= decode_post_op_fh3(xdr
, result
->fh
);
1758 if (unlikely(error
))
1760 error
= decode_post_op_attr(xdr
, result
->fattr
, userns
);
1761 if (unlikely(error
))
1763 /* The server isn't required to return a file handle.
1764 * If it didn't, force the client to perform a LOOKUP
1765 * to determine the correct file handle and attribute
1766 * values for the new object. */
1767 if (result
->fh
->size
== 0)
1768 result
->fattr
->valid
= 0;
1769 error
= decode_wcc_data(xdr
, result
->dir_attr
, userns
);
1774 static int nfs3_xdr_dec_create3res(struct rpc_rqst
*req
,
1775 struct xdr_stream
*xdr
,
1778 struct user_namespace
*userns
= rpc_rqst_userns(req
);
1779 struct nfs3_diropres
*result
= data
;
1780 enum nfs_stat status
;
1783 error
= decode_nfsstat3(xdr
, &status
);
1784 if (unlikely(error
))
1786 if (status
!= NFS3_OK
)
1788 error
= decode_create3resok(xdr
, result
, userns
);
1792 error
= decode_wcc_data(xdr
, result
->dir_attr
, userns
);
1793 if (unlikely(error
))
1795 return nfs_stat_to_errno(status
);
1801 * struct REMOVE3resok {
1805 * struct REMOVE3resfail {
1809 * union REMOVE3res switch (nfsstat3 status) {
1811 * REMOVE3resok resok;
1813 * REMOVE3resfail resfail;
1816 static int nfs3_xdr_dec_remove3res(struct rpc_rqst
*req
,
1817 struct xdr_stream
*xdr
,
1820 struct nfs_removeres
*result
= data
;
1821 enum nfs_stat status
;
1824 error
= decode_nfsstat3(xdr
, &status
);
1825 if (unlikely(error
))
1827 error
= decode_wcc_data(xdr
, result
->dir_attr
, rpc_rqst_userns(req
));
1828 if (unlikely(error
))
1830 if (status
!= NFS3_OK
)
1835 return nfs_stat_to_errno(status
);
1841 * struct RENAME3resok {
1842 * wcc_data fromdir_wcc;
1843 * wcc_data todir_wcc;
1846 * struct RENAME3resfail {
1847 * wcc_data fromdir_wcc;
1848 * wcc_data todir_wcc;
1851 * union RENAME3res switch (nfsstat3 status) {
1853 * RENAME3resok resok;
1855 * RENAME3resfail resfail;
1858 static int nfs3_xdr_dec_rename3res(struct rpc_rqst
*req
,
1859 struct xdr_stream
*xdr
,
1862 struct user_namespace
*userns
= rpc_rqst_userns(req
);
1863 struct nfs_renameres
*result
= data
;
1864 enum nfs_stat status
;
1867 error
= decode_nfsstat3(xdr
, &status
);
1868 if (unlikely(error
))
1870 error
= decode_wcc_data(xdr
, result
->old_fattr
, userns
);
1871 if (unlikely(error
))
1873 error
= decode_wcc_data(xdr
, result
->new_fattr
, userns
);
1874 if (unlikely(error
))
1876 if (status
!= NFS3_OK
)
1881 return nfs_stat_to_errno(status
);
1887 * struct LINK3resok {
1888 * post_op_attr file_attributes;
1889 * wcc_data linkdir_wcc;
1892 * struct LINK3resfail {
1893 * post_op_attr file_attributes;
1894 * wcc_data linkdir_wcc;
1897 * union LINK3res switch (nfsstat3 status) {
1901 * LINK3resfail resfail;
1904 static int nfs3_xdr_dec_link3res(struct rpc_rqst
*req
, struct xdr_stream
*xdr
,
1907 struct user_namespace
*userns
= rpc_rqst_userns(req
);
1908 struct nfs3_linkres
*result
= data
;
1909 enum nfs_stat status
;
1912 error
= decode_nfsstat3(xdr
, &status
);
1913 if (unlikely(error
))
1915 error
= decode_post_op_attr(xdr
, result
->fattr
, userns
);
1916 if (unlikely(error
))
1918 error
= decode_wcc_data(xdr
, result
->dir_attr
, userns
);
1919 if (unlikely(error
))
1921 if (status
!= NFS3_OK
)
1926 return nfs_stat_to_errno(status
);
1930 * nfs3_decode_dirent - Decode a single NFSv3 directory entry stored in
1931 * the local page cache
1932 * @xdr: XDR stream where entry resides
1933 * @entry: buffer to fill in with entry data
1934 * @plus: boolean indicating whether this should be a readdirplus entry
1936 * Returns zero if successful, otherwise a negative errno value is
1939 * This function is not invoked during READDIR reply decoding, but
1940 * rather whenever an application invokes the getdents(2) system call
1941 * on a directory already in our cache.
1949 * fhandle3 filehandle;
1950 * post_op_attr3 attributes;
1951 * entry3 *nextentry;
1955 * struct entryplus3 {
1959 * post_op_attr name_attributes;
1960 * post_op_fh3 name_handle;
1961 * entryplus3 *nextentry;
1964 int nfs3_decode_dirent(struct xdr_stream
*xdr
, struct nfs_entry
*entry
,
1967 struct user_namespace
*userns
= rpc_userns(entry
->server
->client
);
1972 p
= xdr_inline_decode(xdr
, 4);
1975 if (*p
== xdr_zero
) {
1976 p
= xdr_inline_decode(xdr
, 4);
1985 error
= decode_fileid3(xdr
, &entry
->ino
);
1986 if (unlikely(error
))
1989 error
= decode_inline_filename3(xdr
, &entry
->name
, &entry
->len
);
1990 if (unlikely(error
))
1991 return error
== -ENAMETOOLONG
? -ENAMETOOLONG
: -EAGAIN
;
1993 error
= decode_cookie3(xdr
, &new_cookie
);
1994 if (unlikely(error
))
1997 entry
->d_type
= DT_UNKNOWN
;
2000 entry
->fattr
->valid
= 0;
2001 error
= decode_post_op_attr(xdr
, entry
->fattr
, userns
);
2002 if (unlikely(error
))
2004 if (entry
->fattr
->valid
& NFS_ATTR_FATTR_V3
)
2005 entry
->d_type
= nfs_umode_to_dtype(entry
->fattr
->mode
);
2007 if (entry
->fattr
->fileid
!= entry
->ino
) {
2008 entry
->fattr
->mounted_on_fileid
= entry
->ino
;
2009 entry
->fattr
->valid
|= NFS_ATTR_FATTR_MOUNTED_ON_FILEID
;
2012 /* In fact, a post_op_fh3: */
2013 p
= xdr_inline_decode(xdr
, 4);
2016 if (*p
!= xdr_zero
) {
2017 error
= decode_nfs_fh3(xdr
, entry
->fh
);
2018 if (unlikely(error
))
2021 zero_nfs_fh3(entry
->fh
);
2024 entry
->cookie
= new_cookie
;
2030 * 3.3.16 READDIR3res
2037 * struct READDIR3resok {
2038 * post_op_attr dir_attributes;
2039 * cookieverf3 cookieverf;
2043 * struct READDIR3resfail {
2044 * post_op_attr dir_attributes;
2047 * union READDIR3res switch (nfsstat3 status) {
2049 * READDIR3resok resok;
2051 * READDIR3resfail resfail;
2054 * Read the directory contents into the page cache, but otherwise
2055 * don't touch them. The actual decoding is done by nfs3_decode_entry()
2056 * during subsequent nfs_readdir() calls.
2058 static int decode_dirlist3(struct xdr_stream
*xdr
)
2060 return xdr_read_pages(xdr
, xdr
->buf
->page_len
);
2063 static int decode_readdir3resok(struct xdr_stream
*xdr
,
2064 struct nfs3_readdirres
*result
,
2065 struct user_namespace
*userns
)
2069 error
= decode_post_op_attr(xdr
, result
->dir_attr
, userns
);
2070 if (unlikely(error
))
2072 /* XXX: do we need to check if result->verf != NULL ? */
2073 error
= decode_cookieverf3(xdr
, result
->verf
);
2074 if (unlikely(error
))
2076 error
= decode_dirlist3(xdr
);
2081 static int nfs3_xdr_dec_readdir3res(struct rpc_rqst
*req
,
2082 struct xdr_stream
*xdr
,
2085 struct nfs3_readdirres
*result
= data
;
2086 enum nfs_stat status
;
2089 error
= decode_nfsstat3(xdr
, &status
);
2090 if (unlikely(error
))
2092 if (status
!= NFS3_OK
)
2094 error
= decode_readdir3resok(xdr
, result
, rpc_rqst_userns(req
));
2098 error
= decode_post_op_attr(xdr
, result
->dir_attr
, rpc_rqst_userns(req
));
2099 if (unlikely(error
))
2101 return nfs_stat_to_errno(status
);
2107 * struct FSSTAT3resok {
2108 * post_op_attr obj_attributes;
2118 * struct FSSTAT3resfail {
2119 * post_op_attr obj_attributes;
2122 * union FSSTAT3res switch (nfsstat3 status) {
2124 * FSSTAT3resok resok;
2126 * FSSTAT3resfail resfail;
2129 static int decode_fsstat3resok(struct xdr_stream
*xdr
,
2130 struct nfs_fsstat
*result
)
2134 p
= xdr_inline_decode(xdr
, 8 * 6 + 4);
2137 p
= xdr_decode_size3(p
, &result
->tbytes
);
2138 p
= xdr_decode_size3(p
, &result
->fbytes
);
2139 p
= xdr_decode_size3(p
, &result
->abytes
);
2140 p
= xdr_decode_size3(p
, &result
->tfiles
);
2141 p
= xdr_decode_size3(p
, &result
->ffiles
);
2142 xdr_decode_size3(p
, &result
->afiles
);
2143 /* ignore invarsec */
2147 static int nfs3_xdr_dec_fsstat3res(struct rpc_rqst
*req
,
2148 struct xdr_stream
*xdr
,
2151 struct nfs_fsstat
*result
= data
;
2152 enum nfs_stat status
;
2155 error
= decode_nfsstat3(xdr
, &status
);
2156 if (unlikely(error
))
2158 error
= decode_post_op_attr(xdr
, result
->fattr
, rpc_rqst_userns(req
));
2159 if (unlikely(error
))
2161 if (status
!= NFS3_OK
)
2163 error
= decode_fsstat3resok(xdr
, result
);
2167 return nfs_stat_to_errno(status
);
2173 * struct FSINFO3resok {
2174 * post_op_attr obj_attributes;
2182 * size3 maxfilesize;
2183 * nfstime3 time_delta;
2184 * uint32 properties;
2187 * struct FSINFO3resfail {
2188 * post_op_attr obj_attributes;
2191 * union FSINFO3res switch (nfsstat3 status) {
2193 * FSINFO3resok resok;
2195 * FSINFO3resfail resfail;
2198 static int decode_fsinfo3resok(struct xdr_stream
*xdr
,
2199 struct nfs_fsinfo
*result
)
2203 p
= xdr_inline_decode(xdr
, 4 * 7 + 8 + 8 + 4);
2206 result
->rtmax
= be32_to_cpup(p
++);
2207 result
->rtpref
= be32_to_cpup(p
++);
2208 result
->rtmult
= be32_to_cpup(p
++);
2209 result
->wtmax
= be32_to_cpup(p
++);
2210 result
->wtpref
= be32_to_cpup(p
++);
2211 result
->wtmult
= be32_to_cpup(p
++);
2212 result
->dtpref
= be32_to_cpup(p
++);
2213 p
= xdr_decode_size3(p
, &result
->maxfilesize
);
2214 xdr_decode_nfstime3(p
, &result
->time_delta
);
2216 /* ignore properties */
2217 result
->lease_time
= 0;
2218 result
->change_attr_type
= NFS4_CHANGE_TYPE_IS_UNDEFINED
;
2219 result
->xattr_support
= 0;
2223 static int nfs3_xdr_dec_fsinfo3res(struct rpc_rqst
*req
,
2224 struct xdr_stream
*xdr
,
2227 struct nfs_fsinfo
*result
= data
;
2228 enum nfs_stat status
;
2231 error
= decode_nfsstat3(xdr
, &status
);
2232 if (unlikely(error
))
2234 error
= decode_post_op_attr(xdr
, result
->fattr
, rpc_rqst_userns(req
));
2235 if (unlikely(error
))
2237 if (status
!= NFS3_OK
)
2239 error
= decode_fsinfo3resok(xdr
, result
);
2243 return nfs_stat_to_errno(status
);
2247 * 3.3.20 PATHCONF3res
2249 * struct PATHCONF3resok {
2250 * post_op_attr obj_attributes;
2254 * bool chown_restricted;
2255 * bool case_insensitive;
2256 * bool case_preserving;
2259 * struct PATHCONF3resfail {
2260 * post_op_attr obj_attributes;
2263 * union PATHCONF3res switch (nfsstat3 status) {
2265 * PATHCONF3resok resok;
2267 * PATHCONF3resfail resfail;
2270 static int decode_pathconf3resok(struct xdr_stream
*xdr
,
2271 struct nfs_pathconf
*result
)
2275 p
= xdr_inline_decode(xdr
, 4 * 6);
2278 result
->max_link
= be32_to_cpup(p
++);
2279 result
->max_namelen
= be32_to_cpup(p
);
2280 /* ignore remaining fields */
2284 static int nfs3_xdr_dec_pathconf3res(struct rpc_rqst
*req
,
2285 struct xdr_stream
*xdr
,
2288 struct nfs_pathconf
*result
= data
;
2289 enum nfs_stat status
;
2292 error
= decode_nfsstat3(xdr
, &status
);
2293 if (unlikely(error
))
2295 error
= decode_post_op_attr(xdr
, result
->fattr
, rpc_rqst_userns(req
));
2296 if (unlikely(error
))
2298 if (status
!= NFS3_OK
)
2300 error
= decode_pathconf3resok(xdr
, result
);
2304 return nfs_stat_to_errno(status
);
2310 * struct COMMIT3resok {
2311 * wcc_data file_wcc;
2315 * struct COMMIT3resfail {
2316 * wcc_data file_wcc;
2319 * union COMMIT3res switch (nfsstat3 status) {
2321 * COMMIT3resok resok;
2323 * COMMIT3resfail resfail;
2326 static int nfs3_xdr_dec_commit3res(struct rpc_rqst
*req
,
2327 struct xdr_stream
*xdr
,
2330 struct nfs_commitres
*result
= data
;
2331 struct nfs_writeverf
*verf
= result
->verf
;
2332 enum nfs_stat status
;
2335 error
= decode_nfsstat3(xdr
, &status
);
2336 if (unlikely(error
))
2338 error
= decode_wcc_data(xdr
, result
->fattr
, rpc_rqst_userns(req
));
2339 if (unlikely(error
))
2341 result
->op_status
= status
;
2342 if (status
!= NFS3_OK
)
2344 error
= decode_writeverf3(xdr
, &verf
->verifier
);
2346 verf
->committed
= NFS_FILE_SYNC
;
2350 return nfs_stat_to_errno(status
);
2353 #ifdef CONFIG_NFS_V3_ACL
2355 static inline int decode_getacl3resok(struct xdr_stream
*xdr
,
2356 struct nfs3_getaclres
*result
,
2357 struct user_namespace
*userns
)
2359 struct posix_acl
**acl
;
2360 unsigned int *aclcnt
;
2364 error
= decode_post_op_attr(xdr
, result
->fattr
, userns
);
2365 if (unlikely(error
))
2367 error
= decode_uint32(xdr
, &result
->mask
);
2368 if (unlikely(error
))
2371 if (result
->mask
& ~(NFS_ACL
|NFS_ACLCNT
|NFS_DFACL
|NFS_DFACLCNT
))
2374 hdrlen
= xdr_stream_pos(xdr
);
2377 if (result
->mask
& NFS_ACL
)
2378 acl
= &result
->acl_access
;
2380 if (result
->mask
& NFS_ACLCNT
)
2381 aclcnt
= &result
->acl_access_count
;
2382 error
= nfsacl_decode(xdr
->buf
, hdrlen
, aclcnt
, acl
);
2383 if (unlikely(error
<= 0))
2387 if (result
->mask
& NFS_DFACL
)
2388 acl
= &result
->acl_default
;
2390 if (result
->mask
& NFS_DFACLCNT
)
2391 aclcnt
= &result
->acl_default_count
;
2392 error
= nfsacl_decode(xdr
->buf
, hdrlen
+ error
, aclcnt
, acl
);
2393 if (unlikely(error
<= 0))
2400 static int nfs3_xdr_dec_getacl3res(struct rpc_rqst
*req
,
2401 struct xdr_stream
*xdr
,
2404 enum nfs_stat status
;
2407 error
= decode_nfsstat3(xdr
, &status
);
2408 if (unlikely(error
))
2410 if (status
!= NFS3_OK
)
2412 error
= decode_getacl3resok(xdr
, result
, rpc_rqst_userns(req
));
2416 return nfs_stat_to_errno(status
);
2419 static int nfs3_xdr_dec_setacl3res(struct rpc_rqst
*req
,
2420 struct xdr_stream
*xdr
,
2423 enum nfs_stat status
;
2426 error
= decode_nfsstat3(xdr
, &status
);
2427 if (unlikely(error
))
2429 if (status
!= NFS3_OK
)
2431 error
= decode_post_op_attr(xdr
, result
, rpc_rqst_userns(req
));
2435 return nfs_stat_to_errno(status
);
2438 #endif /* CONFIG_NFS_V3_ACL */
2440 #define PROC(proc, argtype, restype, timer) \
2441 [NFS3PROC_##proc] = { \
2442 .p_proc = NFS3PROC_##proc, \
2443 .p_encode = nfs3_xdr_enc_##argtype##3args, \
2444 .p_decode = nfs3_xdr_dec_##restype##3res, \
2445 .p_arglen = NFS3_##argtype##args_sz, \
2446 .p_replen = NFS3_##restype##res_sz, \
2448 .p_statidx = NFS3PROC_##proc, \
2452 const struct rpc_procinfo nfs3_procedures
[] = {
2453 PROC(GETATTR
, getattr
, getattr
, 1),
2454 PROC(SETATTR
, setattr
, setattr
, 0),
2455 PROC(LOOKUP
, lookup
, lookup
, 2),
2456 PROC(ACCESS
, access
, access
, 1),
2457 PROC(READLINK
, readlink
, readlink
, 3),
2458 PROC(READ
, read
, read
, 3),
2459 PROC(WRITE
, write
, write
, 4),
2460 PROC(CREATE
, create
, create
, 0),
2461 PROC(MKDIR
, mkdir
, create
, 0),
2462 PROC(SYMLINK
, symlink
, create
, 0),
2463 PROC(MKNOD
, mknod
, create
, 0),
2464 PROC(REMOVE
, remove
, remove
, 0),
2465 PROC(RMDIR
, lookup
, setattr
, 0),
2466 PROC(RENAME
, rename
, rename
, 0),
2467 PROC(LINK
, link
, link
, 0),
2468 PROC(READDIR
, readdir
, readdir
, 3),
2469 PROC(READDIRPLUS
, readdirplus
, readdir
, 3),
2470 PROC(FSSTAT
, getattr
, fsstat
, 0),
2471 PROC(FSINFO
, getattr
, fsinfo
, 0),
2472 PROC(PATHCONF
, getattr
, pathconf
, 0),
2473 PROC(COMMIT
, commit
, commit
, 5),
2476 static unsigned int nfs_version3_counts
[ARRAY_SIZE(nfs3_procedures
)];
2477 const struct rpc_version nfs_version3
= {
2479 .nrprocs
= ARRAY_SIZE(nfs3_procedures
),
2480 .procs
= nfs3_procedures
,
2481 .counts
= nfs_version3_counts
,
2484 #ifdef CONFIG_NFS_V3_ACL
2485 static const struct rpc_procinfo nfs3_acl_procedures
[] = {
2486 [ACLPROC3_GETACL
] = {
2487 .p_proc
= ACLPROC3_GETACL
,
2488 .p_encode
= nfs3_xdr_enc_getacl3args
,
2489 .p_decode
= nfs3_xdr_dec_getacl3res
,
2490 .p_arglen
= ACL3_getaclargs_sz
,
2491 .p_replen
= ACL3_getaclres_sz
,
2495 [ACLPROC3_SETACL
] = {
2496 .p_proc
= ACLPROC3_SETACL
,
2497 .p_encode
= nfs3_xdr_enc_setacl3args
,
2498 .p_decode
= nfs3_xdr_dec_setacl3res
,
2499 .p_arglen
= ACL3_setaclargs_sz
,
2500 .p_replen
= ACL3_setaclres_sz
,
2506 static unsigned int nfs3_acl_counts
[ARRAY_SIZE(nfs3_acl_procedures
)];
2507 const struct rpc_version nfsacl_version3
= {
2509 .nrprocs
= ARRAY_SIZE(nfs3_acl_procedures
),
2510 .procs
= nfs3_acl_procedures
,
2511 .counts
= nfs3_acl_counts
,
2513 #endif /* CONFIG_NFS_V3_ACL */