diff options
Diffstat (limited to 'net/rds/tcp_connect.c')
| -rw-r--r-- | net/rds/tcp_connect.c | 60 |
1 files changed, 31 insertions, 29 deletions
diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c index ba9ec67f4e41..c916715fbe61 100644 --- a/net/rds/tcp_connect.c +++ b/net/rds/tcp_connect.c | |||
| @@ -41,51 +41,51 @@ | |||
| 41 | void rds_tcp_state_change(struct sock *sk) | 41 | void rds_tcp_state_change(struct sock *sk) |
| 42 | { | 42 | { |
| 43 | void (*state_change)(struct sock *sk); | 43 | void (*state_change)(struct sock *sk); |
| 44 | struct rds_connection *conn; | 44 | struct rds_conn_path *cp; |
| 45 | struct rds_tcp_connection *tc; | 45 | struct rds_tcp_connection *tc; |
| 46 | 46 | ||
| 47 | read_lock_bh(&sk->sk_callback_lock); | 47 | read_lock_bh(&sk->sk_callback_lock); |
| 48 | conn = sk->sk_user_data; | 48 | cp = sk->sk_user_data; |
| 49 | if (!conn) { | 49 | if (!cp) { |
| 50 | state_change = sk->sk_state_change; | 50 | state_change = sk->sk_state_change; |
| 51 | goto out; | 51 | goto out; |
| 52 | } | 52 | } |
| 53 | tc = conn->c_transport_data; | 53 | tc = cp->cp_transport_data; |
| 54 | state_change = tc->t_orig_state_change; | 54 | state_change = tc->t_orig_state_change; |
| 55 | 55 | ||
| 56 | rdsdebug("sock %p state_change to %d\n", tc->t_sock, sk->sk_state); | 56 | rdsdebug("sock %p state_change to %d\n", tc->t_sock, sk->sk_state); |
| 57 | 57 | ||
| 58 | switch(sk->sk_state) { | 58 | switch (sk->sk_state) { |
| 59 | /* ignore connecting sockets as they make progress */ | 59 | /* ignore connecting sockets as they make progress */ |
| 60 | case TCP_SYN_SENT: | 60 | case TCP_SYN_SENT: |
| 61 | case TCP_SYN_RECV: | 61 | case TCP_SYN_RECV: |
| 62 | break; | 62 | break; |
| 63 | case TCP_ESTABLISHED: | 63 | case TCP_ESTABLISHED: |
| 64 | rds_connect_path_complete(&conn->c_path[0], | 64 | rds_connect_path_complete(cp, RDS_CONN_CONNECTING); |
| 65 | RDS_CONN_CONNECTING); | 65 | break; |
| 66 | break; | 66 | case TCP_CLOSE_WAIT: |
| 67 | case TCP_CLOSE_WAIT: | 67 | case TCP_CLOSE: |
| 68 | case TCP_CLOSE: | 68 | rds_conn_path_drop(cp); |
| 69 | rds_conn_drop(conn); | 69 | default: |
| 70 | default: | 70 | break; |
| 71 | break; | ||
| 72 | } | 71 | } |
| 73 | out: | 72 | out: |
| 74 | read_unlock_bh(&sk->sk_callback_lock); | 73 | read_unlock_bh(&sk->sk_callback_lock); |
| 75 | state_change(sk); | 74 | state_change(sk); |
| 76 | } | 75 | } |
| 77 | 76 | ||
| 78 | int rds_tcp_conn_connect(struct rds_connection *conn) | 77 | int rds_tcp_conn_path_connect(struct rds_conn_path *cp) |
| 79 | { | 78 | { |
| 80 | struct socket *sock = NULL; | 79 | struct socket *sock = NULL; |
| 81 | struct sockaddr_in src, dest; | 80 | struct sockaddr_in src, dest; |
| 82 | int ret; | 81 | int ret; |
| 83 | struct rds_tcp_connection *tc = conn->c_transport_data; | 82 | struct rds_connection *conn = cp->cp_conn; |
| 83 | struct rds_tcp_connection *tc = cp->cp_transport_data; | ||
| 84 | 84 | ||
| 85 | mutex_lock(&tc->t_conn_lock); | 85 | mutex_lock(&tc->t_conn_path_lock); |
| 86 | 86 | ||
| 87 | if (rds_conn_up(conn)) { | 87 | if (rds_conn_path_up(cp)) { |
| 88 | mutex_unlock(&tc->t_conn_lock); | 88 | mutex_unlock(&tc->t_conn_path_lock); |
| 89 | return 0; | 89 | return 0; |
| 90 | } | 90 | } |
| 91 | ret = sock_create_kern(rds_conn_net(conn), PF_INET, | 91 | ret = sock_create_kern(rds_conn_net(conn), PF_INET, |
| @@ -114,10 +114,11 @@ int rds_tcp_conn_connect(struct rds_connection *conn) | |||
| 114 | * once we call connect() we can start getting callbacks and they | 114 | * once we call connect() we can start getting callbacks and they |
| 115 | * own the socket | 115 | * own the socket |
| 116 | */ | 116 | */ |
| 117 | rds_tcp_set_callbacks(sock, conn); | 117 | rds_tcp_set_callbacks(sock, cp); |
| 118 | ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest), | 118 | ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest), |
| 119 | O_NONBLOCK); | 119 | O_NONBLOCK); |
| 120 | 120 | ||
| 121 | cp->cp_outgoing = 1; | ||
| 121 | rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret); | 122 | rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret); |
| 122 | if (ret == -EINPROGRESS) | 123 | if (ret == -EINPROGRESS) |
| 123 | ret = 0; | 124 | ret = 0; |
| @@ -125,11 +126,11 @@ int rds_tcp_conn_connect(struct rds_connection *conn) | |||
| 125 | rds_tcp_keepalive(sock); | 126 | rds_tcp_keepalive(sock); |
| 126 | sock = NULL; | 127 | sock = NULL; |
| 127 | } else { | 128 | } else { |
| 128 | rds_tcp_restore_callbacks(sock, conn->c_transport_data); | 129 | rds_tcp_restore_callbacks(sock, cp->cp_transport_data); |
| 129 | } | 130 | } |
| 130 | 131 | ||
| 131 | out: | 132 | out: |
| 132 | mutex_unlock(&tc->t_conn_lock); | 133 | mutex_unlock(&tc->t_conn_path_lock); |
| 133 | if (sock) | 134 | if (sock) |
| 134 | sock_release(sock); | 135 | sock_release(sock); |
| 135 | return ret; | 136 | return ret; |
| @@ -144,12 +145,13 @@ out: | |||
| 144 | * callbacks to those set by TCP. Our callbacks won't execute again once we | 145 | * callbacks to those set by TCP. Our callbacks won't execute again once we |
| 145 | * hold the sock lock. | 146 | * hold the sock lock. |
| 146 | */ | 147 | */ |
| 147 | void rds_tcp_conn_shutdown(struct rds_connection *conn) | 148 | void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp) |
| 148 | { | 149 | { |
| 149 | struct rds_tcp_connection *tc = conn->c_transport_data; | 150 | struct rds_tcp_connection *tc = cp->cp_transport_data; |
| 150 | struct socket *sock = tc->t_sock; | 151 | struct socket *sock = tc->t_sock; |
| 151 | 152 | ||
| 152 | rdsdebug("shutting down conn %p tc %p sock %p\n", conn, tc, sock); | 153 | rdsdebug("shutting down conn %p tc %p sock %p\n", |
| 154 | cp->cp_conn, tc, sock); | ||
| 153 | 155 | ||
| 154 | if (sock) { | 156 | if (sock) { |
| 155 | sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN); | 157 | sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN); |
