Return-Path: Date: Tue, 14 Feb 2012 16:39:55 -0200 From: Gustavo Padovan To: Emeltchenko Andrei Cc: linux-bluetooth@vger.kernel.org Subject: Re: [RFCv4 06/16] Bluetooth: Add socket error function Message-ID: <20120214183955.GB14503@joana> References: <1328882113-19810-1-git-send-email-Andrei.Emeltchenko.news@gmail.com> <1328882113-19810-7-git-send-email-Andrei.Emeltchenko.news@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <1328882113-19810-7-git-send-email-Andrei.Emeltchenko.news@gmail.com> Sender: linux-bluetooth-owner@vger.kernel.org List-ID: Hi Andrei, * Emeltchenko Andrei [2012-02-10 15:55:03 +0200]: > From: Andrei Emeltchenko > > Use locked and unlocked versions to help removing socket > locks from l2cap. > > Signed-off-by: Andrei Emeltchenko > --- > net/bluetooth/l2cap_core.c | 30 +++++++++++++++++++++--------- > 1 files changed, 21 insertions(+), 9 deletions(-) > > diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c > index 5120a1c..e0e4cc8 100644 > --- a/net/bluetooth/l2cap_core.c > +++ b/net/bluetooth/l2cap_core.c > @@ -243,6 +243,22 @@ static void l2cap_state_change(struct l2cap_chan *chan, int state) > release_sock(sk); > } > > +static inline void __l2cap_chan_set_err(struct l2cap_chan *chan, int err) > +{ > + struct sock *sk = chan->sk; > + > + sk->sk_err = err; > +} > + > +static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err) > +{ > + struct sock *sk = chan->sk; > + > + lock_sock(sk); > + __l2cap_chan_set_err(chan, err); > + release_sock(sk); > +} > + > static void l2cap_chan_timeout(struct work_struct *work) > { > struct l2cap_chan *chan = container_of(work, struct l2cap_chan, > @@ -383,7 +399,7 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err) > sock_set_flag(sk, SOCK_ZAPPED); > > if (err) > - sk->sk_err = err; > + __l2cap_chan_set_err(chan, err); > > if (parent) { > bt_accept_unlink(sk); > @@ -715,14 +731,11 @@ static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask) > > static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, int err) > { > - struct sock *sk; > struct l2cap_disconn_req req; > > if (!conn) > return; > > - sk = chan->sk; > - > if (chan->mode == L2CAP_MODE_ERTM) { > __clear_retrans_timer(chan); > __clear_monitor_timer(chan); > @@ -735,7 +748,7 @@ static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *c > L2CAP_DISCONN_REQ, sizeof(req), &req); > > __l2cap_state_change(chan, BT_DISCONN); > - sk->sk_err = err; > + __l2cap_chan_set_err(chan, err); > } > > /* ---- L2CAP connections ---- */ > @@ -974,10 +987,8 @@ static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err) > mutex_lock(&conn->chan_lock); > > list_for_each_entry(chan, &conn->chan_l, list) { > - struct sock *sk = chan->sk; > - > if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags)) > - sk->sk_err = err; > + l2cap_chan_set_err(chan, err); Why is this l2cap_chan_set_err()? This function wasn't holding the lock. Please justify this change. Gustavo