| .. | .. |
|---|
| 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 | } |
|---|