From: Jeffrey Altman Date: Thu, 29 Nov 2007 16:02:14 +0000 (+0000) Subject: DEVEL15-windows-daemon-shutdown-20071129 X-Git-Tag: openafs-devel-1_5_28~27 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=a0b5d98ddf544a39d687e5422032205945c9c784;p=packages%2Fo%2Fopenafs.git DEVEL15-windows-daemon-shutdown-20071129 The cm_Daemon() thread did not check after each operation whether or not the service is in the process of shutting down. As a result the thread could access data, locks, etc. that had been freed by other threads. WER 572098933-1-0407879071 (cherry picked from commit baef5ba97f4d042d75fe1ac8e11325be459a3d9a) --- diff --git a/src/WINNT/afsd/cm_daemon.c b/src/WINNT/afsd/cm_daemon.c index 2eb07abe0..45cff1c59 100644 --- a/src/WINNT/afsd/cm_daemon.c +++ b/src/WINNT/afsd/cm_daemon.c @@ -367,7 +367,10 @@ void cm_Daemon(long parm) */ smb_RestartListeners(); - if (configureFirewall) { + if (daemon_ShutdownFlag == 1) + return; + + if (configureFirewall) { /* Open Microsoft Firewall to allow in port 7001 */ switch (icf_CheckAndAddAFSPorts(AFS_PORTSET_CLIENT)) { case 0: @@ -392,55 +395,79 @@ void cm_Daemon(long parm) now = osi_Time(); /* check down servers */ - if (now > lastDownServerCheck + cm_daemonCheckDownInterval) { + if (now > lastDownServerCheck + cm_daemonCheckDownInterval && + daemon_ShutdownFlag == 0) { lastDownServerCheck = now; osi_Log0(afsd_logp, "cm_Daemon CheckDownServers"); cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } /* check up servers */ - if (now > lastUpServerCheck + cm_daemonCheckUpInterval) { + if (now > lastUpServerCheck + cm_daemonCheckUpInterval && + daemon_ShutdownFlag == 0) { lastUpServerCheck = now; osi_Log0(afsd_logp, "cm_Daemon CheckUpServers"); cm_CheckServers(CM_FLAG_CHECKUPSERVERS, NULL); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastVolCheck + cm_daemonCheckVolInterval) { + if (now > lastVolCheck + cm_daemonCheckVolInterval && + daemon_ShutdownFlag == 0) { lastVolCheck = now; cm_RefreshVolumes(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } if (cm_daemonCheckVolCBInterval && - now > lastVolCBRenewalCheck + cm_daemonCheckVolCBInterval) { + now > lastVolCBRenewalCheck + cm_daemonCheckVolCBInterval && + daemon_ShutdownFlag == 0) { lastVolCBRenewalCheck = now; cm_VolumeRenewROCallbacks(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval) { + if (now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval && + daemon_ShutdownFlag == 0) { lastVolCheck = now; cm_CheckOfflineVolumes(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastCBExpirationCheck + cm_daemonCheckCBInterval) { + if (now > lastCBExpirationCheck + cm_daemonCheckCBInterval && + daemon_ShutdownFlag == 0) { lastCBExpirationCheck = now; cm_CheckCBExpiration(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastLockCheck + cm_daemonCheckLockInterval) { + if (now > lastLockCheck + cm_daemonCheckLockInterval && + daemon_ShutdownFlag == 0) { lastLockCheck = now; cm_CheckLocks(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastTokenCacheCheck + cm_daemonTokenCheckInterval) { + if (now > lastTokenCacheCheck + cm_daemonTokenCheckInterval && + daemon_ShutdownFlag == 0) { lastTokenCacheCheck = now; cm_CheckTokenCache(now); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } @@ -463,9 +490,9 @@ void cm_Daemon(long parm) } } - thrd_Sleep(30 * 1000); /* sleep 30 seconds */ if (daemon_ShutdownFlag == 1) return; + thrd_Sleep(30 * 1000); /* sleep 30 seconds */ } }