]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-callback-shutdown-20080801
authorJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 1 Aug 2008 20:13:51 +0000 (20:13 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 1 Aug 2008 20:13:51 +0000 (20:13 +0000)
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.

src/WINNT/afsd/afsd_init.c
src/WINNT/afsd/afsd_service.c
src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_callback.h

index b2cc03247aba876608be20db03edee83ee98ac38..e51c07eea6ac80e1953b1a82ccd55c8c66605de3 100644 (file)
@@ -1367,6 +1367,8 @@ int afsd_ShutdownCM(void)
 {
     cm_ReleaseSCache(cm_data.rootSCachep);
 
+    cm_shutdown = 1;
+
     return 0;
 }
 
index 8ca9c116944c29bdb5f33b4a5a8b4f1563dae1e7..5cd7cf88072a9bfd8b9130db0e1a77c8f4b55cc1 100644 (file)
@@ -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)
index dfe849c980cfd4fc85b4062d2bb7c9ee9829ea60..8121f2fdd973b46ce87694e8ae2bc3100afbf4c9 100644 (file)
@@ -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);
index eff1a47a1e844cc044c70edab663311d33c11b36..78633b940c8ed362d85ed29322bd72c075cb2e2f 100644 (file)
@@ -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__ */