Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24.4 /net/bluetooth/hci_sysfs.c

Filename:/net/bluetooth/hci_sysfs.c
Lines Added:41
Lines Deleted:11
Also changed in: (Previous) 2.6.24.4-rc3  2.6.24.4-rc2  2.6.24.4-rc1  2.6.24.3  2.6.24.3-rc1  2.6.24-git22 
(Following) 2.6.24.5  2.6.24.6  2.6.24.7  2.6.25-rc7  2.6.25-rc8  2.6.25-rc9 

Location
[  2.6.24.4
  [  net
    [  bluetooth
       o  hci_sysfs.c

Patch

diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c
index 17f7fb7..e13cf5e 100644
--- a/net/bluetooth/hci_sysfs.c
+++ b/net/bluetooth/hci_sysfs.c
@@ -12,6 +12,8 @@
 #undef  BT_DBG
 #define BT_DBG(D...)
 #endif
+static struct workqueue_struct *btaddconn;
+static struct workqueue_struct *btdelconn;
 
 static inline char *typetostr(int type)
 {
@@ -279,6 +281,8 @@ static void add_conn(struct work_struct *work)
    struct hci_conn *conn = container_of(work, struct hci_conn, work);
    int i;
 
+   flush_workqueue(btdelconn);
+
    if (device_add(&conn->dev) < 0) {
       BT_ERR("Failed to register connection device");
       return;
@@ -313,7 +317,7 @@ void hci_conn_add_sysfs(struct hci_conn *conn)
 
    INIT_WORK(&conn->work, add_conn);
 
-   schedule_work(&conn->work);
+   queue_work(btaddconn, &conn->work);
 }
 
 static int __match_tty(struct device *dev, void *data)
@@ -349,7 +353,7 @@ void hci_conn_del_sysfs(struct hci_conn *conn)
 
    INIT_WORK(&conn->work, del_conn);
 
-   schedule_work(&conn->work);
+   queue_work(btdelconn, &conn->work);
 }
 
 int hci_register_sysfs(struct hci_dev *hdev)
@@ -398,28 +402,54 @@ int __init bt_sysfs_init(void)
 {
    int err;
 
+   btaddconn = create_singlethread_workqueue("btaddconn");
+   if (!btaddconn) {
+      err = -ENOMEM;
+      goto out;
+   }
+
+   btdelconn = create_singlethread_workqueue("btdelconn");
+   if (!btdelconn) {
+      err = -ENOMEM;
+      goto out_del;
+   }
+
    bt_platform = platform_device_register_simple("bluetooth", -1, NULL, 0);
-   if (IS_ERR(bt_platform))
-      return PTR_ERR(bt_platform);
+   if (IS_ERR(bt_platform)) {
+      err = PTR_ERR(bt_platform);
+      goto out_platform;
+   }
 
    err = bus_register(&bt_bus);
-   if (err < 0) {
-      platform_device_unregister(bt_platform);
-      return err;
-   }
+   if (err < 0)
+      goto out_bus;
 
    bt_class = class_create(THIS_MODULE, "bluetooth");
    if (IS_ERR(bt_class)) {
-      bus_unregister(&bt_bus);
-      platform_device_unregister(bt_platform);
-      return PTR_ERR(bt_class);
+      err = PTR_ERR(bt_class);
+      goto out_class;
    }
 
    return 0;
+
+out_class:
+   bus_unregister(&bt_bus);
+out_bus:
+   platform_device_unregister(bt_platform);
+out_platform:
+   destroy_workqueue(btdelconn);
+out_del:
+   destroy_workqueue(btaddconn);
+out:
+   return err;
 }
 
 void bt_sysfs_cleanup(void)
 {
+   destroy_workqueue(btaddconn);
+
+   destroy_workqueue(btdelconn);
+
    class_destroy(bt_class);
 
    bus_unregister(&bt_bus);


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.