diff options
-rw-r--r-- | include/net/bluetooth/l2cap.h | 2 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 29 | ||||
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 2 |
3 files changed, 14 insertions, 19 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 1c89c7f03f8..a2dcbfff1c5 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
@@ -464,7 +464,7 @@ struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, | |||
464 | int proto, gfp_t prio); | 464 | int proto, gfp_t prio); |
465 | 465 | ||
466 | struct l2cap_chan *l2cap_chan_create(struct sock *sk); | 466 | struct l2cap_chan *l2cap_chan_create(struct sock *sk); |
467 | void __l2cap_chan_close(struct l2cap_chan *chan, int reason); | 467 | void l2cap_chan_close(struct l2cap_chan *chan, int reason); |
468 | void l2cap_chan_destroy(struct l2cap_chan *chan); | 468 | void l2cap_chan_destroy(struct l2cap_chan *chan); |
469 | int l2cap_chan_connect(struct l2cap_chan *chan); | 469 | int l2cap_chan_connect(struct l2cap_chan *chan); |
470 | int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len); | 470 | int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len); |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 248f68a9694..c630a0e8c5f 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -250,7 +250,7 @@ static void l2cap_chan_timeout(unsigned long arg) | |||
250 | else | 250 | else |
251 | reason = ETIMEDOUT; | 251 | reason = ETIMEDOUT; |
252 | 252 | ||
253 | __l2cap_chan_close(chan, reason); | 253 | l2cap_chan_close(chan, reason); |
254 | 254 | ||
255 | bh_unlock_sock(sk); | 255 | bh_unlock_sock(sk); |
256 | 256 | ||
@@ -383,16 +383,6 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err) | |||
383 | } | 383 | } |
384 | } | 384 | } |
385 | 385 | ||
386 | /* Must be called on unlocked socket. */ | ||
387 | static void l2cap_chan_close(struct sock *sk) | ||
388 | { | ||
389 | l2cap_chan_clear_timer(l2cap_pi(sk)->chan); | ||
390 | lock_sock(sk); | ||
391 | __l2cap_chan_close(l2cap_pi(sk)->chan, ECONNRESET); | ||
392 | release_sock(sk); | ||
393 | l2cap_sock_kill(sk); | ||
394 | } | ||
395 | |||
396 | static void l2cap_chan_cleanup_listen(struct sock *parent) | 386 | static void l2cap_chan_cleanup_listen(struct sock *parent) |
397 | { | 387 | { |
398 | struct sock *sk; | 388 | struct sock *sk; |
@@ -400,14 +390,19 @@ static void l2cap_chan_cleanup_listen(struct sock *parent) | |||
400 | BT_DBG("parent %p", parent); | 390 | BT_DBG("parent %p", parent); |
401 | 391 | ||
402 | /* Close not yet accepted channels */ | 392 | /* Close not yet accepted channels */ |
403 | while ((sk = bt_accept_dequeue(parent, NULL))) | 393 | while ((sk = bt_accept_dequeue(parent, NULL))) { |
404 | l2cap_chan_close(sk); | 394 | l2cap_chan_clear_timer(l2cap_pi(sk)->chan); |
395 | lock_sock(sk); | ||
396 | l2cap_chan_close(l2cap_pi(sk)->chan, ECONNRESET); | ||
397 | release_sock(sk); | ||
398 | l2cap_sock_kill(sk); | ||
399 | } | ||
405 | 400 | ||
406 | parent->sk_state = BT_CLOSED; | 401 | parent->sk_state = BT_CLOSED; |
407 | sock_set_flag(parent, SOCK_ZAPPED); | 402 | sock_set_flag(parent, SOCK_ZAPPED); |
408 | } | 403 | } |
409 | 404 | ||
410 | void __l2cap_chan_close(struct l2cap_chan *chan, int reason) | 405 | void l2cap_chan_close(struct l2cap_chan *chan, int reason) |
411 | { | 406 | { |
412 | struct l2cap_conn *conn = chan->conn; | 407 | struct l2cap_conn *conn = chan->conn; |
413 | struct sock *sk = chan->sk; | 408 | struct sock *sk = chan->sk; |
@@ -724,10 +719,10 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
724 | conn->feat_mask) | 719 | conn->feat_mask) |
725 | && chan->conf_state & | 720 | && chan->conf_state & |
726 | L2CAP_CONF_STATE2_DEVICE) { | 721 | L2CAP_CONF_STATE2_DEVICE) { |
727 | /* __l2cap_chan_close() calls list_del(chan) | 722 | /* l2cap_chan_close() calls list_del(chan) |
728 | * so release the lock */ | 723 | * so release the lock */ |
729 | read_unlock_bh(&conn->chan_lock); | 724 | read_unlock_bh(&conn->chan_lock); |
730 | __l2cap_chan_close(chan, ECONNRESET); | 725 | l2cap_chan_close(chan, ECONNRESET); |
731 | read_lock_bh(&conn->chan_lock); | 726 | read_lock_bh(&conn->chan_lock); |
732 | bh_unlock_sock(sk); | 727 | bh_unlock_sock(sk); |
733 | continue; | 728 | continue; |
@@ -4151,7 +4146,7 @@ static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) | |||
4151 | l2cap_chan_clear_timer(chan); | 4146 | l2cap_chan_clear_timer(chan); |
4152 | l2cap_chan_set_timer(chan, HZ * 5); | 4147 | l2cap_chan_set_timer(chan, HZ * 5); |
4153 | } else if (chan->sec_level == BT_SECURITY_HIGH) | 4148 | } else if (chan->sec_level == BT_SECURITY_HIGH) |
4154 | __l2cap_chan_close(chan, ECONNREFUSED); | 4149 | l2cap_chan_close(chan, ECONNREFUSED); |
4155 | } else { | 4150 | } else { |
4156 | if (chan->sec_level == BT_SECURITY_MEDIUM) | 4151 | if (chan->sec_level == BT_SECURITY_MEDIUM) |
4157 | l2cap_chan_clear_timer(chan); | 4152 | l2cap_chan_clear_timer(chan); |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 7d87d1f664c..b79fb756183 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -707,7 +707,7 @@ static int l2cap_sock_shutdown(struct socket *sock, int how) | |||
707 | err = __l2cap_wait_ack(sk); | 707 | err = __l2cap_wait_ack(sk); |
708 | 708 | ||
709 | sk->sk_shutdown = SHUTDOWN_MASK; | 709 | sk->sk_shutdown = SHUTDOWN_MASK; |
710 | __l2cap_chan_close(chan, 0); | 710 | l2cap_chan_close(chan, 0); |
711 | 711 | ||
712 | if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) | 712 | if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) |
713 | err = bt_sock_wait_state(sk, BT_CLOSED, | 713 | err = bt_sock_wait_state(sk, BT_CLOSED, |