lkml.org 
[lkml]   [2011]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[140/146] SUNRPC: Deal with the lack of a SYN_SENT sk->sk_state_change
    2.6.38-stable review patch.  If anyone has any objections, please let us know.

    ------------------
    callback...

    From: Trond Myklebust <Trond.Myklebust@netapp.com>

    commit fe19a96b10032035a35779f42ad59e35d6dd8ffd upstream.

    The TCP connection state code depends on the state_change() callback
    being called when the SYN_SENT state is set. However the networking layer
    doesn't actually call us back in that case.

    Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    net/sunrpc/xprtsock.c | 16 +++++++++++++---
    1 file changed, 13 insertions(+), 3 deletions(-)

    --- a/net/sunrpc/xprtsock.c
    +++ b/net/sunrpc/xprtsock.c
    @@ -1344,7 +1344,6 @@ static void xs_tcp_state_change(struct s
    case TCP_CLOSE_WAIT:
    /* The server initiated a shutdown of the socket */
    xprt_force_disconnect(xprt);
    - case TCP_SYN_SENT:
    xprt->connect_cookie++;
    case TCP_CLOSING:
    /*
    @@ -1758,6 +1757,7 @@ static void xs_tcp_reuse_connection(stru
    static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
    {
    struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
    + int ret = -ENOTCONN;

    if (!transport->inet) {
    struct sock *sk = sock->sk;
    @@ -1789,12 +1789,22 @@ static int xs_tcp_finish_connecting(stru
    }

    if (!xprt_bound(xprt))
    - return -ENOTCONN;
    + goto out;

    /* Tell the socket layer to start connecting... */
    xprt->stat.connect_count++;
    xprt->stat.connect_start = jiffies;
    - return kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK);
    + ret = kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK);
    + switch (ret) {
    + case 0:
    + case -EINPROGRESS:
    + /* SYN_SENT! */
    + xprt->connect_cookie++;
    + if (xprt->reestablish_timeout < XS_TCP_INIT_REEST_TO)
    + xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO;
    + }
    +out:
    + return ret;
    }

    /**



    \
     
     \ /
      Last update: 2011-06-01 10:23    [W:0.023 / U:0.060 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site