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
This commit is contained in:
Rick Macklem 2011-06-28 22:52:38 +00:00
parent d9f039e0b3
commit 4875024b26
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=223657
3 changed files with 15 additions and 5 deletions

View File

@ -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)
/*

View File

@ -388,6 +388,7 @@ nfscl_loadattrcache(struct vnode **vpp, struct nfsvattr *nap, void *nvaper,
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));

View File

@ -1527,8 +1527,8 @@ nfsrpc_writerpc(vnode_t vp, struct uio *uiop, int *iomode,
* 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.