net: deal with most data-races in sk_wait_event()
[sfrench/cifs-2.6.git] / net / llc / af_llc.c
index da7fe94bea2eb8b6d1fe84bfdb8d1fa7cf5f6879..9ffbc667be6cf4c13d2f731e003510efeed8ee29 100644 (file)
@@ -583,7 +583,8 @@ static int llc_ui_wait_for_disc(struct sock *sk, long timeout)
 
        add_wait_queue(sk_sleep(sk), &wait);
        while (1) {
-               if (sk_wait_event(sk, &timeout, sk->sk_state == TCP_CLOSE, &wait))
+               if (sk_wait_event(sk, &timeout,
+                                 READ_ONCE(sk->sk_state) == TCP_CLOSE, &wait))
                        break;
                rc = -ERESTARTSYS;
                if (signal_pending(current))
@@ -603,7 +604,8 @@ static bool llc_ui_wait_for_conn(struct sock *sk, long timeout)
 
        add_wait_queue(sk_sleep(sk), &wait);
        while (1) {
-               if (sk_wait_event(sk, &timeout, sk->sk_state != TCP_SYN_SENT, &wait))
+               if (sk_wait_event(sk, &timeout,
+                                 READ_ONCE(sk->sk_state) != TCP_SYN_SENT, &wait))
                        break;
                if (signal_pending(current) || !timeout)
                        break;
@@ -622,7 +624,7 @@ static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout)
        while (1) {
                rc = 0;
                if (sk_wait_event(sk, &timeout,
-                                 (sk->sk_shutdown & RCV_SHUTDOWN) ||
+                                 (READ_ONCE(sk->sk_shutdown) & RCV_SHUTDOWN) ||
                                  (!llc_data_accept_state(llc->state) &&
                                   !llc->remote_busy_flag &&
                                   !llc->p_flag), &wait))