OSDN Git Service

Bluetooth: Reset more state when cancelling a sync command
authorBenjamin Berg <bberg@redhat.com>
Fri, 3 Dec 2021 14:58:59 +0000 (15:58 +0100)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 3 Dec 2021 18:41:59 +0000 (10:41 -0800)
Resetting the timers and cmd_cnt means that we assume the device will be
in a good state after the sync command finishes. Without this a chain of
synchronous commands might get stuck if one of them is cancelled.

Signed-off-by: Benjamin Berg <bberg@redhat.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/hci_request.c

index 8b3205e..58d640a 100644 (file)
@@ -118,6 +118,11 @@ void hci_req_sync_cancel(struct hci_dev *hdev, int err)
        if (hdev->req_status == HCI_REQ_PEND) {
                hdev->req_result = err;
                hdev->req_status = HCI_REQ_CANCELED;
+
+               cancel_delayed_work_sync(&hdev->cmd_timer);
+               cancel_delayed_work_sync(&hdev->ncmd_timer);
+               atomic_set(&hdev->cmd_cnt, 1);
+
                wake_up_interruptible(&hdev->req_wait_q);
        }
 }