Hi Gustavo, On Tue, Feb 21, 2012 at 03:46:57PM -0200, Gustavo Padovan wrote: > Hi Andrei, > > * Andrei Emeltchenko <Andrei.Emeltchenko.news@xxxxxxxxx> [2012-02-21 12:55:06 +0200]: > > > From: Andrei Emeltchenko <andrei.emeltchenko@xxxxxxxxx> > > > > Function l2cap_chan_connect does not return with locked socket > > anymore. So we take explicit lock in l2cap_sock_connect. > > > > Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@xxxxxxxxx> > > --- > > net/bluetooth/l2cap_core.c | 18 ++++++++++++++---- > > net/bluetooth/l2cap_sock.c | 2 ++ > > 2 files changed, 16 insertions(+), 4 deletions(-) > > > > diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c > > index 49aa226..9e0af6e 100644 > > --- a/net/bluetooth/l2cap_core.c > > +++ b/net/bluetooth/l2cap_core.c > > @@ -1159,7 +1159,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, bdaddr_t *d > > > > hci_dev_lock(hdev); > > > > - lock_sock(sk); > > + l2cap_chan_lock(chan); > > > > /* PSM must be odd and lsb of upper byte must be 0 */ > > if ((__le16_to_cpu(psm) & 0x0101) != 0x0001 && !cid && > > @@ -1186,17 +1186,21 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, bdaddr_t *d > > goto done; > > } > > > > + lock_sock(sk); > > + > > switch (sk->sk_state) { > > case BT_CONNECT: > > case BT_CONNECT2: > > case BT_CONFIG: > > /* Already connecting */ > > err = 0; > > + release_sock(sk); > > goto done; > > > > case BT_CONNECTED: > > /* Already connected */ > > err = -EISCONN; > > + release_sock(sk); > > goto done; > > > > case BT_OPEN: > > @@ -1206,11 +1210,15 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, bdaddr_t *d > > > > default: > > err = -EBADFD; > > + release_sock(sk); > > goto done; > > } > > > > /* Set destination address and psm */ > > bacpy(&bt_sk(sk)->dst, dst); > > + > > + release_sock(sk); > > + > > chan->psm = psm; > > chan->dcid = cid; > > > > @@ -1238,23 +1246,25 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, bdaddr_t *d > > /* Update source addr of the socket */ > > bacpy(src, conn->src); > > > > + l2cap_chan_unlock(chan); > > l2cap_chan_add(conn, chan); > > + l2cap_chan_lock(chan); > > What are you trying to do here? I am following the same locking sequence, otherwise lockdep warns. > > - __l2cap_state_change(chan, BT_CONNECT); > > + l2cap_state_change(chan, BT_CONNECT); > > __set_chan_timer(chan, sk->sk_sndtimeo); > > > > if (hcon->state == BT_CONNECTED) { > > if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { > > __clear_chan_timer(chan); > > if (l2cap_chan_check_security(chan)) > > - __l2cap_state_change(chan, BT_CONNECTED); > > + l2cap_state_change(chan, BT_CONNECTED); > > } else > > l2cap_do_start(chan); > > } > > > > err = 0; > > - > > Do not remove this line, please. OK. Best regards Andrei Emeltchenko -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html