]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Windows: prevent cm_server races
authorJeffrey Altman <jaltman@your-file-system.com>
Sun, 14 Aug 2011 04:14:10 +0000 (00:14 -0400)
committerJeffrey Altman <jaltman@openafs.org>
Sun, 14 Aug 2011 22:29:15 +0000 (15:29 -0700)
Use interlocked operations to modified the flags field.

Close a race in cm_NewServer() which can result in multiple
cm_server objecs being created for the same addr/port/type
tuple.

Reviewed-on: http://gerrit.openafs.org/5266
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
(cherry picked from commit c20010850e2b43a0b9a6d74357ea6111dbf3409e)

Change-Id: If13f23a921f598db097b391348513a3300d3b10c
Reviewed-on: http://gerrit.openafs.org/5267
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Tested-by: Jeffrey Altman <jaltman@openafs.org>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
src/WINNT/afsd/afsd_init.c
src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_cell.c
src/WINNT/afsd/cm_conn.c
src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_server.c
src/WINNT/afsd/cm_server.h
src/WINNT/afsd/cm_volume.c

index b4217765e9aa417fd379b61405080849f3638258..d9761f5193329396311eae546330ae2805302fef 100644 (file)
@@ -300,12 +300,12 @@ static void afsd_InitServerPreferences(void)
             saddr.sin_family = AF_INET;
             dwRank += (rand() & 0x000f);
 
-            tsp = cm_FindServer(&saddr, CM_SERVER_VLDB);
+            tsp = cm_FindServer(&saddr, CM_SERVER_VLDB, FALSE);
             if ( tsp )         /* an existing server - ref count increased */
             {
                 lock_ObtainMutex(&tsp->mx);
                 tsp->ipRank = (USHORT)dwRank;
-                tsp->flags |= CM_SERVERFLAG_PREF_SET;
+                _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET);
                tsp->adminRank = tsp->ipRank;
                 lock_ReleaseMutex(&tsp->mx);
 
@@ -318,7 +318,7 @@ static void afsd_InitServerPreferences(void)
                 tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
                 lock_ObtainMutex(&tsp->mx);
                 tsp->ipRank = (USHORT)dwRank;
-                tsp->flags |= CM_SERVERFLAG_PREF_SET;
+                _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET);
                tsp->adminRank = tsp->ipRank;
                 lock_ReleaseMutex(&tsp->mx);
             }
@@ -376,12 +376,12 @@ static void afsd_InitServerPreferences(void)
             saddr.sin_family = AF_INET;
             dwRank += (rand() & 0x000f);
 
-            tsp = cm_FindServer(&saddr, CM_SERVER_FILE);
+            tsp = cm_FindServer(&saddr, CM_SERVER_FILE, FALSE);
             if ( tsp )         /* an existing server - ref count increased */
             {
                 lock_ObtainMutex(&tsp->mx);
                 tsp->ipRank = (USHORT)dwRank;
-               tsp->flags |= CM_SERVERFLAG_PREF_SET;
+               _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET);
                tsp->adminRank = tsp->ipRank;
                 lock_ReleaseMutex(&tsp->mx);
 
@@ -397,7 +397,7 @@ static void afsd_InitServerPreferences(void)
                 tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
                 lock_ObtainMutex(&tsp->mx);
                 tsp->ipRank = (USHORT)dwRank;
-                tsp->flags |= CM_SERVERFLAG_PREF_SET;
+                _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET);
                tsp->adminRank = tsp->ipRank;
                 lock_ReleaseMutex(&tsp->mx);
             }
index 097201dbefef1a9a0d144b7918a56f311627a6df..2660536156fc6be980cd3bfe794fe46a95cc0618 100644 (file)
@@ -366,7 +366,7 @@ SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArray
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
 
-        tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE);
+        tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE, FALSE);
         if (tsp) {
             cellp = tsp->cellp;
             cm_PutServer(tsp);
@@ -965,7 +965,6 @@ SRXAFSCB_InitCallBackState3(struct rx_call *callp, afsUUID* serverUuid)
 {
     char *p = NULL;
 
-    struct sockaddr_in taddr;
     cm_server_t *tsp = NULL;
     cm_scache_t *scp = NULL;
     cm_cell_t* cellp = NULL;
@@ -989,10 +988,10 @@ SRXAFSCB_InitCallBackState3(struct rx_call *callp, afsUUID* serverUuid)
                 RpcStringFree(&p);
             }
 
-            tsp = cm_FindServerByUuid(serverUuid, CM_SERVER_FILE);
+            tsp = cm_FindServerByUuid(serverUuid, CM_SERVER_FILE, FALSE);
         }
         if (!tsp)
-            tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE);
+            tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE, FALSE);
         if (tsp) {
             cellp = tsp->cellp;
             cm_PutServer(tsp);
@@ -1012,11 +1011,7 @@ SRXAFSCB_InitCallBackState3(struct rx_call *callp, afsUUID* serverUuid)
     }
 
     if (connp && peerp) {
-       taddr.sin_family = AF_INET;
-       taddr.sin_addr.s_addr = rx_HostOf(rx_PeerOf(rx_ConnectionOf(callp)));
-       taddr.sin_port = rx_PortOf(rx_PeerOf(rx_ConnectionOf(callp)));
-
-       tsp = cm_FindServer(&taddr, CM_SERVER_FILE);
+       tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE, FALSE);
 
        osi_Log1(afsd_logp, "InitCallbackState3 server %x", tsp);
 
@@ -2043,7 +2038,7 @@ cm_GiveUpAllCallbacks(cm_server_t *tsp, afs_int32 markDown)
 
             lock_ObtainMutex(&tsp->mx);
             if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
-                tsp->flags |= CM_SERVERFLAG_DOWN;
+                _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
                 tsp->downTime = time(NULL);
             }
             /* Now update the volume status */
@@ -2162,7 +2157,7 @@ cm_GiveUpAllCallbacksAllServersMulti(afs_int32 markDown)
 
             lock_ObtainMutex(&tsp->mx);
             if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
-                tsp->flags |= CM_SERVERFLAG_DOWN;
+                _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
                 tsp->downTime = time(NULL);
             }
             /* Now update the volume status */
index 5a6c134d76e87afda6806497d5de7c6755249d5d..dbb9e1ac5ab59b7b9da2c219bcb5c76d43dd14b9 100644 (file)
@@ -42,7 +42,7 @@ long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *hostnamep, uns
     probe = !(cellrockp->flags & CM_FLAG_NOPROBE);
 
     /* if this server was previously created by fs setserverprefs */
-    if ( tsp = cm_FindServer(addrp, CM_SERVER_VLDB))
+    if ( tsp = cm_FindServer(addrp, CM_SERVER_VLDB, FALSE))
     {
         if ( !tsp->cellp )
             tsp->cellp = cellp;
index 0858310213a37ee9800cd97e61d60a0bc8019047..28c8629eb8551be2f1b003c577da9fbdb55b5701 100644 (file)
@@ -789,7 +789,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
             if (errorCode == RX_CALL_DEAD &&
                 (reqp->flags & CM_REQ_NEW_CONN_FORCED)) {
                 if (!(serverp->flags & CM_SERVERFLAG_DOWN)) {
-                    serverp->flags |= CM_SERVERFLAG_DOWN;
+                    _InterlockedOr(&serverp->flags, CM_SERVERFLAG_DOWN);
                     serverp->downTime = time(NULL);
                 }
             } else {
index a8ce8b1eaa8f19c7a19693cb76875cfe09fa143d..6e94b8a381ea8e297f738013e1c52ed9ad212432 100644 (file)
@@ -1873,12 +1873,12 @@ cm_IoctlSetSPrefs(struct cm_ioctl *ioctlp, struct cm_user *userp)
         }
         tmp.sin_family = AF_INET;
 
-        tsp = cm_FindServer(&tmp, type);
+        tsp = cm_FindServer(&tmp, type, FALSE);
         if ( tsp )             /* an existing server - ref count increased */
         {
             lock_ObtainMutex(&tsp->mx);
             tsp->ipRank = rank;
-            tsp->flags |= CM_SERVERFLAG_PREF_SET;
+            _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET);
            tsp->adminRank = tsp->ipRank;
             lock_ReleaseMutex(&tsp->mx);
 
@@ -1902,7 +1902,7 @@ cm_IoctlSetSPrefs(struct cm_ioctl *ioctlp, struct cm_user *userp)
             tsp = cm_NewServer(&tmp, type, NULL, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
             lock_ObtainMutex(&tsp->mx);
             tsp->ipRank = rank;
-            tsp->flags |= CM_SERVERFLAG_PREF_SET;
+            _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET);
            tsp->adminRank = tsp->ipRank;
             lock_ReleaseMutex(&tsp->mx);
             tsp->ipRank = rank;
index 224037c680ca627b9a2be3625abf244a172e7b8d..c915f2c6d2472968cb5e4bcac605a3931e3cfe1e 100644 (file)
@@ -128,13 +128,13 @@ cm_PingServer(cm_server_t *tsp)
        lock_ObtainMutex(&tsp->mx);
        tsp->waitCount--;
        if (tsp->waitCount == 0)
-           tsp->flags &= ~CM_SERVERFLAG_PINGING;
+           _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
        else
            osi_Wakeup((LONG_PTR)tsp);
        lock_ReleaseMutex(&tsp->mx);
        return;
     }
-    tsp->flags |= CM_SERVERFLAG_PINGING;
+    _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING);
     wasDown = tsp->flags & CM_SERVERFLAG_DOWN;
     afs_inet_ntoa_r(tsp->addr.sin_addr.S_un.S_addr, hoststr);
     lock_ReleaseMutex(&tsp->mx);
@@ -171,7 +171,7 @@ cm_PingServer(cm_server_t *tsp)
     lock_ObtainMutex(&tsp->mx);
     if (code >= 0 || code == RXGEN_OPCODE) {
        /* mark server as up */
-       tsp->flags &= ~CM_SERVERFLAG_DOWN;
+       _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
         tsp->downTime = 0;
 
        /* we currently handle 32-bits of capabilities */
@@ -215,7 +215,7 @@ cm_PingServer(cm_server_t *tsp)
     } else {
        /* mark server as down */
         if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
-            tsp->flags |= CM_SERVERFLAG_DOWN;
+            _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
             tsp->downTime = time(NULL);
         }
        if (code != VRESTARTING) {
@@ -254,7 +254,7 @@ cm_PingServer(cm_server_t *tsp)
     }
 
     if (tsp->waitCount == 0)
-       tsp->flags &= ~CM_SERVERFLAG_PINGING;
+       _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
     else
        osi_Wakeup((LONG_PTR)tsp);
     lock_ReleaseMutex(&tsp->mx);
@@ -410,7 +410,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
                 continue;
             }
 
-            tsp->flags |= CM_SERVERFLAG_PINGING;
+            _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING);
             lock_ReleaseMutex(&tsp->mx);
 
             serversp[nconns] = tsp;
@@ -454,7 +454,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
 
             if (results[i] >= 0 || results[i] == RXGEN_OPCODE)  {
                 /* mark server as up */
-                tsp->flags &= ~CM_SERVERFLAG_DOWN;
+                _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
                 tsp->downTime = 0;
 
                 /* we currently handle 32-bits of capabilities */
@@ -499,7 +499,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
             } else {
                 /* mark server as down */
                 if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
-                    tsp->flags |= CM_SERVERFLAG_DOWN;
+                    _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
                     tsp->downTime = time(NULL);
                 }
                 if (code != VRESTARTING) {
@@ -539,7 +539,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
             }
 
             if (tsp->waitCount == 0)
-                tsp->flags &= ~CM_SERVERFLAG_PINGING;
+                _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
             else
                 osi_Wakeup((LONG_PTR)tsp);
 
@@ -574,7 +574,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
                 continue;
             }
 
-            tsp->flags |= CM_SERVERFLAG_PINGING;
+            _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING);
             lock_ReleaseMutex(&tsp->mx);
 
             serversp[nconns] = tsp;
@@ -619,7 +619,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
 
             if (results[i] >= 0)  {
                 /* mark server as up */
-                tsp->flags &= ~CM_SERVERFLAG_DOWN;
+                _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
                 tsp->downTime = 0;
                 tsp->capabilities = 0;
 
@@ -631,7 +631,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
             } else {
                 /* mark server as down */
                 if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
-                    tsp->flags |= CM_SERVERFLAG_DOWN;
+                    _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
                     tsp->downTime = time(NULL);
                 }
                 if (code != VRESTARTING) {
@@ -647,7 +647,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
             }
 
             if (tsp->waitCount == 0)
-                tsp->flags &= ~CM_SERVERFLAG_PINGING;
+                _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
             else
                 osi_Wakeup((LONG_PTR)tsp);
 
@@ -745,9 +745,9 @@ void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit)
 {
     lock_ObtainMutex(&serverp->mx);
     if (no64bit)
-        serverp->flags |= CM_SERVERFLAG_NO64BIT;
+        _InterlockedOr(&serverp->flags, CM_SERVERFLAG_NO64BIT);
     else
-        serverp->flags &= ~CM_SERVERFLAG_NO64BIT;
+        _InterlockedAnd(&serverp->flags, ~CM_SERVERFLAG_NO64BIT);
     lock_ReleaseMutex(&serverp->mx);
 }
 
@@ -755,9 +755,9 @@ void cm_SetServerNoInlineBulk(cm_server_t * serverp, int no)
 {
     lock_ObtainMutex(&serverp->mx);
     if (no)
-        serverp->flags |= CM_SERVERFLAG_NOINLINEBULK;
+        _InterlockedOr(&serverp->flags, CM_SERVERFLAG_NOINLINEBULK);
     else
-        serverp->flags &= ~CM_SERVERFLAG_NOINLINEBULK;
+        _InterlockedAnd(&serverp->flags, ~CM_SERVERFLAG_NOINLINEBULK);
     lock_ReleaseMutex(&serverp->mx);
 }
 
@@ -831,6 +831,20 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell
 
     osi_assertx(socketp->sin_family == AF_INET, "unexpected socket family");
 
+    lock_ObtainWrite(&cm_serverLock);  /* get server lock */
+    tsp = cm_FindServer(socketp, type, TRUE);
+    if (tsp) {
+        /* we might have found a server created by set server prefs */
+        if (uuidp && !afs_uuid_is_nil(uuidp) &&
+            !(tsp->flags & CM_SERVERFLAG_UUID))
+        {
+            tsp->uuid = *uuidp;
+            _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID);
+        }
+        lock_ReleaseWrite(&cm_serverLock);
+        return tsp;
+    }
+
     tsp = malloc(sizeof(*tsp));
     if (tsp) {
         memset(tsp, 0, sizeof(*tsp));
@@ -838,7 +852,7 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell
         tsp->cellp = cellp;
         if (uuidp && !afs_uuid_is_nil(uuidp)) {
             tsp->uuid = *uuidp;
-            tsp->flags |= CM_SERVERFLAG_UUID;
+            _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID);
         }
         tsp->refCount = 1;
         lock_InitializeMutex(&tsp->mx, "cm_server_t mutex", LOCK_HIERARCHY_SERVER);
@@ -846,7 +860,6 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell
 
         cm_SetServerPrefs(tsp);
 
-        lock_ObtainWrite(&cm_serverLock);      /* get server lock */
         tsp->allNextp = cm_allServersp;
         cm_allServersp = tsp;
 
@@ -858,23 +871,25 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell
             cm_numFileServers++;
             break;
         }
+    }
+    lock_ReleaseWrite(&cm_serverLock);         /* release server lock */
 
-        lock_ReleaseWrite(&cm_serverLock);     /* release server lock */
-
-        if ( !(flags & CM_FLAG_NOPROBE) ) {
-            tsp->flags |= CM_SERVERFLAG_DOWN;  /* assume down; ping will mark up if available */
-            cm_PingServer(tsp);                        /* Obtain Capabilities and check up/down state */
-        }
+    if (!(flags & CM_FLAG_NOPROBE) && tsp) {
+        _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);       /* assume down; ping will mark up if available */
+        cm_PingServer(tsp);                                    /* Obtain Capabilities and check up/down state */
     }
+
     return tsp;
 }
 
 cm_server_t *
-cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type)
+cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type, int locked)
 {
     cm_server_t *tsp;
 
-    lock_ObtainRead(&cm_serverLock);
+    if (!locked)
+        lock_ObtainRead(&cm_serverLock);
+
     for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
         if (tsp->type == type &&
             tsp->addr.sin_addr.S_un.S_addr == ipaddr &&
@@ -886,17 +901,20 @@ cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type)
     if (tsp)
         cm_GetServerNoLock(tsp);
 
-    lock_ReleaseRead(&cm_serverLock);
+    if (!locked)
+        lock_ReleaseRead(&cm_serverLock);
 
     return tsp;
 }
 
 cm_server_t *
-cm_FindServerByUuid(afsUUID *serverUuid, int type)
+cm_FindServerByUuid(afsUUID *serverUuid, int type, int locked)
 {
     cm_server_t *tsp;
 
-    lock_ObtainRead(&cm_serverLock);
+    if (locked)
+        lock_ObtainRead(&cm_serverLock);
+
     for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
         if (tsp->type == type && !afs_uuid_equal(&tsp->uuid, serverUuid))
             break;
@@ -906,35 +924,18 @@ cm_FindServerByUuid(afsUUID *serverUuid, int type)
     if (tsp)
         cm_GetServerNoLock(tsp);
 
-    lock_ReleaseRead(&cm_serverLock);
+    if (!locked)
+        lock_ReleaseRead(&cm_serverLock);
 
     return tsp;
 }
 
 /* find a server based on its properties */
-cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type)
+cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type, int locked)
 {
-    cm_server_t *tsp;
-
     osi_assertx(addrp->sin_family == AF_INET, "unexpected socket value");
 
-    lock_ObtainRead(&cm_serverLock);
-    for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) {
-        if (tsp->type == type &&
-            tsp->addr.sin_addr.s_addr == addrp->sin_addr.s_addr &&
-            (tsp->addr.sin_port == addrp->sin_port || tsp->addr.sin_port == 0))
-            break;
-    }
-
-    /* bump ref count if we found the server */
-    if (tsp)
-        cm_GetServerNoLock(tsp);
-
-    /* drop big table lock */
-    lock_ReleaseRead(&cm_serverLock);
-
-    /* return what we found */
-    return tsp;
+    return cm_FindServerByIP(addrp->sin_addr.s_addr, addrp->sin_port, type, locked);
 }
 
 cm_server_vols_t *cm_NewServerVols(void) {
index 665e3207de27414920ecb3e4b0ad5a0135af053d..adf47893de7622aaf12b3a7ccb4296ad8799db34 100644 (file)
@@ -100,7 +100,7 @@ extern void cm_PutServer(cm_server_t *);
 
 extern void cm_PutServerNoLock(cm_server_t *);
 
-extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type);
+extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type, int locked);
 
 extern osi_rwlock_t cm_serverLock;
 
@@ -136,9 +136,9 @@ extern void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit);
 
 extern void cm_SetServerNoInlineBulk(cm_server_t * serverp, int no);
 
-extern cm_server_t * cm_FindServerByIP(afs_uint32 addr, unsigned short port, int type);
+extern cm_server_t * cm_FindServerByIP(afs_uint32 addr, unsigned short port, int type, int locked);
 
-extern cm_server_t * cm_FindServerByUuid(afsUUID* uuid, int type);
+extern cm_server_t * cm_FindServerByUuid(afsUUID* uuid, int type, int locked);
 
 extern void cm_SetLanAdapterChangeDetected(void);
 
index cca42b151846d034c9cb7ae5d44475a344ca1f6c..187ba2be161482fd4763aeb7bd02f6dc43c39f26 100644 (file)
@@ -520,7 +520,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *
             tsockAddr.sin_family = AF_INET;
             tempAddr = htonl(serverNumber[i]);
             tsockAddr.sin_addr.s_addr = tempAddr;
-            tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE);
+            tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE, FALSE);
 #ifdef MULTIHOMED
             if (tsp && (method == 2) && (tsp->flags & CM_SERVERFLAG_UUID)) {
                 /*
@@ -566,7 +566,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *
             if ( (method == 2) && !(tsp->flags & CM_SERVERFLAG_UUID) &&
                  !afs_uuid_is_nil(&serverUUID[i])) {
                 tsp->uuid = serverUUID[i];
-                tsp->flags |= CM_SERVERFLAG_UUID;
+                _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID);
             }
 
             /* and add it to the list(s). */