svn commit: r234902 - in projects/nfsv4.1-client/sys/fs: nfs
nfsclient
Rick Macklem
rmacklem at FreeBSD.org
Tue May 1 23:46:19 UTC 2012
Author: rmacklem
Date: Tue May 1 23:46:18 2012
New Revision: 234902
URL: http://svn.freebsd.org/changeset/base/234902
Log:
Fix the NFSv4.1 client for exclusive create, which must
be done differently for NFSv4.1 vs NFSv4.0.
Modified:
projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h
projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c
Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h
==============================================================================
--- projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Tue May 1 20:42:03 2012 (r234901)
+++ projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Tue May 1 23:46:18 2012 (r234902)
@@ -527,6 +527,7 @@
#define NFSCREATE_UNCHECKED 0
#define NFSCREATE_GUARDED 1
#define NFSCREATE_EXCLUSIVE 2
+#define NFSCREATE_EXCLUSIVE41 3
#define NFSV3FSINFO_LINK 0x01
#define NFSV3FSINFO_SYMLINK 0x02
Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c
==============================================================================
--- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Tue May 1 20:42:03 2012 (r234901)
+++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Tue May 1 23:46:18 2012 (r234902)
@@ -1962,10 +1962,26 @@ nfsrpc_createv4(vnode_t dvp, char *name,
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
*tl++ = txdr_unsigned(NFSV4OPEN_CREATE);
if (fmode & O_EXCL) {
- *tl = txdr_unsigned(NFSCREATE_EXCLUSIVE);
- NFSM_BUILD(tl, u_int32_t *, NFSX_VERF);
- *tl++ = cverf.lval[0];
- *tl = cverf.lval[1];
+ if (NFSHASNFSV4N(nmp)) {
+ if (NFSHASSESSPERSIST(nmp)) {
+ /* Use GUARDED for persistent sessions. */
+ *tl = txdr_unsigned(NFSCREATE_GUARDED);
+ nfscl_fillsattr(nd, vap, dvp, 0, 0);
+ } else {
+ /* Otherwise, use EXCLUSIVE4_1. */
+ *tl = txdr_unsigned(NFSCREATE_EXCLUSIVE41);
+ NFSM_BUILD(tl, u_int32_t *, NFSX_VERF);
+ *tl++ = cverf.lval[0];
+ *tl = cverf.lval[1];
+ nfscl_fillsattr(nd, vap, dvp, 0, 0);
+ }
+ } else {
+ /* NFSv4.0 */
+ *tl = txdr_unsigned(NFSCREATE_EXCLUSIVE);
+ NFSM_BUILD(tl, u_int32_t *, NFSX_VERF);
+ *tl++ = cverf.lval[0];
+ *tl = cverf.lval[1];
+ }
} else {
*tl = txdr_unsigned(NFSCREATE_UNCHECKED);
nfscl_fillsattr(nd, vap, dvp, 0, 0);
More information about the svn-src-projects
mailing list