svn commit: r223657 - in head/sys/fs: nfs nfsclient

Rick Macklem rmacklem at FreeBSD.org
Tue Jun 28 22:52:39 UTC 2011


Author: rmacklem
Date: Tue Jun 28 22:52:38 2011
New Revision: 223657
URL: http://svn.freebsd.org/changeset/base/223657

Log:
  Fix the new NFSv4 client so that it doesn't fill the cached
  mode attribute in as 0 when doing writes. The change adds
  the Mode attribute plus the others except Owner and Owner_group
  to the list requested by the NFSv4 Write Operation. This fixed
  a problem where an executable file built by "cc" would get mode
  0111 instead of 0755 for some NFSv4 servers.
  Found at the recent NFSv4 interoperability Bakeathon.
  
  Tested by:	tdh at excfb.com
  MFC after:	2 weeks

Modified:
  head/sys/fs/nfs/nfsproto.h
  head/sys/fs/nfsclient/nfs_clport.c
  head/sys/fs/nfsclient/nfs_clrpcops.c

Modified: head/sys/fs/nfs/nfsproto.h
==============================================================================
--- head/sys/fs/nfs/nfsproto.h	Tue Jun 28 21:21:10 2011	(r223656)
+++ head/sys/fs/nfs/nfsproto.h	Tue Jun 28 22:52:38 2011	(r223657)
@@ -868,15 +868,24 @@ struct nfsv3_sattr {
  * NFSATTRBIT_WRITEGETATTR0 - bits 0<->31
  */
 #define	NFSATTRBIT_WRITEGETATTR0					\
- 	(NFSATTRBM_CHANGE |						\
+ 	(NFSATTRBM_SUPPORTEDATTRS |					\
+ 	NFSATTRBM_TYPE |						\
+ 	NFSATTRBM_CHANGE |						\
  	NFSATTRBM_SIZE |						\
- 	NFSATTRBM_FSID)
+ 	NFSATTRBM_FSID |						\
+ 	NFSATTRBM_FILEID |						\
+ 	NFSATTRBM_MAXREAD)
 
 /*
  * NFSATTRBIT_WRITEGETATTR1 - bits 32<->63
  */
 #define	NFSATTRBIT_WRITEGETATTR1					\
- 	(NFSATTRBM_TIMEMETADATA |					\
+ 	(NFSATTRBM_MODE |						\
+ 	NFSATTRBM_NUMLINKS |						\
+ 	NFSATTRBM_RAWDEV |						\
+ 	NFSATTRBM_SPACEUSED |						\
+ 	NFSATTRBM_TIMEACCESS |						\
+ 	NFSATTRBM_TIMEMETADATA |					\
  	NFSATTRBM_TIMEMODIFY)
 
 /*

Modified: head/sys/fs/nfsclient/nfs_clport.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clport.c	Tue Jun 28 21:21:10 2011	(r223656)
+++ head/sys/fs/nfsclient/nfs_clport.c	Tue Jun 28 22:52:38 2011	(r223657)
@@ -388,6 +388,7 @@ nfscl_loadattrcache(struct vnode **vpp, 
 		np->n_vattr.na_mtime = nap->na_mtime;
 		np->n_vattr.na_ctime = nap->na_ctime;
 		np->n_vattr.na_fsid = nap->na_fsid;
+		np->n_vattr.na_mode = nap->na_mode;
 	} else {
 		NFSBCOPY((caddr_t)nap, (caddr_t)&np->n_vattr,
 		    sizeof (struct nfsvattr));

Modified: head/sys/fs/nfsclient/nfs_clrpcops.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clrpcops.c	Tue Jun 28 21:21:10 2011	(r223656)
+++ head/sys/fs/nfsclient/nfs_clrpcops.c	Tue Jun 28 22:52:38 2011	(r223657)
@@ -1527,8 +1527,8 @@ nfsrpc_writerpc(vnode_t vp, struct uio *
 		 * deadlock, is that the upcall times out and allows
 		 * the write to complete. However, progress is so slow
 		 * that it might just as well be deadlocked.
-		 * So, we just get the attributes that change with each
-		 * write Op.
+		 * As such, we get the rest of the attributes, but not
+		 * Owner or Owner_group.
 		 * nb: nfscl_loadattrcache() needs to be told that these
 		 *     partial attributes from a write rpc are being
 		 *     passed in, via a argument flag.


More information about the svn-src-head mailing list