Commit 9f3956d6 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge tag 'for-net-2022-03-03' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth

Luiz Augusto von Dentz says:

====================
bluetooth pull request for net:

 - Fix regression with processing of MGMT commands
 - Fix unbalanced unlock in Set Device Flags

* tag 'for-net-2022-03-03' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth:
  Bluetooth: hci_sync: Fix not processing all entries on cmd_sync_work
  Bluetooth: hci_core: Fix unbalanced unlock in set_device_flags()
====================

Link: https://lore.kernel.org/r/20220303210743.314679-1-luiz.dentz@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents b949c21f 008ee9eb
...@@ -276,40 +276,37 @@ EXPORT_SYMBOL(__hci_cmd_sync_status); ...@@ -276,40 +276,37 @@ EXPORT_SYMBOL(__hci_cmd_sync_status);
static void hci_cmd_sync_work(struct work_struct *work) static void hci_cmd_sync_work(struct work_struct *work)
{ {
struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_sync_work); struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_sync_work);
struct hci_cmd_sync_work_entry *entry;
hci_cmd_sync_work_func_t func;
hci_cmd_sync_work_destroy_t destroy;
void *data;
bt_dev_dbg(hdev, ""); bt_dev_dbg(hdev, "");
mutex_lock(&hdev->cmd_sync_work_lock); /* Dequeue all entries and run them */
entry = list_first_entry(&hdev->cmd_sync_work_list, while (1) {
struct hci_cmd_sync_work_entry, list); struct hci_cmd_sync_work_entry *entry;
if (entry) {
list_del(&entry->list);
func = entry->func;
data = entry->data;
destroy = entry->destroy;
kfree(entry);
} else {
func = NULL;
data = NULL;
destroy = NULL;
}
mutex_unlock(&hdev->cmd_sync_work_lock);
if (func) { mutex_lock(&hdev->cmd_sync_work_lock);
int err; entry = list_first_entry_or_null(&hdev->cmd_sync_work_list,
struct hci_cmd_sync_work_entry,
list);
if (entry)
list_del(&entry->list);
mutex_unlock(&hdev->cmd_sync_work_lock);
if (!entry)
break;
hci_req_sync_lock(hdev); bt_dev_dbg(hdev, "entry %p", entry);
err = func(hdev, data); if (entry->func) {
int err;
if (destroy) hci_req_sync_lock(hdev);
destroy(hdev, data, err); err = entry->func(hdev, entry->data);
if (entry->destroy)
entry->destroy(hdev, entry->data, err);
hci_req_sync_unlock(hdev);
}
hci_req_sync_unlock(hdev); kfree(entry);
} }
} }
......
...@@ -4541,9 +4541,9 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data, ...@@ -4541,9 +4541,9 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
} }
} }
done:
hci_dev_unlock(hdev); hci_dev_unlock(hdev);
done:
if (status == MGMT_STATUS_SUCCESS) if (status == MGMT_STATUS_SUCCESS)
device_flags_changed(sk, hdev, &cp->addr.bdaddr, cp->addr.type, device_flags_changed(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
supported_flags, current_flags); supported_flags, current_flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment