From 311505170d59360b3c3dd67f789f395b7278bbbe Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 27 Jan 2014 00:14:36 -0500 Subject: [PATCH] Windows: replace cm_allServersp list with osi_queue Replace the cm_allServersp list with an osi_queue. This simplifies the Add/Remove functionality which will be required in case of VLDB server uniquifier changes. Change-Id: I6b118f2a27ee4bd2eb24011aae868865615eb09f Reviewed-on: http://gerrit.openafs.org/10762 Tested-by: BuildBot Reviewed-by: Derrick Brashear Reviewed-by: Jeffrey Altman --- src/WINNT/afsd/cm_callback.c | 8 +++-- src/WINNT/afsd/cm_ioctl.c | 12 ++++++-- src/WINNT/afsd/cm_server.c | 60 +++++++++++++++++++++--------------- src/WINNT/afsd/cm_server.h | 5 +-- 4 files changed, 54 insertions(+), 31 deletions(-) diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index 3cbbb56ae..ae89f10c8 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -2143,7 +2143,9 @@ cm_GiveUpAllCallbacksAllServers(afs_int32 markDown) return; lock_ObtainRead(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { + for (tsp = cm_serversAllFirstp; + tsp; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { cm_GetServerNoLock(tsp); lock_ReleaseRead(&cm_serverLock); cm_GiveUpAllCallbacks(tsp, markDown); @@ -2175,7 +2177,9 @@ cm_GiveUpAllCallbacksAllServersMulti(afs_int32 markDown) serversp = (cm_server_t **)malloc(maxconns * sizeof(cm_server_t *)); lock_ObtainRead(&cm_serverLock); - for (nconns=0, tsp = cm_allServersp; tsp && nconns < maxconns; tsp = tsp->allNextp) { + for (nconns=0, tsp = cm_serversAllFirstp; + tsp && nconns < maxconns; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { if (tsp->type != CM_SERVER_FILE || (tsp->flags & CM_SERVERFLAG_DOWN) || tsp->cellp == NULL /* SetPrefs only */) diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index 59c589d04..bc42626be 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -1297,7 +1297,9 @@ cm_IoctlCheckServers(struct cm_ioctl *ioctlp, struct cm_user *userp) /* now return the current down server list */ cp = ioctlp->outDatap; lock_ObtainRead(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) { + for (tsp = cm_serversAllFirstp; + tsp; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { if (cellp && tsp->cellp != cellp) continue; /* cell spec'd and wrong */ if (tsp->flags & CM_SERVERFLAG_DOWN) { @@ -1306,7 +1308,9 @@ cm_IoctlCheckServers(struct cm_ioctl *ioctlp, struct cm_user *userp) * is up, do not report the server as down. */ if (tsp->type == CM_SERVER_FILE) { - for (csp = cm_allServersp; csp; csp=csp->allNextp) { + for (csp = cm_serversAllFirstp; + csp; + csp = (cm_server_t *)osi_QNext(&csp->allq)) { if (csp->type == CM_SERVER_FILE && !(csp->flags & CM_SERVERFLAG_DOWN) && afs_uuid_equal(&tsp->uuid, &csp->uuid)) { @@ -1993,7 +1997,9 @@ cm_IoctlGetSPrefs(struct cm_ioctl *ioctlp, struct cm_user *userp) lock_ObtainRead(&cm_serverLock); /* get server lock */ - for (tsp=cm_allServersp, i=0; tsp && noServers; tsp=tsp->allNextp,i++){ + for (tsp = cm_serversAllFirstp, i=0; + tsp && noServers; + tsp = (cm_server_t *)osi_QNext(&tsp->allq),i++){ if (spin->offset > i) { continue; /* catch up to where we left off */ } diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c index c2845bc42..256f1dbc2 100644 --- a/src/WINNT/afsd/cm_server.c +++ b/src/WINNT/afsd/cm_server.c @@ -30,7 +30,9 @@ osi_rwlock_t cm_serverLock; osi_rwlock_t cm_syscfgLock; -cm_server_t *cm_allServersp; +cm_server_t *cm_serversAllFirstp = NULL; +cm_server_t *cm_serversAllLastp = NULL; + afs_uint32 cm_numFileServers = 0; afs_uint32 cm_numVldbServers = 0; @@ -40,7 +42,9 @@ cm_ForceNewConnectionsAllServers(void) cm_server_t *tsp; lock_ObtainRead(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { + for (tsp = cm_serversAllFirstp; + tsp; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { cm_GetServerNoLock(tsp); lock_ReleaseRead(&cm_serverLock); cm_ForceNewConnections(tsp); @@ -56,7 +60,9 @@ cm_ServerClearRPCStats(void) { afs_uint16 port; lock_ObtainRead(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { + for (tsp = cm_serversAllFirstp; + tsp; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { switch (tsp->type) { case CM_SERVER_VLDB: port = htons(7003); @@ -359,7 +365,9 @@ cm_RankUpServers() cm_server_t * tsp; lock_ObtainRead(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { + for (tsp = cm_serversAllFirstp; + tsp; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { cm_GetServerNoLock(tsp); lock_ReleaseRead(&cm_serverLock); @@ -390,7 +398,9 @@ static void cm_CheckServersSingular(afs_uint32 flags, cm_cell_t *cellp) int isVLDB; lock_ObtainRead(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { + for (tsp = cm_serversAllFirstp; + tsp; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { cm_GetServerNoLock(tsp); lock_ReleaseRead(&cm_serverLock); @@ -481,7 +491,9 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp) !(flags & (CM_FLAG_CHECKFILESERVERS|CM_FLAG_CHECKVLDBSERVERS))) { lock_ObtainRead(&cm_serverLock); - for (nconns=0, tsp = cm_allServersp; tsp && nconns < maxconns; tsp = tsp->allNextp) { + for (nconns=0, tsp = cm_serversAllFirstp; + tsp != NULL && nconns < maxconns; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { if (tsp->type != CM_SERVER_FILE || tsp->cellp == NULL || /* SetPref only */ cellp && cellp != tsp->cellp) @@ -649,7 +661,9 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp) !(flags & (CM_FLAG_CHECKFILESERVERS|CM_FLAG_CHECKVLDBSERVERS))) { lock_ObtainRead(&cm_serverLock); - for (nconns=0, tsp = cm_allServersp; tsp && nconns < maxconns; tsp = tsp->allNextp) { + for (nconns=0, tsp = cm_serversAllFirstp; + tsp != NULL && nconns < maxconns; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { if (tsp->type != CM_SERVER_VLDB || tsp->cellp == NULL || /* SetPref only */ cellp && cellp != tsp->cellp) @@ -954,8 +968,8 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell lock_InitializeMutex(&tsp->mx, "cm_server_t mutex", LOCK_HIERARCHY_SERVER); tsp->addr = *socketp; - tsp->allNextp = cm_allServersp; - cm_allServersp = tsp; + osi_QAddH((osi_queue_t **)&cm_serversAllFirstp, + (osi_queue_t **)&cm_serversAllLastp, &tsp->allq); switch (type) { case CM_SERVER_VLDB: @@ -1003,7 +1017,9 @@ cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type, int locked) if (!locked) lock_ObtainRead(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { + for (tsp = cm_serversAllFirstp; + tsp; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { if (tsp->type == type && tsp->addr.sin_addr.S_un.S_addr == ipaddr && (tsp->addr.sin_port == port || tsp->addr.sin_port == 0)) @@ -1028,7 +1044,9 @@ cm_FindServerByUuid(afsUUID *serverUuid, int type, int locked) if (!locked) lock_ObtainRead(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { + for (tsp = cm_serversAllFirstp; + tsp; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { if (tsp->type == type && afs_uuid_equal(&tsp->uuid, serverUuid)) break; } @@ -1422,6 +1440,10 @@ void cm_FreeServer(cm_server_t* serverp) */ if (serverp->refCount == 0) { if (!(serverp->flags & CM_SERVERFLAG_PREF_SET)) { + osi_QRemoveHT((osi_queue_t **)&cm_serversAllFirstp, + (osi_queue_t **)&cm_serversAllLastp, + &serverp->allq); + switch (serverp->type) { case CM_SERVER_VLDB: cm_numVldbServers--; @@ -1432,18 +1454,6 @@ void cm_FreeServer(cm_server_t* serverp) } lock_FinalizeMutex(&serverp->mx); - if ( cm_allServersp == serverp ) - cm_allServersp = serverp->allNextp; - else { - cm_server_t *tsp; - - for(tsp = cm_allServersp; tsp->allNextp; tsp=tsp->allNextp) { - if ( tsp->allNextp == serverp ) { - tsp->allNextp = serverp->allNextp; - break; - } - } - } /* free the volid list */ for ( tsrvp = serverp->vols; tsrvp; tsrvp = nextp) { @@ -1566,7 +1576,9 @@ int cm_DumpServers(FILE *outputFile, char *cookie, int lock) cookie, cm_numFileServers, cm_numVldbServers); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); - for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) + for (tsp = cm_serversAllFirstp; + tsp; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { char * type; char * down; diff --git a/src/WINNT/afsd/cm_server.h b/src/WINNT/afsd/cm_server.h index fc82153c4..302655a31 100644 --- a/src/WINNT/afsd/cm_server.h +++ b/src/WINNT/afsd/cm_server.h @@ -24,7 +24,7 @@ typedef struct cm_server_vols { * at the appropriate times to change the pointers to these servers. */ typedef struct cm_server { - struct cm_server *allNextp; /* locked by cm_serverLock */ + osi_queue_t allq; /* locked by cm_serverLock */ struct sockaddr_in addr; /* by mx */ int type; /* by mx */ struct cm_conn *connsp; /* locked by cm_connLock */ @@ -168,7 +168,8 @@ extern int cm_NetFlags[CM_MAXINTERFACE_ADDR]; /* network flags */ extern int cm_LanAdapterChangeDetected; /* Protected by cm_serverLock */ -extern cm_server_t *cm_allServersp; +extern cm_server_t *cm_serversAllFirstp; +extern cm_server_t *cm_serversAllLastp; extern afs_uint32 cm_numFileServers; extern afs_uint32 cm_numVldbServers; #endif /* OPENAFS_WINNT_AFSD_CM_SERVER_H */ -- 2.39.5