Bluetooth: Fix setting state back to TASK_RUNNING
authorJohan Hedberg <johan.hedberg@intel.com>
Wed, 19 Nov 2014 11:16:41 +0000 (13:16 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 19 Nov 2014 15:15:55 +0000 (16:15 +0100)
In __hci_cmd_sync_ev() and __hci_req_sync() if the hci_req_run() call
fails and we return from the functions we should ensure that the state
doesn't remain in TASK_INTERRUPTIBLE that we just set it to. This patch
fixes missing calls to set_current_state(TASK_RUNNING) in both places.

Reported-by: Kirill A. Shutemov <kirill@shutemov.name>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Tested-by: Kirill A. Shutemov <kirill@shutemov.name>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/hci_core.c

index d786958a1decd58a8236701f48f6a74850138b48..a67a4b8e4e1cc4ca859032eb357c21a82a509c3a 100644 (file)
@@ -1128,6 +1128,7 @@ struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
        err = hci_req_run(&req, hci_req_sync_complete);
        if (err < 0) {
                remove_wait_queue(&hdev->req_wait_q, &wait);
+               set_current_state(TASK_RUNNING);
                return ERR_PTR(err);
        }
 
@@ -1196,6 +1197,7 @@ static int __hci_req_sync(struct hci_dev *hdev,
                hdev->req_status = 0;
 
                remove_wait_queue(&hdev->req_wait_q, &wait);
+               set_current_state(TASK_RUNNING);
 
                /* ENODATA means the HCI request command queue is empty.
                 * This can happen when a request with conditionals doesn't