Windows: replace cm_allServersp list with osi_queue
authorJeffrey Altman <jaltman@your-file-system.com>
Mon, 27 Jan 2014 05:14:36 +0000 (00:14 -0500)
committerJeffrey Altman <jaltman@your-file-system.com>
Fri, 31 Jan 2014 06:07:26 +0000 (22:07 -0800)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_server.c
src/WINNT/afsd/cm_server.h

index 3cbbb56..ae89f10 100644 (file)
@@ -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 */)
index 59c589d..bc42626 100644 (file)
@@ -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 */
         }
index c2845bc..256f1db 100644 (file)
@@ -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;
index fc82153..302655a 100644 (file)
@@ -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 */