|
@@ -622,21 +622,26 @@ static inline void l2cap_chan_unlock(struct l2cap_chan *chan)
|
|
|
}
|
|
|
|
|
|
static inline void l2cap_set_timer(struct l2cap_chan *chan,
|
|
|
- struct delayed_work *work, long timeout)
|
|
|
+ struct delayed_work *work, long timeout)
|
|
|
{
|
|
|
BT_DBG("chan %p state %s timeout %ld", chan,
|
|
|
- state_to_string(chan->state), timeout);
|
|
|
+ state_to_string(chan->state), timeout);
|
|
|
|
|
|
+ /* If delayed work cancelled do not hold(chan)
|
|
|
+ since it is already done with previous set_timer */
|
|
|
if (!cancel_delayed_work(work))
|
|
|
l2cap_chan_hold(chan);
|
|
|
+
|
|
|
schedule_delayed_work(work, timeout);
|
|
|
}
|
|
|
|
|
|
static inline bool l2cap_clear_timer(struct l2cap_chan *chan,
|
|
|
- struct delayed_work *work)
|
|
|
+ struct delayed_work *work)
|
|
|
{
|
|
|
bool ret;
|
|
|
|
|
|
+ /* put(chan) if delayed work cancelled otherwise it
|
|
|
+ is done in delayed work function */
|
|
|
ret = cancel_delayed_work(work);
|
|
|
if (ret)
|
|
|
l2cap_chan_put(chan);
|