int proto, gfp_t prio);
struct l2cap_chan *l2cap_chan_create(struct sock *sk);
-void __l2cap_chan_close(struct l2cap_chan *chan, int reason);
+void l2cap_chan_close(struct l2cap_chan *chan, int reason);
void l2cap_chan_destroy(struct l2cap_chan *chan);
int l2cap_chan_connect(struct l2cap_chan *chan);
int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len);
else
reason = ETIMEDOUT;
- __l2cap_chan_close(chan, reason);
+ l2cap_chan_close(chan, reason);
bh_unlock_sock(sk);
}
}
-/* Must be called on unlocked socket. */
-static void l2cap_chan_close(struct sock *sk)
-{
- l2cap_chan_clear_timer(l2cap_pi(sk)->chan);
- lock_sock(sk);
- __l2cap_chan_close(l2cap_pi(sk)->chan, ECONNRESET);
- release_sock(sk);
- l2cap_sock_kill(sk);
-}
-
static void l2cap_chan_cleanup_listen(struct sock *parent)
{
struct sock *sk;
BT_DBG("parent %p", parent);
/* Close not yet accepted channels */
- while ((sk = bt_accept_dequeue(parent, NULL)))
- l2cap_chan_close(sk);
+ while ((sk = bt_accept_dequeue(parent, NULL))) {
+ l2cap_chan_clear_timer(l2cap_pi(sk)->chan);
+ lock_sock(sk);
+ l2cap_chan_close(l2cap_pi(sk)->chan, ECONNRESET);
+ release_sock(sk);
+ l2cap_sock_kill(sk);
+ }
parent->sk_state = BT_CLOSED;
sock_set_flag(parent, SOCK_ZAPPED);
}
-void __l2cap_chan_close(struct l2cap_chan *chan, int reason)
+void l2cap_chan_close(struct l2cap_chan *chan, int reason)
{
struct l2cap_conn *conn = chan->conn;
struct sock *sk = chan->sk;
conn->feat_mask)
&& chan->conf_state &
L2CAP_CONF_STATE2_DEVICE) {
- /* __l2cap_chan_close() calls list_del(chan)
+ /* l2cap_chan_close() calls list_del(chan)
* so release the lock */
read_unlock_bh(&conn->chan_lock);
- __l2cap_chan_close(chan, ECONNRESET);
+ l2cap_chan_close(chan, ECONNRESET);
read_lock_bh(&conn->chan_lock);
bh_unlock_sock(sk);
continue;
l2cap_chan_clear_timer(chan);
l2cap_chan_set_timer(chan, HZ * 5);
} else if (chan->sec_level == BT_SECURITY_HIGH)
- __l2cap_chan_close(chan, ECONNREFUSED);
+ l2cap_chan_close(chan, ECONNREFUSED);
} else {
if (chan->sec_level == BT_SECURITY_MEDIUM)
l2cap_chan_clear_timer(chan);
err = __l2cap_wait_ack(sk);
sk->sk_shutdown = SHUTDOWN_MASK;
- __l2cap_chan_close(chan, 0);
+ l2cap_chan_close(chan, 0);
if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
err = bt_sock_wait_state(sk, BT_CLOSED,