diff options
| author | Dave Young <hidave.darkstar@gmail.com> | 2008-01-31 21:33:10 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-01-31 22:28:33 -0500 |
| commit | 5396c9356efec1d3d818b786f69e081aaad4b98b (patch) | |
| tree | e336503379e46e6e0f43795baf1ed91444ad69d5 | |
| parent | 30a50cc56679f56d7b866b1c29fd05802606fc5a (diff) | |
[BLUETOOTH]: Fix bugs in previous conn add/del workqueue changes.
Jens Axboe noticed that we were queueing &conn->work on both btaddconn
and keventd_wq.
Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/bluetooth/hci_sysfs.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 2726adc419d3..e13cf5ef144c 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
| @@ -282,6 +282,7 @@ static void add_conn(struct work_struct *work) | |||
| 282 | int i; | 282 | int i; |
| 283 | 283 | ||
| 284 | flush_workqueue(btdelconn); | 284 | flush_workqueue(btdelconn); |
| 285 | |||
| 285 | if (device_add(&conn->dev) < 0) { | 286 | if (device_add(&conn->dev) < 0) { |
| 286 | BT_ERR("Failed to register connection device"); | 287 | BT_ERR("Failed to register connection device"); |
| 287 | return; | 288 | return; |
| @@ -317,7 +318,6 @@ void hci_conn_add_sysfs(struct hci_conn *conn) | |||
| 317 | INIT_WORK(&conn->work, add_conn); | 318 | INIT_WORK(&conn->work, add_conn); |
| 318 | 319 | ||
| 319 | queue_work(btaddconn, &conn->work); | 320 | queue_work(btaddconn, &conn->work); |
| 320 | schedule_work(&conn->work); | ||
| 321 | } | 321 | } |
| 322 | 322 | ||
| 323 | static int __match_tty(struct device *dev, void *data) | 323 | static int __match_tty(struct device *dev, void *data) |
| @@ -354,7 +354,6 @@ void hci_conn_del_sysfs(struct hci_conn *conn) | |||
| 354 | INIT_WORK(&conn->work, del_conn); | 354 | INIT_WORK(&conn->work, del_conn); |
| 355 | 355 | ||
| 356 | queue_work(btdelconn, &conn->work); | 356 | queue_work(btdelconn, &conn->work); |
| 357 | schedule_work(&conn->work); | ||
| 358 | } | 357 | } |
| 359 | 358 | ||
| 360 | int hci_register_sysfs(struct hci_dev *hdev) | 359 | int hci_register_sysfs(struct hci_dev *hdev) |
| @@ -408,6 +407,7 @@ int __init bt_sysfs_init(void) | |||
| 408 | err = -ENOMEM; | 407 | err = -ENOMEM; |
| 409 | goto out; | 408 | goto out; |
| 410 | } | 409 | } |
| 410 | |||
| 411 | btdelconn = create_singlethread_workqueue("btdelconn"); | 411 | btdelconn = create_singlethread_workqueue("btdelconn"); |
| 412 | if (!btdelconn) { | 412 | if (!btdelconn) { |
| 413 | err = -ENOMEM; | 413 | err = -ENOMEM; |
| @@ -447,8 +447,12 @@ out: | |||
| 447 | void bt_sysfs_cleanup(void) | 447 | void bt_sysfs_cleanup(void) |
| 448 | { | 448 | { |
| 449 | destroy_workqueue(btaddconn); | 449 | destroy_workqueue(btaddconn); |
| 450 | |||
| 450 | destroy_workqueue(btdelconn); | 451 | destroy_workqueue(btdelconn); |
| 452 | |||
| 451 | class_destroy(bt_class); | 453 | class_destroy(bt_class); |
| 454 | |||
| 452 | bus_unregister(&bt_bus); | 455 | bus_unregister(&bt_bus); |
| 456 | |||
| 453 | platform_device_unregister(bt_platform); | 457 | platform_device_unregister(bt_platform); |
| 454 | } | 458 | } |
