mirror of
https://git.openafs.org/openafs.git
synced 2025-01-31 05:27:44 +00:00
Solaris: stop NetIfPoller on shutdown
The NetIfPoller code that is enabled on AFS_SUN510_ENV never gets shutdown properly. The current code looks as if it was intended for NetIfPoller to recognize the appropriate termState and just return, but we never wait for it, and so we can complete the shutdown sequence without NetIfPoller ever knowing that we are shutting down. This can cause the machine to panic, as we keep attempting to run NetIfPoller even after libafs has been unloaded. Since NetIfPoller is fired by default every 30 seconds, we probably do not want to wait for it to fire during shutdown. Instead, just destroy the necessary timeout and task queue, which will wait for NetIfPoller to complete if running, and will just prevent it from running in the future otherwise. Reviewed-on: http://gerrit.openafs.org/1957 Tested-by: Andrew Deason <adeason@sinenomine.net> Reviewed-by: Derrick Brashear <shadow@dementia.org> (cherry picked from commit 9562721b89a2a7a7f32a165762d7fba8540006a9) Change-Id: Ida24a406958cdafa54bdda954c34a05ef4e7e459 Reviewed-on: http://gerrit.openafs.org/3589 Tested-by: BuildBot <buildbot@rampaginggeek.com> Reviewed-by: Derrick Brashear <shadow@dementia.org> Reviewed-on: http://gerrit.openafs.org/4045 Tested-by: Derrick Brashear <shadow@dementia.org>
This commit is contained in:
parent
7c3999e05c
commit
95e6d159a4
@ -1964,9 +1964,15 @@ afs_shutdown(void)
|
||||
afs_osi_Sleep(&afs_termState);
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
afs_termState = AFSOP_STOP_COMPLETE;
|
||||
#endif
|
||||
|
||||
#ifdef AFS_SUN510_ENV
|
||||
afs_warn("NetIfPoller... ");
|
||||
osi_StopNetIfPoller();
|
||||
#endif
|
||||
|
||||
afs_termState = AFSOP_STOP_COMPLETE;
|
||||
|
||||
afs_warn("\n");
|
||||
|
||||
#ifdef AFS_AIX51_ENV
|
||||
|
@ -591,6 +591,8 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *addr, struct iovec *dvec,
|
||||
/* set afs:afs_if_poll_interval = integer (value is in seconds) */
|
||||
static int afs_if_poll_interval = 30;
|
||||
|
||||
static timeout_id_t afs_if_poller_timeout = 0;
|
||||
|
||||
/* Global array which holds the interface info for consumers */
|
||||
struct afs_ifinfo afsifinfo[ADDRSPERSITE];
|
||||
|
||||
@ -622,14 +624,6 @@ osi_NetIfPoller()
|
||||
uint_t mtu;
|
||||
uint64_t flags;
|
||||
|
||||
if (afs_termState == AFSOP_STOP_NETIF) {
|
||||
afs_warn("NetIfPoller... ");
|
||||
rw_destroy(&afsifinfo_lock);
|
||||
ddi_taskq_destroy(afs_taskq);
|
||||
afs_termState = AFSOP_STOP_COMPLETE;
|
||||
osi_rxWakeup(&afs_termState);
|
||||
return;
|
||||
}
|
||||
/* Get our permissions */
|
||||
cr = CRED();
|
||||
|
||||
@ -765,10 +759,35 @@ osi_NetIfPoller()
|
||||
if (li)
|
||||
(void) ldi_ident_release(li);
|
||||
|
||||
/* Schedule this to run again after afs_if_poll_interval seconds */
|
||||
(void) timeout((void(*) (void *)) osi_StartNetIfPoller, NULL,
|
||||
drv_usectohz((clock_t)afs_if_poll_interval * MICROSEC));
|
||||
if (afs_shuttingdown) {
|
||||
/* do not schedule to run again if we're shutting down */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Schedule this to run again after afs_if_poll_interval seconds */
|
||||
afs_if_poller_timeout = timeout((void(*) (void *)) osi_StartNetIfPoller,
|
||||
NULL, drv_usectohz((clock_t)afs_if_poll_interval * MICROSEC));
|
||||
}
|
||||
|
||||
void
|
||||
osi_StopNetIfPoller(void)
|
||||
{
|
||||
/* it's okay if untimeout races with StartNetIfPoller/NetIfPoller;
|
||||
* it can handle being passed invalid ids. If StartNetIfPoller is
|
||||
* in the middle of running, untimeout will not return until
|
||||
* StartNetIfPoller is done */
|
||||
untimeout(afs_if_poller_timeout);
|
||||
|
||||
/* if NetIfPoller is queued or running, ddi_taskq_destroy will not
|
||||
* return until it is done */
|
||||
ddi_taskq_destroy(afs_taskq);
|
||||
|
||||
rw_destroy(&afsifinfo_lock);
|
||||
|
||||
if (afs_termState == AFSOP_STOP_NETIF) {
|
||||
afs_termState = AFSOP_STOP_COMPLETE;
|
||||
osi_rxWakeup(&afs_termState);
|
||||
}
|
||||
}
|
||||
#endif /* AFS_SUN510_ENV */
|
||||
|
||||
|
@ -406,6 +406,7 @@ extern int osi_NetReceive(osi_socket so, struct sockaddr_in *addr,
|
||||
#if defined(KERNEL) && defined(AFS_SUN510_ENV)
|
||||
extern void osi_StartNetIfPoller(void);
|
||||
extern void osi_NetIfPoller(void);
|
||||
extern void osi_StopNetIfPoller(void);
|
||||
extern struct afs_ifinfo afsifinfo[ADDRSPERSITE];
|
||||
#endif
|
||||
extern void osi_StopListener(void);
|
||||
|
Loading…
x
Reference in New Issue
Block a user