From cd495f072760736c3e962ed11796e6d682b98f98 Mon Sep 17 00:00:00 2001 From: Nickolai Zeldovich Date: Fri, 16 Apr 2004 00:49:13 +0000 Subject: [PATCH] make-uafs-work-a-little-20040415 Make UAFS at least a little more likely to work. --- src/afs/UKERNEL/afs_usrops.c | 94 ++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 42 deletions(-) diff --git a/src/afs/UKERNEL/afs_usrops.c b/src/afs/UKERNEL/afs_usrops.c index f67daa19f..577630200 100644 --- a/src/afs/UKERNEL/afs_usrops.c +++ b/src/afs/UKERNEL/afs_usrops.c @@ -40,6 +40,7 @@ RCSID #define AFSLOGFILE "AFSLog" #define DCACHEFILE "CacheItems" #define VOLINFOFILE "VolumeItems" +#define CELLINFOFILE "CellItems" #define MAXIPADDRS 64 #ifndef MIN @@ -72,13 +73,13 @@ char afs_mountDir[1024]; /* AFS mount point */ int afs_mountDirLen; /* strlen of AFS mount point */ char fullpn_DCacheFile[1024]; /* Full pathname of DCACHEFILE */ char fullpn_VolInfoFile[1024]; /* Full pathname of VOLINFOFILE */ +char fullpn_CellInfoFile[1024]; /* Full pathname of CELLINFOFILE */ char fullpn_AFSLogFile[1024]; /* Full pathname of AFSLOGFILE */ char fullpn_CacheInfo[1024]; /* Full pathname of CACHEINFO */ char fullpn_VFile[1024]; /* Full pathname of data cache files */ char *vFileNumber; /* Ptr to number in file pathname */ char rootVolume[64] = "root.afs"; /* AFS root volume name */ afs_int32 isHomeCell; /* Is current cell info for home cell */ -afs_int32 lookingForHomeCell; /* Are we still looking for home cell */ int createAndTrunc = O_CREAT | O_TRUNC; /* Create & truncate on open */ int ownerRWmode = 0600; /* Read/write OK by owner */ static int nDaemons = 2; /* Number of background daemons */ @@ -95,6 +96,7 @@ int afsd_CloseSynch = 0; /* Are closes synchronous or not? */ char **pathname_for_V; /* Array of cache file pathnames */ int missing_DCacheFile = 1; /* Is the DCACHEFILE missing? */ int missing_VolInfoFile = 1; /* Is the VOLINFOFILE missing? */ +int missing_CellInfoFile = 1; struct afs_cacheParams cparams; /* params passed to cache manager */ struct afsconf_dir *afs_cdir; /* config dir */ @@ -1342,6 +1344,8 @@ SweepAFSCache(int *vFilesFound) * Found the file holding the volume info. */ missing_VolInfoFile = 0; + } else if (strcmp(currp->d_name, CELLINFOFILE) == 0) { + missing_CellInfoFile = 0; } else if ((strcmp(currp->d_name, ".") == 0) || (strcmp(currp->d_name, "..") == 0) || (strcmp(currp->d_name, "lost+found") == 0)) { @@ -1377,6 +1381,12 @@ SweepAFSCache(int *vFilesFound) if (CreateCacheFile(fullpn_VolInfoFile)) printf("%s: Can't create '%s'\n", rn, fullpn_VolInfoFile); } + if (missing_CellInfoFile) { + if (afsd_verbose) + printf("%s: Creating '%s'\n", rn, fullpn_CellInfoFile); + if (CreateCacheFile(fullpn_CellInfoFile)) + printf("%s: Can't create '%s'\n", rn, fullpn_CellInfoFile); + } if (*vFilesFound < cacheFiles) { /* @@ -1413,12 +1423,8 @@ ConfigCell(register struct afsconf_cell *aci, char *arock, /* figure out if this is the home cell */ isHomeCell = (strcmp(aci->name, afs_LclCellName) == 0); - if (isHomeCell) { - lookingForHomeCell = 0; - cellFlags = 1; /* home cell, suid is ok */ - } else { + if (!isHomeCell) cellFlags = 2; /* not home, suid is forbidden */ - } /* build address list */ for (i = 0; i < MAXHOSTSPERCELL; i++) @@ -1436,6 +1442,16 @@ ConfigCell(register struct afsconf_cell *aci, char *arock, return 0; } +static int +ConfigCellAlias(aca, arock, adir) + struct afsconf_cellalias *aca; + char *arock; + struct afsconf_dir *adir; +{ + call_syscall(AFSOP_ADDCELLALIAS, aca->aliasName, aca->realName, 0, 0, 0); + return 0; +} + /* * Set the UDP port number RX uses for UDP datagrams */ @@ -1659,6 +1675,7 @@ uafs_Init(char *rn, char *mountDirParam, char *confDirParam, */ sprintf(fullpn_DCacheFile, "%s/%s", cacheBaseDir, DCACHEFILE); sprintf(fullpn_VolInfoFile, "%s/%s", cacheBaseDir, VOLINFOFILE); + sprintf(fullpn_CellInfoFile, "%s/%s", cacheBaseDir, CELLINFOFILE); sprintf(fullpn_VFile, "%s/V", cacheBaseDir); vFileNumber = fullpn_VFile + strlen(fullpn_VFile); @@ -1707,41 +1724,7 @@ uafs_Init(char *rn, char *mountDirParam, char *confDirParam, if (afsd_verbose) printf("%s: Initializing AFS daemon.\n", rn); - fork_syscall(AFSCALL_CALL, AFSOP_BASIC_INIT); - - if (afsd_verbose) - printf("%s: Forking AFS daemon.\n", rn); - fork_syscall(AFSCALL_CALL, AFSOP_START_AFS); - - if (afsd_verbose) - printf("%s: Forking check server daemon.\n", rn); - fork_syscall(AFSCALL_CALL, AFSOP_START_CS); - - if (afsd_verbose) - printf("%s: Forking %d background daemons.\n", rn, nDaemons); - for (i = 0; i < nDaemons; i++) { - fork_syscall(AFSCALL_CALL, AFSOP_START_BKG); - } - - /* - * Tell the kernel about each cell in the configuration. - */ - lookingForHomeCell = 1; - - afsconf_CellApply(afs_cdir, ConfigCell, NULL); - - /* - * If we're still looking for the home cell after the whole cell - * configuration database has been parsed, there's something wrong. - */ - if (lookingForHomeCell) { - printf("%s: Can't find home cell '%s' in cell database!\n", rn, - afs_LclCellName); - } - - if (afsd_verbose) - printf("%s: Calling AFSOP_ROOTVOLUME with '%s'\n", rn, rootVolume); - call_syscall(AFSCALL_CALL, AFSOP_ROOTVOLUME, (long)rootVolume, 0, 0, 0); + call_syscall(AFSCALL_CALL, AFSOP_BASIC_INIT, 1, 0, 0, 0); /* * Tell the kernel some basic information about the workstation's cache. @@ -1803,6 +1786,7 @@ uafs_Init(char *rn, char *mountDirParam, char *confDirParam, call_syscall(AFSCALL_CALL, AFSOP_CACHEINFO, (long)fullpn_DCacheFile, 0, 0, 0); + call_syscall(AFSCALL_CALL, AFSOP_CELLINFO, fullpn_CellInfoFile, 0, 0, 0); /* * Pass the kernel the name of the workstation cache file holding the @@ -1825,6 +1809,32 @@ uafs_Init(char *rn, char *mountDirParam, char *confDirParam, call_syscall(AFSCALL_CALL, AFSOP_AFSLOG, (long)fullpn_AFSLogFile, 0, 0, 0); + if (afsd_verbose) + printf("%s: Forking AFS daemon.\n", rn); + fork_syscall(AFSCALL_CALL, AFSOP_START_AFS); + + if (afsd_verbose) + printf("%s: Forking check server daemon.\n", rn); + fork_syscall(AFSCALL_CALL, AFSOP_START_CS); + + if (afsd_verbose) + printf("%s: Forking %d background daemons.\n", rn, nDaemons); + for (i = 0; i < nDaemons; i++) { + fork_syscall(AFSCALL_CALL, AFSOP_START_BKG); + } + + /* + * Tell the kernel about each cell in the configuration. + */ + afsconf_CellApply(afs_cdir, ConfigCell, NULL); + afsconf_CellAliasApply(afs_cdir, ConfigCellAlias, NULL); + + fork_syscall(AFSCALL_CALL, AFSOP_SET_THISCELL, afs_LclCellName); + + if (afsd_verbose) + printf("%s: Calling AFSOP_ROOTVOLUME with '%s'\n", rn, rootVolume); + call_syscall(AFSCALL_CALL, AFSOP_ROOTVOLUME, (long)rootVolume, 0, 0, 0); + /* * Give the kernel the names of the AFS files cached on the workstation's * disk. @@ -1862,7 +1872,7 @@ uafs_Init(char *rn, char *mountDirParam, char *confDirParam, rc = lpioctl(0, _VICEIOCTL(8), &iob, 0); #endif if (rc < 0) { - usr_assert(errno == EDOM); + usr_assert(errno == EDOM || errno == ENOSYS); break; } -- 2.39.5