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);
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 */
char afs_AfsdbHandlerPresent = 0;
char afs_AfsdbHandlerInuse = 0;
+char afs_AfsdbHandlerShutdown = 0;
char *afs_AfsdbHandler_CellName;
afs_int32 *afs_AfsdbHandler_CellHosts;
#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;
{
/* afs_syscall_call() has already grabbed the global lock */
+ if (afs_AfsdbHandlerShutdown) return -2;
afs_AfsdbHandlerPresent = 1;
if (afs_AfsdbHandler_ReqPending) {
}
/* 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);
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();
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 */