Hi,

On Wed, Jul 22, 2009 at 02:45:32PM -0700, Brian Rogers wrote:

> @@ -118,14 +113,16 @@ static void del_conn(struct work_struct *work)
>       if (!device_is_registered(&conn->dev))
>               return;
>  
> +     /* wait for child devices to go away first */
>       while (1) {
>               struct device *dev;
>  
> -             dev = device_find_child(&conn->dev, NULL, __match_tty);
> +             dev = device_find_child(&conn->dev, NULL, __match_any);
>               if (!dev)
>                       break;
> -             device_move(dev, NULL, DPM_ORDER_DEV_LAST);
>               put_device(dev);
> +
> +             msleep(100);
>       }
>  
>       device_del(&conn->dev);

Won't this cause problems for rfcomm devices (again)? This code was added
for the reason in the comment you've deleted: the rfcomm device can
remain alive long after the connection is done, and it won't go away
until you find & manually kill the process that holds the device open.

How about this:

diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c
index 95f7a7a..f709439 100644
--- a/net/bluetooth/hci_sysfs.c
+++ b/net/bluetooth/hci_sysfs.c
@@ -100,14 +100,9 @@ static void add_conn(struct work_struct *work)
        hci_dev_hold(hdev);
 }
 
-/*
- * 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.
- */
-static int __match_tty(struct device *dev, void *data)
+static int __match_any(struct device *dev, void *data)
 {
-       return !strncmp(dev_name(dev), "rfcomm", 6);
+       return 1;
 }
 
 static void del_conn(struct work_struct *work)
@@ -124,8 +119,18 @@ static void del_conn(struct work_struct *work)
                dev = device_find_child(&conn->dev, NULL, __match_tty);
                if (!dev)
                        break;
-               device_move(dev, NULL, DPM_ORDER_DEV_LAST);
+
+               /*
+                * 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.
+                */
+               if (!strncmp(dev_name(dev), "rfcomm", 6))
+                       device_move(dev, NULL, DPM_ORDER_DEV_LAST);
+
                put_device(dev);
+
+               msleep(100);
        }
 
        device_del(&conn->dev);

Gabor

-- 
     ---------------------------------------------------------
     MTA SZTAKI Computer and Automation Research Institute
                Hungarian Academy of Sciences
     ---------------------------------------------------------
_______________________________________________
xorg mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/xorg

Reply via email to