Whamcloud - gitweb
LU-7324 lnet: recv could access freed message
[fs/lustre-release.git] / lnet / lnet / acceptor.c
index b6d85ef..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;
@@ -254,8 +260,6 @@ lnet_accept(struct socket *sock, __u32 magic)
 
                 if (magic == le32_to_cpu(LNET_PROTO_TCP_MAGIC))
                         str = "'old' socknal/tcpnal";
-                else if (lnet_accept_magic(magic, LNET_PROTO_RA_MAGIC))
-                        str = "'old' ranal";
                 else
                         str = "unrecognised";
 
@@ -383,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) {
@@ -475,10 +480,8 @@ lnet_acceptor_start(void)
 
        init_completion(&lnet_acceptor_state.pta_signal);
        rc = accept2secure(accept_type, &secure);
-       if (rc <= 0) {
-               fini_completion(&lnet_acceptor_state.pta_signal);
+       if (rc <= 0)
                return rc;
-       }
 
        if (lnet_count_acceptor_nis() == 0)  /* not required */
                return 0;
@@ -488,7 +491,6 @@ lnet_acceptor_start(void)
        if (IS_ERR(task)) {
                rc2 = PTR_ERR(task);
                CERROR("Can't start acceptor thread: %ld\n", rc2);
-               fini_completion(&lnet_acceptor_state.pta_signal);
 
                return -ESRCH;
        }
@@ -503,7 +505,6 @@ lnet_acceptor_start(void)
        }
 
        LASSERT(lnet_acceptor_state.pta_sock == NULL);
-       fini_completion(&lnet_acceptor_state.pta_signal);
 
        return -ENETDOWN;
 }
@@ -511,14 +512,18 @@ 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);
-
-       fini_completion(&lnet_acceptor_state.pta_signal);
 }