--- config/afs_args.h 2001/04/30 22:08:59 1.3 +++ config/afs_args.h 2001/10/04 08:17:56 @@ -105,6 +105,7 @@ /* #define AFSOP_STOP_RXEVENT 214 defined in osi.h */ /* #define AFSOP_STOP_COMPLETE 215 defined in osi.h */ /* #define AFSOP_STOP_RXK_LISTENER 217 defined in osi.h */ +#define AFSOP_STOP_AFSDB 218 /* Stop AFSDB handler */ /* Main afs syscall entry; this number may vary per system (i.e. defined in afs/param.h) */ #ifndef AFS_SYSCALL --- afsd/afsd.c 2001/09/13 23:19:19 1.14 +++ afsd/afsd.c 2001/10/04 08:57:37 @@ -1067,6 +1067,9 @@ continue; } + if (*acellName == 1) /* Shutting down */ + break; + code = afsconf_GetAfsdbInfo(acellName, 0, &acellInfo); if (code) { kernelMsg[0] = 0; @@ -1081,6 +1084,8 @@ kernelMsg[i+2] = acellInfo.hostAddr[i].sin_addr.s_addr; } } + + exit(1); } #endif --- afs/afs_dcache.c 2001/08/08 00:03:28 1.10 +++ afs/afs_dcache.c 2001/10/04 08:16:55 @@ -294,7 +305,11 @@ afs_stats_AddTo(CTD_stats.CTD_sleepTime, CTD_tmpTime); } if (afs_termState == AFSOP_STOP_TRUNCDAEMON) { +#ifdef AFS_AFSDB_ENV + afs_termState = AFSOP_STOP_AFSDB; +#else afs_termState = AFSOP_STOP_RXEVENT; +#endif afs_osi_Wakeup(&afs_termState); break; } --- afs/afs_cell.c 2001/08/08 00:03:28 1.7 +++ afs/afs_cell.c 2001/10/04 08:58:40 @@ -57,6 +57,7 @@ char afs_AfsdbHandlerPresent = 0; char afs_AfsdbHandlerInuse = 0; +char afs_AfsdbHandlerShutdown = 0; char *afs_AfsdbHandler_CellName; afs_int32 *afs_AfsdbHandler_CellHosts; @@ -87,6 +88,16 @@ #ifdef AFS_AFSDB_ENV +void afs_StopAfsdb() +{ + if (afs_AfsdbHandlerPresent) { + afs_osi_Wakeup(&afs_AfsdbHandlerWait); + } else { + afs_AfsdbHandlerShutdown = 1; + afs_termState = AFSOP_STOP_RXEVENT; + } +} + int afs_AfsdbHandler(acellName, acellNameLen, kernelMsg) char *acellName; int acellNameLen; @@ -94,6 +105,7 @@ { /* afs_syscall_call() has already grabbed the global lock */ + if (afs_AfsdbHandlerShutdown) return -2; afs_AfsdbHandlerPresent = 1; if (afs_AfsdbHandler_ReqPending) { @@ -117,9 +129,21 @@ } /* Wait for a request */ - while (afs_AfsdbHandler_ReqPending == 0) + while (afs_AfsdbHandler_ReqPending == 0 && afs_termState != AFSOP_STOP_AFSDB) afs_osi_Sleep(&afs_AfsdbHandlerWait); + /* Check if we're shutting down */ + if (afs_termState == AFSOP_STOP_AFSDB) { + /* Inform anyone waiting for us that we're going away */ + afs_AfsdbHandlerShutdown = 1; + afs_AfsdbHandlerPresent = 0; + afs_osi_Wakeup(&afs_AfsdbLookupWait); + + afs_termState = AFSOP_STOP_RXEVENT; + afs_osi_Wakeup(&afs_termState); + return -2; + } + /* Copy the requested cell name into the request buffer */ strncpy(acellName, afs_AfsdbHandler_CellName, acellNameLen); @@ -139,6 +163,9 @@ if (!afs_AfsdbHandlerPresent) return ENOENT; + /* Initialize host list to empty in case the handler is gone */ + *acellHosts = 0; + if (!ISAFS_GLOCK()) { grab_glock = 1; AFS_GLOCK(); @@ -160,7 +187,7 @@ afs_osi_Wakeup(&afs_AfsdbHandlerWait); /* Wait for the handler to get back to us with the reply */ - while (!afs_AfsdbHandler_Completed) + while (afs_AfsdbHandlerPresent && !afs_AfsdbHandler_Completed) afs_osi_Sleep(&afs_AfsdbLookupWait); /* Release the AFSDB handler and wake up others waiting for it */ --- afs/afs_call.c 2001/08/08 00:03:28 1.14 +++ afs/afs_call.c 2001/10/04 08:59:20 @@ -609,8 +609,16 @@ int cellLen = (sizeArg & 0xffff0000) >> 16; afs_int32 *kmsg = afs_osi_Alloc(kmsgLen); char *cellname = afs_osi_Alloc(cellLen); + AFS_COPYIN((afs_int32 *)parm3, kmsg, kmsgLen, code); - if (!code) code = afs_AfsdbHandler(cellname, cellLen, kmsg); + if (!code) { + code = afs_AfsdbHandler(cellname, cellLen, kmsg); + if (*cellname == 1) *cellname = 0; + if (code == -2) { /* Shutting down? */ + *cellname = 1; + code = 0; + } + } if (!code) AFS_COPYOUT(cellname, (char *)parm2, cellLen, code); afs_osi_Free(kmsg, kmsgLen); afs_osi_Free(cellname, cellLen); @@ -1201,6 +1209,12 @@ afs_osi_Wakeup((char*)&afs_CacheTruncateDaemon); afs_osi_Sleep(&afs_termState); } +#ifdef AFS_AFSDB_ENV + afs_warn("AFSDB... "); + afs_StopAfsdb(); + while (afs_termState == AFSOP_STOP_AFSDB) + afs_osi_Sleep(&afs_termState); +#endif #if defined(AFS_SUN5_ENV) || defined(RXK_LISTENER_ENV) afs_warn("RxEvent... "); /* cancel rx event deamon */