summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2017-05-08 13:42:02 -0400
committerChristoph Hellwig <hch@lst.de>2017-05-15 11:42:25 -0400
commit63f8de37951a64cc24479eafd33085537e088075 (patch)
treee572e2542ef9370c9dfec6795660d52b72f77712
parent026fec7e7c4723b5f26a753bbcad69f68c8299d4 (diff)
sunrpc: properly type pc_encode callbacks
Drop the resp argument as it can trivially be derived from the rqstp argument. With that all functions now have the same prototype, and we can remove the unsafe casting to kxdrproc_t. Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r--fs/lockd/svc4proc.c2
-rw-r--r--fs/lockd/svcproc.c2
-rw-r--r--fs/lockd/xdr.c14
-rw-r--r--fs/lockd/xdr4.c14
-rw-r--r--fs/nfs/callback_xdr.c6
-rw-r--r--fs/nfsd/nfs2acl.c18
-rw-r--r--fs/nfsd/nfs3acl.c11
-rw-r--r--fs/nfsd/nfs3proc.c44
-rw-r--r--fs/nfsd/nfs3xdr.c74
-rw-r--r--fs/nfsd/nfs4proc.c4
-rw-r--r--fs/nfsd/nfs4xdr.c5
-rw-r--r--fs/nfsd/nfsproc.c36
-rw-r--r--fs/nfsd/nfssvc.c5
-rw-r--r--fs/nfsd/nfsxdr.c31
-rw-r--r--fs/nfsd/xdr.h14
-rw-r--r--fs/nfsd/xdr3.h45
-rw-r--r--fs/nfsd/xdr4.h5
-rw-r--r--include/linux/lockd/xdr.h8
-rw-r--r--include/linux/lockd/xdr4.h8
-rw-r--r--include/linux/sunrpc/svc.h3
-rw-r--r--net/sunrpc/svc.c6
21 files changed, 185 insertions, 170 deletions
diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
index 804744f7528c..fed016155791 100644
--- a/fs/lockd/svc4proc.c
+++ b/fs/lockd/svc4proc.c
@@ -497,7 +497,7 @@ struct nlm_void { int dummy; };
497#define PROC(name, xargt, xrest, argt, rest, respsize) \ 497#define PROC(name, xargt, xrest, argt, rest, respsize) \
498 { .pc_func = nlm4svc_proc_##name, \ 498 { .pc_func = nlm4svc_proc_##name, \
499 .pc_decode = nlm4svc_decode_##xargt, \ 499 .pc_decode = nlm4svc_decode_##xargt, \
500 .pc_encode = (kxdrproc_t) nlm4svc_encode_##xrest, \ 500 .pc_encode = nlm4svc_encode_##xrest, \
501 .pc_release = NULL, \ 501 .pc_release = NULL, \
502 .pc_argsize = sizeof(struct nlm_##argt), \ 502 .pc_argsize = sizeof(struct nlm_##argt), \
503 .pc_ressize = sizeof(struct nlm_##rest), \ 503 .pc_ressize = sizeof(struct nlm_##rest), \
diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c
index 204a698f7d41..14648b051eba 100644
--- a/fs/lockd/svcproc.c
+++ b/fs/lockd/svcproc.c
@@ -539,7 +539,7 @@ struct nlm_void { int dummy; };
539#define PROC(name, xargt, xrest, argt, rest, respsize) \ 539#define PROC(name, xargt, xrest, argt, rest, respsize) \
540 { .pc_func = nlmsvc_proc_##name, \ 540 { .pc_func = nlmsvc_proc_##name, \
541 .pc_decode = nlmsvc_decode_##xargt, \ 541 .pc_decode = nlmsvc_decode_##xargt, \
542 .pc_encode = (kxdrproc_t) nlmsvc_encode_##xrest, \ 542 .pc_encode = nlmsvc_encode_##xrest, \
543 .pc_release = NULL, \ 543 .pc_release = NULL, \
544 .pc_argsize = sizeof(struct nlm_##argt), \ 544 .pc_argsize = sizeof(struct nlm_##argt), \
545 .pc_ressize = sizeof(struct nlm_##rest), \ 545 .pc_ressize = sizeof(struct nlm_##rest), \
diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c
index b57af63fba56..442bbd0b0b29 100644
--- a/fs/lockd/xdr.c
+++ b/fs/lockd/xdr.c
@@ -200,8 +200,10 @@ nlmsvc_decode_testargs(struct svc_rqst *rqstp, __be32 *p)
200} 200}
201 201
202int 202int
203nlmsvc_encode_testres(struct svc_rqst *rqstp, __be32 *p, struct nlm_res *resp) 203nlmsvc_encode_testres(struct svc_rqst *rqstp, __be32 *p)
204{ 204{
205 struct nlm_res *resp = rqstp->rq_resp;
206
205 if (!(p = nlm_encode_testres(p, resp))) 207 if (!(p = nlm_encode_testres(p, resp)))
206 return 0; 208 return 0;
207 return xdr_ressize_check(rqstp, p); 209 return xdr_ressize_check(rqstp, p);
@@ -280,8 +282,10 @@ nlmsvc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
280} 282}
281 283
282int 284int
283nlmsvc_encode_shareres(struct svc_rqst *rqstp, __be32 *p, struct nlm_res *resp) 285nlmsvc_encode_shareres(struct svc_rqst *rqstp, __be32 *p)
284{ 286{
287 struct nlm_res *resp = rqstp->rq_resp;
288
285 if (!(p = nlm_encode_cookie(p, &resp->cookie))) 289 if (!(p = nlm_encode_cookie(p, &resp->cookie)))
286 return 0; 290 return 0;
287 *p++ = resp->status; 291 *p++ = resp->status;
@@ -290,8 +294,10 @@ nlmsvc_encode_shareres(struct svc_rqst *rqstp, __be32 *p, struct nlm_res *resp)
290} 294}
291 295
292int 296int
293nlmsvc_encode_res(struct svc_rqst *rqstp, __be32 *p, struct nlm_res *resp) 297nlmsvc_encode_res(struct svc_rqst *rqstp, __be32 *p)
294{ 298{
299 struct nlm_res *resp = rqstp->rq_resp;
300
295 if (!(p = nlm_encode_cookie(p, &resp->cookie))) 301 if (!(p = nlm_encode_cookie(p, &resp->cookie)))
296 return 0; 302 return 0;
297 *p++ = resp->status; 303 *p++ = resp->status;
@@ -342,7 +348,7 @@ nlmsvc_decode_void(struct svc_rqst *rqstp, __be32 *p)
342} 348}
343 349
344int 350int
345nlmsvc_encode_void(struct svc_rqst *rqstp, __be32 *p, void *dummy) 351nlmsvc_encode_void(struct svc_rqst *rqstp, __be32 *p)
346{ 352{
347 return xdr_ressize_check(rqstp, p); 353 return xdr_ressize_check(rqstp, p);
348} 354}
diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
index 46e18598a15c..2a0cd5679c49 100644
--- a/fs/lockd/xdr4.c
+++ b/fs/lockd/xdr4.c
@@ -197,8 +197,10 @@ nlm4svc_decode_testargs(struct svc_rqst *rqstp, __be32 *p)
197} 197}
198 198
199int 199int
200nlm4svc_encode_testres(struct svc_rqst *rqstp, __be32 *p, struct nlm_res *resp) 200nlm4svc_encode_testres(struct svc_rqst *rqstp, __be32 *p)
201{ 201{
202 struct nlm_res *resp = rqstp->rq_resp;
203
202 if (!(p = nlm4_encode_testres(p, resp))) 204 if (!(p = nlm4_encode_testres(p, resp)))
203 return 0; 205 return 0;
204 return xdr_ressize_check(rqstp, p); 206 return xdr_ressize_check(rqstp, p);
@@ -277,8 +279,10 @@ nlm4svc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
277} 279}
278 280
279int 281int
280nlm4svc_encode_shareres(struct svc_rqst *rqstp, __be32 *p, struct nlm_res *resp) 282nlm4svc_encode_shareres(struct svc_rqst *rqstp, __be32 *p)
281{ 283{
284 struct nlm_res *resp = rqstp->rq_resp;
285
282 if (!(p = nlm4_encode_cookie(p, &resp->cookie))) 286 if (!(p = nlm4_encode_cookie(p, &resp->cookie)))
283 return 0; 287 return 0;
284 *p++ = resp->status; 288 *p++ = resp->status;
@@ -287,8 +291,10 @@ nlm4svc_encode_shareres(struct svc_rqst *rqstp, __be32 *p, struct nlm_res *resp)
287} 291}
288 292
289int 293int
290nlm4svc_encode_res(struct svc_rqst *rqstp, __be32 *p, struct nlm_res *resp) 294nlm4svc_encode_res(struct svc_rqst *rqstp, __be32 *p)
291{ 295{
296 struct nlm_res *resp = rqstp->rq_resp;
297
292 if (!(p = nlm4_encode_cookie(p, &resp->cookie))) 298 if (!(p = nlm4_encode_cookie(p, &resp->cookie)))
293 return 0; 299 return 0;
294 *p++ = resp->status; 300 *p++ = resp->status;
@@ -339,7 +345,7 @@ nlm4svc_decode_void(struct svc_rqst *rqstp, __be32 *p)
339} 345}
340 346
341int 347int
342nlm4svc_encode_void(struct svc_rqst *rqstp, __be32 *p, void *dummy) 348nlm4svc_encode_void(struct svc_rqst *rqstp, __be32 *p)
343{ 349{
344 return xdr_ressize_check(rqstp, p); 350 return xdr_ressize_check(rqstp, p);
345} 351}
diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c
index 23ecbf7a40c1..acf75dc63e14 100644
--- a/fs/nfs/callback_xdr.c
+++ b/fs/nfs/callback_xdr.c
@@ -63,7 +63,7 @@ static int nfs4_decode_void(struct svc_rqst *rqstp, __be32 *p)
63 return xdr_argsize_check(rqstp, p); 63 return xdr_argsize_check(rqstp, p);
64} 64}
65 65
66static int nfs4_encode_void(struct svc_rqst *rqstp, __be32 *p, void *dummy) 66static int nfs4_encode_void(struct svc_rqst *rqstp, __be32 *p)
67{ 67{
68 return xdr_ressize_check(rqstp, p); 68 return xdr_ressize_check(rqstp, p);
69} 69}
@@ -999,12 +999,12 @@ static struct svc_procedure nfs4_callback_procedures1[] = {
999 [CB_NULL] = { 999 [CB_NULL] = {
1000 .pc_func = nfs4_callback_null, 1000 .pc_func = nfs4_callback_null,
1001 .pc_decode = nfs4_decode_void, 1001 .pc_decode = nfs4_decode_void,
1002 .pc_encode = (kxdrproc_t)nfs4_encode_void, 1002 .pc_encode = nfs4_encode_void,
1003 .pc_xdrressize = 1, 1003 .pc_xdrressize = 1,
1004 }, 1004 },
1005 [CB_COMPOUND] = { 1005 [CB_COMPOUND] = {
1006 .pc_func = nfs4_callback_compound, 1006 .pc_func = nfs4_callback_compound,
1007 .pc_encode = (kxdrproc_t)nfs4_encode_void, 1007 .pc_encode = nfs4_encode_void,
1008 .pc_argsize = 256, 1008 .pc_argsize = 256,
1009 .pc_ressize = 256, 1009 .pc_ressize = 256,
1010 .pc_xdrressize = NFS4_CALLBACK_BUFSIZE, 1010 .pc_xdrressize = NFS4_CALLBACK_BUFSIZE,
diff --git a/fs/nfsd/nfs2acl.c b/fs/nfsd/nfs2acl.c
index bcfdaa83ee6c..fc6b179c8fff 100644
--- a/fs/nfsd/nfs2acl.c
+++ b/fs/nfsd/nfs2acl.c
@@ -251,15 +251,15 @@ static int nfsaclsvc_decode_accessargs(struct svc_rqst *rqstp, __be32 *p)
251 * There must be an encoding function for void results so svc_process 251 * There must be an encoding function for void results so svc_process
252 * will work properly. 252 * will work properly.
253 */ 253 */
254static int nfsaclsvc_encode_voidres(struct svc_rqst *rqstp, __be32 *p, void *dummy) 254static int nfsaclsvc_encode_voidres(struct svc_rqst *rqstp, __be32 *p)
255{ 255{
256 return xdr_ressize_check(rqstp, p); 256 return xdr_ressize_check(rqstp, p);
257} 257}
258 258
259/* GETACL */ 259/* GETACL */
260static int nfsaclsvc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p, 260static int nfsaclsvc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p)
261 struct nfsd3_getaclres *resp)
262{ 261{
262 struct nfsd3_getaclres *resp = rqstp->rq_resp;
263 struct dentry *dentry = resp->fh.fh_dentry; 263 struct dentry *dentry = resp->fh.fh_dentry;
264 struct inode *inode; 264 struct inode *inode;
265 struct kvec *head = rqstp->rq_res.head; 265 struct kvec *head = rqstp->rq_res.head;
@@ -302,17 +302,19 @@ static int nfsaclsvc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p,
302 return (n > 0); 302 return (n > 0);
303} 303}
304 304
305static int nfsaclsvc_encode_attrstatres(struct svc_rqst *rqstp, __be32 *p, 305static int nfsaclsvc_encode_attrstatres(struct svc_rqst *rqstp, __be32 *p)
306 struct nfsd_attrstat *resp)
307{ 306{
307 struct nfsd_attrstat *resp = rqstp->rq_resp;
308
308 p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat); 309 p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);
309 return xdr_ressize_check(rqstp, p); 310 return xdr_ressize_check(rqstp, p);
310} 311}
311 312
312/* ACCESS */ 313/* ACCESS */
313static int nfsaclsvc_encode_accessres(struct svc_rqst *rqstp, __be32 *p, 314static int nfsaclsvc_encode_accessres(struct svc_rqst *rqstp, __be32 *p)
314 struct nfsd3_accessres *resp)
315{ 315{
316 struct nfsd3_accessres *resp = rqstp->rq_resp;
317
316 p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat); 318 p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);
317 *p++ = htonl(resp->access); 319 *p++ = htonl(resp->access);
318 return xdr_ressize_check(rqstp, p); 320 return xdr_ressize_check(rqstp, p);
@@ -355,7 +357,7 @@ struct nfsd3_voidargs { int dummy; };
355{ \ 357{ \
356 .pc_func = nfsacld_proc_##name, \ 358 .pc_func = nfsacld_proc_##name, \
357 .pc_decode = nfsaclsvc_decode_##argt##args, \ 359 .pc_decode = nfsaclsvc_decode_##argt##args, \
358 .pc_encode = (kxdrproc_t) nfsaclsvc_encode_##rest##res, \ 360 .pc_encode = nfsaclsvc_encode_##rest##res, \
359 .pc_release = nfsaclsvc_release_##relt, \ 361 .pc_release = nfsaclsvc_release_##relt, \
360 .pc_argsize = sizeof(struct nfsd3_##argt##args), \ 362 .pc_argsize = sizeof(struct nfsd3_##argt##args), \
361 .pc_ressize = sizeof(struct nfsd3_##rest##res), \ 363 .pc_ressize = sizeof(struct nfsd3_##rest##res), \
diff --git a/fs/nfsd/nfs3acl.c b/fs/nfsd/nfs3acl.c
index 4e68d6b5f409..9437b758cbfd 100644
--- a/fs/nfsd/nfs3acl.c
+++ b/fs/nfsd/nfs3acl.c
@@ -168,9 +168,9 @@ static int nfs3svc_decode_setaclargs(struct svc_rqst *rqstp, __be32 *p)
168 */ 168 */
169 169
170/* GETACL */ 170/* GETACL */
171static int nfs3svc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p, 171static int nfs3svc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p)
172 struct nfsd3_getaclres *resp)
173{ 172{
173 struct nfsd3_getaclres *resp = rqstp->rq_resp;
174 struct dentry *dentry = resp->fh.fh_dentry; 174 struct dentry *dentry = resp->fh.fh_dentry;
175 175
176 p = nfs3svc_encode_post_op_attr(rqstp, p, &resp->fh); 176 p = nfs3svc_encode_post_op_attr(rqstp, p, &resp->fh);
@@ -213,9 +213,10 @@ static int nfs3svc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p,
213} 213}
214 214
215/* SETACL */ 215/* SETACL */
216static int nfs3svc_encode_setaclres(struct svc_rqst *rqstp, __be32 *p, 216static int nfs3svc_encode_setaclres(struct svc_rqst *rqstp, __be32 *p)
217 struct nfsd3_attrstat *resp)
218{ 217{
218 struct nfsd3_attrstat *resp = rqstp->rq_resp;
219
219 p = nfs3svc_encode_post_op_attr(rqstp, p, &resp->fh); 220 p = nfs3svc_encode_post_op_attr(rqstp, p, &resp->fh);
220 221
221 return xdr_ressize_check(rqstp, p); 222 return xdr_ressize_check(rqstp, p);
@@ -243,7 +244,7 @@ struct nfsd3_voidargs { int dummy; };
243{ \ 244{ \
244 .pc_func = nfsd3_proc_##name, \ 245 .pc_func = nfsd3_proc_##name, \
245 .pc_decode = nfs3svc_decode_##argt##args, \ 246 .pc_decode = nfs3svc_decode_##argt##args, \
246 .pc_encode = (kxdrproc_t) nfs3svc_encode_##rest##res, \ 247 .pc_encode = nfs3svc_encode_##rest##res, \
247 .pc_release = nfs3svc_release_##relt, \ 248 .pc_release = nfs3svc_release_##relt, \
248 .pc_argsize = sizeof(struct nfsd3_##argt##args), \ 249 .pc_argsize = sizeof(struct nfsd3_##argt##args), \
249 .pc_ressize = sizeof(struct nfsd3_##rest##res), \ 250 .pc_ressize = sizeof(struct nfsd3_##rest##res), \
diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c
index ed83e8a9e7b4..17c90c41a3a6 100644
--- a/fs/nfsd/nfs3proc.c
+++ b/fs/nfsd/nfs3proc.c
@@ -677,7 +677,7 @@ struct nfsd3_voidargs { int dummy; };
677static struct svc_procedure nfsd_procedures3[22] = { 677static struct svc_procedure nfsd_procedures3[22] = {
678 [NFS3PROC_NULL] = { 678 [NFS3PROC_NULL] = {
679 .pc_func = nfsd3_proc_null, 679 .pc_func = nfsd3_proc_null,
680 .pc_encode = (kxdrproc_t) nfs3svc_encode_voidres, 680 .pc_encode = nfs3svc_encode_voidres,
681 .pc_argsize = sizeof(struct nfsd3_voidargs), 681 .pc_argsize = sizeof(struct nfsd3_voidargs),
682 .pc_ressize = sizeof(struct nfsd3_voidres), 682 .pc_ressize = sizeof(struct nfsd3_voidres),
683 .pc_cachetype = RC_NOCACHE, 683 .pc_cachetype = RC_NOCACHE,
@@ -686,7 +686,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
686 [NFS3PROC_GETATTR] = { 686 [NFS3PROC_GETATTR] = {
687 .pc_func = nfsd3_proc_getattr, 687 .pc_func = nfsd3_proc_getattr,
688 .pc_decode = nfs3svc_decode_fhandleargs, 688 .pc_decode = nfs3svc_decode_fhandleargs,
689 .pc_encode = (kxdrproc_t) nfs3svc_encode_attrstatres, 689 .pc_encode = nfs3svc_encode_attrstatres,
690 .pc_release = nfs3svc_release_fhandle, 690 .pc_release = nfs3svc_release_fhandle,
691 .pc_argsize = sizeof(struct nfsd3_fhandleargs), 691 .pc_argsize = sizeof(struct nfsd3_fhandleargs),
692 .pc_ressize = sizeof(struct nfsd3_attrstatres), 692 .pc_ressize = sizeof(struct nfsd3_attrstatres),
@@ -696,7 +696,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
696 [NFS3PROC_SETATTR] = { 696 [NFS3PROC_SETATTR] = {
697 .pc_func = nfsd3_proc_setattr, 697 .pc_func = nfsd3_proc_setattr,
698 .pc_decode = nfs3svc_decode_sattrargs, 698 .pc_decode = nfs3svc_decode_sattrargs,
699 .pc_encode = (kxdrproc_t) nfs3svc_encode_wccstatres, 699 .pc_encode = nfs3svc_encode_wccstatres,
700 .pc_release = nfs3svc_release_fhandle, 700 .pc_release = nfs3svc_release_fhandle,
701 .pc_argsize = sizeof(struct nfsd3_sattrargs), 701 .pc_argsize = sizeof(struct nfsd3_sattrargs),
702 .pc_ressize = sizeof(struct nfsd3_wccstatres), 702 .pc_ressize = sizeof(struct nfsd3_wccstatres),
@@ -706,7 +706,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
706 [NFS3PROC_LOOKUP] = { 706 [NFS3PROC_LOOKUP] = {
707 .pc_func = nfsd3_proc_lookup, 707 .pc_func = nfsd3_proc_lookup,
708 .pc_decode = nfs3svc_decode_diropargs, 708 .pc_decode = nfs3svc_decode_diropargs,
709 .pc_encode = (kxdrproc_t) nfs3svc_encode_diropres, 709 .pc_encode = nfs3svc_encode_diropres,
710 .pc_release = nfs3svc_release_fhandle2, 710 .pc_release = nfs3svc_release_fhandle2,
711 .pc_argsize = sizeof(struct nfsd3_diropargs), 711 .pc_argsize = sizeof(struct nfsd3_diropargs),
712 .pc_ressize = sizeof(struct nfsd3_diropres), 712 .pc_ressize = sizeof(struct nfsd3_diropres),
@@ -716,7 +716,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
716 [NFS3PROC_ACCESS] = { 716 [NFS3PROC_ACCESS] = {
717 .pc_func = nfsd3_proc_access, 717 .pc_func = nfsd3_proc_access,
718 .pc_decode = nfs3svc_decode_accessargs, 718 .pc_decode = nfs3svc_decode_accessargs,
719 .pc_encode = (kxdrproc_t) nfs3svc_encode_accessres, 719 .pc_encode = nfs3svc_encode_accessres,
720 .pc_release = nfs3svc_release_fhandle, 720 .pc_release = nfs3svc_release_fhandle,
721 .pc_argsize = sizeof(struct nfsd3_accessargs), 721 .pc_argsize = sizeof(struct nfsd3_accessargs),
722 .pc_ressize = sizeof(struct nfsd3_accessres), 722 .pc_ressize = sizeof(struct nfsd3_accessres),
@@ -726,7 +726,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
726 [NFS3PROC_READLINK] = { 726 [NFS3PROC_READLINK] = {
727 .pc_func = nfsd3_proc_readlink, 727 .pc_func = nfsd3_proc_readlink,
728 .pc_decode = nfs3svc_decode_readlinkargs, 728 .pc_decode = nfs3svc_decode_readlinkargs,
729 .pc_encode = (kxdrproc_t) nfs3svc_encode_readlinkres, 729 .pc_encode = nfs3svc_encode_readlinkres,
730 .pc_release = nfs3svc_release_fhandle, 730 .pc_release = nfs3svc_release_fhandle,
731 .pc_argsize = sizeof(struct nfsd3_readlinkargs), 731 .pc_argsize = sizeof(struct nfsd3_readlinkargs),
732 .pc_ressize = sizeof(struct nfsd3_readlinkres), 732 .pc_ressize = sizeof(struct nfsd3_readlinkres),
@@ -736,7 +736,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
736 [NFS3PROC_READ] = { 736 [NFS3PROC_READ] = {
737 .pc_func = nfsd3_proc_read, 737 .pc_func = nfsd3_proc_read,
738 .pc_decode = nfs3svc_decode_readargs, 738 .pc_decode = nfs3svc_decode_readargs,
739 .pc_encode = (kxdrproc_t) nfs3svc_encode_readres, 739 .pc_encode = nfs3svc_encode_readres,
740 .pc_release = nfs3svc_release_fhandle, 740 .pc_release = nfs3svc_release_fhandle,
741 .pc_argsize = sizeof(struct nfsd3_readargs), 741 .pc_argsize = sizeof(struct nfsd3_readargs),
742 .pc_ressize = sizeof(struct nfsd3_readres), 742 .pc_ressize = sizeof(struct nfsd3_readres),
@@ -746,7 +746,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
746 [NFS3PROC_WRITE] = { 746 [NFS3PROC_WRITE] = {
747 .pc_func = nfsd3_proc_write, 747 .pc_func = nfsd3_proc_write,
748 .pc_decode = nfs3svc_decode_writeargs, 748 .pc_decode = nfs3svc_decode_writeargs,
749 .pc_encode = (kxdrproc_t) nfs3svc_encode_writeres, 749 .pc_encode = nfs3svc_encode_writeres,
750 .pc_release = nfs3svc_release_fhandle, 750 .pc_release = nfs3svc_release_fhandle,
751 .pc_argsize = sizeof(struct nfsd3_writeargs), 751 .pc_argsize = sizeof(struct nfsd3_writeargs),
752 .pc_ressize = sizeof(struct nfsd3_writeres), 752 .pc_ressize = sizeof(struct nfsd3_writeres),
@@ -756,7 +756,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
756 [NFS3PROC_CREATE] = { 756 [NFS3PROC_CREATE] = {
757 .pc_func = nfsd3_proc_create, 757 .pc_func = nfsd3_proc_create,
758 .pc_decode = nfs3svc_decode_createargs, 758 .pc_decode = nfs3svc_decode_createargs,
759 .pc_encode = (kxdrproc_t) nfs3svc_encode_createres, 759 .pc_encode = nfs3svc_encode_createres,
760 .pc_release = nfs3svc_release_fhandle2, 760 .pc_release = nfs3svc_release_fhandle2,
761 .pc_argsize = sizeof(struct nfsd3_createargs), 761 .pc_argsize = sizeof(struct nfsd3_createargs),
762 .pc_ressize = sizeof(struct nfsd3_createres), 762 .pc_ressize = sizeof(struct nfsd3_createres),
@@ -766,7 +766,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
766 [NFS3PROC_MKDIR] = { 766 [NFS3PROC_MKDIR] = {
767 .pc_func = nfsd3_proc_mkdir, 767 .pc_func = nfsd3_proc_mkdir,
768 .pc_decode = nfs3svc_decode_mkdirargs, 768 .pc_decode = nfs3svc_decode_mkdirargs,
769 .pc_encode = (kxdrproc_t) nfs3svc_encode_createres, 769 .pc_encode = nfs3svc_encode_createres,
770 .pc_release = nfs3svc_release_fhandle2, 770 .pc_release = nfs3svc_release_fhandle2,
771 .pc_argsize = sizeof(struct nfsd3_mkdirargs), 771 .pc_argsize = sizeof(struct nfsd3_mkdirargs),
772 .pc_ressize = sizeof(struct nfsd3_createres), 772 .pc_ressize = sizeof(struct nfsd3_createres),
@@ -776,7 +776,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
776 [NFS3PROC_SYMLINK] = { 776 [NFS3PROC_SYMLINK] = {
777 .pc_func = nfsd3_proc_symlink, 777 .pc_func = nfsd3_proc_symlink,
778 .pc_decode = nfs3svc_decode_symlinkargs, 778 .pc_decode = nfs3svc_decode_symlinkargs,
779 .pc_encode = (kxdrproc_t) nfs3svc_encode_createres, 779 .pc_encode = nfs3svc_encode_createres,
780 .pc_release = nfs3svc_release_fhandle2, 780 .pc_release = nfs3svc_release_fhandle2,
781 .pc_argsize = sizeof(struct nfsd3_symlinkargs), 781 .pc_argsize = sizeof(struct nfsd3_symlinkargs),
782 .pc_ressize = sizeof(struct nfsd3_createres), 782 .pc_ressize = sizeof(struct nfsd3_createres),
@@ -786,7 +786,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
786 [NFS3PROC_MKNOD] = { 786 [NFS3PROC_MKNOD] = {
787 .pc_func = nfsd3_proc_mknod, 787 .pc_func = nfsd3_proc_mknod,
788 .pc_decode = nfs3svc_decode_mknodargs, 788 .pc_decode = nfs3svc_decode_mknodargs,
789 .pc_encode = (kxdrproc_t) nfs3svc_encode_createres, 789 .pc_encode = nfs3svc_encode_createres,
790 .pc_release = nfs3svc_release_fhandle2, 790 .pc_release = nfs3svc_release_fhandle2,
791 .pc_argsize = sizeof(struct nfsd3_mknodargs), 791 .pc_argsize = sizeof(struct nfsd3_mknodargs),
792 .pc_ressize = sizeof(struct nfsd3_createres), 792 .pc_ressize = sizeof(struct nfsd3_createres),
@@ -796,7 +796,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
796 [NFS3PROC_REMOVE] = { 796 [NFS3PROC_REMOVE] = {
797 .pc_func = nfsd3_proc_remove, 797 .pc_func = nfsd3_proc_remove,
798 .pc_decode = nfs3svc_decode_diropargs, 798 .pc_decode = nfs3svc_decode_diropargs,
799 .pc_encode = (kxdrproc_t) nfs3svc_encode_wccstatres, 799 .pc_encode = nfs3svc_encode_wccstatres,
800 .pc_release = nfs3svc_release_fhandle, 800 .pc_release = nfs3svc_release_fhandle,
801 .pc_argsize = sizeof(struct nfsd3_diropargs), 801 .pc_argsize = sizeof(struct nfsd3_diropargs),
802 .pc_ressize = sizeof(struct nfsd3_wccstatres), 802 .pc_ressize = sizeof(struct nfsd3_wccstatres),
@@ -806,7 +806,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
806 [NFS3PROC_RMDIR] = { 806 [NFS3PROC_RMDIR] = {
807 .pc_func = nfsd3_proc_rmdir, 807 .pc_func = nfsd3_proc_rmdir,
808 .pc_decode = nfs3svc_decode_diropargs, 808 .pc_decode = nfs3svc_decode_diropargs,
809 .pc_encode = (kxdrproc_t) nfs3svc_encode_wccstatres, 809 .pc_encode = nfs3svc_encode_wccstatres,
810 .pc_release = nfs3svc_release_fhandle, 810 .pc_release = nfs3svc_release_fhandle,
811 .pc_argsize = sizeof(struct nfsd3_diropargs), 811 .pc_argsize = sizeof(struct nfsd3_diropargs),
812 .pc_ressize = sizeof(struct nfsd3_wccstatres), 812 .pc_ressize = sizeof(struct nfsd3_wccstatres),
@@ -816,7 +816,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
816 [NFS3PROC_RENAME] = { 816 [NFS3PROC_RENAME] = {
817 .pc_func = nfsd3_proc_rename, 817 .pc_func = nfsd3_proc_rename,
818 .pc_decode = nfs3svc_decode_renameargs, 818 .pc_decode = nfs3svc_decode_renameargs,
819 .pc_encode = (kxdrproc_t) nfs3svc_encode_renameres, 819 .pc_encode = nfs3svc_encode_renameres,
820 .pc_release = nfs3svc_release_fhandle2, 820 .pc_release = nfs3svc_release_fhandle2,
821 .pc_argsize = sizeof(struct nfsd3_renameargs), 821 .pc_argsize = sizeof(struct nfsd3_renameargs),
822 .pc_ressize = sizeof(struct nfsd3_renameres), 822 .pc_ressize = sizeof(struct nfsd3_renameres),
@@ -826,7 +826,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
826 [NFS3PROC_LINK] = { 826 [NFS3PROC_LINK] = {
827 .pc_func = nfsd3_proc_link, 827 .pc_func = nfsd3_proc_link,
828 .pc_decode = nfs3svc_decode_linkargs, 828 .pc_decode = nfs3svc_decode_linkargs,
829 .pc_encode = (kxdrproc_t) nfs3svc_encode_linkres, 829 .pc_encode = nfs3svc_encode_linkres,
830 .pc_release = nfs3svc_release_fhandle2, 830 .pc_release = nfs3svc_release_fhandle2,
831 .pc_argsize = sizeof(struct nfsd3_linkargs), 831 .pc_argsize = sizeof(struct nfsd3_linkargs),
832 .pc_ressize = sizeof(struct nfsd3_linkres), 832 .pc_ressize = sizeof(struct nfsd3_linkres),
@@ -836,7 +836,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
836 [NFS3PROC_READDIR] = { 836 [NFS3PROC_READDIR] = {
837 .pc_func = nfsd3_proc_readdir, 837 .pc_func = nfsd3_proc_readdir,
838 .pc_decode = nfs3svc_decode_readdirargs, 838 .pc_decode = nfs3svc_decode_readdirargs,
839 .pc_encode = (kxdrproc_t) nfs3svc_encode_readdirres, 839 .pc_encode = nfs3svc_encode_readdirres,
840 .pc_release = nfs3svc_release_fhandle, 840 .pc_release = nfs3svc_release_fhandle,
841 .pc_argsize = sizeof(struct nfsd3_readdirargs), 841 .pc_argsize = sizeof(struct nfsd3_readdirargs),
842 .pc_ressize = sizeof(struct nfsd3_readdirres), 842 .pc_ressize = sizeof(struct nfsd3_readdirres),
@@ -845,7 +845,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
845 [NFS3PROC_READDIRPLUS] = { 845 [NFS3PROC_READDIRPLUS] = {
846 .pc_func = nfsd3_proc_readdirplus, 846 .pc_func = nfsd3_proc_readdirplus,
847 .pc_decode = nfs3svc_decode_readdirplusargs, 847 .pc_decode = nfs3svc_decode_readdirplusargs,
848 .pc_encode = (kxdrproc_t) nfs3svc_encode_readdirres, 848 .pc_encode = nfs3svc_encode_readdirres,
849 .pc_release = nfs3svc_release_fhandle, 849 .pc_release = nfs3svc_release_fhandle,
850 .pc_argsize = sizeof(struct nfsd3_readdirplusargs), 850 .pc_argsize = sizeof(struct nfsd3_readdirplusargs),
851 .pc_ressize = sizeof(struct nfsd3_readdirres), 851 .pc_ressize = sizeof(struct nfsd3_readdirres),
@@ -854,7 +854,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
854 [NFS3PROC_FSSTAT] = { 854 [NFS3PROC_FSSTAT] = {
855 .pc_func = nfsd3_proc_fsstat, 855 .pc_func = nfsd3_proc_fsstat,
856 .pc_decode = nfs3svc_decode_fhandleargs, 856 .pc_decode = nfs3svc_decode_fhandleargs,
857 .pc_encode = (kxdrproc_t) nfs3svc_encode_fsstatres, 857 .pc_encode = nfs3svc_encode_fsstatres,
858 .pc_argsize = sizeof(struct nfsd3_fhandleargs), 858 .pc_argsize = sizeof(struct nfsd3_fhandleargs),
859 .pc_ressize = sizeof(struct nfsd3_fsstatres), 859 .pc_ressize = sizeof(struct nfsd3_fsstatres),
860 .pc_cachetype = RC_NOCACHE, 860 .pc_cachetype = RC_NOCACHE,
@@ -863,7 +863,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
863 [NFS3PROC_FSINFO] = { 863 [NFS3PROC_FSINFO] = {
864 .pc_func = nfsd3_proc_fsinfo, 864 .pc_func = nfsd3_proc_fsinfo,
865 .pc_decode = nfs3svc_decode_fhandleargs, 865 .pc_decode = nfs3svc_decode_fhandleargs,
866 .pc_encode = (kxdrproc_t) nfs3svc_encode_fsinfores, 866 .pc_encode = nfs3svc_encode_fsinfores,
867 .pc_argsize = sizeof(struct nfsd3_fhandleargs), 867 .pc_argsize = sizeof(struct nfsd3_fhandleargs),
868 .pc_ressize = sizeof(struct nfsd3_fsinfores), 868 .pc_ressize = sizeof(struct nfsd3_fsinfores),
869 .pc_cachetype = RC_NOCACHE, 869 .pc_cachetype = RC_NOCACHE,
@@ -872,7 +872,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
872 [NFS3PROC_PATHCONF] = { 872 [NFS3PROC_PATHCONF] = {
873 .pc_func = nfsd3_proc_pathconf, 873 .pc_func = nfsd3_proc_pathconf,
874 .pc_decode = nfs3svc_decode_fhandleargs, 874 .pc_decode = nfs3svc_decode_fhandleargs,
875 .pc_encode = (kxdrproc_t) nfs3svc_encode_pathconfres, 875 .pc_encode = nfs3svc_encode_pathconfres,
876 .pc_argsize = sizeof(struct nfsd3_fhandleargs), 876 .pc_argsize = sizeof(struct nfsd3_fhandleargs),
877 .pc_ressize = sizeof(struct nfsd3_pathconfres), 877 .pc_ressize = sizeof(struct nfsd3_pathconfres),
878 .pc_cachetype = RC_NOCACHE, 878 .pc_cachetype = RC_NOCACHE,
@@ -881,7 +881,7 @@ static struct svc_procedure nfsd_procedures3[22] = {
881 [NFS3PROC_COMMIT] = { 881 [NFS3PROC_COMMIT] = {
882 .pc_func = nfsd3_proc_commit, 882 .pc_func = nfsd3_proc_commit,
883 .pc_decode = nfs3svc_decode_commitargs, 883 .pc_decode = nfs3svc_decode_commitargs,
884 .pc_encode = (kxdrproc_t) nfs3svc_encode_commitres, 884 .pc_encode = nfs3svc_encode_commitres,
885 .pc_release = nfs3svc_release_fhandle, 885 .pc_release = nfs3svc_release_fhandle,
886 .pc_argsize = sizeof(struct nfsd3_commitargs), 886 .pc_argsize = sizeof(struct nfsd3_commitargs),
887 .pc_ressize = sizeof(struct nfsd3_commitres), 887 .pc_ressize = sizeof(struct nfsd3_commitres),
diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c
index be8bf8af9917..349e355edc73 100644
--- a/fs/nfsd/nfs3xdr.c
+++ b/fs/nfsd/nfs3xdr.c
@@ -645,16 +645,17 @@ nfs3svc_decode_commitargs(struct svc_rqst *rqstp, __be32 *p)
645 * will work properly. 645 * will work properly.
646 */ 646 */
647int 647int
648nfs3svc_encode_voidres(struct svc_rqst *rqstp, __be32 *p, void *dummy) 648nfs3svc_encode_voidres(struct svc_rqst *rqstp, __be32 *p)
649{ 649{
650 return xdr_ressize_check(rqstp, p); 650 return xdr_ressize_check(rqstp, p);
651} 651}
652 652
653/* GETATTR */ 653/* GETATTR */
654int 654int
655nfs3svc_encode_attrstat(struct svc_rqst *rqstp, __be32 *p, 655nfs3svc_encode_attrstat(struct svc_rqst *rqstp, __be32 *p)
656 struct nfsd3_attrstat *resp)
657{ 656{
657 struct nfsd3_attrstat *resp = rqstp->rq_resp;
658
658 if (resp->status == 0) { 659 if (resp->status == 0) {
659 lease_get_mtime(d_inode(resp->fh.fh_dentry), 660 lease_get_mtime(d_inode(resp->fh.fh_dentry),
660 &resp->stat.mtime); 661 &resp->stat.mtime);
@@ -665,18 +666,20 @@ nfs3svc_encode_attrstat(struct svc_rqst *rqstp, __be32 *p,
665 666
666/* SETATTR, REMOVE, RMDIR */ 667/* SETATTR, REMOVE, RMDIR */
667int 668int
668nfs3svc_encode_wccstat(struct svc_rqst *rqstp, __be32 *p, 669nfs3svc_encode_wccstat(struct svc_rqst *rqstp, __be32 *p)
669 struct nfsd3_attrstat *resp)
670{ 670{
671 struct nfsd3_attrstat *resp = rqstp->rq_resp;
672
671 p = encode_wcc_data(rqstp, p, &resp->fh); 673 p = encode_wcc_data(rqstp, p, &resp->fh);
672 return xdr_ressize_check(rqstp, p); 674 return xdr_ressize_check(rqstp, p);
673} 675}
674 676
675/* LOOKUP */ 677/* LOOKUP */
676int 678int
677nfs3svc_encode_diropres(struct svc_rqst *rqstp, __be32 *p, 679nfs3svc_encode_diropres(struct svc_rqst *rqstp, __be32 *p)
678 struct nfsd3_diropres *resp)
679{ 680{
681 struct nfsd3_diropres *resp = rqstp->rq_resp;
682
680 if (resp->status == 0) { 683 if (resp->status == 0) {
681 p = encode_fh(p, &resp->fh); 684 p = encode_fh(p, &resp->fh);
682 p = encode_post_op_attr(rqstp, p, &resp->fh); 685 p = encode_post_op_attr(rqstp, p, &resp->fh);
@@ -687,9 +690,10 @@ nfs3svc_encode_diropres(struct svc_rqst *rqstp, __be32 *p,
687 690
688/* ACCESS */ 691/* ACCESS */
689int 692int
690nfs3svc_encode_accessres(struct svc_rqst *rqstp, __be32 *p, 693nfs3svc_encode_accessres(struct svc_rqst *rqstp, __be32 *p)
691 struct nfsd3_accessres *resp)
692{ 694{
695 struct nfsd3_accessres *resp = rqstp->rq_resp;
696
693 p = encode_post_op_attr(rqstp, p, &resp->fh); 697 p = encode_post_op_attr(rqstp, p, &resp->fh);
694 if (resp->status == 0) 698 if (resp->status == 0)
695 *p++ = htonl(resp->access); 699 *p++ = htonl(resp->access);
@@ -698,9 +702,10 @@ nfs3svc_encode_accessres(struct svc_rqst *rqstp, __be32 *p,
698 702
699/* READLINK */ 703/* READLINK */
700int 704int
701nfs3svc_encode_readlinkres(struct svc_rqst *rqstp, __be32 *p, 705nfs3svc_encode_readlinkres(struct svc_rqst *rqstp, __be32 *p)
702 struct nfsd3_readlinkres *resp)
703{ 706{
707 struct nfsd3_readlinkres *resp = rqstp->rq_resp;
708
704 p = encode_post_op_attr(rqstp, p, &resp->fh); 709 p = encode_post_op_attr(rqstp, p, &resp->fh);
705 if (resp->status == 0) { 710 if (resp->status == 0) {
706 *p++ = htonl(resp->len); 711 *p++ = htonl(resp->len);
@@ -719,9 +724,10 @@ nfs3svc_encode_readlinkres(struct svc_rqst *rqstp, __be32 *p,
719 724
720/* READ */ 725/* READ */
721int 726int
722nfs3svc_encode_readres(struct svc_rqst *rqstp, __be32 *p, 727nfs3svc_encode_readres(struct svc_rqst *rqstp, __be32 *p)
723 struct nfsd3_readres *resp)
724{ 728{
729 struct nfsd3_readres *resp = rqstp->rq_resp;
730
725 p = encode_post_op_attr(rqstp, p, &resp->fh); 731 p = encode_post_op_attr(rqstp, p, &resp->fh);
726 if (resp->status == 0) { 732 if (resp->status == 0) {
727 *p++ = htonl(resp->count); 733 *p++ = htonl(resp->count);
@@ -743,9 +749,9 @@ nfs3svc_encode_readres(struct svc_rqst *rqstp, __be32 *p,
743 749
744/* WRITE */ 750/* WRITE */
745int 751int
746nfs3svc_encode_writeres(struct svc_rqst *rqstp, __be32 *p, 752nfs3svc_encode_writeres(struct svc_rqst *rqstp, __be32 *p)
747 struct nfsd3_writeres *resp)
748{ 753{
754 struct nfsd3_writeres *resp = rqstp->rq_resp;
749 struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id); 755 struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
750 756
751 p = encode_wcc_data(rqstp, p, &resp->fh); 757 p = encode_wcc_data(rqstp, p, &resp->fh);
@@ -760,9 +766,10 @@ nfs3svc_encode_writeres(struct svc_rqst *rqstp, __be32 *p,
760 766
761/* CREATE, MKDIR, SYMLINK, MKNOD */ 767/* CREATE, MKDIR, SYMLINK, MKNOD */
762int 768int
763nfs3svc_encode_createres(struct svc_rqst *rqstp, __be32 *p, 769nfs3svc_encode_createres(struct svc_rqst *rqstp, __be32 *p)
764 struct nfsd3_diropres *resp)
765{ 770{
771 struct nfsd3_diropres *resp = rqstp->rq_resp;
772
766 if (resp->status == 0) { 773 if (resp->status == 0) {
767 *p++ = xdr_one; 774 *p++ = xdr_one;
768 p = encode_fh(p, &resp->fh); 775 p = encode_fh(p, &resp->fh);
@@ -774,9 +781,10 @@ nfs3svc_encode_createres(struct svc_rqst *rqstp, __be32 *p,
774 781
775/* RENAME */ 782/* RENAME */
776int 783int
777nfs3svc_encode_renameres(struct svc_rqst *rqstp, __be32 *p, 784nfs3svc_encode_renameres(struct svc_rqst *rqstp, __be32 *p)
778 struct nfsd3_renameres *resp)
779{ 785{
786 struct nfsd3_renameres *resp = rqstp->rq_resp;
787
780 p = encode_wcc_data(rqstp, p, &resp->ffh); 788 p = encode_wcc_data(rqstp, p, &resp->ffh);
781 p = encode_wcc_data(rqstp, p, &resp->tfh); 789 p = encode_wcc_data(rqstp, p, &resp->tfh);
782 return xdr_ressize_check(rqstp, p); 790 return xdr_ressize_check(rqstp, p);
@@ -784,9 +792,10 @@ nfs3svc_encode_renameres(struct svc_rqst *rqstp, __be32 *p,
784 792
785/* LINK */ 793/* LINK */
786int 794int
787nfs3svc_encode_linkres(struct svc_rqst *rqstp, __be32 *p, 795nfs3svc_encode_linkres(struct svc_rqst *rqstp, __be32 *p)
788 struct nfsd3_linkres *resp)
789{ 796{
797 struct nfsd3_linkres *resp = rqstp->rq_resp;
798
790 p = encode_post_op_attr(rqstp, p, &resp->fh); 799 p = encode_post_op_attr(rqstp, p, &resp->fh);
791 p = encode_wcc_data(rqstp, p, &resp->tfh); 800 p = encode_wcc_data(rqstp, p, &resp->tfh);
792 return xdr_ressize_check(rqstp, p); 801 return xdr_ressize_check(rqstp, p);
@@ -794,9 +803,10 @@ nfs3svc_encode_linkres(struct svc_rqst *rqstp, __be32 *p,
794 803
795/* READDIR */ 804/* READDIR */
796int 805int
797nfs3svc_encode_readdirres(struct svc_rqst *rqstp, __be32 *p, 806nfs3svc_encode_readdirres(struct svc_rqst *rqstp, __be32 *p)
798 struct nfsd3_readdirres *resp)
799{ 807{
808 struct nfsd3_readdirres *resp = rqstp->rq_resp;
809
800 p = encode_post_op_attr(rqstp, p, &resp->fh); 810 p = encode_post_op_attr(rqstp, p, &resp->fh);
801 811
802 if (resp->status == 0) { 812 if (resp->status == 0) {
@@ -1044,9 +1054,9 @@ nfs3svc_encode_entry_plus(void *cd, const char *name,
1044 1054
1045/* FSSTAT */ 1055/* FSSTAT */
1046int 1056int
1047nfs3svc_encode_fsstatres(struct svc_rqst *rqstp, __be32 *p, 1057nfs3svc_encode_fsstatres(struct svc_rqst *rqstp, __be32 *p)
1048 struct nfsd3_fsstatres *resp)
1049{ 1058{
1059 struct nfsd3_fsstatres *resp = rqstp->rq_resp;
1050 struct kstatfs *s = &resp->stats; 1060 struct kstatfs *s = &resp->stats;
1051 u64 bs = s->f_bsize; 1061 u64 bs = s->f_bsize;
1052 1062
@@ -1066,9 +1076,10 @@ nfs3svc_encode_fsstatres(struct svc_rqst *rqstp, __be32 *p,
1066 1076
1067/* FSINFO */ 1077/* FSINFO */
1068int 1078int
1069nfs3svc_encode_fsinfores(struct svc_rqst *rqstp, __be32 *p, 1079nfs3svc_encode_fsinfores(struct svc_rqst *rqstp, __be32 *p)
1070 struct nfsd3_fsinfores *resp)
1071{ 1080{
1081 struct nfsd3_fsinfores *resp = rqstp->rq_resp;
1082
1072 *p++ = xdr_zero; /* no post_op_attr */ 1083 *p++ = xdr_zero; /* no post_op_attr */
1073 1084
1074 if (resp->status == 0) { 1085 if (resp->status == 0) {
@@ -1090,9 +1101,10 @@ nfs3svc_encode_fsinfores(struct svc_rqst *rqstp, __be32 *p,
1090 1101
1091/* PATHCONF */ 1102/* PATHCONF */
1092int 1103int
1093nfs3svc_encode_pathconfres(struct svc_rqst *rqstp, __be32 *p, 1104nfs3svc_encode_pathconfres(struct svc_rqst *rqstp, __be32 *p)
1094 struct nfsd3_pathconfres *resp)
1095{ 1105{
1106 struct nfsd3_pathconfres *resp = rqstp->rq_resp;
1107
1096 *p++ = xdr_zero; /* no post_op_attr */ 1108 *p++ = xdr_zero; /* no post_op_attr */
1097 1109
1098 if (resp->status == 0) { 1110 if (resp->status == 0) {
@@ -1109,9 +1121,9 @@ nfs3svc_encode_pathconfres(struct svc_rqst *rqstp, __be32 *p,
1109 1121
1110/* COMMIT */ 1122/* COMMIT */
1111int 1123int
1112nfs3svc_encode_commitres(struct svc_rqst *rqstp, __be32 *p, 1124nfs3svc_encode_commitres(struct svc_rqst *rqstp, __be32 *p)
1113 struct nfsd3_commitres *resp)
1114{ 1125{
1126 struct nfsd3_commitres *resp = rqstp->rq_resp;
1115 struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id); 1127 struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
1116 1128
1117 p = encode_wcc_data(rqstp, p, &resp->fh); 1129 p = encode_wcc_data(rqstp, p, &resp->fh);
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 6ff434b77a9e..ad0622efae4e 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -2520,7 +2520,7 @@ struct nfsd4_voidargs { int dummy; };
2520static struct svc_procedure nfsd_procedures4[2] = { 2520static struct svc_procedure nfsd_procedures4[2] = {
2521 [NFSPROC4_NULL] = { 2521 [NFSPROC4_NULL] = {
2522 .pc_func = nfsd4_proc_null, 2522 .pc_func = nfsd4_proc_null,
2523 .pc_encode = (kxdrproc_t) nfs4svc_encode_voidres, 2523 .pc_encode = nfs4svc_encode_voidres,
2524 .pc_argsize = sizeof(struct nfsd4_voidargs), 2524 .pc_argsize = sizeof(struct nfsd4_voidargs),
2525 .pc_ressize = sizeof(struct nfsd4_voidres), 2525 .pc_ressize = sizeof(struct nfsd4_voidres),
2526 .pc_cachetype = RC_NOCACHE, 2526 .pc_cachetype = RC_NOCACHE,
@@ -2529,7 +2529,7 @@ static struct svc_procedure nfsd_procedures4[2] = {
2529 [NFSPROC4_COMPOUND] = { 2529 [NFSPROC4_COMPOUND] = {
2530 .pc_func = nfsd4_proc_compound, 2530 .pc_func = nfsd4_proc_compound,
2531 .pc_decode = nfs4svc_decode_compoundargs, 2531 .pc_decode = nfs4svc_decode_compoundargs,
2532 .pc_encode = (kxdrproc_t) nfs4svc_encode_compoundres, 2532 .pc_encode = nfs4svc_encode_compoundres,
2533 .pc_argsize = sizeof(struct nfsd4_compoundargs), 2533 .pc_argsize = sizeof(struct nfsd4_compoundargs),
2534 .pc_ressize = sizeof(struct nfsd4_compoundres), 2534 .pc_ressize = sizeof(struct nfsd4_compoundres),
2535 .pc_release = nfsd4_release_compoundargs, 2535 .pc_release = nfsd4_release_compoundargs,
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 3a7e117bd11e..54e212e3541e 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -4538,7 +4538,7 @@ nfsd4_encode_replay(struct xdr_stream *xdr, struct nfsd4_op *op)
4538} 4538}
4539 4539
4540int 4540int
4541nfs4svc_encode_voidres(struct svc_rqst *rqstp, __be32 *p, void *dummy) 4541nfs4svc_encode_voidres(struct svc_rqst *rqstp, __be32 *p)
4542{ 4542{
4543 return xdr_ressize_check(rqstp, p); 4543 return xdr_ressize_check(rqstp, p);
4544} 4544}
@@ -4584,11 +4584,12 @@ nfs4svc_decode_compoundargs(struct svc_rqst *rqstp, __be32 *p)
4584} 4584}
4585 4585
4586int 4586int
4587nfs4svc_encode_compoundres(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compoundres *resp) 4587nfs4svc_encode_compoundres(struct svc_rqst *rqstp, __be32 *p)
4588{ 4588{
4589 /* 4589 /*
4590 * All that remains is to write the tag and operation count... 4590 * All that remains is to write the tag and operation count...
4591 */ 4591 */
4592 struct nfsd4_compoundres *resp = rqstp->rq_resp;
4592 struct xdr_buf *buf = resp->xdr.buf; 4593 struct xdr_buf *buf = resp->xdr.buf;
4593 4594
4594 WARN_ON_ONCE(buf->len != buf->head[0].iov_len + buf->page_len + 4595 WARN_ON_ONCE(buf->len != buf->head[0].iov_len + buf->page_len +
diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c
index d351d0ef6d34..0ef88d0e67d9 100644
--- a/fs/nfsd/nfsproc.c
+++ b/fs/nfsd/nfsproc.c
@@ -577,7 +577,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
577 [NFSPROC_NULL] = { 577 [NFSPROC_NULL] = {
578 .pc_func = nfsd_proc_null, 578 .pc_func = nfsd_proc_null,
579 .pc_decode = nfssvc_decode_void, 579 .pc_decode = nfssvc_decode_void,
580 .pc_encode = (kxdrproc_t) nfssvc_encode_void, 580 .pc_encode = nfssvc_encode_void,
581 .pc_argsize = sizeof(struct nfsd_void), 581 .pc_argsize = sizeof(struct nfsd_void),
582 .pc_ressize = sizeof(struct nfsd_void), 582 .pc_ressize = sizeof(struct nfsd_void),
583 .pc_cachetype = RC_NOCACHE, 583 .pc_cachetype = RC_NOCACHE,
@@ -586,7 +586,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
586 [NFSPROC_GETATTR] = { 586 [NFSPROC_GETATTR] = {
587 .pc_func = nfsd_proc_getattr, 587 .pc_func = nfsd_proc_getattr,
588 .pc_decode = nfssvc_decode_fhandle, 588 .pc_decode = nfssvc_decode_fhandle,
589 .pc_encode = (kxdrproc_t) nfssvc_encode_attrstat, 589 .pc_encode = nfssvc_encode_attrstat,
590 .pc_release = nfssvc_release_fhandle, 590 .pc_release = nfssvc_release_fhandle,
591 .pc_argsize = sizeof(struct nfsd_fhandle), 591 .pc_argsize = sizeof(struct nfsd_fhandle),
592 .pc_ressize = sizeof(struct nfsd_attrstat), 592 .pc_ressize = sizeof(struct nfsd_attrstat),
@@ -596,7 +596,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
596 [NFSPROC_SETATTR] = { 596 [NFSPROC_SETATTR] = {
597 .pc_func = nfsd_proc_setattr, 597 .pc_func = nfsd_proc_setattr,
598 .pc_decode = nfssvc_decode_sattrargs, 598 .pc_decode = nfssvc_decode_sattrargs,
599 .pc_encode = (kxdrproc_t) nfssvc_encode_attrstat, 599 .pc_encode = nfssvc_encode_attrstat,
600 .pc_release = nfssvc_release_fhandle, 600 .pc_release = nfssvc_release_fhandle,
601 .pc_argsize = sizeof(struct nfsd_sattrargs), 601 .pc_argsize = sizeof(struct nfsd_sattrargs),
602 .pc_ressize = sizeof(struct nfsd_attrstat), 602 .pc_ressize = sizeof(struct nfsd_attrstat),
@@ -605,7 +605,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
605 }, 605 },
606 [NFSPROC_ROOT] = { 606 [NFSPROC_ROOT] = {
607 .pc_decode = nfssvc_decode_void, 607 .pc_decode = nfssvc_decode_void,
608 .pc_encode = (kxdrproc_t) nfssvc_encode_void, 608 .pc_encode = nfssvc_encode_void,
609 .pc_argsize = sizeof(struct nfsd_void), 609 .pc_argsize = sizeof(struct nfsd_void),
610 .pc_ressize = sizeof(struct nfsd_void), 610 .pc_ressize = sizeof(struct nfsd_void),
611 .pc_cachetype = RC_NOCACHE, 611 .pc_cachetype = RC_NOCACHE,
@@ -614,7 +614,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
614 [NFSPROC_LOOKUP] = { 614 [NFSPROC_LOOKUP] = {
615 .pc_func = nfsd_proc_lookup, 615 .pc_func = nfsd_proc_lookup,
616 .pc_decode = nfssvc_decode_diropargs, 616 .pc_decode = nfssvc_decode_diropargs,
617 .pc_encode = (kxdrproc_t) nfssvc_encode_diropres, 617 .pc_encode = nfssvc_encode_diropres,
618 .pc_release = nfssvc_release_fhandle, 618 .pc_release = nfssvc_release_fhandle,
619 .pc_argsize = sizeof(struct nfsd_diropargs), 619 .pc_argsize = sizeof(struct nfsd_diropargs),
620 .pc_ressize = sizeof(struct nfsd_diropres), 620 .pc_ressize = sizeof(struct nfsd_diropres),
@@ -624,7 +624,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
624 [NFSPROC_READLINK] = { 624 [NFSPROC_READLINK] = {
625 .pc_func = nfsd_proc_readlink, 625 .pc_func = nfsd_proc_readlink,
626 .pc_decode = nfssvc_decode_readlinkargs, 626 .pc_decode = nfssvc_decode_readlinkargs,
627 .pc_encode = (kxdrproc_t) nfssvc_encode_readlinkres, 627 .pc_encode = nfssvc_encode_readlinkres,
628 .pc_argsize = sizeof(struct nfsd_readlinkargs), 628 .pc_argsize = sizeof(struct nfsd_readlinkargs),
629 .pc_ressize = sizeof(struct nfsd_readlinkres), 629 .pc_ressize = sizeof(struct nfsd_readlinkres),
630 .pc_cachetype = RC_NOCACHE, 630 .pc_cachetype = RC_NOCACHE,
@@ -633,7 +633,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
633 [NFSPROC_READ] = { 633 [NFSPROC_READ] = {
634 .pc_func = nfsd_proc_read, 634 .pc_func = nfsd_proc_read,
635 .pc_decode = nfssvc_decode_readargs, 635 .pc_decode = nfssvc_decode_readargs,
636 .pc_encode = (kxdrproc_t) nfssvc_encode_readres, 636 .pc_encode = nfssvc_encode_readres,
637 .pc_release = nfssvc_release_fhandle, 637 .pc_release = nfssvc_release_fhandle,
638 .pc_argsize = sizeof(struct nfsd_readargs), 638 .pc_argsize = sizeof(struct nfsd_readargs),
639 .pc_ressize = sizeof(struct nfsd_readres), 639 .pc_ressize = sizeof(struct nfsd_readres),
@@ -642,7 +642,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
642 }, 642 },
643 [NFSPROC_WRITECACHE] = { 643 [NFSPROC_WRITECACHE] = {
644 .pc_decode = nfssvc_decode_void, 644 .pc_decode = nfssvc_decode_void,
645 .pc_encode = (kxdrproc_t) nfssvc_encode_void, 645 .pc_encode = nfssvc_encode_void,
646 .pc_argsize = sizeof(struct nfsd_void), 646 .pc_argsize = sizeof(struct nfsd_void),
647 .pc_ressize = sizeof(struct nfsd_void), 647 .pc_ressize = sizeof(struct nfsd_void),
648 .pc_cachetype = RC_NOCACHE, 648 .pc_cachetype = RC_NOCACHE,
@@ -651,7 +651,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
651 [NFSPROC_WRITE] = { 651 [NFSPROC_WRITE] = {
652 .pc_func = nfsd_proc_write, 652 .pc_func = nfsd_proc_write,
653 .pc_decode = nfssvc_decode_writeargs, 653 .pc_decode = nfssvc_decode_writeargs,
654 .pc_encode = (kxdrproc_t) nfssvc_encode_attrstat, 654 .pc_encode = nfssvc_encode_attrstat,
655 .pc_release = nfssvc_release_fhandle, 655 .pc_release = nfssvc_release_fhandle,
656 .pc_argsize = sizeof(struct nfsd_writeargs), 656 .pc_argsize = sizeof(struct nfsd_writeargs),
657 .pc_ressize = sizeof(struct nfsd_attrstat), 657 .pc_ressize = sizeof(struct nfsd_attrstat),
@@ -661,7 +661,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
661 [NFSPROC_CREATE] = { 661 [NFSPROC_CREATE] = {
662 .pc_func = nfsd_proc_create, 662 .pc_func = nfsd_proc_create,
663 .pc_decode = nfssvc_decode_createargs, 663 .pc_decode = nfssvc_decode_createargs,
664 .pc_encode = (kxdrproc_t) nfssvc_encode_diropres, 664 .pc_encode = nfssvc_encode_diropres,
665 .pc_release = nfssvc_release_fhandle, 665 .pc_release = nfssvc_release_fhandle,
666 .pc_argsize = sizeof(struct nfsd_createargs), 666 .pc_argsize = sizeof(struct nfsd_createargs),
667 .pc_ressize = sizeof(struct nfsd_diropres), 667 .pc_ressize = sizeof(struct nfsd_diropres),
@@ -671,7 +671,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
671 [NFSPROC_REMOVE] = { 671 [NFSPROC_REMOVE] = {
672 .pc_func = nfsd_proc_remove, 672 .pc_func = nfsd_proc_remove,
673 .pc_decode = nfssvc_decode_diropargs, 673 .pc_decode = nfssvc_decode_diropargs,
674 .pc_encode = (kxdrproc_t) nfssvc_encode_void, 674 .pc_encode = nfssvc_encode_void,
675 .pc_argsize = sizeof(struct nfsd_diropargs), 675 .pc_argsize = sizeof(struct nfsd_diropargs),
676 .pc_ressize = sizeof(struct nfsd_void), 676 .pc_ressize = sizeof(struct nfsd_void),
677 .pc_cachetype = RC_REPLSTAT, 677 .pc_cachetype = RC_REPLSTAT,
@@ -680,7 +680,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
680 [NFSPROC_RENAME] = { 680 [NFSPROC_RENAME] = {
681 .pc_func = nfsd_proc_rename, 681 .pc_func = nfsd_proc_rename,
682 .pc_decode = nfssvc_decode_renameargs, 682 .pc_decode = nfssvc_decode_renameargs,
683 .pc_encode = (kxdrproc_t) nfssvc_encode_void, 683 .pc_encode = nfssvc_encode_void,
684 .pc_argsize = sizeof(struct nfsd_renameargs), 684 .pc_argsize = sizeof(struct nfsd_renameargs),
685 .pc_ressize = sizeof(struct nfsd_void), 685 .pc_ressize = sizeof(struct nfsd_void),
686 .pc_cachetype = RC_REPLSTAT, 686 .pc_cachetype = RC_REPLSTAT,
@@ -689,7 +689,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
689 [NFSPROC_LINK] = { 689 [NFSPROC_LINK] = {
690 .pc_func = nfsd_proc_link, 690 .pc_func = nfsd_proc_link,
691 .pc_decode = nfssvc_decode_linkargs, 691 .pc_decode = nfssvc_decode_linkargs,
692 .pc_encode = (kxdrproc_t) nfssvc_encode_void, 692 .pc_encode = nfssvc_encode_void,
693 .pc_argsize = sizeof(struct nfsd_linkargs), 693 .pc_argsize = sizeof(struct nfsd_linkargs),
694 .pc_ressize = sizeof(struct nfsd_void), 694 .pc_ressize = sizeof(struct nfsd_void),
695 .pc_cachetype = RC_REPLSTAT, 695 .pc_cachetype = RC_REPLSTAT,
@@ -698,7 +698,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
698 [NFSPROC_SYMLINK] = { 698 [NFSPROC_SYMLINK] = {
699 .pc_func = nfsd_proc_symlink, 699 .pc_func = nfsd_proc_symlink,
700 .pc_decode = nfssvc_decode_symlinkargs, 700 .pc_decode = nfssvc_decode_symlinkargs,
701 .pc_encode = (kxdrproc_t) nfssvc_encode_void, 701 .pc_encode = nfssvc_encode_void,
702 .pc_argsize = sizeof(struct nfsd_symlinkargs), 702 .pc_argsize = sizeof(struct nfsd_symlinkargs),
703 .pc_ressize = sizeof(struct nfsd_void), 703 .pc_ressize = sizeof(struct nfsd_void),
704 .pc_cachetype = RC_REPLSTAT, 704 .pc_cachetype = RC_REPLSTAT,
@@ -707,7 +707,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
707 [NFSPROC_MKDIR] = { 707 [NFSPROC_MKDIR] = {
708 .pc_func = nfsd_proc_mkdir, 708 .pc_func = nfsd_proc_mkdir,
709 .pc_decode = nfssvc_decode_createargs, 709 .pc_decode = nfssvc_decode_createargs,
710 .pc_encode = (kxdrproc_t) nfssvc_encode_diropres, 710 .pc_encode = nfssvc_encode_diropres,
711 .pc_release = nfssvc_release_fhandle, 711 .pc_release = nfssvc_release_fhandle,
712 .pc_argsize = sizeof(struct nfsd_createargs), 712 .pc_argsize = sizeof(struct nfsd_createargs),
713 .pc_ressize = sizeof(struct nfsd_diropres), 713 .pc_ressize = sizeof(struct nfsd_diropres),
@@ -717,7 +717,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
717 [NFSPROC_RMDIR] = { 717 [NFSPROC_RMDIR] = {
718 .pc_func = nfsd_proc_rmdir, 718 .pc_func = nfsd_proc_rmdir,
719 .pc_decode = nfssvc_decode_diropargs, 719 .pc_decode = nfssvc_decode_diropargs,
720 .pc_encode = (kxdrproc_t) nfssvc_encode_void, 720 .pc_encode = nfssvc_encode_void,
721 .pc_argsize = sizeof(struct nfsd_diropargs), 721 .pc_argsize = sizeof(struct nfsd_diropargs),
722 .pc_ressize = sizeof(struct nfsd_void), 722 .pc_ressize = sizeof(struct nfsd_void),
723 .pc_cachetype = RC_REPLSTAT, 723 .pc_cachetype = RC_REPLSTAT,
@@ -726,7 +726,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
726 [NFSPROC_READDIR] = { 726 [NFSPROC_READDIR] = {
727 .pc_func = nfsd_proc_readdir, 727 .pc_func = nfsd_proc_readdir,
728 .pc_decode = nfssvc_decode_readdirargs, 728 .pc_decode = nfssvc_decode_readdirargs,
729 .pc_encode = (kxdrproc_t) nfssvc_encode_readdirres, 729 .pc_encode = nfssvc_encode_readdirres,
730 .pc_argsize = sizeof(struct nfsd_readdirargs), 730 .pc_argsize = sizeof(struct nfsd_readdirargs),
731 .pc_ressize = sizeof(struct nfsd_readdirres), 731 .pc_ressize = sizeof(struct nfsd_readdirres),
732 .pc_cachetype = RC_NOCACHE, 732 .pc_cachetype = RC_NOCACHE,
@@ -734,7 +734,7 @@ static struct svc_procedure nfsd_procedures2[18] = {
734 [NFSPROC_STATFS] = { 734 [NFSPROC_STATFS] = {
735 .pc_func = nfsd_proc_statfs, 735 .pc_func = nfsd_proc_statfs,
736 .pc_decode = nfssvc_decode_fhandle, 736 .pc_decode = nfssvc_decode_fhandle,
737 .pc_encode = (kxdrproc_t) nfssvc_encode_statfsres, 737 .pc_encode = nfssvc_encode_statfsres,
738 .pc_argsize = sizeof(struct nfsd_fhandle), 738 .pc_argsize = sizeof(struct nfsd_fhandle),
739 .pc_ressize = sizeof(struct nfsd_statfsres), 739 .pc_ressize = sizeof(struct nfsd_statfsres),
740 .pc_cachetype = RC_NOCACHE, 740 .pc_cachetype = RC_NOCACHE,
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index 3e00499d7ad7..555233664124 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -782,7 +782,6 @@ int
782nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp) 782nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
783{ 783{
784 struct svc_procedure *proc; 784 struct svc_procedure *proc;
785 kxdrproc_t xdr;
786 __be32 nfserr; 785 __be32 nfserr;
787 __be32 *nfserrp; 786 __be32 *nfserrp;
788 787
@@ -841,9 +840,7 @@ nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
841 * For NFSv2, additional info is never returned in case of an error. 840 * For NFSv2, additional info is never returned in case of an error.
842 */ 841 */
843 if (!(nfserr && rqstp->rq_vers == 2)) { 842 if (!(nfserr && rqstp->rq_vers == 2)) {
844 xdr = proc->pc_encode; 843 if (proc->pc_encode && !proc->pc_encode(rqstp, nfserrp)) {
845 if (xdr && !xdr(rqstp, nfserrp,
846 rqstp->rq_resp)) {
847 /* Failed to encode result. Release cache entry */ 844 /* Failed to encode result. Release cache entry */
848 dprintk("nfsd: failed to encode result!\n"); 845 dprintk("nfsd: failed to encode result!\n");
849 nfsd_cache_update(rqstp, RC_NOCACHE, NULL); 846 nfsd_cache_update(rqstp, RC_NOCACHE, NULL);
diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c
index 0957ceebe1aa..bb1998c5ae61 100644
--- a/fs/nfsd/nfsxdr.c
+++ b/fs/nfsd/nfsxdr.c
@@ -429,32 +429,35 @@ nfssvc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p)
429 * XDR encode functions 429 * XDR encode functions
430 */ 430 */
431int 431int
432nfssvc_encode_void(struct svc_rqst *rqstp, __be32 *p, void *dummy) 432nfssvc_encode_void(struct svc_rqst *rqstp, __be32 *p)
433{ 433{
434 return xdr_ressize_check(rqstp, p); 434 return xdr_ressize_check(rqstp, p);
435} 435}
436 436
437int 437int
438nfssvc_encode_attrstat(struct svc_rqst *rqstp, __be32 *p, 438nfssvc_encode_attrstat(struct svc_rqst *rqstp, __be32 *p)
439 struct nfsd_attrstat *resp)
440{ 439{
440 struct nfsd_attrstat *resp = rqstp->rq_resp;
441
441 p = encode_fattr(rqstp, p, &resp->fh, &resp->stat); 442 p = encode_fattr(rqstp, p, &resp->fh, &resp->stat);
442 return xdr_ressize_check(rqstp, p); 443 return xdr_ressize_check(rqstp, p);
443} 444}
444 445
445int 446int
446nfssvc_encode_diropres(struct svc_rqst *rqstp, __be32 *p, 447nfssvc_encode_diropres(struct svc_rqst *rqstp, __be32 *p)
447 struct nfsd_diropres *resp)
448{ 448{
449 struct nfsd_diropres *resp = rqstp->rq_resp;
450
449 p = encode_fh(p, &resp->fh); 451 p = encode_fh(p, &resp->fh);
450 p = encode_fattr(rqstp, p, &resp->fh, &resp->stat); 452 p = encode_fattr(rqstp, p, &resp->fh, &resp->stat);
451 return xdr_ressize_check(rqstp, p); 453 return xdr_ressize_check(rqstp, p);
452} 454}
453 455
454int 456int
455nfssvc_encode_readlinkres(struct svc_rqst *rqstp, __be32 *p, 457nfssvc_encode_readlinkres(struct svc_rqst *rqstp, __be32 *p)
456 struct nfsd_readlinkres *resp)
457{ 458{
459 struct nfsd_readlinkres *resp = rqstp->rq_resp;
460
458 *p++ = htonl(resp->len); 461 *p++ = htonl(resp->len);
459 xdr_ressize_check(rqstp, p); 462 xdr_ressize_check(rqstp, p);
460 rqstp->rq_res.page_len = resp->len; 463 rqstp->rq_res.page_len = resp->len;
@@ -468,9 +471,10 @@ nfssvc_encode_readlinkres(struct svc_rqst *rqstp, __be32 *p,
468} 471}
469 472
470int 473int
471nfssvc_encode_readres(struct svc_rqst *rqstp, __be32 *p, 474nfssvc_encode_readres(struct svc_rqst *rqstp, __be32 *p)
472 struct nfsd_readres *resp)
473{ 475{
476 struct nfsd_readres *resp = rqstp->rq_resp;
477
474 p = encode_fattr(rqstp, p, &resp->fh, &resp->stat); 478 p = encode_fattr(rqstp, p, &resp->fh, &resp->stat);
475 *p++ = htonl(resp->count); 479 *p++ = htonl(resp->count);
476 xdr_ressize_check(rqstp, p); 480 xdr_ressize_check(rqstp, p);
@@ -487,9 +491,10 @@ nfssvc_encode_readres(struct svc_rqst *rqstp, __be32 *p,
487} 491}
488 492
489int 493int
490nfssvc_encode_readdirres(struct svc_rqst *rqstp, __be32 *p, 494nfssvc_encode_readdirres(struct svc_rqst *rqstp, __be32 *p)
491 struct nfsd_readdirres *resp)
492{ 495{
496 struct nfsd_readdirres *resp = rqstp->rq_resp;
497
493 xdr_ressize_check(rqstp, p); 498 xdr_ressize_check(rqstp, p);
494 p = resp->buffer; 499 p = resp->buffer;
495 *p++ = 0; /* no more entries */ 500 *p++ = 0; /* no more entries */
@@ -500,9 +505,9 @@ nfssvc_encode_readdirres(struct svc_rqst *rqstp, __be32 *p,
500} 505}
501 506
502int 507int
503nfssvc_encode_statfsres(struct svc_rqst *rqstp, __be32 *p, 508nfssvc_encode_statfsres(struct svc_rqst *rqstp, __be32 *p)
504 struct nfsd_statfsres *resp)
505{ 509{
510 struct nfsd_statfsres *resp = rqstp->rq_resp;
506 struct kstatfs *stat = &resp->stats; 511 struct kstatfs *stat = &resp->stats;
507 512
508 *p++ = htonl(NFSSVC_MAXBLKSIZE_V2); /* max transfer size */ 513 *p++ = htonl(NFSSVC_MAXBLKSIZE_V2); /* max transfer size */
diff --git a/fs/nfsd/xdr.h b/fs/nfsd/xdr.h
index 8eeb752cf6f8..457ce45e5084 100644
--- a/fs/nfsd/xdr.h
+++ b/fs/nfsd/xdr.h
@@ -143,13 +143,13 @@ int nfssvc_decode_readlinkargs(struct svc_rqst *, __be32 *);
143int nfssvc_decode_linkargs(struct svc_rqst *, __be32 *); 143int nfssvc_decode_linkargs(struct svc_rqst *, __be32 *);
144int nfssvc_decode_symlinkargs(struct svc_rqst *, __be32 *); 144int nfssvc_decode_symlinkargs(struct svc_rqst *, __be32 *);
145int nfssvc_decode_readdirargs(struct svc_rqst *, __be32 *); 145int nfssvc_decode_readdirargs(struct svc_rqst *, __be32 *);
146int nfssvc_encode_void(struct svc_rqst *, __be32 *, void *); 146int nfssvc_encode_void(struct svc_rqst *, __be32 *);
147int nfssvc_encode_attrstat(struct svc_rqst *, __be32 *, struct nfsd_attrstat *); 147int nfssvc_encode_attrstat(struct svc_rqst *, __be32 *);
148int nfssvc_encode_diropres(struct svc_rqst *, __be32 *, struct nfsd_diropres *); 148int nfssvc_encode_diropres(struct svc_rqst *, __be32 *);
149int nfssvc_encode_readlinkres(struct svc_rqst *, __be32 *, struct nfsd_readlinkres *); 149int nfssvc_encode_readlinkres(struct svc_rqst *, __be32 *);
150int nfssvc_encode_readres(struct svc_rqst *, __be32 *, struct nfsd_readres *); 150int nfssvc_encode_readres(struct svc_rqst *, __be32 *);
151int nfssvc_encode_statfsres(struct svc_rqst *, __be32 *, struct nfsd_statfsres *); 151int nfssvc_encode_statfsres(struct svc_rqst *, __be32 *);
152int nfssvc_encode_readdirres(struct svc_rqst *, __be32 *, struct nfsd_readdirres *); 152int nfssvc_encode_readdirres(struct svc_rqst *, __be32 *);
153 153
154int nfssvc_encode_entry(void *, const char *name, 154int nfssvc_encode_entry(void *, const char *name,
155 int namlen, loff_t offset, u64 ino, unsigned int); 155 int namlen, loff_t offset, u64 ino, unsigned int);
diff --git a/fs/nfsd/xdr3.h b/fs/nfsd/xdr3.h
index f79be4c42e4a..80d7da620e91 100644
--- a/fs/nfsd/xdr3.h
+++ b/fs/nfsd/xdr3.h
@@ -285,35 +285,22 @@ int nfs3svc_decode_symlinkargs(struct svc_rqst *, __be32 *);
285int nfs3svc_decode_readdirargs(struct svc_rqst *, __be32 *); 285int nfs3svc_decode_readdirargs(struct svc_rqst *, __be32 *);
286int nfs3svc_decode_readdirplusargs(struct svc_rqst *, __be32 *); 286int nfs3svc_decode_readdirplusargs(struct svc_rqst *, __be32 *);
287int nfs3svc_decode_commitargs(struct svc_rqst *, __be32 *); 287int nfs3svc_decode_commitargs(struct svc_rqst *, __be32 *);
288int nfs3svc_encode_voidres(struct svc_rqst *, __be32 *, void *); 288int nfs3svc_encode_voidres(struct svc_rqst *, __be32 *);
289int nfs3svc_encode_attrstat(struct svc_rqst *, __be32 *, 289int nfs3svc_encode_attrstat(struct svc_rqst *, __be32 *);
290 struct nfsd3_attrstat *); 290int nfs3svc_encode_wccstat(struct svc_rqst *, __be32 *);
291int nfs3svc_encode_wccstat(struct svc_rqst *, __be32 *, 291int nfs3svc_encode_diropres(struct svc_rqst *, __be32 *);
292 struct nfsd3_attrstat *); 292int nfs3svc_encode_accessres(struct svc_rqst *, __be32 *);
293int nfs3svc_encode_diropres(struct svc_rqst *, __be32 *, 293int nfs3svc_encode_readlinkres(struct svc_rqst *, __be32 *);
294 struct nfsd3_diropres *); 294int nfs3svc_encode_readres(struct svc_rqst *, __be32 *);
295int nfs3svc_encode_accessres(struct svc_rqst *, __be32 *, 295int nfs3svc_encode_writeres(struct svc_rqst *, __be32 *);
296 struct nfsd3_accessres *); 296int nfs3svc_encode_createres(struct svc_rqst *, __be32 *);
297int nfs3svc_encode_readlinkres(struct svc_rqst *, __be32 *, 297int nfs3svc_encode_renameres(struct svc_rqst *, __be32 *);
298 struct nfsd3_readlinkres *); 298int nfs3svc_encode_linkres(struct svc_rqst *, __be32 *);
299int nfs3svc_encode_readres(struct svc_rqst *, __be32 *, struct nfsd3_readres *); 299int nfs3svc_encode_readdirres(struct svc_rqst *, __be32 *);
300int nfs3svc_encode_writeres(struct svc_rqst *, __be32 *, struct nfsd3_writeres *); 300int nfs3svc_encode_fsstatres(struct svc_rqst *, __be32 *);
301int nfs3svc_encode_createres(struct svc_rqst *, __be32 *, 301int nfs3svc_encode_fsinfores(struct svc_rqst *, __be32 *);
302 struct nfsd3_diropres *); 302int nfs3svc_encode_pathconfres(struct svc_rqst *, __be32 *);
303int nfs3svc_encode_renameres(struct svc_rqst *, __be32 *, 303int nfs3svc_encode_commitres(struct svc_rqst *, __be32 *);
304 struct nfsd3_renameres *);
305int nfs3svc_encode_linkres(struct svc_rqst *, __be32 *,
306 struct nfsd3_linkres *);
307int nfs3svc_encode_readdirres(struct svc_rqst *, __be32 *,
308 struct nfsd3_readdirres *);
309int nfs3svc_encode_fsstatres(struct svc_rqst *, __be32 *,
310 struct nfsd3_fsstatres *);
311int nfs3svc_encode_fsinfores(struct svc_rqst *, __be32 *,
312 struct nfsd3_fsinfores *);
313int nfs3svc_encode_pathconfres(struct svc_rqst *, __be32 *,
314 struct nfsd3_pathconfres *);
315int nfs3svc_encode_commitres(struct svc_rqst *, __be32 *,
316 struct nfsd3_commitres *);
317 304
318void nfs3svc_release_fhandle(struct svc_rqst *); 305void nfs3svc_release_fhandle(struct svc_rqst *);
319void nfs3svc_release_fhandle2(struct svc_rqst *); 306void nfs3svc_release_fhandle2(struct svc_rqst *);
diff --git a/fs/nfsd/xdr4.h b/fs/nfsd/xdr4.h
index 2a53c1233884..eb7f9239304f 100644
--- a/fs/nfsd/xdr4.h
+++ b/fs/nfsd/xdr4.h
@@ -682,10 +682,9 @@ set_change_info(struct nfsd4_change_info *cinfo, struct svc_fh *fhp)
682 682
683 683
684bool nfsd4_mach_creds_match(struct nfs4_client *cl, struct svc_rqst *rqstp); 684bool nfsd4_mach_creds_match(struct nfs4_client *cl, struct svc_rqst *rqstp);
685int nfs4svc_encode_voidres(struct svc_rqst *, __be32 *, void *); 685int nfs4svc_encode_voidres(struct svc_rqst *, __be32 *);
686int nfs4svc_decode_compoundargs(struct svc_rqst *, __be32 *); 686int nfs4svc_decode_compoundargs(struct svc_rqst *, __be32 *);
687int nfs4svc_encode_compoundres(struct svc_rqst *, __be32 *, 687int nfs4svc_encode_compoundres(struct svc_rqst *, __be32 *);
688 struct nfsd4_compoundres *);
689__be32 nfsd4_check_resp_size(struct nfsd4_compoundres *, u32); 688__be32 nfsd4_check_resp_size(struct nfsd4_compoundres *, u32);
690void nfsd4_encode_operation(struct nfsd4_compoundres *, struct nfsd4_op *); 689void nfsd4_encode_operation(struct nfsd4_compoundres *, struct nfsd4_op *);
691void nfsd4_encode_replay(struct xdr_stream *xdr, struct nfsd4_op *op); 690void nfsd4_encode_replay(struct xdr_stream *xdr, struct nfsd4_op *op);
diff --git a/include/linux/lockd/xdr.h b/include/linux/lockd/xdr.h
index 0416600844ce..7acbecc21a40 100644
--- a/include/linux/lockd/xdr.h
+++ b/include/linux/lockd/xdr.h
@@ -96,16 +96,16 @@ struct nlm_reboot {
96#define NLMSVC_XDRSIZE sizeof(struct nlm_args) 96#define NLMSVC_XDRSIZE sizeof(struct nlm_args)
97 97
98int nlmsvc_decode_testargs(struct svc_rqst *, __be32 *); 98int nlmsvc_decode_testargs(struct svc_rqst *, __be32 *);
99int nlmsvc_encode_testres(struct svc_rqst *, __be32 *, struct nlm_res *); 99int nlmsvc_encode_testres(struct svc_rqst *, __be32 *);
100int nlmsvc_decode_lockargs(struct svc_rqst *, __be32 *); 100int nlmsvc_decode_lockargs(struct svc_rqst *, __be32 *);
101int nlmsvc_decode_cancargs(struct svc_rqst *, __be32 *); 101int nlmsvc_decode_cancargs(struct svc_rqst *, __be32 *);
102int nlmsvc_decode_unlockargs(struct svc_rqst *, __be32 *); 102int nlmsvc_decode_unlockargs(struct svc_rqst *, __be32 *);
103int nlmsvc_encode_res(struct svc_rqst *, __be32 *, struct nlm_res *); 103int nlmsvc_encode_res(struct svc_rqst *, __be32 *);
104int nlmsvc_decode_res(struct svc_rqst *, __be32 *); 104int nlmsvc_decode_res(struct svc_rqst *, __be32 *);
105int nlmsvc_encode_void(struct svc_rqst *, __be32 *, void *); 105int nlmsvc_encode_void(struct svc_rqst *, __be32 *);
106int nlmsvc_decode_void(struct svc_rqst *, __be32 *); 106int nlmsvc_decode_void(struct svc_rqst *, __be32 *);
107int nlmsvc_decode_shareargs(struct svc_rqst *, __be32 *); 107int nlmsvc_decode_shareargs(struct svc_rqst *, __be32 *);
108int nlmsvc_encode_shareres(struct svc_rqst *, __be32 *, struct nlm_res *); 108int nlmsvc_encode_shareres(struct svc_rqst *, __be32 *);
109int nlmsvc_decode_notify(struct svc_rqst *, __be32 *); 109int nlmsvc_decode_notify(struct svc_rqst *, __be32 *);
110int nlmsvc_decode_reboot(struct svc_rqst *, __be32 *); 110int nlmsvc_decode_reboot(struct svc_rqst *, __be32 *);
111/* 111/*
diff --git a/include/linux/lockd/xdr4.h b/include/linux/lockd/xdr4.h
index 951bbe31fdb8..bf1645609225 100644
--- a/include/linux/lockd/xdr4.h
+++ b/include/linux/lockd/xdr4.h
@@ -24,16 +24,16 @@
24 24
25 25
26int nlm4svc_decode_testargs(struct svc_rqst *, __be32 *); 26int nlm4svc_decode_testargs(struct svc_rqst *, __be32 *);
27int nlm4svc_encode_testres(struct svc_rqst *, __be32 *, struct nlm_res *); 27int nlm4svc_encode_testres(struct svc_rqst *, __be32 *);
28int nlm4svc_decode_lockargs(struct svc_rqst *, __be32 *); 28int nlm4svc_decode_lockargs(struct svc_rqst *, __be32 *);
29int nlm4svc_decode_cancargs(struct svc_rqst *, __be32 *); 29int nlm4svc_decode_cancargs(struct svc_rqst *, __be32 *);
30int nlm4svc_decode_unlockargs(struct svc_rqst *, __be32 *); 30int nlm4svc_decode_unlockargs(struct svc_rqst *, __be32 *);
31int nlm4svc_encode_res(struct svc_rqst *, __be32 *, struct nlm_res *); 31int nlm4svc_encode_res(struct svc_rqst *, __be32 *);
32int nlm4svc_decode_res(struct svc_rqst *, __be32 *); 32int nlm4svc_decode_res(struct svc_rqst *, __be32 *);
33int nlm4svc_encode_void(struct svc_rqst *, __be32 *, void *); 33int nlm4svc_encode_void(struct svc_rqst *, __be32 *);
34int nlm4svc_decode_void(struct svc_rqst *, __be32 *); 34int nlm4svc_decode_void(struct svc_rqst *, __be32 *);
35int nlm4svc_decode_shareargs(struct svc_rqst *, __be32 *); 35int nlm4svc_decode_shareargs(struct svc_rqst *, __be32 *);
36int nlm4svc_encode_shareres(struct svc_rqst *, __be32 *, struct nlm_res *); 36int nlm4svc_encode_shareres(struct svc_rqst *, __be32 *);
37int nlm4svc_decode_notify(struct svc_rqst *, __be32 *); 37int nlm4svc_decode_notify(struct svc_rqst *, __be32 *);
38int nlm4svc_decode_reboot(struct svc_rqst *, __be32 *); 38int nlm4svc_decode_reboot(struct svc_rqst *, __be32 *);
39/* 39/*
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index 047f04411dd4..6cfe41db7f31 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -423,7 +423,8 @@ struct svc_procedure {
423 __be32 (*pc_func)(struct svc_rqst *); 423 __be32 (*pc_func)(struct svc_rqst *);
424 /* XDR decode args: */ 424 /* XDR decode args: */
425 int (*pc_decode)(struct svc_rqst *, __be32 *data); 425 int (*pc_decode)(struct svc_rqst *, __be32 *data);
426 kxdrproc_t pc_encode; /* XDR encode result */ 426 /* XDR encode result: */
427 int (*pc_encode)(struct svc_rqst *, __be32 *data);
427 /* XDR free result: */ 428 /* XDR free result: */
428 void (*pc_release)(struct svc_rqst *); 429 void (*pc_release)(struct svc_rqst *);
429 unsigned int pc_argsize; /* argument struct size */ 430 unsigned int pc_argsize; /* argument struct size */
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index 18024c1b9b7b..aa643a29fdc6 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -1154,7 +1154,6 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
1154 struct svc_version *versp = NULL; /* compiler food */ 1154 struct svc_version *versp = NULL; /* compiler food */
1155 struct svc_procedure *procp = NULL; 1155 struct svc_procedure *procp = NULL;
1156 struct svc_serv *serv = rqstp->rq_server; 1156 struct svc_serv *serv = rqstp->rq_server;
1157 kxdrproc_t xdr;
1158 __be32 *statp; 1157 __be32 *statp;
1159 u32 prog, vers, proc; 1158 u32 prog, vers, proc;
1160 __be32 auth_stat, rpc_stat; 1159 __be32 auth_stat, rpc_stat;
@@ -1298,9 +1297,8 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
1298 procp->pc_release(rqstp); 1297 procp->pc_release(rqstp);
1299 goto err_bad_auth; 1298 goto err_bad_auth;
1300 } 1299 }
1301 if (*statp == rpc_success && 1300 if (*statp == rpc_success && procp->pc_encode &&
1302 (xdr = procp->pc_encode) && 1301 !procp->pc_encode(rqstp, resv->iov_base + resv->iov_len)) {
1303 !xdr(rqstp, resv->iov_base+resv->iov_len, rqstp->rq_resp)) {
1304 dprintk("svc: failed to encode reply\n"); 1302 dprintk("svc: failed to encode reply\n");
1305 /* serv->sv_stats->rpcsystemerr++; */ 1303 /* serv->sv_stats->rpcsystemerr++; */
1306 *statp = rpc_system_err; 1304 *statp = rpc_system_err;