diff options
Diffstat (limited to 'net/bluetooth/l2cap_core.c')
| -rw-r--r-- | net/bluetooth/l2cap_core.c | 8 | 
1 files changed, 7 insertions, 1 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 6eabbe05fe54..323f23cd2c37 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -1663,7 +1663,13 @@ static void l2cap_conn_del(struct hci_conn *hcon, int err)  	kfree_skb(conn->rx_skb);  	skb_queue_purge(&conn->pending_rx); -	flush_work(&conn->pending_rx_work); + +	/* We can not call flush_work(&conn->pending_rx_work) here since we +	 * might block if we are running on a worker from the same workqueue +	 * pending_rx_work is waiting on. +	 */ +	if (work_pending(&conn->pending_rx_work)) +		cancel_work_sync(&conn->pending_rx_work);  	l2cap_unregister_all_users(conn);  |