diff options
Diffstat (limited to 'net/bluetooth/hci_sysfs.c')
-rw-r--r-- | net/bluetooth/hci_sysfs.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index cad510309dcf..17f7fb720553 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
@@ -316,9 +316,26 @@ void hci_conn_add_sysfs(struct hci_conn *conn) | |||
316 | schedule_work(&conn->work); | 316 | schedule_work(&conn->work); |
317 | } | 317 | } |
318 | 318 | ||
319 | static int __match_tty(struct device *dev, void *data) | ||
320 | { | ||
321 | /* The rfcomm tty device will possibly retain even when conn | ||
322 | * is down, and sysfs doesn't support move zombie device, | ||
323 | * so we should move the device before conn device is destroyed. | ||
324 | * Due to the only child device of hci_conn dev is rfcomm | ||
325 | * tty_dev, here just return 1 | ||
326 | */ | ||
327 | return 1; | ||
328 | } | ||
329 | |||
319 | static void del_conn(struct work_struct *work) | 330 | static void del_conn(struct work_struct *work) |
320 | { | 331 | { |
332 | struct device *dev; | ||
321 | struct hci_conn *conn = container_of(work, struct hci_conn, work); | 333 | struct hci_conn *conn = container_of(work, struct hci_conn, work); |
334 | |||
335 | while (dev = device_find_child(&conn->dev, NULL, __match_tty)) { | ||
336 | device_move(dev, NULL); | ||
337 | put_device(dev); | ||
338 | } | ||
322 | device_del(&conn->dev); | 339 | device_del(&conn->dev); |
323 | put_device(&conn->dev); | 340 | put_device(&conn->dev); |
324 | } | 341 | } |