mirror of
https://github.com/torvalds/linux.git
synced 2024-12-02 17:11:33 +00:00
bluetooth pull request for net:
- Fix regression with processing of MGMT commands - Fix unbalanced unlock in Set Device Flags -----BEGIN PGP SIGNATURE----- iQJNBAABCAA3FiEE7E6oRXp8w05ovYr/9JCA4xAyCykFAmIhLGwZHGx1aXoudm9u LmRlbnR6QGludGVsLmNvbQAKCRD0kIDjEDILKdweD/wIGDx874gJQWGgrm0ASvzi 1M3YLPu+CSfJ9wRnBS95FmnpBLKXbO6trZ1MNkxeuqS9yb7oyOXx992NrqOxwetm AdvA2YvQW7GB61d2QujxM6QkI1BQI2y+QIrDu+6K/YPsRQHhsLoPznlyo3mAimDx K7coCWq3qbQSDdjgMUT2/FGv+V6+qRVjUsp72OMs5XocXJ5ruiDKxHahdoBz8GhK fUKsx7v+rUjGt4iNygpYt985dOnAAPvcbP/BCk0LLwtCEB8TA4iXXrqAj1Ibzkfi Nyf7wtDWuKxTtOprLl1Ed8lGdx1iM+yf2adtNIekId9eWtkw/Ete2GRfHgIvIVIN uhIaVNDLOPB/gDzp2s0Rl8eYYUVYrjDBx37UhsUhNGksr6H49fKRBoBO19QBQ3Fk 0jg+4Kodta5aXxYGPAiTsx1HJU9it0ascFgQBuvvMNKTZycCYTGwjbx4eemwD4z2 N9gYAY0+S7GzNrm2vlxMq0DafTrcKTydGJX6RWtXRbczMLpcyZVnuBx20gC+qbU6 /SROOkaSONz+jpYtff22aJ3zva+LpIOdc/XmVtLgHq1bp+S1UM99fAa2QP/om3Gl TXjv+NnM3ST370NDh3Zja07kW53NcKxbcRGr9j35r7q4+kFAsilAdsEDUYW/Bkvr dcVDhm94cErgfyhLdQ6kxg== =Awzt -----END PGP SIGNATURE----- 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.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
9f3956d659
@ -276,40 +276,37 @@ EXPORT_SYMBOL(__hci_cmd_sync_status);
|
||||
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_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, "");
|
||||
|
||||
mutex_lock(&hdev->cmd_sync_work_lock);
|
||||
entry = list_first_entry(&hdev->cmd_sync_work_list,
|
||||
struct hci_cmd_sync_work_entry, list);
|
||||
if (entry) {
|
||||
list_del(&entry->list);
|
||||
func = entry->func;
|
||||
data = entry->data;
|
||||
destroy = entry->destroy;
|
||||
/* Dequeue all entries and run them */
|
||||
while (1) {
|
||||
struct hci_cmd_sync_work_entry *entry;
|
||||
|
||||
mutex_lock(&hdev->cmd_sync_work_lock);
|
||||
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;
|
||||
|
||||
bt_dev_dbg(hdev, "entry %p", entry);
|
||||
|
||||
if (entry->func) {
|
||||
int err;
|
||||
|
||||
hci_req_sync_lock(hdev);
|
||||
err = entry->func(hdev, entry->data);
|
||||
if (entry->destroy)
|
||||
entry->destroy(hdev, entry->data, err);
|
||||
hci_req_sync_unlock(hdev);
|
||||
}
|
||||
|
||||
kfree(entry);
|
||||
} else {
|
||||
func = NULL;
|
||||
data = NULL;
|
||||
destroy = NULL;
|
||||
}
|
||||
mutex_unlock(&hdev->cmd_sync_work_lock);
|
||||
|
||||
if (func) {
|
||||
int err;
|
||||
|
||||
hci_req_sync_lock(hdev);
|
||||
|
||||
err = func(hdev, data);
|
||||
|
||||
if (destroy)
|
||||
destroy(hdev, data, err);
|
||||
|
||||
hci_req_sync_unlock(hdev);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4541,9 +4541,9 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
hci_dev_unlock(hdev);
|
||||
|
||||
done:
|
||||
if (status == MGMT_STATUS_SUCCESS)
|
||||
device_flags_changed(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
|
||||
supported_flags, current_flags);
|
||||
|
Loading…
Reference in New Issue
Block a user