cred_t *credp = NULL;
struct vcache *vcp, *pvcp, *tvc = NULL;
int valid;
+ struct afs_fakestat_state fakestate;
#ifdef AFS_LINUX24_ENV
maybe_lock_kernel();
#endif
AFS_GLOCK();
+ afs_InitFakeStat(&fakestate);
if (dp->d_inode) {
if (vcp->mvstat == 1) { /* mount point */
if (vcp->mvid && (vcp->states & CMValid)) {
- /* a mount point, not yet replaced by its directory */
- goto bad_dentry;
+ int tryEvalOnly = 0;
+ int code = 0;
+ struct vrequest treq;
+
+ credp = crref();
+ code = afs_InitReq(&treq, credp);
+ if (
+#ifdef AFS_DARWIN_ENV
+ (strcmp(dp->d_name.name, ".DS_Store") == 0) ||
+ (strcmp(dp->d_name.name, "Contents") == 0) ||
+#endif
+ (strcmp(dp->d_name.name, ".directory") == 0)) {
+ tryEvalOnly = 1;
+ }
+ if (tryEvalOnly)
+ code = afs_TryEvalFakeStat(&vcp, &fakestate, &treq);
+ else
+ code = afs_EvalFakeStat(&vcp, &fakestate, &treq);
+ if ((tryEvalOnly && vcp->mvstat == 1) || code) {
+ /* a mount point, not yet replaced by its directory */
+ goto bad_dentry;
+ }
}
} else
if (*dp->d_name.name != '/' && vcp->mvstat == 2) /* root vnode */
/* Clean up */
if (tvc)
afs_PutVCache(tvc);
+ afs_PutFakeStat(&fakestate);
AFS_GUNLOCK();
if (credp)
crfree(credp);
return valid;
bad_dentry:
- valid = 0;
+ if (have_submounts(dp))
+ valid = 1;
+ else
+ valid = 0;
goto done;
}