Bluetooth: Fix __hci_req_sync() handling of empty requests
authorJohan Hedberg <johan.hedberg@intel.com>
Tue, 5 Mar 2013 18:37:42 +0000 (20:37 +0200)
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>
Fri, 8 Mar 2013 13:40:25 +0000 (10:40 -0300)
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>
net/bluetooth/hci_core.c

index 551df8a6f983ef08df1be23db96b7d9a421d8a04..9369e010c90ee0e476c75785c2a5fe30f103369e 100644 (file)
@@ -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);