]> www.infradead.org Git - users/hch/misc.git/commitdiff
sunrpc: delay pc_release callback until after the reply is sent
authorJeff Layton <jlayton@kernel.org>
Tue, 8 Jul 2025 18:14:53 +0000 (14:14 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Sun, 21 Sep 2025 23:24:50 +0000 (19:24 -0400)
The server-side sunrpc code currently calls pc_release before sending
the reply. Change svc_process and svc_process_bc to call pc_release
after sending the reply instead.

Reviewed-by: NeilBrown <neil@brown.name>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
net/sunrpc/svc.c

index b1fab3a6954437cf751e4725fa52cfc83eddf2ab..fc70e13b1cb99a4ac4cbaa919f5a91d285844b11 100644 (file)
@@ -1426,8 +1426,6 @@ svc_process_common(struct svc_rqst *rqstp)
 
        /* Call the function that processes the request. */
        rc = process.dispatch(rqstp);
-       if (procp->pc_release)
-               procp->pc_release(rqstp);
        xdr_finish_decode(xdr);
 
        if (!rc)
@@ -1526,6 +1524,14 @@ static void svc_drop(struct svc_rqst *rqstp)
        trace_svc_drop(rqstp);
 }
 
+static void svc_release_rqst(struct svc_rqst *rqstp)
+{
+       const struct svc_procedure *procp = rqstp->rq_procinfo;
+
+       if (procp && procp->pc_release)
+               procp->pc_release(rqstp);
+}
+
 /**
  * svc_process - Execute one RPC transaction
  * @rqstp: RPC transaction context
@@ -1565,9 +1571,12 @@ void svc_process(struct svc_rqst *rqstp)
        if (unlikely(*p != rpc_call))
                goto out_baddir;
 
-       if (!svc_process_common(rqstp))
+       if (!svc_process_common(rqstp)) {
+               svc_release_rqst(rqstp);
                goto out_drop;
+       }
        svc_send(rqstp);
+       svc_release_rqst(rqstp);
        return;
 
 out_baddir:
@@ -1635,6 +1644,7 @@ void svc_process_bc(struct rpc_rqst *req, struct svc_rqst *rqstp)
        if (!proc_error) {
                /* Processing error: drop the request */
                xprt_free_bc_request(req);
+               svc_release_rqst(rqstp);
                return;
        }
        /* Finally, send the reply synchronously */
@@ -1648,6 +1658,7 @@ void svc_process_bc(struct rpc_rqst *req, struct svc_rqst *rqstp)
        timeout.to_maxval = timeout.to_initval;
        memcpy(&req->rq_snd_buf, &rqstp->rq_res, sizeof(req->rq_snd_buf));
        task = rpc_run_bc_task(req, &timeout);
+       svc_release_rqst(rqstp);
 
        if (IS_ERR(task))
                return;