openbsd-20021011
[openafs.git] / src / afs / VNOPS / afs_vnop_lookup.c
index 6bde5de..9560885 100644 (file)
@@ -54,7 +54,7 @@ extern struct inode_operations afs_symlink_iops, afs_dir_iops;
 
 afs_int32 afs_bulkStatsDone;
 static int bulkStatCounter = 0;        /* counter for bulk stat seq. numbers */
-int afs_fakestat_enable = 0;
+int afs_fakestat_enable = 0;   /* 1: fakestat-all, 2: fakestat-crosscell */
 
 
 /* this would be faster if it did comparison as int32word, but would be 
@@ -397,7 +397,6 @@ void afs_PutFakeStat(struct afs_fakestat_state *state)
     
 int afs_ENameOK(register char *aname)
 {
-    register char tc;
     register int tlen;
 
     AFS_STATCNT(ENameOK);
@@ -470,9 +469,9 @@ int Next_AtSys(register struct vcache *avc, struct vrequest *areq,
       } else
        return 0; /* .*@sys doesn't match either */
   } else if (++(state->index) >= afs_sysnamecount
-            || !afs_sysnamelist[state->index])
+            || !afs_sysnamelist[(int)state->index])
     return 0;  /* end of list */
-  strcpy(state->name+state->offset, afs_sysnamelist[state->index]);
+  strcpy(state->name+state->offset, afs_sysnamelist[(int)state->index]);
   return 1;
 }
 
@@ -527,10 +526,6 @@ int afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
     struct conn *tcp;          /* conn for call */
     AFSCBs cbParm;             /* callback parm for bulk stat */
     struct server *hostp = 0;  /* host we got callback from */
-    long origEvenCBs;          /* original # of callbacks for even-fid files */
-    long origOddCBs;           /* original # of callbacks for odd-fid files */
-    long origEvenZaps;         /* original # of recycles for even-fid files */
-    long origOddZaps;          /* original # of recycles for odd-fid files */
     long startTime;            /* time we started the call,
                                 * for callback expiration base
                                 */
@@ -1382,17 +1377,34 @@ afs_lookup(adp, aname, avcp, acred)
     } /* sub-block just to reduce stack usage */
 
     if (tvc) {
-       if (adp->states & CForeign)
+       int force_eval = afs_fakestat_enable ? 0 : 1;
+
+       if (adp->states & CForeign)
           tvc->states |= CForeign;
        tvc->parentVnode = adp->fid.Fid.Vnode;
        tvc->parentUnique = adp->fid.Fid.Unique;
        tvc->states &= ~CBulkStat;
 
+       if (afs_fakestat_enable == 2 && tvc->mvstat == 1) {
+           ObtainSharedLock(&tvc->lock, 680);
+           if (!tvc->linkData) {
+               UpgradeSToWLock(&tvc->lock, 681);
+               code = afs_HandleLink(tvc, &treq);
+               ConvertWToRLock(&tvc->lock);
+           } else {
+               ConvertSToRLock(&tvc->lock);
+               code = 0;
+           }
+           if (!code && !strchr(tvc->linkData, ':'))
+               force_eval = 1;
+           ReleaseReadLock(&tvc->lock);
+       }
+
 #if defined(UKERNEL) && defined(AFS_WEB_ENHANCEMENTS)
         if (!(flags & AFS_LOOKUP_NOEVAL))
           /* don't eval mount points */
 #endif /* UKERNEL && AFS_WEB_ENHANCEMENTS */
-       if (!afs_fakestat_enable && tvc->mvstat == 1) {
+       if (tvc->mvstat == 1 && force_eval) {
            /* a mt point, possibly unevaluated */
            struct volume *tvolp;