BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
 
        mutex_lock(&conn->chan_lock);
+       /* __set_chan_timer() calls l2cap_chan_hold(chan) while scheduling
+        * this work. No need to call l2cap_chan_hold(chan) here again.
+        */
        l2cap_chan_lock(chan);
 
        if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
 
        l2cap_chan_close(chan, reason);
 
-       l2cap_chan_unlock(chan);
-
        chan->ops->close(chan);
-       mutex_unlock(&conn->chan_lock);
 
+       l2cap_chan_unlock(chan);
        l2cap_chan_put(chan);
+
+       mutex_unlock(&conn->chan_lock);
 }
 
 struct l2cap_chan *l2cap_chan_create(void)
 
                l2cap_chan_del(chan, err);
 
-               l2cap_chan_unlock(chan);
-
                chan->ops->close(chan);
+
+               l2cap_chan_unlock(chan);
                l2cap_chan_put(chan);
        }
 
                return 0;
        }
 
+       l2cap_chan_hold(chan);
        l2cap_chan_lock(chan);
 
        rsp.dcid = cpu_to_le16(chan->scid);
 
        chan->ops->set_shutdown(chan);
 
-       l2cap_chan_hold(chan);
        l2cap_chan_del(chan, ECONNRESET);
 
-       l2cap_chan_unlock(chan);
-
        chan->ops->close(chan);
+
+       l2cap_chan_unlock(chan);
        l2cap_chan_put(chan);
 
        mutex_unlock(&conn->chan_lock);
                return 0;
        }
 
+       l2cap_chan_hold(chan);
        l2cap_chan_lock(chan);
 
        if (chan->state != BT_DISCONN) {
                l2cap_chan_unlock(chan);
+               l2cap_chan_put(chan);
                mutex_unlock(&conn->chan_lock);
                return 0;
        }
 
-       l2cap_chan_hold(chan);
        l2cap_chan_del(chan, 0);
 
-       l2cap_chan_unlock(chan);
-
        chan->ops->close(chan);
+
+       l2cap_chan_unlock(chan);
        l2cap_chan_put(chan);
 
        mutex_unlock(&conn->chan_lock);
 
 }
 
 /* Kill socket (only if zapped and orphan)
- * Must be called on unlocked socket.
+ * Must be called on unlocked socket, with l2cap channel lock.
  */
 static void l2cap_sock_kill(struct sock *sk)
 {
 
        err = l2cap_sock_shutdown(sock, 2);
 
+       l2cap_chan_hold(l2cap_pi(sk)->chan);
+       l2cap_chan_lock(l2cap_pi(sk)->chan);
+
        sock_orphan(sk);
        l2cap_sock_kill(sk);
+
+       l2cap_chan_unlock(l2cap_pi(sk)->chan);
+       l2cap_chan_put(l2cap_pi(sk)->chan);
+
        return err;
 }
 
                BT_DBG("child chan %p state %s", chan,
                       state_to_string(chan->state));
 
+               l2cap_chan_hold(chan);
                l2cap_chan_lock(chan);
+
                __clear_chan_timer(chan);
                l2cap_chan_close(chan, ECONNRESET);
-               l2cap_chan_unlock(chan);
-
                l2cap_sock_kill(sk);
+
+               l2cap_chan_unlock(chan);
+               l2cap_chan_put(chan);
        }
 }