diff options
| author | John W. Linville <linville@tuxdriver.com> | 2011-08-26 10:33:51 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2011-08-26 10:33:51 -0400 |
| commit | e2e6be56df37c371f564e127c154036b0c2211a1 (patch) | |
| tree | 6687fc0340c20a76972bcaf5c665364c1074aee8 /net | |
| parent | bc909d9ddbf7778371e36a651d6e4194b1cc7d4c (diff) | |
| parent | 8b2a3827bb12430d932cd479b22d906baf08c212 (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless into for-davem
Diffstat (limited to 'net')
| -rw-r--r-- | net/bluetooth/af_bluetooth.c | 6 | ||||
| -rw-r--r-- | net/bluetooth/bnep/bnep.h | 1 | ||||
| -rw-r--r-- | net/bluetooth/bnep/core.c | 13 | ||||
| -rw-r--r-- | net/bluetooth/cmtp/capi.c | 3 | ||||
| -rw-r--r-- | net/bluetooth/cmtp/cmtp.h | 1 | ||||
| -rw-r--r-- | net/bluetooth/cmtp/core.c | 20 | ||||
| -rw-r--r-- | net/bluetooth/hci_core.c | 8 | ||||
| -rw-r--r-- | net/bluetooth/hidp/core.c | 19 | ||||
| -rw-r--r-- | net/bluetooth/l2cap_core.c | 6 | ||||
| -rw-r--r-- | net/bluetooth/l2cap_sock.c | 30 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/core.c | 17 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/sock.c | 28 | ||||
| -rw-r--r-- | net/bluetooth/sco.c | 28 | ||||
| -rw-r--r-- | net/mac80211/main.c | 2 | ||||
| -rw-r--r-- | net/wireless/core.c | 7 | ||||
| -rw-r--r-- | net/wireless/sysfs.c | 6 |
16 files changed, 106 insertions, 89 deletions
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 8add9b499912..117e0d161780 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
| @@ -494,9 +494,8 @@ int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo) | |||
| 494 | BT_DBG("sk %p", sk); | 494 | BT_DBG("sk %p", sk); |
| 495 | 495 | ||
| 496 | add_wait_queue(sk_sleep(sk), &wait); | 496 | add_wait_queue(sk_sleep(sk), &wait); |
| 497 | set_current_state(TASK_INTERRUPTIBLE); | ||
| 497 | while (sk->sk_state != state) { | 498 | while (sk->sk_state != state) { |
| 498 | set_current_state(TASK_INTERRUPTIBLE); | ||
| 499 | |||
| 500 | if (!timeo) { | 499 | if (!timeo) { |
| 501 | err = -EINPROGRESS; | 500 | err = -EINPROGRESS; |
| 502 | break; | 501 | break; |
| @@ -510,12 +509,13 @@ int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo) | |||
| 510 | release_sock(sk); | 509 | release_sock(sk); |
| 511 | timeo = schedule_timeout(timeo); | 510 | timeo = schedule_timeout(timeo); |
| 512 | lock_sock(sk); | 511 | lock_sock(sk); |
| 512 | set_current_state(TASK_INTERRUPTIBLE); | ||
| 513 | 513 | ||
| 514 | err = sock_error(sk); | 514 | err = sock_error(sk); |
| 515 | if (err) | 515 | if (err) |
| 516 | break; | 516 | break; |
| 517 | } | 517 | } |
| 518 | set_current_state(TASK_RUNNING); | 518 | __set_current_state(TASK_RUNNING); |
| 519 | remove_wait_queue(sk_sleep(sk), &wait); | 519 | remove_wait_queue(sk_sleep(sk), &wait); |
| 520 | return err; | 520 | return err; |
| 521 | } | 521 | } |
diff --git a/net/bluetooth/bnep/bnep.h b/net/bluetooth/bnep/bnep.h index 8e6c06158f8e..e7ee5314f39a 100644 --- a/net/bluetooth/bnep/bnep.h +++ b/net/bluetooth/bnep/bnep.h | |||
| @@ -155,6 +155,7 @@ struct bnep_session { | |||
| 155 | unsigned int role; | 155 | unsigned int role; |
| 156 | unsigned long state; | 156 | unsigned long state; |
| 157 | unsigned long flags; | 157 | unsigned long flags; |
| 158 | atomic_t terminate; | ||
| 158 | struct task_struct *task; | 159 | struct task_struct *task; |
| 159 | 160 | ||
| 160 | struct ethhdr eh; | 161 | struct ethhdr eh; |
diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c index ca39fcf010ce..d9edfe8bf9d6 100644 --- a/net/bluetooth/bnep/core.c +++ b/net/bluetooth/bnep/core.c | |||
| @@ -484,9 +484,11 @@ static int bnep_session(void *arg) | |||
| 484 | 484 | ||
| 485 | init_waitqueue_entry(&wait, current); | 485 | init_waitqueue_entry(&wait, current); |
| 486 | add_wait_queue(sk_sleep(sk), &wait); | 486 | add_wait_queue(sk_sleep(sk), &wait); |
| 487 | while (!kthread_should_stop()) { | 487 | while (1) { |
| 488 | set_current_state(TASK_INTERRUPTIBLE); | 488 | set_current_state(TASK_INTERRUPTIBLE); |
| 489 | 489 | ||
| 490 | if (atomic_read(&s->terminate)) | ||
| 491 | break; | ||
| 490 | /* RX */ | 492 | /* RX */ |
| 491 | while ((skb = skb_dequeue(&sk->sk_receive_queue))) { | 493 | while ((skb = skb_dequeue(&sk->sk_receive_queue))) { |
| 492 | skb_orphan(skb); | 494 | skb_orphan(skb); |
| @@ -504,7 +506,7 @@ static int bnep_session(void *arg) | |||
| 504 | 506 | ||
| 505 | schedule(); | 507 | schedule(); |
| 506 | } | 508 | } |
| 507 | set_current_state(TASK_RUNNING); | 509 | __set_current_state(TASK_RUNNING); |
| 508 | remove_wait_queue(sk_sleep(sk), &wait); | 510 | remove_wait_queue(sk_sleep(sk), &wait); |
| 509 | 511 | ||
| 510 | /* Cleanup session */ | 512 | /* Cleanup session */ |
| @@ -640,9 +642,10 @@ int bnep_del_connection(struct bnep_conndel_req *req) | |||
| 640 | down_read(&bnep_session_sem); | 642 | down_read(&bnep_session_sem); |
| 641 | 643 | ||
| 642 | s = __bnep_get_session(req->dst); | 644 | s = __bnep_get_session(req->dst); |
| 643 | if (s) | 645 | if (s) { |
| 644 | kthread_stop(s->task); | 646 | atomic_inc(&s->terminate); |
| 645 | else | 647 | wake_up_process(s->task); |
| 648 | } else | ||
| 646 | err = -ENOENT; | 649 | err = -ENOENT; |
| 647 | 650 | ||
| 648 | up_read(&bnep_session_sem); | 651 | up_read(&bnep_session_sem); |
diff --git a/net/bluetooth/cmtp/capi.c b/net/bluetooth/cmtp/capi.c index 040f67b12978..50f0d135eb8f 100644 --- a/net/bluetooth/cmtp/capi.c +++ b/net/bluetooth/cmtp/capi.c | |||
| @@ -386,7 +386,8 @@ static void cmtp_reset_ctr(struct capi_ctr *ctrl) | |||
| 386 | 386 | ||
| 387 | capi_ctr_down(ctrl); | 387 | capi_ctr_down(ctrl); |
| 388 | 388 | ||
| 389 | kthread_stop(session->task); | 389 | atomic_inc(&session->terminate); |
| 390 | wake_up_process(session->task); | ||
| 390 | } | 391 | } |
| 391 | 392 | ||
| 392 | static void cmtp_register_appl(struct capi_ctr *ctrl, __u16 appl, capi_register_params *rp) | 393 | static void cmtp_register_appl(struct capi_ctr *ctrl, __u16 appl, capi_register_params *rp) |
diff --git a/net/bluetooth/cmtp/cmtp.h b/net/bluetooth/cmtp/cmtp.h index db43b54ac9af..c32638dddbf9 100644 --- a/net/bluetooth/cmtp/cmtp.h +++ b/net/bluetooth/cmtp/cmtp.h | |||
| @@ -81,6 +81,7 @@ struct cmtp_session { | |||
| 81 | 81 | ||
| 82 | char name[BTNAMSIZ]; | 82 | char name[BTNAMSIZ]; |
| 83 | 83 | ||
| 84 | atomic_t terminate; | ||
| 84 | struct task_struct *task; | 85 | struct task_struct *task; |
| 85 | 86 | ||
| 86 | wait_queue_head_t wait; | 87 | wait_queue_head_t wait; |
diff --git a/net/bluetooth/cmtp/core.c b/net/bluetooth/cmtp/core.c index c5b11af908be..521baa4fe835 100644 --- a/net/bluetooth/cmtp/core.c +++ b/net/bluetooth/cmtp/core.c | |||
| @@ -292,9 +292,11 @@ static int cmtp_session(void *arg) | |||
| 292 | 292 | ||
| 293 | init_waitqueue_entry(&wait, current); | 293 | init_waitqueue_entry(&wait, current); |
| 294 | add_wait_queue(sk_sleep(sk), &wait); | 294 | add_wait_queue(sk_sleep(sk), &wait); |
| 295 | while (!kthread_should_stop()) { | 295 | while (1) { |
| 296 | set_current_state(TASK_INTERRUPTIBLE); | 296 | set_current_state(TASK_INTERRUPTIBLE); |
| 297 | 297 | ||
| 298 | if (atomic_read(&session->terminate)) | ||
| 299 | break; | ||
| 298 | if (sk->sk_state != BT_CONNECTED) | 300 | if (sk->sk_state != BT_CONNECTED) |
| 299 | break; | 301 | break; |
| 300 | 302 | ||
| @@ -307,7 +309,7 @@ static int cmtp_session(void *arg) | |||
| 307 | 309 | ||
| 308 | schedule(); | 310 | schedule(); |
| 309 | } | 311 | } |
| 310 | set_current_state(TASK_RUNNING); | 312 | __set_current_state(TASK_RUNNING); |
| 311 | remove_wait_queue(sk_sleep(sk), &wait); | 313 | remove_wait_queue(sk_sleep(sk), &wait); |
| 312 | 314 | ||
| 313 | down_write(&cmtp_session_sem); | 315 | down_write(&cmtp_session_sem); |
| @@ -380,16 +382,17 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) | |||
| 380 | 382 | ||
| 381 | if (!(session->flags & (1 << CMTP_LOOPBACK))) { | 383 | if (!(session->flags & (1 << CMTP_LOOPBACK))) { |
| 382 | err = cmtp_attach_device(session); | 384 | err = cmtp_attach_device(session); |
| 383 | if (err < 0) | 385 | if (err < 0) { |
| 384 | goto detach; | 386 | atomic_inc(&session->terminate); |
| 387 | wake_up_process(session->task); | ||
| 388 | up_write(&cmtp_session_sem); | ||
| 389 | return err; | ||
| 390 | } | ||
| 385 | } | 391 | } |
| 386 | 392 | ||
| 387 | up_write(&cmtp_session_sem); | 393 | up_write(&cmtp_session_sem); |
| 388 | return 0; | 394 | return 0; |
| 389 | 395 | ||
| 390 | detach: | ||
| 391 | cmtp_detach_device(session); | ||
| 392 | |||
| 393 | unlink: | 396 | unlink: |
| 394 | __cmtp_unlink_session(session); | 397 | __cmtp_unlink_session(session); |
| 395 | 398 | ||
| @@ -414,7 +417,8 @@ int cmtp_del_connection(struct cmtp_conndel_req *req) | |||
| 414 | skb_queue_purge(&session->transmit); | 417 | skb_queue_purge(&session->transmit); |
| 415 | 418 | ||
| 416 | /* Stop session thread */ | 419 | /* Stop session thread */ |
| 417 | kthread_stop(session->task); | 420 | atomic_inc(&session->terminate); |
| 421 | wake_up_process(session->task); | ||
| 418 | } else | 422 | } else |
| 419 | err = -ENOENT; | 423 | err = -ENOENT; |
| 420 | 424 | ||
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index ec0bc3f60f2e..56943add45cc 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
| @@ -1209,7 +1209,6 @@ static void hci_cmd_timer(unsigned long arg) | |||
| 1209 | 1209 | ||
| 1210 | BT_ERR("%s command tx timeout", hdev->name); | 1210 | BT_ERR("%s command tx timeout", hdev->name); |
| 1211 | atomic_set(&hdev->cmd_cnt, 1); | 1211 | atomic_set(&hdev->cmd_cnt, 1); |
| 1212 | clear_bit(HCI_RESET, &hdev->flags); | ||
| 1213 | tasklet_schedule(&hdev->cmd_task); | 1212 | tasklet_schedule(&hdev->cmd_task); |
| 1214 | } | 1213 | } |
| 1215 | 1214 | ||
| @@ -1327,7 +1326,7 @@ int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr) | |||
| 1327 | 1326 | ||
| 1328 | entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL); | 1327 | entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL); |
| 1329 | if (!entry) { | 1328 | if (!entry) { |
| 1330 | return -ENOMEM; | 1329 | err = -ENOMEM; |
| 1331 | goto err; | 1330 | goto err; |
| 1332 | } | 1331 | } |
| 1333 | 1332 | ||
| @@ -2408,7 +2407,10 @@ static void hci_cmd_task(unsigned long arg) | |||
| 2408 | if (hdev->sent_cmd) { | 2407 | if (hdev->sent_cmd) { |
| 2409 | atomic_dec(&hdev->cmd_cnt); | 2408 | atomic_dec(&hdev->cmd_cnt); |
| 2410 | hci_send_frame(skb); | 2409 | hci_send_frame(skb); |
| 2411 | mod_timer(&hdev->cmd_timer, | 2410 | if (test_bit(HCI_RESET, &hdev->flags)) |
| 2411 | del_timer(&hdev->cmd_timer); | ||
| 2412 | else | ||
| 2413 | mod_timer(&hdev->cmd_timer, | ||
| 2412 | jiffies + msecs_to_jiffies(HCI_CMD_TIMEOUT)); | 2414 | jiffies + msecs_to_jiffies(HCI_CMD_TIMEOUT)); |
| 2413 | } else { | 2415 | } else { |
| 2414 | skb_queue_head(&hdev->cmd_q, skb); | 2416 | skb_queue_head(&hdev->cmd_q, skb); |
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 43b4c2deb7cc..fb68f344c34a 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
| @@ -764,6 +764,7 @@ static int hidp_session(void *arg) | |||
| 764 | 764 | ||
| 765 | up_write(&hidp_session_sem); | 765 | up_write(&hidp_session_sem); |
| 766 | 766 | ||
| 767 | kfree(session->rd_data); | ||
| 767 | kfree(session); | 768 | kfree(session); |
| 768 | return 0; | 769 | return 0; |
| 769 | } | 770 | } |
| @@ -841,7 +842,8 @@ static int hidp_setup_input(struct hidp_session *session, | |||
| 841 | 842 | ||
| 842 | err = input_register_device(input); | 843 | err = input_register_device(input); |
| 843 | if (err < 0) { | 844 | if (err < 0) { |
| 844 | hci_conn_put_device(session->conn); | 845 | input_free_device(input); |
| 846 | session->input = NULL; | ||
| 845 | return err; | 847 | return err; |
| 846 | } | 848 | } |
| 847 | 849 | ||
| @@ -1044,8 +1046,12 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, | |||
| 1044 | } | 1046 | } |
| 1045 | 1047 | ||
| 1046 | err = hid_add_device(session->hid); | 1048 | err = hid_add_device(session->hid); |
| 1047 | if (err < 0) | 1049 | if (err < 0) { |
| 1048 | goto err_add_device; | 1050 | atomic_inc(&session->terminate); |
| 1051 | wake_up_process(session->task); | ||
| 1052 | up_write(&hidp_session_sem); | ||
| 1053 | return err; | ||
| 1054 | } | ||
| 1049 | 1055 | ||
| 1050 | if (session->input) { | 1056 | if (session->input) { |
| 1051 | hidp_send_ctrl_message(session, | 1057 | hidp_send_ctrl_message(session, |
| @@ -1059,12 +1065,6 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, | |||
| 1059 | up_write(&hidp_session_sem); | 1065 | up_write(&hidp_session_sem); |
| 1060 | return 0; | 1066 | return 0; |
| 1061 | 1067 | ||
| 1062 | err_add_device: | ||
| 1063 | hid_destroy_device(session->hid); | ||
| 1064 | session->hid = NULL; | ||
| 1065 | atomic_inc(&session->terminate); | ||
| 1066 | wake_up_process(session->task); | ||
| 1067 | |||
| 1068 | unlink: | 1068 | unlink: |
| 1069 | hidp_del_timer(session); | 1069 | hidp_del_timer(session); |
| 1070 | 1070 | ||
| @@ -1090,7 +1090,6 @@ purge: | |||
| 1090 | failed: | 1090 | failed: |
| 1091 | up_write(&hidp_session_sem); | 1091 | up_write(&hidp_session_sem); |
| 1092 | 1092 | ||
| 1093 | input_free_device(session->input); | ||
| 1094 | kfree(session); | 1093 | kfree(session); |
| 1095 | return err; | 1094 | return err; |
| 1096 | } | 1095 | } |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 3204ba8a701c..b3bdb482bbe6 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
| @@ -1159,9 +1159,8 @@ int __l2cap_wait_ack(struct sock *sk) | |||
| 1159 | int timeo = HZ/5; | 1159 | int timeo = HZ/5; |
| 1160 | 1160 | ||
| 1161 | add_wait_queue(sk_sleep(sk), &wait); | 1161 | add_wait_queue(sk_sleep(sk), &wait); |
| 1162 | while ((chan->unacked_frames > 0 && chan->conn)) { | 1162 | set_current_state(TASK_INTERRUPTIBLE); |
| 1163 | set_current_state(TASK_INTERRUPTIBLE); | 1163 | while (chan->unacked_frames > 0 && chan->conn) { |
| 1164 | |||
| 1165 | if (!timeo) | 1164 | if (!timeo) |
| 1166 | timeo = HZ/5; | 1165 | timeo = HZ/5; |
| 1167 | 1166 | ||
| @@ -1173,6 +1172,7 @@ int __l2cap_wait_ack(struct sock *sk) | |||
| 1173 | release_sock(sk); | 1172 | release_sock(sk); |
| 1174 | timeo = schedule_timeout(timeo); | 1173 | timeo = schedule_timeout(timeo); |
| 1175 | lock_sock(sk); | 1174 | lock_sock(sk); |
| 1175 | set_current_state(TASK_INTERRUPTIBLE); | ||
| 1176 | 1176 | ||
| 1177 | err = sock_error(sk); | 1177 | err = sock_error(sk); |
| 1178 | if (err) | 1178 | if (err) |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 5c36b3e8739c..61f1f623091d 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
| @@ -235,30 +235,26 @@ static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int fl | |||
| 235 | 235 | ||
| 236 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); | 236 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
| 237 | 237 | ||
| 238 | if (sk->sk_state != BT_LISTEN) { | ||
| 239 | err = -EBADFD; | ||
| 240 | goto done; | ||
| 241 | } | ||
| 242 | |||
| 243 | timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); | 238 | timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); |
| 244 | 239 | ||
| 245 | BT_DBG("sk %p timeo %ld", sk, timeo); | 240 | BT_DBG("sk %p timeo %ld", sk, timeo); |
| 246 | 241 | ||
| 247 | /* Wait for an incoming connection. (wake-one). */ | 242 | /* Wait for an incoming connection. (wake-one). */ |
| 248 | add_wait_queue_exclusive(sk_sleep(sk), &wait); | 243 | add_wait_queue_exclusive(sk_sleep(sk), &wait); |
| 249 | while (!(nsk = bt_accept_dequeue(sk, newsock))) { | 244 | while (1) { |
| 250 | set_current_state(TASK_INTERRUPTIBLE); | 245 | set_current_state(TASK_INTERRUPTIBLE); |
| 251 | if (!timeo) { | 246 | |
| 252 | err = -EAGAIN; | 247 | if (sk->sk_state != BT_LISTEN) { |
| 248 | err = -EBADFD; | ||
| 253 | break; | 249 | break; |
| 254 | } | 250 | } |
| 255 | 251 | ||
| 256 | release_sock(sk); | 252 | nsk = bt_accept_dequeue(sk, newsock); |
| 257 | timeo = schedule_timeout(timeo); | 253 | if (nsk) |
| 258 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); | 254 | break; |
| 259 | 255 | ||
| 260 | if (sk->sk_state != BT_LISTEN) { | 256 | if (!timeo) { |
| 261 | err = -EBADFD; | 257 | err = -EAGAIN; |
| 262 | break; | 258 | break; |
| 263 | } | 259 | } |
| 264 | 260 | ||
| @@ -266,8 +262,12 @@ static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int fl | |||
| 266 | err = sock_intr_errno(timeo); | 262 | err = sock_intr_errno(timeo); |
| 267 | break; | 263 | break; |
| 268 | } | 264 | } |
| 265 | |||
| 266 | release_sock(sk); | ||
| 267 | timeo = schedule_timeout(timeo); | ||
| 268 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); | ||
| 269 | } | 269 | } |
| 270 | set_current_state(TASK_RUNNING); | 270 | __set_current_state(TASK_RUNNING); |
| 271 | remove_wait_queue(sk_sleep(sk), &wait); | 271 | remove_wait_queue(sk_sleep(sk), &wait); |
| 272 | 272 | ||
| 273 | if (err) | 273 | if (err) |
| @@ -993,7 +993,7 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int p | |||
| 993 | INIT_LIST_HEAD(&bt_sk(sk)->accept_q); | 993 | INIT_LIST_HEAD(&bt_sk(sk)->accept_q); |
| 994 | 994 | ||
| 995 | sk->sk_destruct = l2cap_sock_destruct; | 995 | sk->sk_destruct = l2cap_sock_destruct; |
| 996 | sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT); | 996 | sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT; |
| 997 | 997 | ||
| 998 | sock_reset_flag(sk, SOCK_ZAPPED); | 998 | sock_reset_flag(sk, SOCK_ZAPPED); |
| 999 | 999 | ||
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 5759bb7054f7..5ba3f6df665c 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
| @@ -62,7 +62,6 @@ static DEFINE_MUTEX(rfcomm_mutex); | |||
| 62 | #define rfcomm_lock() mutex_lock(&rfcomm_mutex) | 62 | #define rfcomm_lock() mutex_lock(&rfcomm_mutex) |
| 63 | #define rfcomm_unlock() mutex_unlock(&rfcomm_mutex) | 63 | #define rfcomm_unlock() mutex_unlock(&rfcomm_mutex) |
| 64 | 64 | ||
| 65 | static unsigned long rfcomm_event; | ||
| 66 | 65 | ||
| 67 | static LIST_HEAD(session_list); | 66 | static LIST_HEAD(session_list); |
| 68 | 67 | ||
| @@ -120,7 +119,6 @@ static inline void rfcomm_schedule(void) | |||
| 120 | { | 119 | { |
| 121 | if (!rfcomm_thread) | 120 | if (!rfcomm_thread) |
| 122 | return; | 121 | return; |
| 123 | set_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event); | ||
| 124 | wake_up_process(rfcomm_thread); | 122 | wake_up_process(rfcomm_thread); |
| 125 | } | 123 | } |
| 126 | 124 | ||
| @@ -2038,19 +2036,18 @@ static int rfcomm_run(void *unused) | |||
| 2038 | 2036 | ||
| 2039 | rfcomm_add_listener(BDADDR_ANY); | 2037 | rfcomm_add_listener(BDADDR_ANY); |
| 2040 | 2038 | ||
| 2041 | while (!kthread_should_stop()) { | 2039 | while (1) { |
| 2042 | set_current_state(TASK_INTERRUPTIBLE); | 2040 | set_current_state(TASK_INTERRUPTIBLE); |
| 2043 | if (!test_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event)) { | 2041 | |
| 2044 | /* No pending events. Let's sleep. | 2042 | if (kthread_should_stop()) |
| 2045 | * Incoming connections and data will wake us up. */ | 2043 | break; |
| 2046 | schedule(); | ||
| 2047 | } | ||
| 2048 | set_current_state(TASK_RUNNING); | ||
| 2049 | 2044 | ||
| 2050 | /* Process stuff */ | 2045 | /* Process stuff */ |
| 2051 | clear_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event); | ||
| 2052 | rfcomm_process_sessions(); | 2046 | rfcomm_process_sessions(); |
| 2047 | |||
| 2048 | schedule(); | ||
| 2053 | } | 2049 | } |
| 2050 | __set_current_state(TASK_RUNNING); | ||
| 2054 | 2051 | ||
| 2055 | rfcomm_kill_listener(); | 2052 | rfcomm_kill_listener(); |
| 2056 | 2053 | ||
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 8f01e6b11a70..482722bbc7a0 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
| @@ -485,11 +485,6 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f | |||
| 485 | 485 | ||
| 486 | lock_sock(sk); | 486 | lock_sock(sk); |
| 487 | 487 | ||
| 488 | if (sk->sk_state != BT_LISTEN) { | ||
| 489 | err = -EBADFD; | ||
| 490 | goto done; | ||
| 491 | } | ||
| 492 | |||
| 493 | if (sk->sk_type != SOCK_STREAM) { | 488 | if (sk->sk_type != SOCK_STREAM) { |
| 494 | err = -EINVAL; | 489 | err = -EINVAL; |
| 495 | goto done; | 490 | goto done; |
| @@ -501,19 +496,20 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f | |||
| 501 | 496 | ||
| 502 | /* Wait for an incoming connection. (wake-one). */ | 497 | /* Wait for an incoming connection. (wake-one). */ |
| 503 | add_wait_queue_exclusive(sk_sleep(sk), &wait); | 498 | add_wait_queue_exclusive(sk_sleep(sk), &wait); |
| 504 | while (!(nsk = bt_accept_dequeue(sk, newsock))) { | 499 | while (1) { |
| 505 | set_current_state(TASK_INTERRUPTIBLE); | 500 | set_current_state(TASK_INTERRUPTIBLE); |
| 506 | if (!timeo) { | 501 | |
| 507 | err = -EAGAIN; | 502 | if (sk->sk_state != BT_LISTEN) { |
| 503 | err = -EBADFD; | ||
| 508 | break; | 504 | break; |
| 509 | } | 505 | } |
| 510 | 506 | ||
| 511 | release_sock(sk); | 507 | nsk = bt_accept_dequeue(sk, newsock); |
| 512 | timeo = schedule_timeout(timeo); | 508 | if (nsk) |
| 513 | lock_sock(sk); | 509 | break; |
| 514 | 510 | ||
| 515 | if (sk->sk_state != BT_LISTEN) { | 511 | if (!timeo) { |
| 516 | err = -EBADFD; | 512 | err = -EAGAIN; |
| 517 | break; | 513 | break; |
| 518 | } | 514 | } |
| 519 | 515 | ||
| @@ -521,8 +517,12 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f | |||
| 521 | err = sock_intr_errno(timeo); | 517 | err = sock_intr_errno(timeo); |
| 522 | break; | 518 | break; |
| 523 | } | 519 | } |
| 520 | |||
| 521 | release_sock(sk); | ||
| 522 | timeo = schedule_timeout(timeo); | ||
| 523 | lock_sock(sk); | ||
| 524 | } | 524 | } |
| 525 | set_current_state(TASK_RUNNING); | 525 | __set_current_state(TASK_RUNNING); |
| 526 | remove_wait_queue(sk_sleep(sk), &wait); | 526 | remove_wait_queue(sk_sleep(sk), &wait); |
| 527 | 527 | ||
| 528 | if (err) | 528 | if (err) |
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 4c3621b5e0aa..8270f05e3f1f 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
| @@ -564,30 +564,26 @@ static int sco_sock_accept(struct socket *sock, struct socket *newsock, int flag | |||
| 564 | 564 | ||
| 565 | lock_sock(sk); | 565 | lock_sock(sk); |
| 566 | 566 | ||
| 567 | if (sk->sk_state != BT_LISTEN) { | ||
| 568 | err = -EBADFD; | ||
| 569 | goto done; | ||
| 570 | } | ||
| 571 | |||
| 572 | timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); | 567 | timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); |
| 573 | 568 | ||
| 574 | BT_DBG("sk %p timeo %ld", sk, timeo); | 569 | BT_DBG("sk %p timeo %ld", sk, timeo); |
| 575 | 570 | ||
| 576 | /* Wait for an incoming connection. (wake-one). */ | 571 | /* Wait for an incoming connection. (wake-one). */ |
| 577 | add_wait_queue_exclusive(sk_sleep(sk), &wait); | 572 | add_wait_queue_exclusive(sk_sleep(sk), &wait); |
| 578 | while (!(ch = bt_accept_dequeue(sk, newsock))) { | 573 | while (1) { |
| 579 | set_current_state(TASK_INTERRUPTIBLE); | 574 | set_current_state(TASK_INTERRUPTIBLE); |
| 580 | if (!timeo) { | 575 | |
| 581 | err = -EAGAIN; | 576 | if (sk->sk_state != BT_LISTEN) { |
| 577 | err = -EBADFD; | ||
| 582 | break; | 578 | break; |
| 583 | } | 579 | } |
| 584 | 580 | ||
| 585 | release_sock(sk); | 581 | ch = bt_accept_dequeue(sk, newsock); |
| 586 | timeo = schedule_timeout(timeo); | 582 | if (ch) |
| 587 | lock_sock(sk); | 583 | break; |
| 588 | 584 | ||
| 589 | if (sk->sk_state != BT_LISTEN) { | 585 | if (!timeo) { |
| 590 | err = -EBADFD; | 586 | err = -EAGAIN; |
| 591 | break; | 587 | break; |
| 592 | } | 588 | } |
| 593 | 589 | ||
| @@ -595,8 +591,12 @@ static int sco_sock_accept(struct socket *sock, struct socket *newsock, int flag | |||
| 595 | err = sock_intr_errno(timeo); | 591 | err = sock_intr_errno(timeo); |
| 596 | break; | 592 | break; |
| 597 | } | 593 | } |
| 594 | |||
| 595 | release_sock(sk); | ||
| 596 | timeo = schedule_timeout(timeo); | ||
| 597 | lock_sock(sk); | ||
| 598 | } | 598 | } |
| 599 | set_current_state(TASK_RUNNING); | 599 | __set_current_state(TASK_RUNNING); |
| 600 | remove_wait_queue(sk_sleep(sk), &wait); | 600 | remove_wait_queue(sk_sleep(sk), &wait); |
| 601 | 601 | ||
| 602 | if (err) | 602 | if (err) |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 866f269183cf..acb44230b251 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
| @@ -1012,7 +1012,6 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw) | |||
| 1012 | cancel_work_sync(&local->reconfig_filter); | 1012 | cancel_work_sync(&local->reconfig_filter); |
| 1013 | 1013 | ||
| 1014 | ieee80211_clear_tx_pending(local); | 1014 | ieee80211_clear_tx_pending(local); |
| 1015 | sta_info_stop(local); | ||
| 1016 | rate_control_deinitialize(local); | 1015 | rate_control_deinitialize(local); |
| 1017 | 1016 | ||
| 1018 | if (skb_queue_len(&local->skb_queue) || | 1017 | if (skb_queue_len(&local->skb_queue) || |
| @@ -1024,6 +1023,7 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw) | |||
| 1024 | 1023 | ||
| 1025 | destroy_workqueue(local->workqueue); | 1024 | destroy_workqueue(local->workqueue); |
| 1026 | wiphy_unregister(local->hw.wiphy); | 1025 | wiphy_unregister(local->hw.wiphy); |
| 1026 | sta_info_stop(local); | ||
| 1027 | ieee80211_wep_free(local); | 1027 | ieee80211_wep_free(local); |
| 1028 | ieee80211_led_exit(local); | 1028 | ieee80211_led_exit(local); |
| 1029 | kfree(local->int_scan_req); | 1029 | kfree(local->int_scan_req); |
diff --git a/net/wireless/core.c b/net/wireless/core.c index 645437cfc464..c14865172da7 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c | |||
| @@ -616,6 +616,9 @@ int wiphy_register(struct wiphy *wiphy) | |||
| 616 | if (res) | 616 | if (res) |
| 617 | goto out_rm_dev; | 617 | goto out_rm_dev; |
| 618 | 618 | ||
| 619 | rtnl_lock(); | ||
| 620 | rdev->wiphy.registered = true; | ||
| 621 | rtnl_unlock(); | ||
| 619 | return 0; | 622 | return 0; |
| 620 | 623 | ||
| 621 | out_rm_dev: | 624 | out_rm_dev: |
| @@ -647,6 +650,10 @@ void wiphy_unregister(struct wiphy *wiphy) | |||
| 647 | { | 650 | { |
| 648 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | 651 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); |
| 649 | 652 | ||
| 653 | rtnl_lock(); | ||
| 654 | rdev->wiphy.registered = false; | ||
| 655 | rtnl_unlock(); | ||
| 656 | |||
| 650 | rfkill_unregister(rdev->rfkill); | 657 | rfkill_unregister(rdev->rfkill); |
| 651 | 658 | ||
| 652 | /* protect the device list */ | 659 | /* protect the device list */ |
diff --git a/net/wireless/sysfs.c b/net/wireless/sysfs.c index c6e4ca6a7d2e..ff574597a854 100644 --- a/net/wireless/sysfs.c +++ b/net/wireless/sysfs.c | |||
| @@ -93,7 +93,8 @@ static int wiphy_suspend(struct device *dev, pm_message_t state) | |||
| 93 | 93 | ||
| 94 | if (rdev->ops->suspend) { | 94 | if (rdev->ops->suspend) { |
| 95 | rtnl_lock(); | 95 | rtnl_lock(); |
| 96 | ret = rdev->ops->suspend(&rdev->wiphy, rdev->wowlan); | 96 | if (rdev->wiphy.registered) |
| 97 | ret = rdev->ops->suspend(&rdev->wiphy, rdev->wowlan); | ||
| 97 | rtnl_unlock(); | 98 | rtnl_unlock(); |
| 98 | } | 99 | } |
| 99 | 100 | ||
| @@ -112,7 +113,8 @@ static int wiphy_resume(struct device *dev) | |||
| 112 | 113 | ||
| 113 | if (rdev->ops->resume) { | 114 | if (rdev->ops->resume) { |
| 114 | rtnl_lock(); | 115 | rtnl_lock(); |
| 115 | ret = rdev->ops->resume(&rdev->wiphy); | 116 | if (rdev->wiphy.registered) |
| 117 | ret = rdev->ops->resume(&rdev->wiphy); | ||
| 116 | rtnl_unlock(); | 118 | rtnl_unlock(); |
| 117 | } | 119 | } |
| 118 | 120 | ||
