From: Nickolai Zeldovich Date: Mon, 29 Jul 2002 21:03:36 +0000 (+0000) Subject: Support empty CellServDB entries like arla; this is useful to X-Git-Tag: openafs-devel_1_3_3~44 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=4e13acfe3baa1bd6c7973e7c8b9f73a2dd57db04 Support empty CellServDB entries like arla; this is useful to tell dynroot about the existence of a cell without hard-coding the server list (it will be fetched from AFSDB). --- diff --git a/src/afs/afs.h b/src/afs/afs.h index e119600..d164b58 100644 --- a/src/afs/afs.h +++ b/src/afs/afs.h @@ -1016,7 +1016,7 @@ extern struct brequest afs_brs[NBRS]; /* request structures */ extern struct cell *afs_GetCell(); extern struct cell *afs_GetCellNoLock(); extern struct cell *afs_GetCellByName(); -extern struct cell *afs_GetCellByName2(); +extern struct cell *afs_FindCellByName(); extern struct cell *afs_GetCellByIndex(); extern struct unixuser *afs_GetUser(); extern struct volume *afs_GetVolume(); diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index ce87909..4e0e118 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -293,8 +293,8 @@ long parm, parm2, parm3, parm4, parm5, parm6; else { AFS_COPYIN((char *)parm3, tcell.cellName, parm4, code); if (!code) - afs_NewCell(tcell.cellName, tcell.hosts, parm5, - (char *)0, (u_short)0, (u_short)0, (int)0); + afs_NewCell(tcell.cellName, tcell.hosts, parm5, (char *)0, + (u_short)0, (u_short)0, (int)0, (char *)0); } } } else if (parm == AFSOP_ADDCELL2) { @@ -323,8 +323,8 @@ long parm, parm2, parm3, parm4, parm5, parm6; } } if (!code) - afs_NewCell(tbuffer1, tcell.hosts, cflags, - lcnamep, (u_short)0, (u_short)0, (int)0); + afs_NewCell(tbuffer1, tcell.hosts, cflags, lcnamep, + (u_short)0, (u_short)0, (int)0, (char *)0); } } osi_FreeSmallSpace(tbuffer); diff --git a/src/afs/afs_cell.c b/src/afs/afs_cell.c index ca69560..d8c01da 100644 --- a/src/afs/afs_cell.c +++ b/src/afs/afs_cell.c @@ -78,8 +78,6 @@ char afs_AfsdbHandler_ReqPending = 0; char afs_AfsdbHandler_Completed = 0; -struct cell *afs_GetCellByName2(); - int afs_strcasecmp(s1, s2) register char *s1, *s2; { @@ -228,8 +226,10 @@ void afs_RefreshCell(ac) struct cell *tc; int timeout; - /* Don't need to do anything if no timeout or it's not expired */ - if (!ac->timeout || ac->timeout > osi_Time()) return; + if (ac->cellHosts[0]) /* If we already have some servers.. */ + if (!ac->timeout || ac->timeout > osi_Time()) + /* Don't refresh if not expired */ + return; if (afs_GetCellHostsFromDns(ac->cellName, cellHosts, &timeout, &realName)) /* In case of lookup failure, keep old data */ @@ -244,7 +244,7 @@ void afs_RefreshCell(ac) * Look up the entry we just updated, to compensate for * uppercase-vs-lowercase lossage with DNS. */ - tc = afs_GetCellByName2(realName, READ_LOCK, 0 /* no AFSDB */); + tc = afs_FindCellByName(realName, READ_LOCK); if (tc) { afs_NewCell(ac->cellName, 0, CAlias, (char *) 0, 0, 0, @@ -280,7 +280,7 @@ struct cell *afs_GetCellByName_Dns(acellName, locktype) * Look up the entry we just updated, to compensate for * uppercase-vs-lowercase lossage with DNS. */ - tc = afs_GetCellByName2(realName, READ_LOCK, 0 /* no AFSDB */); + tc = afs_FindCellByName(realName, READ_LOCK); if (!tc) goto bad; @@ -295,7 +295,7 @@ struct cell *afs_GetCellByName_Dns(acellName, locktype) if (realName) afs_osi_Free(realName, strlen(realName) + 1); - return afs_GetCellByName2(acellName, locktype, 0); + return afs_FindCellByName(acellName, locktype); bad: if (realName) @@ -304,10 +304,9 @@ bad: } -struct cell *afs_GetCellByName2(acellName, locktype, trydns) +struct cell *afs_FindCellByName(acellName, locktype) register char *acellName; afs_int32 locktype; - char trydns; { register struct cell *tc; register struct afs_q *cq, *tq; @@ -332,19 +331,23 @@ retry: return tc; } } - ReleaseWriteLock(&afs_xcell); - return trydns ? afs_GetCellByName_Dns(acellName, locktype) - : (struct cell *) 0; -} /*afs_GetCellByName2*/ + ReleaseWriteLock(&afs_xcell); + return (struct cell *) 0; +} /*afs_FindCellByName*/ struct cell *afs_GetCellByName(acellName, locktype) register char *acellName; afs_int32 locktype; { - return afs_GetCellByName2(acellName, locktype, 1); + struct cell *tc; + + tc = afs_FindCellByName(acellName, locktype); + if (!tc) + tc = afs_GetCellByName_Dns(acellName, locktype); + return tc; } /*afs_GetCellByName*/ static struct cell *afs_GetCellInternal(acell, locktype, holdxcell) @@ -431,9 +434,6 @@ afs_int32 afs_NewCell(acellName, acellHosts, aflags, linkedcname, fsport, vlport register struct afs_q *cq, *tq; AFS_STATCNT(afs_NewCell); - if (!(aflags & CAlias) && *acellHosts == 0) - /* need >= one host to gen cell # */ - return EINVAL; ObtainWriteLock(&afs_xcell,103); @@ -441,10 +441,13 @@ afs_int32 afs_NewCell(acellName, acellHosts, aflags, linkedcname, fsport, vlport for (cq = CellLRU.next; cq != &CellLRU; cq = tq) { tc = QTOC(cq); tq = QNext(cq); if (afs_strcasecmp(tc->cellName, acellName) == 0) { - /* if the cell we've found has the correct name but no timeout, + /* If the cell we've found has the correct name but no timeout, * and we're called with a non-zero timeout, bail out: never - * override static configuration entries with AFSDB ones. */ - if (timeout && !tc->timeout) { + * override static configuration entries with AFSDB ones. + * One exception: if the original cell entry had no servers, + * it must get servers from AFSDB. + */ + if (timeout && !tc->timeout && tc->cellHosts[0]) { ReleaseWriteLock(&afs_xcell); return 0; } diff --git a/src/afs/afs_dynroot.c b/src/afs/afs_dynroot.c index b90d968..1394e4c 100644 --- a/src/afs/afs_dynroot.c +++ b/src/afs/afs_dynroot.c @@ -584,7 +584,7 @@ afs_DynrootVOPRemove(avc, acred, aname) } /* Check if this is an actual cell? */ - c = afs_GetCellByName2(aname, READ_LOCK, 0 /* no AFSDB */); + c = afs_FindCellByName(aname, READ_LOCK); if (c) { afs_PutCell(c, READ_LOCK); return EROFS; @@ -610,7 +610,7 @@ afs_DynrootVOPSymlink(avc, acred, aname, atargetName) return EPERM; /* Check if it's already a cell */ - c = afs_GetCellByName2(aname, READ_LOCK, 0 /* no AFSDB */); + c = afs_FindCellByName(aname, READ_LOCK); if (c) { afs_PutCell(c, READ_LOCK); return EEXIST; diff --git a/src/auth/cellconfig.c b/src/auth/cellconfig.c index a296d5f..5d221a9 100644 --- a/src/auth/cellconfig.c +++ b/src/auth/cellconfig.c @@ -856,7 +856,7 @@ struct afsconf_cell *acellInfo; { bestce = tce; } } - if (!ambig && bestce) { + if (!ambig && bestce && bestce->cellInfo.numServers) { *acellInfo = bestce->cellInfo; /* structure assignment */ if (aservice) { tservice = afsconf_FindService(aservice);