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.
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to