From: Jeffrey Altman Date: Fri, 1 Aug 2008 20:13:51 +0000 (+0000) Subject: DEVEL15-windows-callback-shutdown-20080801 X-Git-Tag: openafs-devel-1_5_52~45 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=2c24430e37b92de2faf3750ce762d398252bbdbf;p=packages%2Fo%2Fopenafs.git DEVEL15-windows-callback-shutdown-20080801 LICENSE MIT When the cache manager is shutting down, return an error to all callback requests. Otherwise, it is possible for a callback to get stuck waiting for a lock and when the lock clears to be left with nothing but invalid memory addresses to crash on. In the meantime, the file server is waiting for the response. --- diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c index b2cc03247..e51c07eea 100644 --- a/src/WINNT/afsd/afsd_init.c +++ b/src/WINNT/afsd/afsd_init.c @@ -1367,6 +1367,8 @@ int afsd_ShutdownCM(void) { cm_ReleaseSCache(cm_data.rootSCachep); + cm_shutdown = 1; + return 0; } diff --git a/src/WINNT/afsd/afsd_service.c b/src/WINNT/afsd/afsd_service.c index 8ca9c1169..5cd7cf880 100644 --- a/src/WINNT/afsd/afsd_service.c +++ b/src/WINNT/afsd/afsd_service.c @@ -1421,9 +1421,6 @@ afsd_Main(DWORD argc, LPTSTR *argv) buf_Shutdown(); afsi_log("Buffer shutdown complete"); - rx_Finalize(); - afsi_log("rx finalization complete"); - smb_Shutdown(); afsi_log("smb shutdown complete"); @@ -1431,11 +1428,11 @@ afsd_Main(DWORD argc, LPTSTR *argv) cm_ReleaseAllLocks(); + cm_ShutdownMappedMemory(); + rx_Finalize(); afsi_log("rx finalization complete"); - cm_ShutdownMappedMemory(); - #ifdef REGISTER_POWER_NOTIFICATIONS /* terminate thread used to flush cache */ if (powerEventsRegistered) diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index dfe849c98..8121f2fdd 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -34,6 +34,8 @@ afs_int32 cm_OfflineROIsValid = 0; afs_int32 cm_giveUpAllCBs = 0; +afs_int32 cm_shutdown = 0; + #ifdef AFS_FREELANCE_CLIENT extern osi_mutex_t cm_Freelance_Lock; #endif @@ -347,6 +349,9 @@ SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArray cm_server_t *tsp = NULL; cm_cell_t* cellp = NULL; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -418,6 +423,9 @@ SRXAFSCB_InitCallBackState(struct rx_call *callp) unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -535,6 +543,9 @@ SRXAFSCB_Probe(struct rx_call *callp) unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -639,6 +650,9 @@ SRXAFSCB_GetLock(struct rx_call *callp, long index, AFSDBLock *lockp) unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -696,6 +710,9 @@ SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep) unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -808,6 +825,9 @@ SRXAFSCB_GetCE64(struct rx_call *callp, long index, AFSDBCacheEntry64 *cep) unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -922,6 +942,9 @@ SRXAFSCB_XStatsVersion(struct rx_call *callp, long *vp) unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -944,6 +967,9 @@ SRXAFSCB_GetXStats(struct rx_call *callp, long cvn, long coln, long *srvp, long unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -958,6 +984,9 @@ SRXAFSCB_GetXStats(struct rx_call *callp, long cvn, long coln, long *srvp, long int SRXAFSCB_InitCallBackState2(struct rx_call *callp, struct interfaceAddr* addr) { + if (cm_shutdown) + return 1; + osi_Log0(afsd_logp, "SRXAFSCB_InitCallBackState2 ->"); return SRXAFSCB_InitCallBackState(callp); @@ -974,6 +1003,9 @@ SRXAFSCB_WhoAreYou(struct rx_call *callp, struct interfaceAddr* addr) unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -1017,6 +1049,9 @@ SRXAFSCB_InitCallBackState3(struct rx_call *callp, afsUUID* serverUuid) { char *p = NULL; + if (cm_shutdown) + return 1; + if (UuidToString((UUID *)serverUuid, &p) == RPC_S_OK) { osi_Log1(afsd_logp, "SRXAFSCB_InitCallBackState3 %s ->",osi_LogSaveString(afsd_logp,p)); RpcStringFree(&p); @@ -1037,6 +1072,9 @@ SRXAFSCB_ProbeUuid(struct rx_call *callp, afsUUID* clientUuid) char *p,*q; int code = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -1108,6 +1146,9 @@ SRXAFSCB_GetCellByNum(struct rx_call *callp, afs_int32 a_cellnum, unsigned short port = 0; int rc; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -1140,6 +1181,9 @@ SRXAFSCB_TellMeAboutYourself( struct rx_call *callp, unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -1216,6 +1260,9 @@ int SRXAFSCB_GetServerPrefs( unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -1262,6 +1309,9 @@ int SRXAFSCB_GetCellServDB(struct rx_call *callp, afs_int32 index, char **a_name unsigned short port = 0; int rc; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -1309,6 +1359,9 @@ int SRXAFSCB_GetLocalCell(struct rx_call *callp, char **a_name) unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); @@ -1404,6 +1457,9 @@ int SRXAFSCB_GetCacheConfig(struct rx_call *callp, unsigned long host = 0; unsigned short port = 0; + if (cm_shutdown) + return 1; + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); diff --git a/src/WINNT/afsd/cm_callback.h b/src/WINNT/afsd/cm_callback.h index eff1a47a1..78633b940 100644 --- a/src/WINNT/afsd/cm_callback.h +++ b/src/WINNT/afsd/cm_callback.h @@ -75,4 +75,6 @@ extern void cm_GiveUpAllCallbacksAllServers(afs_int32 markDown); extern afs_int32 cm_OfflineROIsValid; extern afs_int32 cm_giveUpAllCBs; + +extern afs_int32 cm_shutdown; #endif /* _CM_CALLBACK_H_ENV__ */