diff options
Diffstat (limited to 'net/bluetooth/l2cap_core.c')
| -rw-r--r-- | net/bluetooth/l2cap_core.c | 24 | 
1 files changed, 6 insertions, 18 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 49926f59cc12..55a7226233f9 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -4652,33 +4652,27 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn,  	BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid); -	mutex_lock(&conn->chan_lock); - -	chan = __l2cap_get_chan_by_scid(conn, dcid); +	chan = l2cap_get_chan_by_scid(conn, dcid);  	if (!chan) { -		mutex_unlock(&conn->chan_lock);  		cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);  		return 0;  	} -	l2cap_chan_hold(chan); -	l2cap_chan_lock(chan); -  	rsp.dcid = cpu_to_le16(chan->scid);  	rsp.scid = cpu_to_le16(chan->dcid);  	l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);  	chan->ops->set_shutdown(chan); +	mutex_lock(&conn->chan_lock);  	l2cap_chan_del(chan, ECONNRESET); +	mutex_unlock(&conn->chan_lock);  	chan->ops->close(chan);  	l2cap_chan_unlock(chan);  	l2cap_chan_put(chan); -	mutex_unlock(&conn->chan_lock); -  	return 0;  } @@ -4698,33 +4692,27 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,  	BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid); -	mutex_lock(&conn->chan_lock); - -	chan = __l2cap_get_chan_by_scid(conn, scid); +	chan = l2cap_get_chan_by_scid(conn, scid);  	if (!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;  	} +	mutex_lock(&conn->chan_lock);  	l2cap_chan_del(chan, 0); +	mutex_unlock(&conn->chan_lock);  	chan->ops->close(chan);  	l2cap_chan_unlock(chan);  	l2cap_chan_put(chan); -	mutex_unlock(&conn->chan_lock); -  	return 0;  }  |