Bluetooth: Stability fix: dev locking
The hci_dev should be locked/unlocked with the _bh form of
the spin lock, and function may not return while lock is held.
Change-Id: I2179a59506c2b212db5fb5b57bc27bff165b2cc6
Signed-off-by: Brian Gix <bgix@codeaurora.org>
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 8b6f23e..e15609c 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -1353,20 +1353,23 @@
if (!hdev)
return cmd_status(sk, index, MGMT_OP_ENCRYPT_LINK, ENODEV);
- hci_dev_lock(hdev);
+ hci_dev_lock_bh(hdev);
if (!test_bit(HCI_UP, &hdev->flags)) {
err = cmd_status(sk, index, MGMT_OP_ENCRYPT_LINK, ENETDOWN);
- goto failed;
+ goto done;
}
- conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
- &cp->bdaddr);
- if (!conn)
- return cmd_status(sk, index, MGMT_OP_ENCRYPT_LINK, ENOTCONN);
+ conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
+ if (!conn) {
+ err = cmd_status(sk, index, MGMT_OP_ENCRYPT_LINK, ENOTCONN);
+ goto done;
+ }
- if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
- return cmd_status(sk, index, MGMT_OP_ENCRYPT_LINK, EINPROGRESS);
+ if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) {
+ err = cmd_status(sk, index, MGMT_OP_ENCRYPT_LINK, EINPROGRESS);
+ goto done;
+ }
if (conn->link_mode & HCI_LM_AUTH) {
enc.handle = cpu_to_le16(conn->handle);
@@ -1383,8 +1386,8 @@
}
}
-failed:
- hci_dev_unlock(hdev);
+done:
+ hci_dev_unlock_bh(hdev);
hci_dev_put(hdev);
return err;