diff --git a/src/afs/VNOPS/afs_vnop_attrs.c b/src/afs/VNOPS/afs_vnop_attrs.c index f0402010b9..a26f5dbaa0 100644 --- a/src/afs/VNOPS/afs_vnop_attrs.c +++ b/src/afs/VNOPS/afs_vnop_attrs.c @@ -188,6 +188,7 @@ afs_getattr(OSI_VC_DECL(avc), struct vattr *attrs, struct AFS_UCRED *acred) struct vrequest treq; extern struct unixuser *afs_FindUser(); struct unixuser *au; + int inited = 0; OSI_VC_CONVERT(avc); AFS_STATCNT(afs_getattr); @@ -211,23 +212,15 @@ afs_getattr(OSI_VC_DECL(avc), struct vattr *attrs, struct AFS_UCRED *acred) afs_PutFakeStat(&fakestat); return code; } - -#if defined(AFS_SUN5_ENV) || defined(AFS_DARWIN_ENV) && !defined(AFS_DARWIN80_ENV) #if defined(AFS_SUN5_ENV) - if (flags & ATTR_HINT) -#else - if (avc->states & CUBCinit) + if (flags & ATTR_HINT) { + code = afs_CopyOutAttrs(avc, attrs); + return code; + } #endif - { - if (!(code = afs_InitReq(&treq, acred))) { - if (vType(avc) != VDIR && vType(avc) != VLNK && - !afs_AccessOK(avc, PRSFS_READ, &treq, DONT_CHECK_MODE_BITS)) { - - code = EACCES; - } - if (!code) - code = afs_CopyOutAttrs(avc, attrs); - } +#if defined(AFS_DARWIN_ENV) && !defined(AFS_DARWIN80_ENV) + if (avc->states & CUBCinit) { + code = afs_CopyOutAttrs(avc, attrs); return code; } #endif @@ -239,11 +232,13 @@ afs_getattr(OSI_VC_DECL(avc), struct vattr *attrs, struct AFS_UCRED *acred) if (afs_shuttingdown) return EIO; - code = afs_InitReq(&treq, acred); - - if (code == 0 && !(avc->states & CStatd)) { - code = afs_VerifyVCache2(avc, &treq); - } + if (!(avc->states & CStatd)) { + if (!(code = afs_InitReq(&treq, acred))) { + code = afs_VerifyVCache2(avc, &treq); + inited = 1; + } + } else + code = 0; #ifdef AFS_BOZONLOCK_ENV if (code == 0) @@ -251,17 +246,17 @@ afs_getattr(OSI_VC_DECL(avc), struct vattr *attrs, struct AFS_UCRED *acred) afs_BozonUnlock(&avc->pvnLock, avc); #endif - if (code == 0 && vType(avc) != VDIR && vType(avc) != VLNK && - !afs_AccessOK(avc, PRSFS_READ, &treq, DONT_CHECK_MODE_BITS)) { - - code = EACCES; - } if (code == 0) { osi_FlushText(avc); /* only needed to flush text if text locked last time */ code = afs_CopyOutAttrs(avc, attrs); if (afs_nfsexporter) { + if (!inited) { + if ((code = afs_InitReq(&treq, acred))) + return code; + inited = 1; + } if (AFS_NFSXLATORREQ(acred)) { if ((vType(avc) != VDIR) && !afs_AccessOK(avc, PRSFS_READ, &treq,