FAILED: patch "[PATCH] SUNRPC: Don't call connect() more than once on a TCP socket" failed to apply to 5.15-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 89f42494f92f448747bd8a7ab1ae8b5d5520577d Mon Sep 17 00:00:00 2001
From: Trond Myklebust <[email protected]>
Date: Wed, 16 Mar 2022 19:10:43 -0400
Subject: [PATCH] SUNRPC: Don't call connect() more than once on a TCP socket
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.
include/linux/sunrpc/xprtsock.h +1 -0
@@ -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 */
net/sunrpc/xprtsock.c +12 -10
@@ -2235,10 +2235,15 @@ static void xs_tcp_setup_socket(struct work_struct *work)if (atomic_read (&xprt->swapper)) current->flags |=PF_MEMALLOC ; -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)) {xprt_wake_pending_tasks (xprt,PTR_ERR (sock)); goto out;
@@ -2262,6 +2267,7 @@ static void xs_tcp_setup_socket(struct work_struct *work) fallthrough;case -EINPROGRESS :/* SYN_SENT! */ +set_bit (XPRT_SOCK_CONNECT_SENT , &transport->sock_state);if (xprt->reestablish_timeout <XS_TCP_INIT_REEST_TO ) xprt->reestablish_timeout =XS_TCP_INIT_REEST_TO ; fallthrough;
@@ -2323,13 +2329,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 );