]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
getcellservdb-cleanup-20020608
authorDerrick Brashear <shadow@dementia.org>
Sat, 8 Jun 2002 12:01:59 +0000 (12:01 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 8 Jun 2002 12:01:59 +0000 (12:01 +0000)
based on comments and suggestion from Srikanth Vishwanathan <vsrikanth@in.ibm.com>
avoid deadlock. send back variable length list. allocate what we need to, and
be care to clean up after ourselves if there's an error. whether this
should be variable length is arguable but it's pretty clear no one was using
this before.

src/afs/afs_callback.c
src/fsint/common.xg
src/vlserver/vldbint.xg

index 01adda3d546e5606c1b39c819062ea5fb9866ac1..a634757eb3b1f7e77d911ee42dba87fb10725453 100644 (file)
@@ -1175,7 +1175,7 @@ int SRXAFSCB_GetCellServDB(
     struct rx_call *a_call,
     afs_int32 a_index,
     char **a_name,
-    afs_int32 *a_hosts)
+    serverList *a_hosts)
 {
     afs_int32 i, j;
     struct cell *tcell;
@@ -1185,27 +1185,27 @@ int SRXAFSCB_GetCellServDB(
     RX_AFS_GLOCK();
     AFS_STATCNT(SRXAFSCB_GetCellServDB);
 
-    memset(a_hosts, 0, AFSMAXCELLHOSTS * sizeof(afs_int32));
-
-    /* search the list for the cell with this index */
-    ObtainReadLock(&afs_xcell);
-
     tcell = afs_GetCellByIndex(a_index, READ_LOCK, 0);
 
     if (!tcell) {
        i = 0;
+       a_hosts->serverList_val = 0;
+       a_hosts->serverList_len = 0;
     } else {
        p_name = tcell->cellName;
-       for (j = 0 ; j < AFSMAXCELLHOSTS && tcell->cellHosts[j] ; j++) {
-           a_hosts[j] = ntohl(tcell->cellHosts[j]->addr->sa_ip);
-       }
+       for (j = 0 ; j < AFSMAXCELLHOSTS && tcell->cellHosts[j] ; j++) 
+         ;
        i = strlen(p_name);
+       a_hosts->serverList_val = (afs_int32 *)afs_osi_Alloc(j*sizeof(afs_int32));
+       a_hosts->serverList_len = j;
+       for (j = 0 ; j < AFSMAXCELLHOSTS && tcell->cellHosts[j] ; j++) 
+           a_hosts->serverList_val[j] = ntohl(tcell->cellHosts[j]->addr->sa_ip);
        afs_PutCell(tcell, READ_LOCK);
     }
 
     t_name = (char *)afs_osi_Alloc(i+1);
     if (t_name == NULL) {
-       ReleaseReadLock(&afs_xcell);
+       afs_osi_Free(a_hosts->serverList_val, (j*sizeof(afs_int32)));
        RX_AFS_GUNLOCK();
        return ENOMEM;
     }
@@ -1214,8 +1214,6 @@ int SRXAFSCB_GetCellServDB(
     if (p_name)
        memcpy(t_name, p_name, i);
 
-    ReleaseReadLock(&afs_xcell);
-
     RX_AFS_GUNLOCK();
 
     *a_name = t_name;
index 6e644c2a4c246a51c317eb75cf6b7d0f0df2088a..83d50a1f66d9357d0d0325bbaa431663d460dc3f 100644 (file)
@@ -152,7 +152,7 @@ struct interfaceAddr {              /* for multihomed clients */
 };
 
 const AFSMAXCELLHOSTS = 8;     /*Max VLDB servers per cell*/
-typedef afs_int32 serverList[AFSMAXCELLHOSTS];
+typedef afs_int32 serverList<AFSMAXCELLHOSTS>;
 
 typedef afs_uint32 cacheConfig<>;
 
index 6b54cfbe607c556a7c3e7713e0eb2fd57e4f206e..9c175a57b1e7841c6ce7b46753fa930c5697aab1 100644 (file)
@@ -15,7 +15,7 @@ statindex 15
 %#include      "vl_opcodes.h"  /* directly to other places */
 
 %#ifdef KERNEL
-%#define       xdr_array(a,b,c,d,e,f)  xdr_arrayN(a,b,c,d,e,f)
+%#define       afs_xdr_array(a,b,c,d,e,f)      afs_xdr_arrayN(a,b,c,d,e,f)
 %#include "../afs/longc_procs.h"
 %#endif