diff mbox series

[v1] svcrdma: Drop connection after an RDMA Read error

Message ID 169695862158.5083.6004887085023503434.stgit@oracle-102.nfsv4bat.org (mailing list archive)
State New, archived
Headers show
Series [v1] svcrdma: Drop connection after an RDMA Read error | expand

Commit Message

Chuck Lever Oct. 10, 2023, 5:23 p.m. UTC
From: Chuck Lever <chuck.lever@oracle.com>

When an RPC Call message cannot be pulled from the client, that
is a message loss, by definition. Close the connection to trigger
the client to resend.

Cc: <stable@vger.kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 net/sunrpc/xprtrdma/svc_rdma_recvfrom.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Tom Talpey Oct. 13, 2023, 12:23 a.m. UTC | #1
On 10/10/2023 1:23 PM, Chuck Lever wrote:
> From: Chuck Lever <chuck.lever@oracle.com>
> 
> When an RPC Call message cannot be pulled from the client, that
> is a message loss, by definition. Close the connection to trigger
> the client to resend.

This looks correct, but it seems there are actually two changes here,
it's initiating the close but it's also unconditionally returning
-ENOTCONN. Other similar code paths do this so it's ok but the
altered return value is a bit mysterious.

Reviewed-by: Tom Talpey <tom@talpey.com>

> 
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> ---
>   net/sunrpc/xprtrdma/svc_rdma_recvfrom.c |    3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
> index 85c8bcaebb80..3b05f90a3e50 100644
> --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
> +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
> @@ -852,7 +852,8 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
>   	if (ret == -EINVAL)
>   		svc_rdma_send_error(rdma_xprt, ctxt, ret);
>   	svc_rdma_recv_ctxt_put(rdma_xprt, ctxt);
> -	return ret;
> +	svc_xprt_deferred_close(xprt);
> +	return -ENOTCONN;
>   
>   out_backchannel:
>   	svc_rdma_handle_bc_reply(rqstp, ctxt);
> 
> 
>
Chuck Lever Oct. 13, 2023, 12:01 p.m. UTC | #2
> On Oct 12, 2023, at 8:23 PM, Tom Talpey <tom@talpey.com> wrote:
> 
> On 10/10/2023 1:23 PM, Chuck Lever wrote:
>> From: Chuck Lever <chuck.lever@oracle.com>
>> When an RPC Call message cannot be pulled from the client, that
>> is a message loss, by definition. Close the connection to trigger
>> the client to resend.
> 
> This looks correct, but it seems there are actually two changes here,
> it's initiating the close but it's also unconditionally returning
> -ENOTCONN. Other similar code paths do this so it's ok but the
> altered return value is a bit mysterious.

It's conventional for transport top level methods to return
-ENOTCONN if the connection is closing or closed.


> Reviewed-by: Tom Talpey <tom@talpey.com>

Thanks!


>> Cc: <stable@vger.kernel.org>
>> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
>> ---
>>  net/sunrpc/xprtrdma/svc_rdma_recvfrom.c |    3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>> diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
>> index 85c8bcaebb80..3b05f90a3e50 100644
>> --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
>> +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
>> @@ -852,7 +852,8 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
>>   if (ret == -EINVAL)
>>   svc_rdma_send_error(rdma_xprt, ctxt, ret);
>>   svc_rdma_recv_ctxt_put(rdma_xprt, ctxt);
>> - return ret;
>> + svc_xprt_deferred_close(xprt);
>> + return -ENOTCONN;
>>    out_backchannel:
>>   svc_rdma_handle_bc_reply(rqstp, ctxt);

--
Chuck Lever
diff mbox series

Patch

diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
index 85c8bcaebb80..3b05f90a3e50 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
@@ -852,7 +852,8 @@  int svc_rdma_recvfrom(struct svc_rqst *rqstp)
 	if (ret == -EINVAL)
 		svc_rdma_send_error(rdma_xprt, ctxt, ret);
 	svc_rdma_recv_ctxt_put(rdma_xprt, ctxt);
-	return ret;
+	svc_xprt_deferred_close(xprt);
+	return -ENOTCONN;
 
 out_backchannel:
 	svc_rdma_handle_bc_reply(rqstp, ctxt);