svn commit: r210513 - stable/7/sys/nfsclient
John Baldwin
jhb at FreeBSD.org
Mon Jul 26 18:55:19 UTC 2010
Author: jhb
Date: Mon Jul 26 18:55:18 2010
New Revision: 210513
URL: http://svn.freebsd.org/changeset/base/210513
Log:
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().
Modified:
stable/7/sys/nfsclient/nfs_vnops.c
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/cddl/contrib/opensolaris/ (props changed)
stable/7/sys/contrib/dev/acpica/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/nfsclient/nfs_vnops.c
==============================================================================
--- stable/7/sys/nfsclient/nfs_vnops.c Mon Jul 26 18:54:56 2010 (r210512)
+++ stable/7/sys/nfsclient/nfs_vnops.c Mon Jul 26 18:55:18 2010 (r210513)
@@ -488,14 +488,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;
- }
mtx_unlock(&np->n_mtx);
error = VOP_GETATTR(vp, &vattr, ap->a_cred, ap->a_td);
if (error)
@@ -1031,6 +1023,19 @@ 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;
+ mtx_unlock(&np->n_mtx);
+ }
}
if (v3) {
nfsm_postop_attr(newvp, attrflag);
More information about the svn-src-all
mailing list