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-all
mailing list