From 7d0a5fe3e3e21f41f22eb10e00649e0ada465786 Mon Sep 17 00:00:00 2001 From: jhb Date: Mon, 26 Jul 2010 18:54:56 +0000 Subject: [PATCH] MFC 209948: A previous change moved the GETATTR RPC for open() calls that hit in the name cache up into nfs_lookup() instead of nfs_open(). Continue this trend by flushing the attribute cache for leaf nodes in nfs_lookup() during an open() if we do a LOOKUP RPC. For NFSv3 this should generally be a NOP as the attributes are flushed before fetching the post-op attributes from the LOOKUP RPC which most (all?) NFSv3 servers provide, so the post-op attributes should populate the cache. Now all NFS open() calls will always clear the cached attributes during the nfs_lookup() prior to nfs_open() in the !NMODIFIED case to provide CTOC. As a result, we can remove the conditional flushing of the attribute cache from nfs_open(). git-svn-id: svn://svn.freebsd.org/base/stable/8@210512 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/nfsclient/nfs_vnops.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c index 575997cc3..f3323f960 100644 --- a/sys/nfsclient/nfs_vnops.c +++ b/sys/nfsclient/nfs_vnops.c @@ -538,15 +538,6 @@ nfs_open(struct vop_open_args *ap) np->n_mtime = vattr.va_mtime; mtx_unlock(&np->n_mtx); } else { - struct thread *td = curthread; - - if (np->n_ac_ts_syscalls != td->td_syscalls || - np->n_ac_ts_tid != td->td_tid || - td->td_proc == NULL || - np->n_ac_ts_pid != td->td_proc->p_pid) { - np->n_attrstamp = 0; - KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp); - } mtx_unlock(&np->n_mtx); error = VOP_GETATTR(vp, &vattr, ap->a_cred); if (error) @@ -1123,6 +1114,20 @@ nfs_lookup(struct vop_lookup_args *ap) return (error); } newvp = NFSTOV(np); + + /* + * Flush the attribute cache when opening a leaf node + * to ensure that fresh attributes are fetched in + * nfs_open() if we are unable to fetch attributes + * from the LOOKUP reply. + */ + if ((flags & (ISLASTCN | ISOPEN)) == (ISLASTCN | ISOPEN) && + !(np->n_flag & NMODIFIED)) { + mtx_lock(&np->n_mtx); + np->n_attrstamp = 0; + KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(newvp); + mtx_unlock(&np->n_mtx); + } } if (v3) { nfsm_postop_attr(newvp, attrflag); -- 2.45.0