Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 May 2012 23:46:19 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r234902 - in projects/nfsv4.1-client/sys/fs: nfs nfsclient
Message-ID:  <201205012346.q41NkJVP053394@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205012346.q41NkJVP053394>