FBSD: give osi_NetReceive time to shutdown, reprise
authorMatt Benjamin <matt@linuxbox.com>
Wed, 25 Aug 2010 20:19:18 +0000 (16:19 -0400)
committerDerrick Brashear <shadow@dementia.org>
Wed, 25 Aug 2010 18:13:06 +0000 (11:13 -0700)
The delay logic needs to follow soshutdown, and precede
soclose.  The thread in osi_NetReceive is racing to do
another soreceive.  That thread needs to win the race
and notice the socket is shut down before rx_socket is
torn down.

Change-Id: Id8424dcfa2498550a190d277017b7ea15fc11023
Reviewed-on: http://gerrit.openafs.org/2613
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/rx/FBSD/rx_knet.c

index 7579fdc..187ee4c 100644 (file)
@@ -87,7 +87,6 @@ osi_StopListener(void)
     if (haveGlock)
        AFS_GUNLOCK();
     soshutdown(rx_socket, SHUT_RDWR);
-    soclose(rx_socket);
     p = pfind(rxk_ListenerPid);
     afs_warn("osi_StopListener: rxk_ListenerPid %lx\n", p);
     if (p)
@@ -104,12 +103,13 @@ osi_StopListener(void)
       MUTEX_ENTER(&s_mtx);
       tries = 3;
       while ((tries > 0) && (!so_is_disconn(rx_socket))) {
+          afs_warn("osi_StopListener: waiting (%d) ", tries);
        msleep(&osi_StopListener, &s_mtx, PSOCK | PCATCH,
               "rx_shutdown_timedwait", 1 * hz);
        --tries;
       }
       if (so_is_disconn(rx_socket))
-       soclose(rx_socket);
+          soclose(rx_socket);
       MUTEX_EXIT(&s_mtx);
       MUTEX_DESTROY(&s_mtx);
     }