@@ -908,9 +908,6 @@ int svc_send(struct svc_rqst *rqstp)
if (!xprt)
goto out;
- /* release the receive skb before sending the reply */
- xprt->xpt_ops->xpo_release_rqst(rqstp);
-
/* calculate over-all length */
xb = &rqstp->rq_res;
xb->len = xb->head[0].iov_len +
@@ -527,6 +527,8 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
unsigned int uninitialized_var(sent);
int err;
+ svc_release_udp_skb(rqstp);
+
svc_set_cmsg_data(rqstp, cmh);
err = xprt_sock_sendmsg(svsk->sk_sock, &msg, xdr, 0, 0, &sent);
@@ -1076,6 +1078,8 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp)
unsigned int uninitialized_var(sent);
int err;
+ svc_release_skb(rqstp);
+
err = xprt_sock_sendmsg(svsk->sk_sock, &msg, xdr, 0, marker, &sent);
xdr_free_bvec(xdr);
if (err < 0 || sent != (xdr->len + sizeof(marker)))
Refactor: Instead of making two transport method calls in svc_send(), fold the ->xpo_release_rqst call into the ->xpo_sendto method of the two transports that need this extra behavior. Subsequently, svcrdma, which does not want or need the extra ->xpo_release_rqst call can then use ->xpo_release_rqst properly. This patch does not fix commit 3a88092ee319 ("svcrdma: Preserve Receive buffer until svc_rdma_sendto"), but is a prerequisite for the next patch, which does fix that commit. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> --- net/sunrpc/svc_xprt.c | 3 --- net/sunrpc/svcsock.c | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-)