libafs: memset dirHeader->hashTable
[openafs.git] / src / afs / afs_dynroot.c
index 6661764..9ca8131 100644 (file)
@@ -87,7 +87,7 @@ static int
 afs_dynrootCellInit(void)
 {
     if (!afs_dynrootCell) {
-       afs_int32 cellHosts[MAXCELLHOSTS];
+       afs_int32 cellHosts[AFS_MAXCELLHOSTS];
        struct cell *tc;
        int code;
 
@@ -257,7 +257,7 @@ afs_dynroot_addDirEnt(struct DirHeader *dirHeader, int *curPageP,
     /*
      * Add the new entry to the correct hash chain.
      */
-    i = DirHash(name);
+    i = afs_dir_DirHash(name);
     dirEntry->next = dirHeader->hashTable[i];
     dirHeader->hashTable[i] = htons(curPage * EPP + curChunk);
 
@@ -341,11 +341,13 @@ afs_RebuildDynroot(void)
        c = afs_GetCellByIndex(cellidx, READ_LOCK);
        if (!c)
            break;
-       if (c->cellNum == afs_dynrootCell)
+       if ((c->cellNum == afs_dynrootCell) || (c->states & CHush)) {
+           afs_PutCell(c, READ_LOCK);
            continue;
-
+       }
        dotLen = strlen(c->cellName) + 2;
        dotCell = afs_osi_Alloc(dotLen);
+       osi_Assert(dotCell != NULL);
        strcpy(dotCell, ".");
        afs_strcat(dotCell, c->cellName);
 
@@ -364,6 +366,7 @@ afs_RebuildDynroot(void)
 
        dotLen = strlen(ca->alias) + 2;
        dotCell = afs_osi_Alloc(dotLen);
+       osi_Assert(dotCell != NULL);
        strcpy(dotCell, ".");
        afs_strcat(dotCell, ca->alias);
 
@@ -384,6 +387,7 @@ afs_RebuildDynroot(void)
 
     dirSize = (curPage + 1) * AFS_PAGESIZE;
     newDir = afs_osi_Alloc(dirSize);
+    osi_Assert(newDir != NULL);
 
     /*
      * Now actually construct the directory.
@@ -403,8 +407,7 @@ afs_RebuildDynroot(void)
     dirHeader->alloMap[0] = EPP - DHE - 1;
     for (i = 1; i < MAXPAGES; i++)
        dirHeader->alloMap[i] = EPP;
-    for (i = 0; i < NHASHENT; i++)
-       dirHeader->hashTable[i] = 0;
+    memset(dirHeader->hashTable, 0, NHASHENT * sizeof(dirHeader->hashTable[0]));
 
     /* Install ".", "..", and the dynamic mount directory */
     afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk, ".", 1);
@@ -417,11 +420,14 @@ afs_RebuildDynroot(void)
        c = afs_GetCellByIndex(cellidx, READ_LOCK);
        if (!c)
            continue;
-       if (c->cellNum == afs_dynrootCell)
+       if ((c->cellNum == afs_dynrootCell) || (c->states & CHush)) {
+           afs_PutCell(c, READ_LOCK);
            continue;
+       }
 
        dotLen = strlen(c->cellName) + 2;
        dotCell = afs_osi_Alloc(dotLen);
+       osi_Assert(dotCell != NULL);
        strcpy(dotCell, ".");
        afs_strcat(dotCell, c->cellName);
        afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk, c->cellName,
@@ -441,6 +447,7 @@ afs_RebuildDynroot(void)
 
        dotLen = strlen(ca->alias) + 2;
        dotCell = afs_osi_Alloc(dotLen);
+       osi_Assert(dotCell != NULL);
        strcpy(dotCell, ".");
        afs_strcat(dotCell, ca->alias);
        afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk, ca->alias,
@@ -479,6 +486,7 @@ afs_RebuildDynrootMount(void)
     struct DirHeader *dirHeader;
 
     newDir = afs_osi_Alloc(AFS_PAGESIZE);
+    osi_Assert(newDir != NULL);
 
     /*
      * Now actually construct the directory.
@@ -498,8 +506,7 @@ afs_RebuildDynrootMount(void)
     dirHeader->alloMap[0] = EPP - DHE - 1;
     for (i = 1; i < MAXPAGES; i++)
        dirHeader->alloMap[i] = EPP;
-    for (i = 0; i < NHASHENT; i++)
-       dirHeader->hashTable[i] = 0;
+    memset(dirHeader->hashTable, 0, NHASHENT * sizeof(dirHeader->hashTable[0]));
 
     /* Install "." and ".." */
     afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk, ".", 1);
@@ -603,13 +610,13 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
            return 0;
        afs_GetDynroot(0, 0, status);
        afs_PutDynroot();
-       return 1;
+       goto succeed;
     }
 
     if (afs_IsDynrootMount(avc)) {
        afs_GetDynrootMount(0, 0, status);
        afs_PutDynroot();
-       return 1;
+       goto succeed;
     }
 
     /*
@@ -647,6 +654,7 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
            if (ts) {
                linklen = strlen(ts->target);
                avc->linkData = afs_osi_Alloc(linklen + 1);
+               osi_Assert(avc->linkData != NULL);
                strcpy(avc->linkData, ts->target);
 
                status->Length = linklen;
@@ -654,7 +662,10 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
            }
            ReleaseReadLock(&afs_dynSymlinkLock);
 
-           return ts ? 1 : 0;
+           if (ts)
+               goto succeed;
+
+           return 0;
        }
 
        if (VNUM_TO_VNTYPE(avc->f.fid.Fid.Vnode) != VN_TYPE_CELL
@@ -692,6 +703,7 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
                int namelen = strlen(realName);
                linklen = rw + namelen;
                avc->linkData = afs_osi_Alloc(linklen + 1);
+               osi_Assert(avc->linkData != NULL);
                strcpy(avc->linkData, rw ? "." : "");
                afs_strcat(avc->linkData, realName);
            }
@@ -714,6 +726,7 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
            bp = afs_cv2string(&tbuf[CVBS], avc->f.fid.Fid.Unique);
            linklen = 2 + namelen + strlen(bp);
            avc->linkData = afs_osi_Alloc(linklen + 1);
+           osi_Assert(avc->linkData != NULL);
            strcpy(avc->linkData, "%");
            afs_strcat(avc->linkData, c->cellName);
            afs_strcat(avc->linkData, ":");
@@ -737,6 +750,7 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
            namelen = strlen(c->cellName);
            linklen = 1 + namelen + 10;
            avc->linkData = afs_osi_Alloc(linklen + 1);
+           osi_Assert(avc->linkData != NULL);
            strcpy(avc->linkData, rw ? "%" : "#");
            afs_strcat(avc->linkData, c->cellName);
            afs_strcat(avc->linkData, ":root.cell");
@@ -746,10 +760,31 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
        }
 
        status->Length = linklen;
-       return 1;
+       goto succeed;
     }
 
     return 0;
+
+    /* make sure we set type correctly when we do this. used to stay VREG */
+ succeed:
+    switch (status->FileType) {
+    case File:
+       vSetType(avc, VREG);
+       break;
+    case Directory:
+       vSetType(avc, VDIR);
+       break;
+    case SymbolicLink:
+       if (afs_fakestat_enable && (avc->f.m.Mode & 0111) == 0)
+           vSetType(avc, VDIR);
+       else
+           vSetType(avc, VLNK);
+       break;
+    default:
+       /* shouldn't happen */
+      ;
+    }
+    return 1;
 }
 
 /*
@@ -856,11 +891,14 @@ afs_DynrootVOPSymlink(struct vcache *avc, afs_ucred_t *acred,
 
     /* Doesn't already exist -- go ahead and create it */
     tps = afs_osi_Alloc(sizeof(*tps));
+    osi_Assert(tps != NULL);
     tps->index = afs_dynSymlinkIndex++;
     tps->next = afs_dynSymlinkBase;
     tps->name = afs_osi_Alloc(strlen(aname) + 1);
+    osi_Assert(tps->name != NULL);
     strcpy(tps->name, aname);
     tps->target = afs_osi_Alloc(strlen(atargetName) + 1);
+    osi_Assert(tps->target != NULL);
     strcpy(tps->target, atargetName);
     afs_dynSymlinkBase = tps;
     ReleaseWriteLock(&afs_dynSymlinkLock);