FBSD: give osi_NetReceive time to shutdown, reprise

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>
This commit is contained in:
Matt Benjamin 2010-08-25 16:19:18 -04:00 committed by Derrick Brashear
parent 5c0aebc421
commit 2ea508ea0f

View 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);
}