aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/bluetooth/l2cap.h2
-rw-r--r--net/bluetooth/l2cap_core.c29
-rw-r--r--net/bluetooth/l2cap_sock.c2
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
466struct l2cap_chan *l2cap_chan_create(struct sock *sk); 466struct l2cap_chan *l2cap_chan_create(struct sock *sk);
467void __l2cap_chan_close(struct l2cap_chan *chan, int reason); 467void l2cap_chan_close(struct l2cap_chan *chan, int reason);
468void l2cap_chan_destroy(struct l2cap_chan *chan); 468void l2cap_chan_destroy(struct l2cap_chan *chan);
469int l2cap_chan_connect(struct l2cap_chan *chan); 469int l2cap_chan_connect(struct l2cap_chan *chan);
470int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len); 470int 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. */
387static 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
396static void l2cap_chan_cleanup_listen(struct sock *parent) 386static 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
410void __l2cap_chan_close(struct l2cap_chan *chan, int reason) 405void 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,