Patchwork [3.5.yuz,extended,stable] Patch "SUNRPC: Prevent races in xs_abort_connection()" has been added to staging queue

mail settings
Submitter Herton Ronaldo Krzesinski
Date Nov. 22, 2012, 4:48 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/200978/
State New
Headers show


Herton Ronaldo Krzesinski - Nov. 22, 2012, 4:48 a.m.
This is a note to let you know that I have just added a patch titled

    SUNRPC: Prevent races in xs_abort_connection()

to the linux-3.5.y-queue branch of the 3.5.yuz extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.yuz tree, see



From 7ba8158d2f5ed85debf49b5c12aec0f5c4ca5940 Mon Sep 17 00:00:00 2001
From: Trond Myklebust <>
Date: Tue, 23 Oct 2012 17:50:07 -0400
Subject: [PATCH] SUNRPC: Prevent races in xs_abort_connection()

commit 4bc1e68ed6a8b59be8a79eb719be515a55c7bc68 upstream.

The call to xprt_disconnect_done() that is triggered by a successful
connection reset will trigger another automatic wakeup of all tasks
on the xprt->pending rpc_wait_queue. In particular it will cause an
early wake up of the task that called xprt_connect().

All we really want to do here is clear all the socket-specific state
flags, so we split that functionality out of xs_sock_mark_closed()
into a helper that can be called by xs_abort_connection()

Reported-by: Chris Perl <>
Signed-off-by: Trond Myklebust <>
Tested-by: Chris Perl <>
Signed-off-by: Herton Ronaldo Krzesinski <>
 net/sunrpc/xprtsock.c |   13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)



diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index a3f1990..67c46ec 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -1465,7 +1465,7 @@  static void xs_tcp_cancel_linger_timeout(struct rpc_xprt *xprt)

-static void xs_sock_mark_closed(struct rpc_xprt *xprt)
+static void xs_sock_reset_connection_flags(struct rpc_xprt *xprt)
 	clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);
@@ -1473,6 +1473,11 @@  static void xs_sock_mark_closed(struct rpc_xprt *xprt)
 	clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
 	clear_bit(XPRT_CLOSING, &xprt->state);
+static void xs_sock_mark_closed(struct rpc_xprt *xprt)
+	xs_sock_reset_connection_flags(xprt);
 	/* Mark transport as closed and wake up all pending tasks */
@@ -2028,10 +2033,8 @@  static void xs_abort_connection(struct sock_xprt *transport)
 	any.sa_family = AF_UNSPEC;
 	result = kernel_connect(transport->sock, &any, sizeof(any), 0);
 	if (!result)
-		xs_sock_mark_closed(&transport->xprt);
-	else
-		dprintk("RPC:       AF_UNSPEC connect return code %d\n",
-				result);
+		xs_sock_reset_connection_flags(&transport->xprt);
+	dprintk("RPC:       AF_UNSPEC connect return code %d\n", result);

 static void xs_tcp_reuse_connection(struct sock_xprt *transport)