/* if it's from DNS, see if it has expired
* and check to make sure we have a valid set of volume servers
- * this function must be called with a Write Lock on cm_cellLock
+ * this function must not be called with a lock on cm_cellLock
*/
cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
{
void cm_FreeCell(cm_cell_t *cellp)
{
+ lock_AssertWrite(&cm_cellLock);
+
if (cellp->vlServersp)
cm_FreeServerList(&cellp->vlServersp, CM_FREESERVERLIST_DELETE);
cellp->name[0] = '\0';
}
if (cp) {
+ lock_ReleaseWrite(&cm_cellLock);
lock_ObtainMutex(&cp->mx);
+ lock_ObtainWrite(&cm_cellLock);
cm_AddCellToNameHashTable(cp);
cm_AddCellToIDHashTable(cp);
lock_ReleaseMutex(&cp->mx);
if ( code ) {
osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellByDNS(%s) returns code= %d fullname= %s",
osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname));
+ lock_ObtainMutex(&cp->mx);
+ lock_ObtainWrite(&cm_cellLock);
+ hasWriteLock = 1;
+ cm_RemoveCellFromIDHashTable(cp);
+ cm_RemoveCellFromNameHashTable(cp);
+ lock_ReleaseMutex(&cp->mx);
cm_FreeCell(cp);
cp = NULL;
goto done;
else
#endif
{
+ lock_ObtainMutex(&cp->mx);
+ lock_ObtainWrite(&cm_cellLock);
+ hasWriteLock = 1;
+ cm_RemoveCellFromIDHashTable(cp);
+ cm_RemoveCellFromNameHashTable(cp);
+ lock_ReleaseMutex(&cp->mx);
cm_FreeCell(cp);
cp = NULL;
goto done;
* we should use it instead of completing the allocation
* of a new cm_cell_t
*/
+ lock_ObtainRead(&cm_cellLock);
hash = CM_CELL_NAME_HASH(fullname);
for (cp2 = cm_data.cellNameHashTablep[hash]; cp2; cp2=cp2->nameNextp) {
if (cm_stricmp_utf8(fullname, cp2->name) == 0) {
}
if (cp2) {
- if (hasMutex) {
- lock_ReleaseMutex(&cp->mx);
- hasMutex = 0;
+ if (!hasMutex) {
+ lock_ObtainMutex(&cp->mx);
+ hasMutex = 1;
}
+ lock_ConvertRToW(&cm_cellLock);
+ hasWriteLock = 1;
+ cm_RemoveCellFromIDHashTable(cp);
+ cm_RemoveCellFromNameHashTable(cp);
+ lock_ReleaseMutex(&cp->mx);
+ hasMutex = 0;
cm_FreeCell(cp);
cp = cp2;
goto done;
}
+ lock_ReleaseRead(&cm_cellLock);
/* randomise among those vlservers having the same rank*/
cm_RandomizeServer(&cp->vlServersp);
if (!hasMutex)
lock_ObtainMutex(&cp->mx);
+
/* copy in name */
strncpy(cp->name, fullname, CELL_MAXNAMELEN);
cp->name[CELL_MAXNAMELEN-1] = '\0';
strncpy(cp->linkedName, linkedName, CELL_MAXNAMELEN);
cp->linkedName[CELL_MAXNAMELEN-1] = '\0';
+ lock_ObtainWrite(&cm_cellLock);
+ hasWriteLock = 1;
cm_AddCellToNameHashTable(cp);
- cm_AddCellToIDHashTable(cp);
+ cm_AddCellToIDHashTable(cp);
lock_ReleaseMutex(&cp->mx);
hasMutex = 0;
lock_InitializeMutex(&cellp->mx, "cm_cell_t mutex", LOCK_HIERARCHY_CELL);
+ lock_ObtainMutex(&cellp->mx);
+ lock_ObtainWrite(&cm_cellLock);
+
/* copy in name */
strncpy(cellp->name, "Freelance.Local.Cell", CELL_MAXNAMELEN); /*safe*/
cellp->name[CELL_MAXNAMELEN-1] = '\0';
cellp->vlServersp = NULL;
cellp->flags = CM_CELLFLAG_FREELANCE;
- lock_ObtainMutex(&cellp->mx);
cm_AddCellToNameHashTable(cellp);
- cm_AddCellToIDHashTable(cellp);
+ cm_AddCellToIDHashTable(cellp);
+ lock_ReleaseWrite(&cm_cellLock);
lock_ReleaseMutex(&cellp->mx);
#endif
} else {
+ lock_ObtainRead(&cm_cellLock);
for (cellp = cm_data.allCellsp; cellp; cellp=cellp->allNextp) {
lock_InitializeMutex(&cellp->mx, "cm_cell_t mutex", LOCK_HIERARCHY_CELL);
cellp->vlServersp = NULL;
cellp->flags |= CM_CELLFLAG_VLSERVER_INVALID;
}
+ lock_ReleaseRead(&cm_cellLock);
}
osi_EndOnce(&once);
{
int i;
+ lock_AssertWrite(&cm_cellLock);
+ lock_AssertMutex(&cellp->mx);
+
if (cellp->flags & CM_CELLFLAG_IN_NAMEHASH)
return;
cm_cell_t *tcellp;
int i;
+ lock_AssertWrite(&cm_cellLock);
+ lock_AssertMutex(&cellp->mx);
+
if (cellp->flags & CM_CELLFLAG_IN_NAMEHASH) {
/* hash it out first */
i = CM_CELL_NAME_HASH(cellp->name);
{
int i;
+ lock_AssertWrite(&cm_cellLock);
+ lock_AssertMutex(&cellp->mx);
+
if (cellp->flags & CM_CELLFLAG_IN_IDHASH)
return;
cm_cell_t *tcellp;
int i;
+ lock_AssertWrite(&cm_cellLock);
+ lock_AssertMutex(&cellp->mx);
+
if (cellp->flags & CM_CELLFLAG_IN_IDHASH) {
/* hash it out first */
i = CM_CELL_ID_HASH(cellp->cellID);