All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bagas Sanjaya <bagasdotme@gmail.com>
To: Meena Shanmugam <meenashanmugam@google.com>
Cc: stable@vger.kernel.org, gregkh@linuxfoundation.org,
	trond.myklebust@hammerspace.com,
	Dexter Rivera <riverade@google.com>
Subject: Re: Request to cherry-pick f00432063db1 to 5.10
Date: Thu, 12 May 2022 13:48:57 +0700	[thread overview]
Message-ID: <Ynyt2bI4dgO2gcFz@debian.me> (raw)
In-Reply-To: <CAMdnWFC4+-mEubOVkzaoqC5jnJCwY5hpcQtDnkmgqJ-mY5_GYg@mail.gmail.com>

On Tue, May 10, 2022 at 07:33:23PM -0700, Meena Shanmugam wrote:
> From: Trond Myklebust <trond.myklebust@hammerspace.com>
> Date: Wed, 16 Mar 2022 19:10:43 -0400
> Subject: [PATCH] SUNRPC: Don't call connect() more than once on a TCP socket
> 
> commit 89f42494f92f448747bd8a7ab1ae8b5d5520577d upstream.
> 
> Avoid socket state races due to repeated calls to ->connect() using the
> same socket. If connect() returns 0 due to the connection having
> completed, but we are in fact in a closing state, then we may leave the
> XPRT_CONNECTING flag set on the transport.
> 
> Reported-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
> Fixes: 3be232f11a3c ("SUNRPC: Prevent immediate close+reconnect")
> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
> [meenashanmugam: Backported to 5.10: Fixed merge conflict in
> xs_tcp_setup_socket]
> Signed-off-by: Meena Shanmugam <meena.shanmugam@google.com>
> ---
>  include/linux/sunrpc/xprtsock.h |  1 +
>  net/sunrpc/xprtsock.c           | 21 +++++++++++----------
>  2 files changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git a/include/linux/sunrpc/xprtsock.h b/include/linux/sunrpc/xprtsock.h
> index 8c2a712cb242..689062afdd61 100644
> --- a/include/linux/sunrpc/xprtsock.h
> +++ b/include/linux/sunrpc/xprtsock.h
> @@ -89,5 +89,6 @@ struct sock_xprt {
>  #define XPRT_SOCK_WAKE_WRITE (5)
>  #define XPRT_SOCK_WAKE_PENDING (6)
>  #define XPRT_SOCK_WAKE_DISCONNECT (7)
> +#define XPRT_SOCK_CONNECT_SENT (8)
> 
>  #endif /* _LINUX_SUNRPC_XPRTSOCK_H */
> diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
> index 60c58eb9a456..33a81f9703b1 100644
> --- a/net/sunrpc/xprtsock.c
> +++ b/net/sunrpc/xprtsock.c
> @@ -2260,10 +2260,14 @@ static void xs_tcp_setup_socket(struct
> work_struct *work)
>   struct rpc_xprt *xprt = &transport->xprt;
>   int status = -EIO;
> 
> - if (!sock) {
> - sock = xs_create_sock(xprt, transport,
> - xs_addr(xprt)->sa_family, SOCK_STREAM,
> - IPPROTO_TCP, true);
> + if (xprt_connected(xprt))
> + goto out;
> + if (test_and_clear_bit(XPRT_SOCK_CONNECT_SENT,
> +        &transport->sock_state) ||
> +     !sock) {
> + xs_reset_transport(transport);
> + sock = xs_create_sock(xprt, transport, xs_addr(xprt)->sa_family,
> +       SOCK_STREAM, IPPROTO_TCP, true);
>   if (IS_ERR(sock)) {
>   status = PTR_ERR(sock);
>   goto out;
> @@ -2294,6 +2298,7 @@ static void xs_tcp_setup_socket(struct work_struct *work)
>   break;
>   case 0:
>   case -EINPROGRESS:
> + set_bit(XPRT_SOCK_CONNECT_SENT, &transport->sock_state);
>   case -EALREADY:
>   xprt_unlock_connect(xprt, transport);
>   return;
> @@ -2345,13 +2350,9 @@ static void xs_connect(struct rpc_xprt *xprt,
> struct rpc_task *task)
> 
>   WARN_ON_ONCE(!xprt_lock_connect(xprt, task, transport));
> 
> - if (transport->sock != NULL && !xprt_connecting(xprt)) {
> + if (transport->sock != NULL) {
>   dprintk("RPC:       xs_connect delayed xprt %p for %lu "
> - "seconds\n",
> - xprt, xprt->reestablish_timeout / HZ);
> -
> - /* Start by resetting any existing state */
> - xs_reset_transport(transport);
> + "seconds\n", xprt, xprt->reestablish_timeout / HZ);
> 
>   delay = xprt_reconnect_delay(xprt);
>   xprt_reconnect_backoff(xprt, XS_TCP_INIT_REEST_TO);
> -- 
> 2.36.0.512.ge40c2bad7a-goog

Hi Meena,

The backport above didn't apply due to whitespace mangling (maybe your
mailer?). So I had to manually apply it.

Here's the proper backport:

-- >8 --

From 2ec4a7d1668a53a1f46d3413bdec6ff9cc0458a3 Mon Sep 17 00:00:00 2001
From: Bagas Sanjaya <bagasdotme@gmail.com>
Date: Thu, 12 May 2022 12:53:07 +0700
Subject: [PATCH] SUNRPC: Don't call connect() more than once on a TCP socket

From: Trond Myklebust <trond.myklebust@hammerspace.com>

commit 89f42494f92f448747bd8a7ab1ae8b5d5520577d upstream.

Avoid socket state races due to repeated calls to ->connect() using the
same socket. If connect() returns 0 due to the connection having
completed, but we are in fact in a closing state, then we may leave the
XPRT_CONNECTING flag set on the transport.

Reported-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
Fixes: 3be232f11a3cc9 ("SUNRPC: Prevent immediate close+reconnect")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
[meenashanmugam: Backported to 5.10: Fixed merge conflict in
xs_tcp_setup_socket]
Signed-off-by: Meena Shanmugam <meena.shanmugam@google.com>
[Bagas: Fix patch corruption by manually applying the backport]
Signed-off-by: Bagas Sanjaya <bagasdotme@gmail.com>
---
 include/linux/sunrpc/xprtsock.h |  1 +
 net/sunrpc/xprtsock.c           | 22 ++++++++++++----------
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/include/linux/sunrpc/xprtsock.h b/include/linux/sunrpc/xprtsock.h
index 8c2a712cb24202..689062afdd610d 100644
--- a/include/linux/sunrpc/xprtsock.h
+++ b/include/linux/sunrpc/xprtsock.h
@@ -89,5 +89,6 @@ struct sock_xprt {
 #define XPRT_SOCK_WAKE_WRITE	(5)
 #define XPRT_SOCK_WAKE_PENDING	(6)
 #define XPRT_SOCK_WAKE_DISCONNECT	(7)
+#define XPRT_SOCK_CONNECT_SENT	(8)
 
 #endif /* _LINUX_SUNRPC_XPRTSOCK_H */
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 60c58eb9a456f1..c9975a5c769be9 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -2260,10 +2260,15 @@ static void xs_tcp_setup_socket(struct work_struct *work)
 	struct rpc_xprt *xprt = &transport->xprt;
 	int status = -EIO;
 
-	if (!sock) {
-		sock = xs_create_sock(xprt, transport,
-				xs_addr(xprt)->sa_family, SOCK_STREAM,
-				IPPROTO_TCP, true);
+	if (xprt_connected(xprt))
+		goto out;
+
+	if (test_and_clear_bit(XPRT_SOCK_CONNECT_SENT),
+	    &transport->sock_state || !sock) {
+		xs_reset_transport(transport);
+		sock = xs_create_sock(xprt, transport, xs_addr(xprt)->sa_family,
+				      SOCK_STREAM, IPPROTO_TCP, true);
+
 		if (IS_ERR(sock)) {
 			status = PTR_ERR(sock);
 			goto out;
@@ -2294,6 +2299,7 @@ static void xs_tcp_setup_socket(struct work_struct *work)
 		break;
 	case 0:
 	case -EINPROGRESS:
+		set_bit(XPRT_SOCK_CONNECT_SENT, &transport->sock_state);
 	case -EALREADY:
 		xprt_unlock_connect(xprt, transport);
 		return;
@@ -2345,13 +2351,9 @@ static void xs_connect(struct rpc_xprt *xprt, struct rpc_task *task)
 
 	WARN_ON_ONCE(!xprt_lock_connect(xprt, task, transport));
 
-	if (transport->sock != NULL && !xprt_connecting(xprt)) {
+	if (transport->sock != NULL) {
 		dprintk("RPC:       xs_connect delayed xprt %p for %lu "
-				"seconds\n",
-				xprt, xprt->reestablish_timeout / HZ);
-
-		/* Start by resetting any existing state */
-		xs_reset_transport(transport);
+			"seconds\n", xprt, xprt->reestablish_timeout / HZ);
 
 		delay = xprt_reconnect_delay(xprt);
 		xprt_reconnect_backoff(xprt, XS_TCP_INIT_REEST_TO);
-- 
An old man doll... just what I always wanted! - Clara

Next time, configure your mailer/MUA to not mangle whitespaces. For sending
patches, it is preferred to use git-send-email(1).

FYI, CC Dexter Rivera since he's also requesting the backport [1].

[1]: https://lore.kernel.org/stable/CAG5dfppH0s-ujBjXyJJ62mGiJRiKz1NOYBPYOx3A1550Z8X7Mg@mail.gmail.com/

-- 
An old man doll... just what I always wanted! - Clara

  reply	other threads:[~2022-05-12  6:49 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-11  2:33 Request to cherry-pick f00432063db1 to 5.10 Meena Shanmugam
2022-05-12  6:48 ` Bagas Sanjaya [this message]
2022-05-12 16:23 ` Greg KH
2022-05-12 17:38   ` Meena Shanmugam
2022-05-13  8:25     ` Greg KH
2022-05-13 17:59       ` [PATCH] SUNRPC: Don't call connect() more than once on a TCP socket Meena Shanmugam
2022-05-14  4:56         ` Greg KH
2022-05-14  5:34           ` [PATCH 0/4] Request to cherry-pick f00432063db1 to 5.10 Meena Shanmugam
2022-05-14  5:34             ` [PATCH 1/4] SUNRPC: Clean up scheduling of autoclose Meena Shanmugam
2022-05-14  5:34             ` [PATCH 2/4] SUNRPC: Prevent immediate close+reconnect Meena Shanmugam
2022-05-14  5:34             ` [PATCH 3/4] SUNRPC: Don't call connect() more than once on a TCP socket Meena Shanmugam
2022-05-16 21:34               ` Greg KH
2022-05-17  3:56                 ` Meena Shanmugam
2022-05-14  5:34             ` [PATCH 4/4] SUNRPC: Ensure we flush any closed sockets before xs_xprt_free() Meena Shanmugam
2022-05-14  8:47             ` [PATCH 0/4] Request to cherry-pick f00432063db1 to 5.10 Bagas Sanjaya
2022-05-16 12:43               ` Greg KH
2022-05-13 18:10       ` Meena Shanmugam
2022-05-13 18:14       ` Meena Shanmugam
2022-05-16 12:42         ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Ynyt2bI4dgO2gcFz@debian.me \
    --to=bagasdotme@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=meenashanmugam@google.com \
    --cc=riverade@google.com \
    --cc=stable@vger.kernel.org \
    --cc=trond.myklebust@hammerspace.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.