aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/nfs4proc.c2
-rw-r--r--fs/nfsd/nfs4xdr.c14
-rw-r--r--fs/nfsd/xdr4.h2
3 files changed, 8 insertions, 10 deletions
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 121fd84e7f90..7ef1b27f1125 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -1218,7 +1218,6 @@ encode_op:
1218 fh_put(&resp->cstate.save_fh); 1218 fh_put(&resp->cstate.save_fh);
1219 BUG_ON(resp->cstate.replay_owner); 1219 BUG_ON(resp->cstate.replay_owner);
1220out: 1220out:
1221 nfsd4_release_compoundargs(args);
1222 /* Reset deferral mechanism for RPC deferrals */ 1221 /* Reset deferral mechanism for RPC deferrals */
1223 rqstp->rq_usedeferral = 1; 1222 rqstp->rq_usedeferral = 1;
1224 dprintk("nfsv4 compound returned %d\n", ntohl(status)); 1223 dprintk("nfsv4 compound returned %d\n", ntohl(status));
@@ -1473,6 +1472,7 @@ static struct svc_procedure nfsd_procedures4[2] = {
1473 .pc_encode = (kxdrproc_t) nfs4svc_encode_compoundres, 1472 .pc_encode = (kxdrproc_t) nfs4svc_encode_compoundres,
1474 .pc_argsize = sizeof(struct nfsd4_compoundargs), 1473 .pc_argsize = sizeof(struct nfsd4_compoundargs),
1475 .pc_ressize = sizeof(struct nfsd4_compoundres), 1474 .pc_ressize = sizeof(struct nfsd4_compoundres),
1475 .pc_release = nfsd4_release_compoundargs,
1476 .pc_cachetype = RC_NOCACHE, 1476 .pc_cachetype = RC_NOCACHE,
1477 .pc_xdrressize = NFSD_BUFSIZE/4, 1477 .pc_xdrressize = NFSD_BUFSIZE/4,
1478 }, 1478 },
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index a8d83bd5c1d5..c43f56021501 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -3428,8 +3428,11 @@ nfs4svc_encode_voidres(struct svc_rqst *rqstp, __be32 *p, void *dummy)
3428 return xdr_ressize_check(rqstp, p); 3428 return xdr_ressize_check(rqstp, p);
3429} 3429}
3430 3430
3431void nfsd4_release_compoundargs(struct nfsd4_compoundargs *args) 3431int nfsd4_release_compoundargs(void *rq, __be32 *p, void *resp)
3432{ 3432{
3433 struct svc_rqst *rqstp = rq;
3434 struct nfsd4_compoundargs *args = rqstp->rq_argp;
3435
3433 if (args->ops != args->iops) { 3436 if (args->ops != args->iops) {
3434 kfree(args->ops); 3437 kfree(args->ops);
3435 args->ops = args->iops; 3438 args->ops = args->iops;
@@ -3442,13 +3445,12 @@ void nfsd4_release_compoundargs(struct nfsd4_compoundargs *args)
3442 tb->release(tb->buf); 3445 tb->release(tb->buf);
3443 kfree(tb); 3446 kfree(tb);
3444 } 3447 }
3448 return 1;
3445} 3449}
3446 3450
3447int 3451int
3448nfs4svc_decode_compoundargs(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compoundargs *args) 3452nfs4svc_decode_compoundargs(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compoundargs *args)
3449{ 3453{
3450 __be32 status;
3451
3452 args->p = p; 3454 args->p = p;
3453 args->end = rqstp->rq_arg.head[0].iov_base + rqstp->rq_arg.head[0].iov_len; 3455 args->end = rqstp->rq_arg.head[0].iov_base + rqstp->rq_arg.head[0].iov_len;
3454 args->pagelist = rqstp->rq_arg.pages; 3456 args->pagelist = rqstp->rq_arg.pages;
@@ -3458,11 +3460,7 @@ nfs4svc_decode_compoundargs(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_comp
3458 args->ops = args->iops; 3460 args->ops = args->iops;
3459 args->rqstp = rqstp; 3461 args->rqstp = rqstp;
3460 3462
3461 status = nfsd4_decode_compound(args); 3463 return !nfsd4_decode_compound(args);
3462 if (status) {
3463 nfsd4_release_compoundargs(args);
3464 }
3465 return !status;
3466} 3464}
3467 3465
3468int 3466int
diff --git a/fs/nfsd/xdr4.h b/fs/nfsd/xdr4.h
index 02fb0e09de7f..351348c79631 100644
--- a/fs/nfsd/xdr4.h
+++ b/fs/nfsd/xdr4.h
@@ -580,7 +580,7 @@ extern __be32
580nfsd4_release_lockowner(struct svc_rqst *rqstp, 580nfsd4_release_lockowner(struct svc_rqst *rqstp,
581 struct nfsd4_compound_state *, 581 struct nfsd4_compound_state *,
582 struct nfsd4_release_lockowner *rlockowner); 582 struct nfsd4_release_lockowner *rlockowner);
583extern void nfsd4_release_compoundargs(struct nfsd4_compoundargs *); 583extern int nfsd4_release_compoundargs(void *rq, __be32 *p, void *resp);
584extern __be32 nfsd4_delegreturn(struct svc_rqst *rqstp, 584extern __be32 nfsd4_delegreturn(struct svc_rqst *rqstp,
585 struct nfsd4_compound_state *, struct nfsd4_delegreturn *dr); 585 struct nfsd4_compound_state *, struct nfsd4_delegreturn *dr);
586extern __be32 nfsd4_renew(struct svc_rqst *rqstp, 586extern __be32 nfsd4_renew(struct svc_rqst *rqstp,