diff -ru /usr/src/sys/nfs/nfs.h /usr/src/sys/nfs.noac/nfs.h --- /usr/src/sys/nfs/nfs.h 2005-01-11 01:39:46.000000000 -0500 +++ /usr/src/sys/nfs.noac/nfs.h 2005-09-18 19:41:02.000000000 -0400 @@ -168,11 +168,12 @@ /* * Set the attribute timeout based on how recently the file has been modified. */ -#define NFS_ATTRTIMEO(np) \ +#define NFS_ATTRTIMEO(nmp, np) \ + ((nmp->nm_flag & NFSMNT_NOAC) ? 0 : \ ((((np)->n_flag & NMODIFIED) || \ (time.tv_sec - (np)->n_mtime.tv_sec) / 10 < NFS_MINATTRTIMO) ? NFS_MINATTRTIMO : \ ((time.tv_sec - (np)->n_mtime.tv_sec) / 10 > NFS_MAXATTRTIMO ? NFS_MAXATTRTIMO : \ - (time.tv_sec - (np)->n_mtime.tv_sec) / 10)) + (time.tv_sec - (np)->n_mtime.tv_sec) / 10))) /* * Expected allocation sizes for major data structures. If the actual size diff -ru /usr/src/sys/nfs/nfs_subs.c /usr/src/sys/nfs.noac/nfs_subs.c --- /usr/src/sys/nfs/nfs_subs.c 2005-03-16 06:54:49.000000000 -0500 +++ /usr/src/sys/nfs.noac/nfs_subs.c 2005-09-18 19:45:08.000000000 -0400 @@ -1865,10 +1865,11 @@ struct vattr *vaper; { struct nfsnode *np = VTONFS(vp); + struct nfsmount *nmp = VFSTONFS(vp->v_mount); struct vattr *vap; if (np->n_attrstamp == 0 || - (time.tv_sec - np->n_attrstamp) >= NFS_ATTRTIMEO(np)) { + (time.tv_sec - np->n_attrstamp) >= NFS_ATTRTIMEO(nmp, np)) { nfsstats.attrcache_misses++; return (ENOENT); } diff -ru /usr/src/sys/nfs/nfs_vfsops.c /usr/src/sys/nfs.noac/nfs_vfsops.c --- /usr/src/sys/nfs/nfs_vfsops.c 2004-05-29 05:04:02.000000000 -0400 +++ /usr/src/sys/nfs.noac/nfs_vfsops.c 2005-09-18 19:41:02.000000000 -0400 @@ -302,7 +302,7 @@ * XXX time must be non-zero when we init the interface or else * the arp code will wedge. [Fixed now in if_ether.c] * However, the NFS attribute cache gives false "hits" when - * time.tv_sec < NFS_ATTRTIMEO(np) so keep this in for now. + * time.tv_sec < NFS_ATTRTIMEO(nmp, np) so keep this in for now. */ if (time.tv_sec < NFS_MAXATTRTIMO) time.tv_sec = NFS_MAXATTRTIMO; diff -ru /usr/src/sys/nfs/nfs_vnops.c /usr/src/sys/nfs.noac/nfs_vnops.c --- /usr/src/sys/nfs/nfs_vnops.c 2005-03-16 07:50:30.000000000 -0500 +++ /usr/src/sys/nfs.noac/nfs_vnops.c 2005-09-18 19:47:41.000000000 -0400 @@ -333,9 +333,10 @@ u_int32_t mode, rmode; const int v3 = NFS_ISV3(vp); struct nfsnode *np = VTONFS(vp); + struct nfsmount *nmp = VFSTONFS(vp->v_mount); cachevalid = (np->n_accstamp != -1 && - (time.tv_sec - np->n_accstamp) < NFS_ATTRTIMEO(np) && + (time.tv_sec - np->n_accstamp) < NFS_ATTRTIMEO(nmp, np) && np->n_accuid == ap->a_cred->cr_uid); /* diff -ru /usr/src/sys/nfs/nfsmount.h /usr/src/sys/nfs.noac/nfsmount.h --- /usr/src/sys/nfs/nfsmount.h 2003-10-03 12:34:31.000000000 -0400 +++ /usr/src/sys/nfs.noac/nfsmount.h 2005-09-18 19:41:02.000000000 -0400 @@ -85,13 +85,14 @@ #define NFSMNT_RDIRPLUS 0x00010000 /* Use Readdirplus for V3 */ #define NFSMNT_READDIRSIZE 0x00020000 /* Set readdir size */ #define NFSMNT_XLATECOOKIE 0x00040000 /* 32<->64 dir cookie xlation */ +#define NFSMNT_NOAC 0x00080000 /* Turn off attribute cache */ #define NFSMNT_BITS "\177\20" \ "b\00soft\0b\01wsize\0b\02rsize\0b\03timeo\0" \ "b\04retrans\0b\05maxgrps\0b\06intr\0b\07noconn\0" \ "b\10nqnfs\0b\11nfsv3\0b\12kerb\0b\13dumbtimr\0" \ "b\14leaseterm\0b\15readahead\0b\16deadthresh\0b\17resvport\0" \ - "b\20rdirplus\0b\21readdirsize\0b\22xlatecookie\0" + "b\20rdirplus\0b\21readdirsize\0b\22xlatecookie\0b\23noac\0" /* * NFS internal flags (nm_iflag) */