.. | .. |
---|
1623 | 1623 | hdev->flush(hdev); |
---|
1624 | 1624 | |
---|
1625 | 1625 | if (hdev->sent_cmd) { |
---|
| 1626 | + cancel_delayed_work_sync(&hdev->cmd_timer); |
---|
1626 | 1627 | kfree_skb(hdev->sent_cmd); |
---|
1627 | 1628 | hdev->sent_cmd = NULL; |
---|
1628 | 1629 | } |
---|
.. | .. |
---|
2342 | 2343 | |
---|
2343 | 2344 | void hci_link_keys_clear(struct hci_dev *hdev) |
---|
2344 | 2345 | { |
---|
2345 | | - struct link_key *key; |
---|
| 2346 | + struct link_key *key, *tmp; |
---|
2346 | 2347 | |
---|
2347 | | - list_for_each_entry(key, &hdev->link_keys, list) { |
---|
| 2348 | + list_for_each_entry_safe(key, tmp, &hdev->link_keys, list) { |
---|
2348 | 2349 | list_del_rcu(&key->list); |
---|
2349 | 2350 | kfree_rcu(key, rcu); |
---|
2350 | 2351 | } |
---|
.. | .. |
---|
2352 | 2353 | |
---|
2353 | 2354 | void hci_smp_ltks_clear(struct hci_dev *hdev) |
---|
2354 | 2355 | { |
---|
2355 | | - struct smp_ltk *k; |
---|
| 2356 | + struct smp_ltk *k, *tmp; |
---|
2356 | 2357 | |
---|
2357 | | - list_for_each_entry(k, &hdev->long_term_keys, list) { |
---|
| 2358 | + list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) { |
---|
2358 | 2359 | list_del_rcu(&k->list); |
---|
2359 | 2360 | kfree_rcu(k, rcu); |
---|
2360 | 2361 | } |
---|
.. | .. |
---|
2362 | 2363 | |
---|
2363 | 2364 | void hci_smp_irks_clear(struct hci_dev *hdev) |
---|
2364 | 2365 | { |
---|
2365 | | - struct smp_irk *k; |
---|
| 2366 | + struct smp_irk *k, *tmp; |
---|
2366 | 2367 | |
---|
2367 | | - list_for_each_entry(k, &hdev->identity_resolving_keys, list) { |
---|
| 2368 | + list_for_each_entry_safe(k, tmp, &hdev->identity_resolving_keys, list) { |
---|
2368 | 2369 | list_del_rcu(&k->list); |
---|
2369 | 2370 | kfree_rcu(k, rcu); |
---|
2370 | 2371 | } |
---|
.. | .. |
---|
2372 | 2373 | |
---|
2373 | 2374 | void hci_blocked_keys_clear(struct hci_dev *hdev) |
---|
2374 | 2375 | { |
---|
2375 | | - struct blocked_key *b; |
---|
| 2376 | + struct blocked_key *b, *tmp; |
---|
2376 | 2377 | |
---|
2377 | | - list_for_each_entry(b, &hdev->blocked_keys, list) { |
---|
| 2378 | + list_for_each_entry_safe(b, tmp, &hdev->blocked_keys, list) { |
---|
2378 | 2379 | list_del_rcu(&b->list); |
---|
2379 | 2380 | kfree_rcu(b, rcu); |
---|
2380 | 2381 | } |
---|
.. | .. |
---|
2684 | 2685 | |
---|
2685 | 2686 | int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type) |
---|
2686 | 2687 | { |
---|
2687 | | - struct smp_ltk *k; |
---|
| 2688 | + struct smp_ltk *k, *tmp; |
---|
2688 | 2689 | int removed = 0; |
---|
2689 | 2690 | |
---|
2690 | | - list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { |
---|
| 2691 | + list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) { |
---|
2691 | 2692 | if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type) |
---|
2692 | 2693 | continue; |
---|
2693 | 2694 | |
---|
.. | .. |
---|
2703 | 2704 | |
---|
2704 | 2705 | void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type) |
---|
2705 | 2706 | { |
---|
2706 | | - struct smp_irk *k; |
---|
| 2707 | + struct smp_irk *k, *tmp; |
---|
2707 | 2708 | |
---|
2708 | | - list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) { |
---|
| 2709 | + list_for_each_entry_safe(k, tmp, &hdev->identity_resolving_keys, list) { |
---|
2709 | 2710 | if (bacmp(bdaddr, &k->bdaddr) || k->addr_type != addr_type) |
---|
2710 | 2711 | continue; |
---|
2711 | 2712 | |
---|
.. | .. |
---|
4907 | 4908 | *req_complete_skb = bt_cb(skb)->hci.req_complete_skb; |
---|
4908 | 4909 | else |
---|
4909 | 4910 | *req_complete = bt_cb(skb)->hci.req_complete; |
---|
4910 | | - kfree_skb(skb); |
---|
| 4911 | + dev_kfree_skb_irq(skb); |
---|
4911 | 4912 | } |
---|
4912 | 4913 | spin_unlock_irqrestore(&hdev->cmd_q.lock, flags); |
---|
4913 | 4914 | } |
---|