Whamcloud - gitweb
LU-7324 lnet: recv could access freed message
[fs/lustre-release.git] / lnet / lnet / acceptor.c
index 6c0115c..9086237 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2014, Intel Corporation.
+ * Copyright (c) 2011, 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
  */
 
 #define DEBUG_SUBSYSTEM S_LNET
+
+#ifdef HAVE_COMPAT_RDMA
+#include <linux/compat-2.6.h>
+#endif
 #include <linux/completion.h>
+#include <net/sock.h>
 #include <lnet/lib-lnet.h>
 
 static int   accept_port    = 988;
@@ -382,13 +387,14 @@ lnet_acceptor(void *arg)
         while (!lnet_acceptor_state.pta_shutdown) {
 
                rc = lnet_sock_accept(&newsock, lnet_acceptor_state.pta_sock);
-                if (rc != 0) {
-                        if (rc != -EAGAIN) {
-                                CWARN("Accept error %d: pausing...\n", rc);
-                                cfs_pause(cfs_time_seconds(1));
-                        }
-                        continue;
-                }
+               if (rc != 0) {
+                       if (rc != -EAGAIN) {
+                               CWARN("Accept error %d: pausing...\n", rc);
+                               set_current_state(TASK_UNINTERRUPTIBLE);
+                               schedule_timeout(cfs_time_seconds(1));
+                       }
+                       continue;
+               }
 
                /* maybe we're waken up with lnet_sock_abort_accept() */
                if (lnet_acceptor_state.pta_shutdown) {
@@ -506,11 +512,17 @@ lnet_acceptor_start(void)
 void
 lnet_acceptor_stop(void)
 {
+       struct sock *sk;
+
        if (lnet_acceptor_state.pta_shutdown) /* not running */
                return;
 
        lnet_acceptor_state.pta_shutdown = 1;
-       wake_up_all(sk_sleep(lnet_acceptor_state.pta_sock->sk));
+
+       sk = lnet_acceptor_state.pta_sock->sk;
+
+       /* awake any sleepers using safe method */
+       sk->sk_state_change(sk);
 
        /* block until acceptor signals exit */
        wait_for_completion(&lnet_acceptor_state.pta_signal);