瀏覽代碼

Bluetooth: Fix lost wakeups waiting for sock state change

Fix race conditions which can cause lost wakeups while waiting
for sock state to change.

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Peter Hurley 14 年之前
父節點
當前提交
9be4e3fbf2
共有 1 個文件被更改,包括 3 次插入3 次删除
  1. 3 3
      net/bluetooth/af_bluetooth.c

+ 3 - 3
net/bluetooth/af_bluetooth.c

@@ -494,9 +494,8 @@ int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
 	BT_DBG("sk %p", sk);
 	BT_DBG("sk %p", sk);
 
 
 	add_wait_queue(sk_sleep(sk), &wait);
 	add_wait_queue(sk_sleep(sk), &wait);
+	set_current_state(TASK_INTERRUPTIBLE);
 	while (sk->sk_state != state) {
 	while (sk->sk_state != state) {
-		set_current_state(TASK_INTERRUPTIBLE);
-
 		if (!timeo) {
 		if (!timeo) {
 			err = -EINPROGRESS;
 			err = -EINPROGRESS;
 			break;
 			break;
@@ -510,12 +509,13 @@ int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
 		release_sock(sk);
 		release_sock(sk);
 		timeo = schedule_timeout(timeo);
 		timeo = schedule_timeout(timeo);
 		lock_sock(sk);
 		lock_sock(sk);
+		set_current_state(TASK_INTERRUPTIBLE);
 
 
 		err = sock_error(sk);
 		err = sock_error(sk);
 		if (err)
 		if (err)
 			break;
 			break;
 	}
 	}
-	set_current_state(TASK_RUNNING);
+	__set_current_state(TASK_RUNNING);
 	remove_wait_queue(sk_sleep(sk), &wait);
 	remove_wait_queue(sk_sleep(sk), &wait);
 	return err;
 	return err;
 }
 }