DEVEL15-linux-warning-reduction-20090318
[openafs.git] / src / afs / VNOPS / afs_vnop_lookup.c
index 6389263..2c2bd3c 100644 (file)
@@ -87,10 +87,14 @@ EvalMountData(char type, char *data, afs_uint32 states, afs_uint32 cellnum,
        volnamep = data;
        tcell = afs_GetCell(cellnum, READ_LOCK);
     } else {
+       /*printf("No cellname %s , or cellnum %d , returning ENODEV\n", 
+              data, cellnum);*/
        return ENODEV;
     }
-    if (!tcell)
+    if (!tcell) {
+       /*printf("Lookup failed, returning ENODEV\n");*/
        return ENODEV;
+    }
 
     cellidx = tcell->cellIndex;
     mtptCell = tcell->cellNum; /* The cell for the mountpoint */
@@ -143,8 +147,10 @@ EvalMountData(char type, char *data, afs_uint32 states, afs_uint32 cellnum,
        tfid.Fid.Volume = volid;        /* remember BK volume */
        tfid.Cell = mtptCell;
        tvp = afs_GetVolume(&tfid, areq, WRITE_LOCK);   /* get the new one */
-       if (!tvp)
+       if (!tvp) {
+           /*printf("afs_GetVolume failed - returning ENODEV");*/
            return ENODEV;      /* oops, can't do it */
+       }
        goto done;
     }
 
@@ -179,6 +185,7 @@ EvalMountData(char type, char *data, afs_uint32 states, afs_uint32 cellnum,
      * ".backup" in it, this will get the volume struct for the RW volume.
      * The RO volume will be prefetched if requested (but not returned).
      */
+    /*printf("Calling GetVolumeByName\n");*/
     tvp = afs_GetVolumeByName(volnamep, mtptCell, prefetch, areq, WRITE_LOCK);
 
     /* If no volume was found in this cell, try the associated linked cell */
@@ -207,8 +214,10 @@ EvalMountData(char type, char *data, afs_uint32 states, afs_uint32 cellnum,
        osi_FreeSmallSpace(buf);
     }
 
-    if (!tvp)
+    if (!tvp) {
+       /*printf("Couldn't find the volume\n");*/
        return ENODEV;          /* Couldn't find the volume */
+    }
 
     /* Don't cross mountpoint from a BK to a BK volume */
     if ((states & CBackup) && (tvp->states & VBackup)) {
@@ -261,7 +270,7 @@ EvalMountPoint(register struct vcache *avc, struct vcache *advc,
 
     AFS_STATCNT(EvalMountPoint);
 #ifdef notdef
-    if (avc->mvid && (avc->states & CMValid))
+    if (avc->mvid && (avc->f.states & CMValid))
        return 0;               /* done while racing */
 #endif
     *avolpp = NULL;
@@ -271,7 +280,7 @@ EvalMountPoint(register struct vcache *avc, struct vcache *advc,
 
     /* Determine which cell and volume the mointpoint goes to */
     code = EvalMountData(avc->linkData[0], avc->linkData + 1,
-                         avc->states, avc->fid.Cell, avolpp, areq, 0, 0,
+                         avc->f.states, avc->f.fid.Cell, avolpp, areq, 0, 0,
                         &avnoid);
     if (code) return code;
 
@@ -285,7 +294,7 @@ EvalMountPoint(register struct vcache *avc, struct vcache *advc,
     avc->mvid->Fid.Volume = (*avolpp)->volume;
     avc->mvid->Fid.Vnode = avnoid;
     avc->mvid->Fid.Unique = 1;
-    avc->states |= CMValid;
+    avc->f.states |= CMValid;
 
     /* Used to: if the mount point is stored within a backup volume,
      * then we should only update the parent pointer information if
@@ -294,7 +303,7 @@ EvalMountPoint(register struct vcache *avc, struct vcache *advc,
      *
      * Next two lines used to be under this if:
      *
-     * if (!(avc->states & CBackup) || tvp->dotdot.Fid.Volume == 0)
+     * if (!(avc->f.states & CBackup) || tvp->dotdot.Fid.Volume == 0)
      *
      * Now: update mount point back pointer on every call, so that we handle
      * multiple mount points better.  This way, when du tries to go back
@@ -302,9 +311,10 @@ EvalMountPoint(register struct vcache *avc, struct vcache *advc,
      * cd'ing via a new path to a volume will reset the ".." pointer
      * to the new path.
      */
-    (*avolpp)->mtpoint = avc->fid;     /* setup back pointer to mtpoint */
+    (*avolpp)->mtpoint = avc->f.fid;   /* setup back pointer to mtpoint */
+    
     if (advc)
-       (*avolpp)->dotdot = advc->fid;
+       (*avolpp)->dotdot = advc->f.fid;
 
     return 0;
 }
@@ -366,12 +376,12 @@ afs_EvalFakeStat_int(struct vcache **avcp, struct afs_fakestat_state *state,
        if (code)
            goto done;
        if (tvolp) {
-           tvolp->dotdot = tvc->fid;
-           tvolp->dotdot.Fid.Vnode = tvc->parentVnode;
-           tvolp->dotdot.Fid.Unique = tvc->parentUnique;
+           tvolp->dotdot = tvc->f.fid;
+           tvolp->dotdot.Fid.Vnode = tvc->f.parent.vnode;
+           tvolp->dotdot.Fid.Unique = tvc->f.parent.unique;
        }
     }
-    if (tvc->mvid && (tvc->states & CMValid)) {
+    if (tvc->mvid && (tvc->f.states & CMValid)) {
        if (!canblock) {
            afs_int32 retry;
 
@@ -393,7 +403,7 @@ afs_EvalFakeStat_int(struct vcache **avcp, struct afs_fakestat_state *state,
            goto done;
        }
 #ifdef AFS_DARWIN80_ENV
-        root_vp->m.Type = VDIR;
+        root_vp->f.m.Type = VDIR;
         AFS_GUNLOCK();
         code = afs_darwin_finalizevnode(root_vp, NULL, NULL, 0);
         AFS_GLOCK();
@@ -505,7 +515,7 @@ afs_getsysname(register struct vrequest *areq, register struct vcache *adp,
     if (!afs_nfsexporter)
        strcpy(bufp, (*sysnamelist)[0]);
     else {
-       au = afs_GetUser(areq->uid, adp->fid.Cell, 0);
+       au = afs_GetUser(areq->uid, adp->f.fid.Cell, 0);
        if (au->exporter) {
            error = EXP_SYSNAME(au->exporter, (char *)0, sysnamelist, num, 0);
            if (error) {
@@ -581,7 +591,7 @@ Next_AtSys(register struct vcache *avc, struct vrequest *areq,
        *sysnamelist = afs_sysnamelist;
 
        if (afs_nfsexporter) {
-           au = afs_GetUser(areq->uid, avc->fid.Cell, 0);
+           au = afs_GetUser(areq->uid, avc->f.fid.Cell, 0);
            if (au->exporter) {
                error =
                    EXP_SYSNAME(au->exporter, (char *)0, sysnamelist, &num, 0);
@@ -639,7 +649,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
     AFSCBFids fidParm;         /* file ID parm for bulk stat */
     AFSBulkStats statParm;     /* stat info parm for bulk stat */
     int fidIndex = 0;          /* which file were stating */
-    struct conn *tcp = 0;      /* conn for call */
+    struct afs_conn *tcp = 0;  /* conn for call */
     AFSCBs cbParm;             /* callback parm for bulk stat */
     struct server *hostp = 0;  /* host we got callback from */
     long startTime;            /* time we started the call,
@@ -655,10 +665,13 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
     afs_int32 retry;           /* handle low-level SGI MP race conditions */
     long volStates;            /* flags from vol structure */
     struct volume *volp = 0;   /* volume ptr */
-    struct VenusFid dotdot;
+    struct VenusFid dotdot = {0, 0, 0};
     int flagIndex = 0;         /* First file with bulk fetch flag set */
     int inlinebulk = 0;                /* Did we use InlineBulk RPC or not? */
     XSTATS_DECLS;
+    dotdot.Cell = 0;
+    dotdot.Fid.Unique = 0;
+    dotdot.Fid.Vnode = 0;
 #ifdef AFS_DARWIN80_ENV
     panic("bulkstatus doesn't work on AFS_DARWIN80_ENV. don't call it");
 #endif
@@ -719,9 +732,9 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
      * 1. The cache data is being fetched by another process.
      * 2. The cache data is no longer valid
      */
-    while ((adp->states & CStatd)
+    while ((adp->f.states & CStatd)
           && (dcp->dflags & DFFetching)
-          && hsame(adp->m.DataVersion, dcp->f.versionNo)) {
+          && hsame(adp->f.m.DataVersion, dcp->f.versionNo)) {
        afs_Trace4(afs_iclSetp, CM_TRACE_DCACHEWAIT, ICL_TYPE_STRING,
                   __FILE__, ICL_TYPE_INT32, __LINE__, ICL_TYPE_POINTER, dcp,
                   ICL_TYPE_INT32, dcp->dflags);
@@ -731,8 +744,8 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
        ObtainReadLock(&adp->lock);
        ObtainReadLock(&dcp->lock);
     }
-    if (!(adp->states & CStatd)
-       || !hsame(adp->m.DataVersion, dcp->f.versionNo)) {
+    if (!(adp->f.states & CStatd)
+       || !hsame(adp->f.m.DataVersion, dcp->f.versionNo)) {
        ReleaseReadLock(&dcp->lock);
        ReleaseReadLock(&adp->lock);
        afs_PutDCache(dcp);
@@ -782,8 +795,8 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
             * also make us skip "." and probably "..", unless it has
             * disappeared from the cache since we did our namei call.
             */
-           tfid.Cell = adp->fid.Cell;
-           tfid.Fid.Volume = adp->fid.Fid.Volume;
+           tfid.Cell = adp->f.fid.Cell;
+           tfid.Fid.Volume = adp->f.fid.Fid.Volume;
            tfid.Fid.Vnode = ntohl(dirEntryp->fid.vnode);
            tfid.Fid.Unique = ntohl(dirEntryp->fid.vunique);
            do {
@@ -819,7 +832,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
            }
 
 #ifdef AFS_DARWIN80_ENV
-            if (tvcp->states & CVInit) {
+            if (tvcp->f.states & CVInit) {
                  /* XXX don't have status yet, so creating the vnode is
                     not yet useful. we would get CDeadVnode set, and the
                     upcoming PutVCache will cause the vcache to be flushed &
@@ -833,12 +846,12 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
             * if the new length will be ignored when afs_ProcessFS is
             * called with new stats. */
 #ifdef AFS_SGI_ENV
-           if (!(tvcp->states & (CStatd | CBulkFetching))
+           if (!(tvcp->f.states & (CStatd | CBulkFetching))
                && (tvcp->execsOrWriters <= 0)
                && !afs_DirtyPages(tvcp)
                && !AFS_VN_MAPPED((vnode_t *) tvcp))
 #else
-           if (!(tvcp->states & (CStatd | CBulkFetching))
+           if (!(tvcp->f.states & (CStatd | CBulkFetching))
                && (tvcp->execsOrWriters <= 0)
                && !afs_DirtyPages(tvcp))
 #endif
@@ -860,8 +873,8 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
                 */
                memcpy((char *)(fidsp + fidIndex), (char *)&tfid.Fid,
                       sizeof(*fidsp));
-               tvcp->states |= CBulkFetching;
-               tvcp->m.Length = statSeqNo;
+               tvcp->f.states |= CBulkFetching;
+               tvcp->f.m.Length = statSeqNo;
                fidIndex++;
            }
            afs_PutVCache(tvcp);
@@ -901,7 +914,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
        /* start the timer; callback expirations are relative to this */
        startTime = osi_Time();
 
-       tcp = afs_Conn(&adp->fid, areqp, SHARED_LOCK);
+       tcp = afs_Conn(&adp->f.fid, areqp, SHARED_LOCK);
        if (tcp) {
            hostp = tcp->srvr->server;
            XSTATS_START_TIME(AFS_STATS_FS_RPCIDX_BULKSTATUS);
@@ -930,7 +943,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
        } else
            code = -1;
     } while (afs_Analyze
-            (tcp, code, &adp->fid, areqp, AFS_STATS_FS_RPCIDX_BULKSTATUS,
+            (tcp, code, &adp->f.fid, areqp, AFS_STATS_FS_RPCIDX_BULKSTATUS,
              SHARED_LOCK, NULL));
 
     /* now, if we didnt get the info, bail out. */
@@ -939,7 +952,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
 
     /* we need vol flags to create the entries properly */
     dotdot.Fid.Volume = 0;
-    volp = afs_GetVolume(&adp->fid, areqp, READ_LOCK);
+    volp = afs_GetVolume(&adp->f.fid, areqp, READ_LOCK);
     if (volp) {
        volStates = volp->states;
        if (volp->dotdot.Fid.Volume != 0)
@@ -1001,8 +1014,8 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
     for (i = 0; i < fidIndex; i++) {
        if ((&statsp[i])->errorCode)
            continue;
-       afid.Cell = adp->fid.Cell;
-       afid.Fid.Volume = adp->fid.Fid.Volume;
+       afid.Cell = adp->f.fid.Cell;
+       afid.Fid.Volume = adp->f.fid.Fid.Volume;
        afid.Fid.Vnode = fidsp[i].Vnode;
        afid.Fid.Unique = fidsp[i].Unique;
        do {
@@ -1026,7 +1039,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
         * and we may not have the latest status information for this
         * file.  Leave the entry alone.
         */
-       if (!(tvcp->states & CBulkFetching) || (tvcp->m.Length != statSeqNo)) {
+       if (!(tvcp->f.states & CBulkFetching) || (tvcp->f.m.Length != statSeqNo)) {
            flagIndex++;
            ReleaseWriteLock(&tvcp->lock);
            afs_PutVCache(tvcp);
@@ -1077,7 +1090,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
        /* We need to check the flags again. We may have missed
         * something while we were waiting for a lock.
         */
-       if (!(tvcp->states & CBulkFetching) || (tvcp->m.Length != statSeqNo)) {
+       if (!(tvcp->f.states & CBulkFetching) || (tvcp->f.m.Length != statSeqNo)) {
            flagIndex++;
            ReleaseWriteLock(&tvcp->lock);
            ReleaseWriteLock(&afs_xcbhash);
@@ -1097,21 +1110,21 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
         * loaded, so we can tell if we use it before it gets
         * recycled.
         */
-       tvcp->states |= CBulkStat;
-       tvcp->states &= ~CBulkFetching;
+       tvcp->f.states |= CBulkStat;
+       tvcp->f.states &= ~CBulkFetching;
        flagIndex++;
        afs_bulkStatsDone++;
 
        /* merge in vol info */
        if (volStates & VRO)
-           tvcp->states |= CRO;
+           tvcp->f.states |= CRO;
        if (volStates & VBackup)
-           tvcp->states |= CBackup;
+           tvcp->f.states |= CBackup;
        if (volStates & VForeign)
-           tvcp->states |= CForeign;
+           tvcp->f.states |= CForeign;
 
        /* merge in the callback info */
-       tvcp->states |= CTruth;
+       tvcp->f.states |= CTruth;
 
        /* get ptr to the callback we are interested in */
        tcbp = cbsp + i;
@@ -1119,19 +1132,19 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
        if (tcbp->ExpirationTime != 0) {
            tvcp->cbExpires = tcbp->ExpirationTime + startTime;
            tvcp->callback = hostp;
-           tvcp->states |= CStatd;
+           tvcp->f.states |= CStatd;
            afs_QueueCallback(tvcp, CBHash(tcbp->ExpirationTime), volp);
-       } else if (tvcp->states & CRO) {
+       } else if (tvcp->f.states & CRO) {
            /* ordinary callback on a read-only volume -- AFS 3.2 style */
            tvcp->cbExpires = 3600 + startTime;
            tvcp->callback = hostp;
-           tvcp->states |= CStatd;
+           tvcp->f.states |= CStatd;
            afs_QueueCallback(tvcp, CBHash(3600), volp);
        } else {
            tvcp->callback = 0;
-           tvcp->states &= ~(CStatd | CUnique);
+           tvcp->f.states &= ~(CStatd | CUnique);
            afs_DequeueCallback(tvcp);
-           if ((tvcp->states & CForeign) || (vType(tvcp) == VDIR))
+           if ((tvcp->f.states & CForeign) || (vType(tvcp) == VDIR))
                osi_dnlc_purgedp(tvcp); /* if it (could be) a directory */
        }
        ReleaseWriteLock(&afs_xcbhash);
@@ -1147,8 +1160,8 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
   done:
     /* Be sure to turn off the CBulkFetching flags */
     for (i = flagIndex; i < fidIndex; i++) {
-       afid.Cell = adp->fid.Cell;
-       afid.Fid.Volume = adp->fid.Fid.Volume;
+       afid.Cell = adp->f.fid.Cell;
+       afid.Fid.Volume = adp->f.fid.Fid.Volume;
        afid.Fid.Vnode = fidsp[i].Vnode;
        afid.Fid.Unique = fidsp[i].Unique;
        do {
@@ -1157,9 +1170,9 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
            tvcp = afs_FindVCache(&afid, &retry, 0 /* !stats&!lru */ );
            ReleaseReadLock(&afs_xvcache);
        } while (tvcp && retry);
-       if (tvcp != NULL && (tvcp->states & CBulkFetching)
-           && (tvcp->m.Length == statSeqNo)) {
-           tvcp->states &= ~CBulkFetching;
+       if (tvcp != NULL && (tvcp->f.states & CBulkFetching)
+           && (tvcp->f.m.Length == statSeqNo)) {
+           tvcp->f.states &= ~CBulkFetching;
        }
        if (tvcp != NULL) {
            afs_PutVCache(tvcp);
@@ -1171,7 +1184,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
     /* If we did the InlineBulk RPC pull out the return code */
     if (inlinebulk) {
        if ((&statsp[0])->errorCode) {
-           afs_Analyze(tcp, (&statsp[0])->errorCode, &adp->fid, areqp,
+           afs_Analyze(tcp, (&statsp[0])->errorCode, &adp->f.fid, areqp,
                        AFS_STATS_FS_RPCIDX_BULKSTATUS, SHARED_LOCK, NULL);
            code = (&statsp[0])->errorCode;
        }
@@ -1222,6 +1235,8 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
     AFS_STATCNT(afs_lookup);
     afs_InitFakeStat(&fakestate);
 
+    AFS_DISCON_LOCK();
+    
     if ((code = afs_InitReq(&treq, acred)))
        goto done;
 
@@ -1250,6 +1265,9 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
        code = afs_TryEvalFakeStat(&adp, &fakestate, &treq);
     else
        code = afs_EvalFakeStat(&adp, &fakestate, &treq);
+
+    /*printf("Code is %d\n", code);*/
+    
     if (tryEvalOnly && adp->mvstat == 1)
        code = ENOENT;
     if (code)
@@ -1264,7 +1282,7 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
     *avcp = NULL;              /* Since some callers don't initialize it */
     bulkcode = 0;
 
-    if (!(adp->states & CStatd) && !afs_InReadDir(adp)) {
+    if (!(adp->f.states & CStatd) && !afs_InReadDir(adp)) {
        if ((code = afs_VerifyVCache2(adp, &treq))) {
            goto done;
        }
@@ -1291,6 +1309,7 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
            goto done;
        }
        /* otherwise we have the fid here, so we use it */
+       /*printf("Getting vcache\n");*/
        tvc = afs_GetVCache(adp->mvid, &treq, NULL, NULL);
        afs_Trace3(afs_iclSetp, CM_TRACE_GETVCDOTDOT, ICL_TYPE_FID, adp->mvid,
                   ICL_TYPE_POINTER, tvc, ICL_TYPE_INT32, code);
@@ -1414,7 +1433,9 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
     if (tvc) {
        if (no_read_access && vType(tvc) != VDIR && vType(tvc) != VLNK) {
            /* need read access on dir to stat non-directory / non-link */
+#ifndef AFS_FBSD80_ENV
            afs_PutVCache(tvc);
+#endif
            *avcp = NULL;
            code = EACCES;
            goto done;
@@ -1468,17 +1489,17 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
         * use that.  This eliminates several possible deadlocks.  
         */
        if (!afs_InReadDir(adp)) {
-           while ((adp->states & CStatd)
+           while ((adp->f.states & CStatd)
                   && (tdc->dflags & DFFetching)
-                  && hsame(adp->m.DataVersion, tdc->f.versionNo)) {
+                  && hsame(adp->f.m.DataVersion, tdc->f.versionNo)) {
                ReleaseReadLock(&tdc->lock);
                ReleaseReadLock(&adp->lock);
                afs_osi_Sleep(&tdc->validPos);
                ObtainReadLock(&adp->lock);
                ObtainReadLock(&tdc->lock);
            }
-           if (!(adp->states & CStatd)
-               || !hsame(adp->m.DataVersion, tdc->f.versionNo)) {
+           if (!(adp->f.states & CStatd)
+               || !hsame(adp->f.m.DataVersion, tdc->f.versionNo)) {
                ReleaseReadLock(&tdc->lock);
                ReleaseReadLock(&adp->lock);
                afs_PutDCache(tdc);
@@ -1534,8 +1555,8 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
        }
 
        /* new fid has same cell and volume */
-       tfid.Cell = adp->fid.Cell;
-       tfid.Fid.Volume = adp->fid.Fid.Volume;
+       tfid.Cell = adp->f.fid.Cell;
+       tfid.Fid.Volume = adp->f.fid.Fid.Volume;
        afs_Trace4(afs_iclSetp, CM_TRACE_LOOKUP, ICL_TYPE_POINTER, adp,
                   ICL_TYPE_STRING, tname, ICL_TYPE_FID, &tfid,
                   ICL_TYPE_INT32, code);
@@ -1550,7 +1571,8 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
        /* prefetch some entries, if the dir is currently open.  The variable
         * dirCookie tells us where to start prefetching from.
         */
-       if (AFSDOBULK && adp->opens > 0 && !(adp->states & CForeign)
+       if (!AFS_IS_DISCONNECTED && 
+           AFSDOBULK && adp->opens > 0 && !(adp->f.states & CForeign)
            && !afs_IsDynroot(adp) && !afs_InReadDir(adp)) {
            afs_int32 retry;
            /* if the entry is not in the cache, or is in the cache,
@@ -1563,14 +1585,16 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
                ReleaseReadLock(&afs_xvcache);
            } while (tvc && retry);
 
-           if (!tvc || !(tvc->states & CStatd))
+           if (!tvc || !(tvc->f.states & CStatd))
                bulkcode = afs_DoBulkStat(adp, dirCookie, &treq);
            else
                bulkcode = 0;
 
            /* if the vcache isn't usable, release it */
-           if (tvc && !(tvc->states & CStatd)) {
-               afs_PutVCache(tvc);
+           if (tvc && !(tvc->f.states & CStatd)) {
+#ifndef  AFS_FBSD80_ENV
+             afs_PutVCache(tvc);
+#endif
                tvc = NULL;
            }
        } else {
@@ -1587,7 +1611,7 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
         */
        if (!tvc) {
            afs_int32 cached = 0;
-           if (!tfid.Fid.Unique && (adp->states & CForeign)) {
+           if (!tfid.Fid.Unique && (adp->f.states & CForeign)) {
                tvc = afs_LookupVCache(&tfid, &treq, &cached, adp, tname);
            }
            if (!tvc && !bulkcode) {    /* lookup failed or wasn't called */
@@ -1597,11 +1621,11 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
     }                          /* sub-block just to reduce stack usage */
 
     if (tvc) {
-       if (adp->states & CForeign)
-           tvc->states |= CForeign;
-       tvc->parentVnode = adp->fid.Fid.Vnode;
-       tvc->parentUnique = adp->fid.Fid.Unique;
-       tvc->states &= ~CBulkStat;
+       if (adp->f.states & CForeign)
+           tvc->f.states |= CForeign;
+       tvc->f.parent.vnode = adp->f.fid.Fid.Vnode;
+       tvc->f.parent.unique = adp->f.fid.Fid.Unique;
+       tvc->f.states &= ~CBulkStat;
 
        if (afs_fakestat_enable == 2 && tvc->mvstat == 1) {
            ObtainSharedLock(&tvc->lock, 680);
@@ -1617,7 +1641,7 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
                force_eval = 1;
            ReleaseReadLock(&tvc->lock);
        }
-       if (tvc->mvstat == 1 && (tvc->states & CMValid) && tvc->mvid != NULL)
+       if (tvc->mvstat == 1 && (tvc->f.states & CMValid) && tvc->mvid != NULL)
          force_eval = 1; /* This is now almost for free, get it correct */
 
 #if defined(UKERNEL) && defined(AFS_WEB_ENHANCEMENTS)
@@ -1633,19 +1657,21 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
                ReleaseWriteLock(&tvc->lock);
 
                if (code) {
+#ifndef AFS_FBSD80_ENV
                    afs_PutVCache(tvc);
+#endif
                    if (tvolp)
                        afs_PutVolume(tvolp, WRITE_LOCK);
                    goto done;
                }
 
                /* next, we want to continue using the target of the mt point */
-               if (tvc->mvid && (tvc->states & CMValid)) {
+               if (tvc->mvid && (tvc->f.states & CMValid)) {
                    struct vcache *uvc;
                    /* now lookup target, to set .. pointer */
                    afs_Trace2(afs_iclSetp, CM_TRACE_LOOKUP1,
                               ICL_TYPE_POINTER, tvc, ICL_TYPE_FID,
-                              &tvc->fid);
+                              &tvc->f.fid);
                    uvc = tvc;  /* remember for later */
 
                    if (tvolp && (tvolp->states & VForeign)) {
@@ -1655,7 +1681,9 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
                    } else {
                        tvc = afs_GetVCache(tvc->mvid, &treq, NULL, NULL);
                    }
+#ifndef AFS_FBSD80_ENV
                    afs_PutVCache(uvc); /* we're done with it */
+#endif
 
                    if (!tvc) {
                        code = ENOENT;
@@ -1680,7 +1708,9 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
                        afs_PutVolume(tvolp, WRITE_LOCK);
                    }
                } else {
+#ifndef AFS_FBSD80_ENV
                    afs_PutVCache(tvc);
+#endif
                    code = ENOENT;
                    if (tvolp)
                        afs_PutVolume(tvolp, WRITE_LOCK);
@@ -1697,25 +1727,30 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
         * be located (a Multics "connection failure").  If the volume is
         * read-only, we try flushing this entry from the cache and trying
         * again. */
-       if (pass == 0) {
-           struct volume *tv;
-           tv = afs_GetVolume(&adp->fid, &treq, READ_LOCK);
-           if (tv) {
-               if (tv->states & VRO) {
-                   pass = 1;   /* try this *once* */
-                   ObtainWriteLock(&afs_xcbhash, 495);
-                   afs_DequeueCallback(adp);
-                   /* re-stat to get later version */
-                   adp->states &= ~CStatd;
-                   ReleaseWriteLock(&afs_xcbhash);
-                   osi_dnlc_purgedp(adp);
+       if (!AFS_IS_DISCONNECTED) {
+           if (pass == 0) {
+               struct volume *tv;
+               tv = afs_GetVolume(&adp->f.fid, &treq, READ_LOCK);
+               if (tv) {
+                   if (tv->states & VRO) {
+                       pass = 1;       /* try this *once* */
+                       ObtainWriteLock(&afs_xcbhash, 495);
+                       afs_DequeueCallback(adp);
+                       /* re-stat to get later version */
+                       adp->f.states &= ~CStatd;
+                       ReleaseWriteLock(&afs_xcbhash);
+                       osi_dnlc_purgedp(adp);
+                       afs_PutVolume(tv, READ_LOCK);
+                       goto redo;
+                   }
                    afs_PutVolume(tv, READ_LOCK);
-                   goto redo;
-               }
-               afs_PutVolume(tv, READ_LOCK);
+               }
            }
+           code = ENOENT;
+       } else {
+           printf("Network down in afs_lookup\n");
+           code = ENETDOWN;
        }
-       code = ENOENT;
     }
 
   done:
@@ -1726,7 +1761,7 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
 #ifdef AFS_OSF_ENV
        /* Handle RENAME; only need to check rename "."  */
        if (opflag == RENAME && wantparent && *ndp->ni_next == 0) {
-           if (!FidCmp(&(tvc->fid), &(adp->fid))) {
+           if (!FidCmp(&(tvc->f.fid), &(adp->f.fid))) {
                afs_PutVCache(*avcp);
                *avcp = NULL;
                afs_PutFakeStat(&fakestate);
@@ -1753,6 +1788,7 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
                code = afs_VerifyVCache(tvc, &treq);
 #else
                afs_PutFakeStat(&fakestate);
+               AFS_DISCON_UNLOCK();
                return 0;       /* can't have been any errors if hit and !code */
 #endif
            }
@@ -1769,5 +1805,6 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED
     }
 
     afs_PutFakeStat(&fakestate);
+    AFS_DISCON_UNLOCK();
     return code;
 }