mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 22:21:42 +00:00
SUNRPC: De-duplicate .pc_release() call sites
There was some spaghetti in svc_process_common() that had evolved over time such that there was still one case that needed a call to .pc_release() but never made it. That issue was removed in the previous patch. As additional insurance against missing this important callout, ensure that the .pc_release() method is always called, no matter what the reply_stat is. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
0ae93b99be
commit
5b747a594b
@ -1252,7 +1252,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
||||
__be32 *statp;
|
||||
u32 prog, vers;
|
||||
__be32 rpc_stat;
|
||||
int auth_res;
|
||||
int auth_res, rc;
|
||||
__be32 *reply_statp;
|
||||
|
||||
rpc_stat = rpc_success;
|
||||
@ -1353,20 +1353,18 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
||||
svc_reserve_auth(rqstp, procp->pc_xdrressize<<2);
|
||||
|
||||
/* Call the function that processes the request. */
|
||||
if (!process.dispatch(rqstp, statp))
|
||||
goto release_dropit;
|
||||
|
||||
rc = process.dispatch(rqstp, statp);
|
||||
if (procp->pc_release)
|
||||
procp->pc_release(rqstp);
|
||||
if (!rc)
|
||||
goto dropit;
|
||||
if (rqstp->rq_auth_stat != rpc_auth_ok)
|
||||
goto err_release_bad_auth;
|
||||
goto err_bad_auth;
|
||||
|
||||
/* Check RPC status result */
|
||||
if (*statp != rpc_success)
|
||||
resv->iov_len = ((void*)statp) - resv->iov_base + 4;
|
||||
|
||||
/* Release reply info */
|
||||
if (procp->pc_release)
|
||||
procp->pc_release(rqstp);
|
||||
|
||||
if (procp->pc_encode == NULL)
|
||||
goto dropit;
|
||||
|
||||
@ -1375,9 +1373,6 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
||||
goto close_xprt;
|
||||
return 1; /* Caller can now send it */
|
||||
|
||||
release_dropit:
|
||||
if (procp->pc_release)
|
||||
procp->pc_release(rqstp);
|
||||
dropit:
|
||||
svc_authorise(rqstp); /* doesn't hurt to call this twice */
|
||||
dprintk("svc: svc_process dropit\n");
|
||||
@ -1404,9 +1399,6 @@ err_bad_rpc:
|
||||
svc_putnl(resv, 2);
|
||||
goto sendit;
|
||||
|
||||
err_release_bad_auth:
|
||||
if (procp->pc_release)
|
||||
procp->pc_release(rqstp);
|
||||
err_bad_auth:
|
||||
dprintk("svc: authentication failed (%d)\n",
|
||||
be32_to_cpu(rqstp->rq_auth_stat));
|
||||
|
Loading…
Reference in New Issue
Block a user