Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=acea6852f32b8805e166d885ed7e9f0c7cd10d41
Commit:     acea6852f32b8805e166d885ed7e9f0c7cd10d41
Parent:     667984d9e481e43a930a478c588dced98cb61fea
Author:     Dave Young <[EMAIL PROTECTED]>
AuthorDate: Mon Jan 21 22:35:21 2008 -0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Jan 23 03:11:39 2008 -0800

    [BLUETOOTH]: Move children of connection device to NULL before connection 
down.
    
    The rfcomm tty device will possibly retain even when conn is down, and
    sysfs doesn't support zombie device moving, so this patch move the tty
    device before conn device is destroyed.
    
    For the bug refered please see :
    http://lkml.org/lkml/2007/12/28/87
    
    Signed-off-by: Dave Young <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/bluetooth/hci_sysfs.c  |   17 +++++++++++++++++
 net/bluetooth/rfcomm/tty.c |    3 ++-
 2 files changed, 19 insertions(+), 1 deletions(-)

diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c
index cad5103..17f7fb7 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)
        schedule_work(&conn->work);
 }
 
+static int __match_tty(struct device *dev, void *data)
+{
+       /* The rfcomm tty device will possibly retain even when conn
+        * is down, and sysfs doesn't support move zombie device,
+        * so we should move the device before conn device is destroyed.
+        * Due to the only child device of hci_conn dev is rfcomm
+        * tty_dev, here just return 1
+        */
+       return 1;
+}
+
 static void del_conn(struct work_struct *work)
 {
+       struct device *dev;
        struct hci_conn *conn = container_of(work, struct hci_conn, work);
+
+       while (dev = device_find_child(&conn->dev, NULL, __match_tty)) {
+               device_move(dev, NULL);
+               put_device(dev);
+       }
        device_del(&conn->dev);
        put_device(&conn->dev);
 }
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
index a6a758d..788c703 100644
--- a/net/bluetooth/rfcomm/tty.c
+++ b/net/bluetooth/rfcomm/tty.c
@@ -696,7 +696,8 @@ static void rfcomm_tty_close(struct tty_struct *tty, struct 
file *filp)
        BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, 
dev->opened);
 
        if (--dev->opened == 0) {
-               device_move(dev->tty_dev, NULL);
+               if (dev->tty_dev->parent)
+                       device_move(dev->tty_dev, NULL);
 
                /* Close DLC and dettach TTY */
                rfcomm_dlc_close(dev->dlc, 0);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to