* [PATCH v1 1/3] svcrdma: Don't leak send_ctxt on Send errors
@ 2021-04-15 14:05 Chuck Lever
2021-04-15 14:05 ` [PATCH v1 2/3] svcrdma: Rename goto labels in svc_rdma_sendto() Chuck Lever
2021-04-15 14:05 ` [PATCH v1 3/3] svcrdma: Pass a useful error code to the send_err tracepoint Chuck Lever
0 siblings, 2 replies; 3+ messages in thread
From: Chuck Lever @ 2021-04-15 14:05 UTC (permalink / raw)
To: linux-nfs, linux-rdma
Address a rare send_ctxt leak in the svc_rdma_sendto() error paths.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
net/sunrpc/xprtrdma/svc_rdma_sendto.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
index 056452cabc98..39aec629aaeb 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
@@ -936,7 +936,7 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
p = xdr_reserve_space(&sctxt->sc_stream,
rpcrdma_fixed_maxsz * sizeof(*p));
if (!p)
- goto err0;
+ goto err1;
ret = svc_rdma_send_reply_chunk(rdma, rctxt, &rqstp->rq_res);
if (ret < 0)
@@ -948,11 +948,11 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
*p = pcl_is_empty(&rctxt->rc_reply_pcl) ? rdma_msg : rdma_nomsg;
if (svc_rdma_encode_read_list(sctxt) < 0)
- goto err0;
+ goto err1;
if (svc_rdma_encode_write_list(rctxt, sctxt) < 0)
- goto err0;
+ goto err1;
if (svc_rdma_encode_reply_chunk(rctxt, sctxt, ret) < 0)
- goto err0;
+ goto err1;
ret = svc_rdma_send_reply_msg(rdma, sctxt, rctxt, rqstp);
if (ret < 0)
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v1 2/3] svcrdma: Rename goto labels in svc_rdma_sendto()
2021-04-15 14:05 [PATCH v1 1/3] svcrdma: Don't leak send_ctxt on Send errors Chuck Lever
@ 2021-04-15 14:05 ` Chuck Lever
2021-04-15 14:05 ` [PATCH v1 3/3] svcrdma: Pass a useful error code to the send_err tracepoint Chuck Lever
1 sibling, 0 replies; 3+ messages in thread
From: Chuck Lever @ 2021-04-15 14:05 UTC (permalink / raw)
To: linux-nfs, linux-rdma
Clean up: Make the goto labels consistent with other similar
functions.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
net/sunrpc/xprtrdma/svc_rdma_sendto.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
index 39aec629aaeb..a3b0f5899f03 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
@@ -926,21 +926,21 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
ret = -ENOTCONN;
if (svc_xprt_is_dead(xprt))
- goto err0;
+ goto drop_connection;
ret = -ENOMEM;
sctxt = svc_rdma_send_ctxt_get(rdma);
if (!sctxt)
- goto err0;
+ goto drop_connection;
p = xdr_reserve_space(&sctxt->sc_stream,
rpcrdma_fixed_maxsz * sizeof(*p));
if (!p)
- goto err1;
+ goto put_ctxt;
ret = svc_rdma_send_reply_chunk(rdma, rctxt, &rqstp->rq_res);
if (ret < 0)
- goto err2;
+ goto reply_chunk;
*p++ = *rdma_argp;
*p++ = *(rdma_argp + 1);
@@ -948,15 +948,15 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
*p = pcl_is_empty(&rctxt->rc_reply_pcl) ? rdma_msg : rdma_nomsg;
if (svc_rdma_encode_read_list(sctxt) < 0)
- goto err1;
+ goto put_ctxt;
if (svc_rdma_encode_write_list(rctxt, sctxt) < 0)
- goto err1;
+ goto put_ctxt;
if (svc_rdma_encode_reply_chunk(rctxt, sctxt, ret) < 0)
- goto err1;
+ goto put_ctxt;
ret = svc_rdma_send_reply_msg(rdma, sctxt, rctxt, rqstp);
if (ret < 0)
- goto err1;
+ goto put_ctxt;
/* Prevent svc_xprt_release() from releasing the page backing
* rq_res.head[0].iov_base. It's no longer being accessed by
@@ -964,16 +964,16 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
rqstp->rq_respages++;
return 0;
- err2:
+reply_chunk:
if (ret != -E2BIG && ret != -EINVAL)
- goto err1;
+ goto put_ctxt;
svc_rdma_send_error_msg(rdma, sctxt, rctxt, ret);
return 0;
- err1:
+put_ctxt:
svc_rdma_send_ctxt_put(rdma, sctxt);
- err0:
+drop_connection:
trace_svcrdma_send_err(rqstp, ret);
svc_xprt_deferred_close(&rdma->sc_xprt);
return -ENOTCONN;
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v1 3/3] svcrdma: Pass a useful error code to the send_err tracepoint
2021-04-15 14:05 [PATCH v1 1/3] svcrdma: Don't leak send_ctxt on Send errors Chuck Lever
2021-04-15 14:05 ` [PATCH v1 2/3] svcrdma: Rename goto labels in svc_rdma_sendto() Chuck Lever
@ 2021-04-15 14:05 ` Chuck Lever
1 sibling, 0 replies; 3+ messages in thread
From: Chuck Lever @ 2021-04-15 14:05 UTC (permalink / raw)
To: linux-nfs, linux-rdma
Capture error codes in @ret, which is passed to the send_err
tracepoint, so that they can be logged when something goes awry.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
net/sunrpc/xprtrdma/svc_rdma_sendto.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
index a3b0f5899f03..d6bbafb773e1 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
@@ -921,6 +921,7 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
struct svc_rdma_recv_ctxt *rctxt = rqstp->rq_xprt_ctxt;
__be32 *rdma_argp = rctxt->rc_recv_buf;
struct svc_rdma_send_ctxt *sctxt;
+ unsigned int rc_size;
__be32 *p;
int ret;
@@ -933,6 +934,7 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
if (!sctxt)
goto drop_connection;
+ ret = -EMSGSIZE;
p = xdr_reserve_space(&sctxt->sc_stream,
rpcrdma_fixed_maxsz * sizeof(*p));
if (!p)
@@ -941,17 +943,21 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
ret = svc_rdma_send_reply_chunk(rdma, rctxt, &rqstp->rq_res);
if (ret < 0)
goto reply_chunk;
+ rc_size = ret;
*p++ = *rdma_argp;
*p++ = *(rdma_argp + 1);
*p++ = rdma->sc_fc_credits;
*p = pcl_is_empty(&rctxt->rc_reply_pcl) ? rdma_msg : rdma_nomsg;
- if (svc_rdma_encode_read_list(sctxt) < 0)
+ ret = svc_rdma_encode_read_list(sctxt);
+ if (ret < 0)
goto put_ctxt;
- if (svc_rdma_encode_write_list(rctxt, sctxt) < 0)
+ ret = svc_rdma_encode_write_list(rctxt, sctxt);
+ if (ret < 0)
goto put_ctxt;
- if (svc_rdma_encode_reply_chunk(rctxt, sctxt, ret) < 0)
+ ret = svc_rdma_encode_reply_chunk(rctxt, sctxt, rc_size);
+ if (ret < 0)
goto put_ctxt;
ret = svc_rdma_send_reply_msg(rdma, sctxt, rctxt, rqstp);
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-04-15 14:05 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-15 14:05 [PATCH v1 1/3] svcrdma: Don't leak send_ctxt on Send errors Chuck Lever
2021-04-15 14:05 ` [PATCH v1 2/3] svcrdma: Rename goto labels in svc_rdma_sendto() Chuck Lever
2021-04-15 14:05 ` [PATCH v1 3/3] svcrdma: Pass a useful error code to the send_err tracepoint Chuck Lever
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).