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