diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-08-22 17:19:26 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-08-22 17:19:26 -0400 |
commit | 9eba32b86d17ef87131fa0bce43c614904ab5781 (patch) | |
tree | cd7e40a026475b7e4ddb8bdc944e75bc5a18c250 /net/bluetooth/hci_event.c | |
parent | 364f63519d94442ed373ac7da79033c8282df46a (diff) |
Bluetooth: Add extra device reference counting for connections
The device model itself has no real usable reference counting at the
moment and this causes problems if parents are deleted before their
children. The device model itself handles the memory details of this
correctly, but the uevent order is not consistent. This causes various
problems for systems like HAL or even X.
So until device_put() does a proper cleanup, the device for Bluetooth
connection will be protected with an extra reference counting to ensure
the correct order of uevents when connections are terminated.
This is not an automatic feature. Higher Bluetooth layers like HIDP or
BNEP should grab this new reference to ensure that their uevents are
send before the ones from the parent device.
Based on a report by Brian Rogers <brian@xyzw.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth/hci_event.c')
-rw-r--r-- | net/bluetooth/hci_event.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 184ba0a88ec0..e99fe385fba2 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -887,6 +887,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
887 | } else | 887 | } else |
888 | conn->state = BT_CONNECTED; | 888 | conn->state = BT_CONNECTED; |
889 | 889 | ||
890 | hci_conn_hold_device(conn); | ||
890 | hci_conn_add_sysfs(conn); | 891 | hci_conn_add_sysfs(conn); |
891 | 892 | ||
892 | if (test_bit(HCI_AUTH, &hdev->flags)) | 893 | if (test_bit(HCI_AUTH, &hdev->flags)) |
@@ -1693,6 +1694,7 @@ static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev, struct sk_bu | |||
1693 | conn->handle = __le16_to_cpu(ev->handle); | 1694 | conn->handle = __le16_to_cpu(ev->handle); |
1694 | conn->state = BT_CONNECTED; | 1695 | conn->state = BT_CONNECTED; |
1695 | 1696 | ||
1697 | hci_conn_hold_device(conn); | ||
1696 | hci_conn_add_sysfs(conn); | 1698 | hci_conn_add_sysfs(conn); |
1697 | break; | 1699 | break; |
1698 | 1700 | ||