getcellservdb-cleanup-20020608

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.
This commit is contained in:
Derrick Brashear 2002-06-08 12:01:59 +00:00
parent b80ae7d78c
commit 08bb209eef
3 changed files with 12 additions and 14 deletions

View 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;

View 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<>;

View 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