svn commit: r276347 - head/sys/fs/nfsclient

Rick Macklem rmacklem at FreeBSD.org
Sun Dec 28 21:13:54 UTC 2014


Author: rmacklem
Date: Sun Dec 28 21:13:52 2014
New Revision: 276347
URL: https://svnweb.freebsd.org/changeset/base/276347

Log:
  r245508 modified the NFS client's Setattr RPC to
  use VA_UTIMES_NULL to indicate whether it should
  set the time to the current tod on the server.
  This had the side effect of making the NFS client
  use the client's timestamp for exclusive create,
  starting with FreeBSD9.2.
  Unfortunately a bug in some Solaris NFS servers
  causes these servers to return NFS_OK to the
  Setattr RPC done during exclusive create, but not
  actually set the file's mode, leaving the file's
  mode == 0.
  This patch restores the NFS client's behaviour to
  use the server's tod for the exclusive open's
  Setattr RPC, to avoid the Solaris server bug and
  to restore the pre-FreeBSD9.2 NFS behaviour.
  
  Discussed on:	freebsd-fs
  PR:	186293
  MFC after:	3 months

Modified:
  head/sys/fs/nfsclient/nfs_clport.c

Modified: head/sys/fs/nfsclient/nfs_clport.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clport.c	Sun Dec 28 21:06:03 2014	(r276346)
+++ head/sys/fs/nfsclient/nfs_clport.c	Sun Dec 28 21:13:52 2014	(r276347)
@@ -1096,9 +1096,16 @@ nfscl_checksattr(struct vattr *vap, stru
 	 * us to do a SETATTR RPC. FreeBSD servers store the verifier
 	 * in atime, but we can't really assume that all servers will
 	 * so we ensure that our SETATTR sets both atime and mtime.
+	 * Set the VA_UTIMES_NULL flag for this case, so that
+	 * the server's time will be used.  This is needed to
+	 * work around a bug in some Solaris servers, where
+	 * setting the time TOCLIENT causes the Setattr RPC
+	 * to return NFS_OK, but not set va_mode.
 	 */
-	if (vap->va_mtime.tv_sec == VNOVAL)
+	if (vap->va_mtime.tv_sec == VNOVAL) {
 		vfs_timestamp(&vap->va_mtime);
+		vap->va_vaflags |= VA_UTIMES_NULL;
+	}
 	if (vap->va_atime.tv_sec == VNOVAL)
 		vap->va_atime = vap->va_mtime;
 	return (1);


More information about the svn-src-head mailing list