lkml.org 
[lkml]   [2012]   [Feb]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 14/91] SUNRPC: fix NFS client over TCP hangs due to packet loss (Bug 16494)
    2.6.27-longterm review patch.  If anyone has any objections, please let us know.

    ------------------

    commit 669502ff31d7dba1849aec7ee2450a3c61f57d39 upstream.

    When reusing a TCP connection, ensure that it's aborted if a previous
    shutdown attempt has been made on that connection so that the RPC over
    TCP recovery mechanism succeeds.

    Signed-off-by: Andy Chittenden <andyc.bluearc@gmail.com>
    Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    ---
    net/sunrpc/xprtsock.c | 28 ++++++++++++++++++++++------
    1 files changed, 22 insertions(+), 6 deletions(-)

    Index: longterm-2.6.27/net/sunrpc/xprtsock.c
    ===================================================================
    --- longterm-2.6.27.orig/net/sunrpc/xprtsock.c 2012-02-05 22:34:34.580914949 +0100
    +++ longterm-2.6.27/net/sunrpc/xprtsock.c 2012-02-05 22:34:36.898916728 +0100
    @@ -1126,10 +1126,11 @@
    if (!(xprt = xprt_from_sock(sk)))
    goto out;
    dprintk("RPC: xs_tcp_state_change client %p...\n", xprt);
    - dprintk("RPC: state %x conn %d dead %d zapped %d\n",
    + dprintk("RPC: state %x conn %d dead %d zapped %d sk_shutdown %d\n",
    sk->sk_state, xprt_connected(xprt),
    sock_flag(sk, SOCK_DEAD),
    - sock_flag(sk, SOCK_ZAPPED));
    + sock_flag(sk, SOCK_ZAPPED),
    + sk->sk_shutdown);

    switch (sk->sk_state) {
    case TCP_ESTABLISHED:
    @@ -1594,10 +1595,25 @@
    {
    unsigned int state = transport->inet->sk_state;

    - if (state == TCP_CLOSE && transport->sock->state == SS_UNCONNECTED)
    - return;
    - if ((1 << state) & (TCPF_ESTABLISHED|TCPF_SYN_SENT))
    - return;
    + if (state == TCP_CLOSE && transport->sock->state == SS_UNCONNECTED) {
    + /* we don't need to abort the connection if the socket
    + * hasn't undergone a shutdown
    + */
    + if (transport->inet->sk_shutdown == 0)
    + return;
    + dprintk("RPC: %s: TCP_CLOSEd and sk_shutdown set to %d\n",
    + __func__, transport->inet->sk_shutdown);
    + }
    + if ((1 << state) & (TCPF_ESTABLISHED|TCPF_SYN_SENT)) {
    + /* we don't need to abort the connection if the socket
    + * hasn't undergone a shutdown
    + */
    + if (transport->inet->sk_shutdown == 0)
    + return;
    + dprintk("RPC: %s: ESTABLISHED/SYN_SENT "
    + "sk_shutdown set to %d\n",
    + __func__, transport->inet->sk_shutdown);
    + }
    xs_abort_connection(xprt, transport);
    }




    \
     
     \ /
      Last update: 2012-02-05 23:51    [W:0.022 / U:0.832 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site