{
long code = 0;
cm_cell_rock_t rock;
+ afs_uint32 mxheld = 0;
if (cp == NULL)
return NULL;
lock_ObtainMutex(&cp->mx);
+ mxheld = 1;
if ((cp->vlServersp == NULL
#ifdef AFS_FREELANCE_CLIENT
&& !(cp->flags & CM_CELLFLAG_FREELANCE)
((cp->flags & CM_CELLFLAG_VLSERVER_INVALID)))
)
{
- lock_ReleaseMutex(&cp->mx);
-
/* must empty cp->vlServersp */
if (cp->vlServersp) {
cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE);
cp->vlServersp = NULL;
}
+ lock_ReleaseMutex(&cp->mx);
+ mxheld = 0;
+
rock.cellp = cp;
rock.flags = flags;
code = cm_SearchCellRegistry(1, cp->name, NULL, cp->linkedName, cm_AddCellProc, &rock);
code = cm_SearchCellFileEx(cp->name, NULL, cp->linkedName, cm_AddCellProc, &rock);
if (code == 0) {
lock_ObtainMutex(&cp->mx);
+ mxheld = 1;
cp->timeout = time(0) + 7200;
- lock_ReleaseMutex(&cp->mx);
}
else {
if (cm_dnsEnabled) {
code = cm_SearchCellByDNS(cp->name, NULL, &ttl, cm_AddCellProc, &rock);
if (code == 0) { /* got cell from DNS */
lock_ObtainMutex(&cp->mx);
+ mxheld = 1;
cp->flags |= CM_CELLFLAG_DNS;
cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID;
cp->timeout = time(0) + ttl;
- lock_ReleaseMutex(&cp->mx);
#ifdef DEBUG
fprintf(stderr, "cell %s: ttl=%d\n", cp->name, ttl);
#endif
* current entry alone
*/
lock_ObtainMutex(&cp->mx);
+ mxheld = 1;
cp->flags |= CM_CELLFLAG_VLSERVER_INVALID;
- lock_ReleaseMutex(&cp->mx);
}
}
}
- } else {
- lock_ReleaseMutex(&cp->mx);
}
if (code == 0)
cm_RandomizeServer(&cp->vlServersp);
+ if (mxheld)
+ lock_ReleaseMutex(&cp->mx);
+
return code ? NULL : cp;
}