if (vcp == afs_globalVp)
goto good_dentry;
- if (*dp->d_name.name != '/' && vcp->mvstat == 2) /* root vnode */
- check_bad_parent(dp); /* check and correct mvid */
+ if (vcp->mvstat == 1) { /* mount point */
+ if (vcp->mvid && (vcp->states & CMValid)) {
+ /* a mount point, not yet replaced by its directory */
+ goto bad_dentry;
+ }
+ } else
+ if (*dp->d_name.name != '/' && vcp->mvstat == 2) /* root vnode */
+ check_bad_parent(dp); /* check and correct mvid */
#ifdef notdef
/* If the last looker changes, we should make sure the current
register afs_int32 code;
register afs_int32 bulkcode = 0;
int pass = 0, hit = 0;
+ int force_eval = afs_fakestat_enable ? 0 : 1;
long dirCookie;
extern afs_int32 afs_mariner; /*Writing activity to log? */
afs_hyper_t versionNo;
} /* sub-block just to reduce stack usage */
if (tvc) {
- int force_eval = afs_fakestat_enable ? 0 : 1;
-
if (adp->states & CForeign)
tvc->states |= CForeign;
tvc->parentVnode = adp->fid.Fid.Vnode;
force_eval = 1;
ReleaseReadLock(&tvc->lock);
}
+ if (tvc->mvstat == 1 && (tvc->states & CMValid) && tvc->mvid != NULL)
+ force_eval = 1; /* This is now almost for free, get it correct */
+
#if defined(UKERNEL) && defined(AFS_WEB_ENHANCEMENTS)
if (!(flags & AFS_LOOKUP_NOEVAL))
/* don't eval mount points */
* rather than the vc of the mount point itself. we can still find the
* mount point's vc in the vcache by its fid. */
#endif /* UKERNEL && AFS_WEB_ENHANCEMENTS */
- if (!hit) {
+ if (!hit && force_eval) {
osi_dnlc_enter(adp, aname, tvc, &versionNo);
} else {
#ifdef AFS_LINUX20_ENV