From a67769d7f1aa3d0af58c0779da09f323663f215c Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Sat, 8 Jun 2002 12:00:28 +0000 Subject: [PATCH] STABLE12-getcellservdb-cleanup-20020608 based on comments and suggestion from Srikanth Vishwanathan 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. (cherry picked from commit 08bb209eef379534268ec6433a131bc52711d111) --- src/afs/afs_callback.c | 22 ++++++++++------------ src/fsint/common.xg | 2 +- src/vlserver/vldbint.xg | 2 +- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/afs/afs_callback.c b/src/afs/afs_callback.c index 30bc1c478..fe6ccf79c 100644 --- a/src/afs/afs_callback.c +++ b/src/afs/afs_callback.c @@ -1125,7 +1125,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; @@ -1137,27 +1137,27 @@ int SRXAFSCB_GetCellServDB( #endif /* RX_ENABLE_LOCKS */ 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))); #ifdef RX_ENABLE_LOCKS AFS_GUNLOCK(); #endif /* RX_ENABLE_LOCKS */ @@ -1168,8 +1168,6 @@ int SRXAFSCB_GetCellServDB( if (p_name) memcpy(t_name, p_name, i); - ReleaseReadLock(&afs_xcell); - #ifdef RX_ENABLE_LOCKS AFS_GUNLOCK(); #endif /* RX_ENABLE_LOCKS */ diff --git a/src/fsint/common.xg b/src/fsint/common.xg index c658b6dfe..5215be4ab 100644 --- a/src/fsint/common.xg +++ b/src/fsint/common.xg @@ -136,7 +136,7 @@ struct interfaceAddr { /* for multihomed clients */ }; const AFSMAXCELLHOSTS = 8; /*Max VLDB servers per cell*/ -typedef afs_int32 serverList[AFSMAXCELLHOSTS]; +typedef afs_int32 serverList; typedef afs_uint32 cacheConfig<>; diff --git a/src/vlserver/vldbint.xg b/src/vlserver/vldbint.xg index 6b54cfbe6..9c175a57b 100644 --- a/src/vlserver/vldbint.xg +++ b/src/vlserver/vldbint.xg @@ -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 -- 2.39.5