summaryrefslogtreecommitdiffstats
path: root/net/bluetooth/hci_core.c
diff options
context:
space:
mode:
authorJohan Hedberg2013-03-05 19:37:42 +0100
committerGustavo Padovan2013-03-08 14:40:25 +0100
commit53cce22dc795e73fb48205e3f584f63f4c71c90c (patch)
treeaa671d4a99b4da6594541c974535f8c6e0ce5ad8 /net/bluetooth/hci_core.c
parentBluetooth: Rename hci_request to hci_req_sync (diff)
downloadkernel-qcow2-linux-53cce22dc795e73fb48205e3f584f63f4c71c90c.tar.gz
kernel-qcow2-linux-53cce22dc795e73fb48205e3f584f63f4c71c90c.tar.xz
kernel-qcow2-linux-53cce22dc795e73fb48205e3f584f63f4c71c90c.zip
Bluetooth: Fix __hci_req_sync() handling of empty requests
If a request callback doesn't send any commands __hci_req_sync() should fail imediately instead of waiting for the inevitable timeout to occur. This is particularly important once we start creating requests with conditional command sending which can potentially result in no commands being sent at all. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth/hci_core.c')
-rw-r--r--net/bluetooth/hci_core.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 551df8a6f983..9369e010c90e 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -122,6 +122,14 @@ static int __hci_req_sync(struct hci_dev *hdev,
set_current_state(TASK_INTERRUPTIBLE);
req(hdev, opt);
+
+ /* If the request didn't send any commands return immediately */
+ if (skb_queue_empty(&hdev->cmd_q) && atomic_read(&hdev->cmd_cnt)) {
+ hdev->req_status = 0;
+ remove_wait_queue(&hdev->req_wait_q, &wait);
+ return err;
+ }
+
schedule_timeout(timeout);
remove_wait_queue(&hdev->req_wait_q, &wait);