newuuid-20070612
[openafs.git] / src / afs / afs_server.c
index 6ba3e3e..90fbd11 100644 (file)
@@ -488,6 +488,42 @@ afs_CountServers(void)
 }                              /*afs_CountServers */
 
 
+void
+ForceAllNewConnections()
+{
+    int srvAddrCount;
+    struct srvAddr **addrs;
+    struct srvAddr *sa;
+    afs_int32 i, j;
+
+    ObtainReadLock(&afs_xserver);      /* Necessary? */
+    ObtainReadLock(&afs_xsrvAddr);
+
+    srvAddrCount = 0;
+    for (i = 0; i < NSERVERS; i++) {
+       for (sa = afs_srvAddrs[i]; sa; sa = sa->next_bkt) {
+           srvAddrCount++;
+       }
+    }
+
+    addrs = afs_osi_Alloc(srvAddrCount * sizeof(*addrs));
+    j = 0;
+    for (i = 0; i < NSERVERS; i++) {
+       for (sa = afs_srvAddrs[i]; sa; sa = sa->next_bkt) {
+           if (j >= srvAddrCount)
+               break;
+           addrs[j++] = sa;
+       }
+    }
+
+    ReleaseReadLock(&afs_xsrvAddr);
+    ReleaseReadLock(&afs_xserver);
+    for (i = 0; i < j; i++) {
+        sa = addrs[i];
+       ForceNewConnections(sa);
+    }
+}
+
 /* check down servers (if adown), or running servers (if !adown) */
 void
 afs_CheckServers(int adown, struct cell *acellp)
@@ -1383,15 +1419,22 @@ static int afs_SetServerPrefs(struct srvAddr *sa) {
 #elif defined(AFS_DARWIN80_ENV)
     {
        errno_t t;
-       int cnt=0;
-       ifaddr_t *addresses, address;
-       t = ifnet_get_address_list_family(NULL, &addresses, AF_INET);
-       if (t == 0) {
-           while(addresses[cnt] != NULL) {
-               afsi_SetServerIPRank(sa, address);
-               cnt++;
+       unsigned int count;
+       int cnt=0, m, j;
+       ifaddr_t *ifads;
+       ifnet_t *ifn;
+
+       if (!ifnet_list_get(AF_INET, &ifn, &count)) {
+           for (m = 0; m < count; m++) {
+               if (!ifnet_get_address_list(ifn[m], &ifads)) {
+                   for (j = 0; ifads[j] != NULL && cnt < ADDRSPERSITE; j++) {
+                       afsi_SetServerIPRank(sa, ifads[j]);
+                       cnt++;
+                   }
+                   ifnet_free_address_list(ifads);
+               }
            }
-           ifnet_free_address_list(addresses);
+           ifnet_list_free(ifn);
        }
     }
 #elif defined(AFS_DARWIN60_ENV)
@@ -1654,11 +1697,7 @@ struct server *afs_GetServer(afs_uint32 * aserverp, afs_int32 nservers,
 
        /* Compute preference values and resort */
        if (!newsa->sa_iprank) {
-           if (aport == fsport) {
-               afs_SetServerPrefs(newsa);      /* new fileserver rank */
-           } else {
-               newsa->sa_iprank = 10000 + afs_randomMod127();  /* new vlserver rank */
-           }
+           afs_SetServerPrefs(newsa);  /* new server rank */
        }
     }
     afs_SortOneServer(newts);  /* Sort by rank */