diff options
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r-- | net/tipc/socket.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index e16197eb7b9f..c58f66be7e18 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -110,7 +110,7 @@ static void tipc_write_space(struct sock *sk); | |||
110 | static int tipc_release(struct socket *sock); | 110 | static int tipc_release(struct socket *sock); |
111 | static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags); | 111 | static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags); |
112 | static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p); | 112 | static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p); |
113 | static void tipc_sk_timeout(unsigned long portid); | 113 | static void tipc_sk_timeout(unsigned long data); |
114 | static int tipc_sk_publish(struct tipc_sock *tsk, uint scope, | 114 | static int tipc_sk_publish(struct tipc_sock *tsk, uint scope, |
115 | struct tipc_name_seq const *seq); | 115 | struct tipc_name_seq const *seq); |
116 | static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope, | 116 | static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope, |
@@ -361,7 +361,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock, | |||
361 | return -EINVAL; | 361 | return -EINVAL; |
362 | } | 362 | } |
363 | msg_set_origport(msg, tsk->portid); | 363 | msg_set_origport(msg, tsk->portid); |
364 | setup_timer(&tsk->timer, tipc_sk_timeout, tsk->portid); | 364 | setup_timer(&tsk->timer, tipc_sk_timeout, (unsigned long)tsk); |
365 | sk->sk_backlog_rcv = tipc_backlog_rcv; | 365 | sk->sk_backlog_rcv = tipc_backlog_rcv; |
366 | sk->sk_rcvbuf = sysctl_tipc_rmem[1]; | 366 | sk->sk_rcvbuf = sysctl_tipc_rmem[1]; |
367 | sk->sk_data_ready = tipc_data_ready; | 367 | sk->sk_data_ready = tipc_data_ready; |
@@ -475,7 +475,7 @@ static int tipc_release(struct socket *sock) | |||
475 | struct sock *sk = sock->sk; | 475 | struct sock *sk = sock->sk; |
476 | struct tipc_sock *tsk; | 476 | struct tipc_sock *tsk; |
477 | struct sk_buff *skb; | 477 | struct sk_buff *skb; |
478 | u32 dnode; | 478 | u32 dnode, probing_state; |
479 | 479 | ||
480 | /* | 480 | /* |
481 | * Exit if socket isn't fully initialized (occurs when a failed accept() | 481 | * Exit if socket isn't fully initialized (occurs when a failed accept() |
@@ -511,7 +511,9 @@ static int tipc_release(struct socket *sock) | |||
511 | } | 511 | } |
512 | 512 | ||
513 | tipc_sk_withdraw(tsk, 0, NULL); | 513 | tipc_sk_withdraw(tsk, 0, NULL); |
514 | del_timer_sync(&tsk->timer); | 514 | probing_state = tsk->probing_state; |
515 | if (del_timer_sync(&tsk->timer) && probing_state != TIPC_CONN_PROBING) | ||
516 | sock_put(sk); | ||
515 | tipc_sk_remove(tsk); | 517 | tipc_sk_remove(tsk); |
516 | if (tsk->connected) { | 518 | if (tsk->connected) { |
517 | skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE, TIPC_CONN_MSG, | 519 | skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE, TIPC_CONN_MSG, |
@@ -1141,7 +1143,8 @@ static void tipc_sk_finish_conn(struct tipc_sock *tsk, u32 peer_port, | |||
1141 | tsk->probing_intv = CONN_PROBING_INTERVAL; | 1143 | tsk->probing_intv = CONN_PROBING_INTERVAL; |
1142 | tsk->probing_state = TIPC_CONN_OK; | 1144 | tsk->probing_state = TIPC_CONN_OK; |
1143 | tsk->connected = 1; | 1145 | tsk->connected = 1; |
1144 | mod_timer(&tsk->timer, jiffies + tsk->probing_intv); | 1146 | if (!mod_timer(&tsk->timer, jiffies + tsk->probing_intv)) |
1147 | sock_hold(&tsk->sk); | ||
1145 | tipc_node_add_conn(peer_node, tsk->portid, peer_port); | 1148 | tipc_node_add_conn(peer_node, tsk->portid, peer_port); |
1146 | tsk->max_pkt = tipc_node_get_mtu(peer_node, tsk->portid); | 1149 | tsk->max_pkt = tipc_node_get_mtu(peer_node, tsk->portid); |
1147 | } | 1150 | } |
@@ -2096,18 +2099,13 @@ restart: | |||
2096 | return res; | 2099 | return res; |
2097 | } | 2100 | } |
2098 | 2101 | ||
2099 | static void tipc_sk_timeout(unsigned long portid) | 2102 | static void tipc_sk_timeout(unsigned long data) |
2100 | { | 2103 | { |
2101 | struct tipc_sock *tsk; | 2104 | struct tipc_sock *tsk = (struct tipc_sock *)data; |
2102 | struct sock *sk; | 2105 | struct sock *sk = &tsk->sk; |
2103 | struct sk_buff *skb = NULL; | 2106 | struct sk_buff *skb = NULL; |
2104 | u32 peer_port, peer_node; | 2107 | u32 peer_port, peer_node; |
2105 | 2108 | ||
2106 | tsk = tipc_sk_lookup(portid); | ||
2107 | if (!tsk) | ||
2108 | return; | ||
2109 | |||
2110 | sk = &tsk->sk; | ||
2111 | bh_lock_sock(sk); | 2109 | bh_lock_sock(sk); |
2112 | if (!tsk->connected) { | 2110 | if (!tsk->connected) { |
2113 | bh_unlock_sock(sk); | 2111 | bh_unlock_sock(sk); |
@@ -2120,18 +2118,19 @@ static void tipc_sk_timeout(unsigned long portid) | |||
2120 | /* Previous probe not answered -> self abort */ | 2118 | /* Previous probe not answered -> self abort */ |
2121 | skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE, TIPC_CONN_MSG, | 2119 | skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE, TIPC_CONN_MSG, |
2122 | SHORT_H_SIZE, 0, tipc_own_addr, | 2120 | SHORT_H_SIZE, 0, tipc_own_addr, |
2123 | peer_node, portid, peer_port, | 2121 | peer_node, tsk->portid, peer_port, |
2124 | TIPC_ERR_NO_PORT); | 2122 | TIPC_ERR_NO_PORT); |
2125 | } else { | 2123 | } else { |
2126 | skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE, INT_H_SIZE, | 2124 | skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE, INT_H_SIZE, |
2127 | 0, peer_node, tipc_own_addr, | 2125 | 0, peer_node, tipc_own_addr, |
2128 | peer_port, portid, TIPC_OK); | 2126 | peer_port, tsk->portid, TIPC_OK); |
2129 | tsk->probing_state = TIPC_CONN_PROBING; | 2127 | tsk->probing_state = TIPC_CONN_PROBING; |
2130 | mod_timer(&tsk->timer, jiffies + tsk->probing_intv); | 2128 | if (!mod_timer(&tsk->timer, jiffies + tsk->probing_intv)) |
2129 | sock_hold(sk); | ||
2131 | } | 2130 | } |
2132 | bh_unlock_sock(sk); | 2131 | bh_unlock_sock(sk); |
2133 | if (skb) | 2132 | if (skb) |
2134 | tipc_link_xmit_skb(skb, peer_node, portid); | 2133 | tipc_link_xmit_skb(skb, peer_node, tsk->portid); |
2135 | exit: | 2134 | exit: |
2136 | sock_put(sk); | 2135 | sock_put(sk); |
2137 | } | 2136 | } |