Hi Alain, On Wed, Jun 1, 2022 at 8:12 AM Alain Michaud <alainmichaud@xxxxxxxxxx> wrote: > > From: Alain Michaud <alainm@xxxxxxxxxxxx> > > If a hardware error occurs and the connections are flushed without a > disconnection_complete event being signaled, the temporary linkkeys are > not flushed. > > This change ensures that any outstanding flushable linkkeys are flushed > when the connection are flushed from the hash table. > > Signed-off-by: Alain Michaud <alainm@xxxxxxxxxxxx> > > --- > > net/bluetooth/hci_conn.c | 3 +++ > net/bluetooth/hci_event.c | 4 +++- > 2 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c > index 352d7d612128..85dc1af90fcb 100644 > --- a/net/bluetooth/hci_conn.c > +++ b/net/bluetooth/hci_conn.c > @@ -118,6 +118,9 @@ static void hci_conn_cleanup(struct hci_conn *conn) > if (test_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags)) > hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type); > > + if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) > + hci_remove_link_key(hdev, &conn->dst); > + > hci_chan_list_flush(conn); > > hci_conn_hash_del(hdev, conn); > diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c > index 6b83f9b0082c..09f4ff71e747 100644 > --- a/net/bluetooth/hci_event.c > +++ b/net/bluetooth/hci_event.c > @@ -3372,8 +3372,10 @@ static void hci_disconn_complete_evt(struct hci_dev *hdev, void *data, > reason, mgmt_connected); > > if (conn->type == ACL_LINK) { > - if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) > + if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) { > hci_remove_link_key(hdev, &conn->dst); > + clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags); > + } Could we use test_and_clean_bit instead? In theory there could be other threads trying to clean up so I guess it would be safer to reduce the risk of having concurrency problems although hci_dev_lock would prevent that, better to be safe than sorry. > hci_req_update_scan(hdev); > } > -- > 2.36.1.255.ge46751e96f-goog > -- Luiz Augusto von Dentz