From owner-svn-src-projects@freebsd.org  Sun Jun 11 00:17:09 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 538C2BF9590
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Sun, 11 Jun 2017 00:17:09 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 27A2367D58;
 Sun, 11 Jun 2017 00:17:09 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5B0H8CV055898;
 Sun, 11 Jun 2017 00:17:08 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5B0H7fw055894;
 Sun, 11 Jun 2017 00:17:07 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706110017.v5B0H7fw055894@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Sun, 11 Jun 2017 00:17:07 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319816 - projects/pnfs-planb-server-stable11/sys/fs/nfs
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 11 Jun 2017 00:17:09 -0000

Author: rmacklem
Date: Sun Jun 11 00:17:07 2017
New Revision: 319816
URL: https://svnweb.freebsd.org/changeset/base/319816

Log:
  Update some of the NFS .h files for the pNFS server.

Modified:
  projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsport.h
  projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsproto.h
  projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsrvstate.h

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsport.h
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsport.h	Sun Jun 11 00:16:21 2017	(r319815)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsport.h	Sun Jun 11 00:17:07 2017	(r319816)
@@ -707,6 +707,10 @@ void nfsrvd_rcv(struct socket *, void *, int);
 #define	NFSSESSIONMUTEXPTR(s)	(&((s)->mtx))
 #define	NFSLOCKSESSION(s)	mtx_lock(&((s)->mtx))
 #define	NFSUNLOCKSESSION(s)	mtx_unlock(&((s)->mtx))
+#define	NFSLOCKLAYOUT(l)	mtx_lock(&((l)->mtx))
+#define	NFSUNLOCKLAYOUT(l)	mtx_unlock(&((l)->mtx))
+#define	NFSDDSLOCK()		mtx_lock(&nfsrv_dslock_mtx)
+#define	NFSDDSUNLOCK()		mtx_unlock(&nfsrv_dslock_mtx)
 
 /*
  * Use these macros to initialize/free a mutex.

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsproto.h
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsproto.h	Sun Jun 11 00:16:21 2017	(r319815)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsproto.h	Sun Jun 11 00:17:07 2017	(r319816)
@@ -56,8 +56,22 @@
 #define	NFS_MAXDGRAMDATA 16384
 #define	NFS_MAXPATHLEN	1024
 #define	NFS_MAXNAMLEN	255
+/*
+ * Calculating the maximum XDR overhead for an NFS RPC isn't easy.
+ * NFS_MAXPKTHDR is antiquated and assume AUTH_SYS over UDP.
+ * NFS_MAXXDR should be sufficient for all NFS versions over TCP.
+ * It includes:
+ * - Maximum RPC message header. It can include 2 400byte authenticators plus
+ *   a machine name of unlimited length, although it is usually relatively
+ *   small.
+ * - XDR overheads for the NFSv4 compound. This can include Owner and
+ *   Owner_group strings, which are usually fairly small, but are allowed
+ *   to be up to 1024 bytes each.
+ * 4096 is overkill, but should always be sufficient.
+ */
 #define	NFS_MAXPKTHDR	404
-#define	NFS_MAXPACKET	(NFS_SRVMAXIO + 2048)
+#define	NFS_MAXXDR	4096
+#define	NFS_MAXPACKET	(NFS_SRVMAXIO + NFS_MAXXDR)
 #define	NFS_MINPACKET	20
 #define	NFS_FABLKSIZE	512	/* Size in bytes of a block wrt fa_blocks */
 #define	NFSV4_MINORVERSION	0	/* V4 Minor version */
@@ -244,6 +258,10 @@
 #define	NFSX_V4SETTIME		(NFSX_UNSIGNED + NFSX_V4TIME)
 #define	NFSX_V4SESSIONID	16
 #define	NFSX_V4DEVICEID		16
+#define	NFSX_V4PNFSFH		(sizeof(fhandle_t) + 1)
+#define	NFSX_V4FILELAYOUT	(4 * NFSX_UNSIGNED + NFSX_V4DEVICEID +	\
+				 NFSX_HYPER + NFSM_RNDUP(NFSX_V4PNFSFH))
+#define	NFSX_V4MAXLAYOUT	NFSX_V4FILELAYOUT
 
 /* sizes common to multiple NFS versions */
 #define	NFSX_FHMAX		(NFSX_V4FHMAX)
@@ -633,7 +651,9 @@
 /* Flags for File Layout. */
 #define	NFSFLAYUTIL_DENSE		0x1
 #define	NFSFLAYUTIL_COMMIT_THRU_MDS	0x2
+#define	NFSFLAYUTIL_STRIPE_MASK		0xffffffc0
 
+#if defined(_KERNEL) || defined(KERNEL)
 /* Conversion macros */
 #define	vtonfsv2_mode(t,m) 						\
 		txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : 	\
@@ -783,6 +803,7 @@ struct nfsv3_sattr {
 	u_int32_t sa_mtimetype;
 	nfstime3  sa_mtime;
 };
+#endif	/* _KERNEL */
 
 /*
  * The attribute bits used for V4.
@@ -1010,7 +1031,8 @@ struct nfsv3_sattr {
  	NFSATTRBM_MOUNTEDONFILEID |					\
 	NFSATTRBM_QUOTAHARD |                        			\
     	NFSATTRBM_QUOTASOFT |                        			\
-    	NFSATTRBM_QUOTAUSED)
+    	NFSATTRBM_QUOTAUSED |						\
+	NFSATTRBM_FSLAYOUTTYPE)
 
 
 #ifdef QUOTA
@@ -1026,7 +1048,11 @@ struct nfsv3_sattr {
 #define	NFSATTRBIT_SUPP1	NFSATTRBIT_S1
 #endif
 
-#define	NFSATTRBIT_SUPP2	NFSATTRBM_SUPPATTREXCLCREAT
+#define	NFSATTRBIT_SUPP2						\
+	(NFSATTRBM_LAYOUTTYPE |						\
+	NFSATTRBM_LAYOUTBLKSIZE |					\
+	NFSATTRBM_LAYOUTALIGNMENT |					\
+	NFSATTRBM_SUPPATTREXCLCREAT)
 
 /*
  * NFSATTRBIT_SUPPSETONLY is the OR of NFSATTRBIT_TIMEACCESSSET and
@@ -1342,5 +1368,15 @@ struct nfsv4stateid {
 	u_int32_t	other[NFSX_STATEIDOTHER / NFSX_UNSIGNED];
 };
 typedef struct nfsv4stateid nfsv4stateid_t;
+
+/* Notify bits and notify bitmap size. */
+#define	NFSV4NOTIFY_CHANGE	1
+#define	NFSV4NOTIFY_DELETE	2
+#define	NFSV4_NOTIFYBITMAP	1	/* # of 32bit values needed for bits */
+
+/* Layoutreturn kinds. */
+#define	NFSV4LAYOUTRET_FILE	1
+#define	NFSV4LAYOUTRET_FSID	2
+#define	NFSV4LAYOUTRET_ALL	3
 
 #endif	/* _NFS_NFSPROTO_H_ */

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsrvstate.h
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsrvstate.h	Sun Jun 11 00:16:21 2017	(r319815)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsrvstate.h	Sun Jun 11 00:17:07 2017	(r319816)
@@ -29,6 +29,7 @@
 #ifndef _NFS_NFSRVSTATE_H_
 #define	_NFS_NFSRVSTATE_H_
 
+#if defined(_KERNEL) || defined(KERNEL)
 /*
  * Definitions for NFS V4 server state handling.
  */
@@ -44,6 +45,8 @@ LIST_HEAD(nfslockhead, nfslock);
 LIST_HEAD(nfslockhashhead, nfslockfile);
 LIST_HEAD(nfssessionhead, nfsdsession);
 LIST_HEAD(nfssessionhashhead, nfsdsession);
+LIST_HEAD(nfslayouthead, nfslayout);
+SLIST_HEAD(nfsdsdirhead, nfsdsdir);
 
 /*
  * List head for nfsusrgrp.
@@ -72,6 +75,13 @@ struct nfssessionhash {
 #define	NFSSESSIONHASH(f) 						\
 	(&nfssessionhash[nfsrv_hashsessionid(f) % nfsrv_sessionhashsize])
 
+struct nfslayouthash {
+	struct mtx		mtx;
+	struct nfslayouthead	list;
+};
+#define	NFSLAYOUTHASH(f) 						\
+	(&nfslayouthash[nfsrv_hashfh(f) % nfsrv_layouthashsize])
+
 /*
  * Client server structure for V4. It is doubly linked into two lists.
  * The first is a hash table based on the clientid and the second is a
@@ -110,6 +120,21 @@ struct nfsclient {
 #define	CLOPS_RENEWOP		0x0004
 
 /*
+ * Structure for NFSv4.1 Layouts.
+ * Malloc'd to correct size for the lay_xdr.
+ */
+struct nfslayout {
+	LIST_ENTRY(nfslayout)	lay_list;
+	nfsv4stateid_t		lay_stateid;
+	nfsquad_t		lay_clientid;
+	fhandle_t		lay_fh;
+	uint16_t		lay_layoutlen;
+	uint8_t			lay_read;
+	uint8_t			lay_rw;
+	char			lay_xdr[0];
+};
+
+/*
  * Structure for an NFSv4.1 session.
  * Locking rules for this structure.
  * To add/delete one of these structures from the lists, you must lock
@@ -153,6 +178,7 @@ struct nfsdsession {
  * - open file structures chained off an open_owner structure
  * - lock_owner structures chained off an open file structure
  * - delegated file structures chained off of nfsclient and nfslockfile
+ * - pNFS layouts chained off of nfsclient and nfslockfile
  * - the ls_list field is used for the chain it is in
  * - the ls_head structure is used to chain off the sibling structure
  *   (it is a union between an nfsstate and nfslock structure head)
@@ -186,8 +212,9 @@ struct nfsstate {
 	struct nfslockfile	*ls_lfp;	/* Back pointer */
 	struct nfsrvcache	*ls_op;		/* Op cache reference */
 	struct nfsclient	*ls_clp;	/* Back pointer */
-	u_short			ls_ownerlen;	/* Length of ls_owner */
+	u_int32_t		ls_ownerlen;	/* Length of ls_owner */
 	u_char			ls_owner[1];	/* malloc'd the correct size */
+						/* Must be uint32_t * aligned */
 };
 #define	ls_lock			ls_head.lock
 #define	ls_open			ls_head.open
@@ -199,6 +226,8 @@ struct nfsstate {
 #define	ls_delegtime		ls_un.deleg.expiry
 #define	ls_delegtimelimit	ls_un.deleg.limit
 #define	ls_compref		ls_un.deleg.compref
+#define	ls_layout		ls_owner
+#define	ls_layoutlen		ls_ownerlen
 
 /*
  * Nfs lock structure.
@@ -249,6 +278,7 @@ struct nfsrollback {
 struct nfslockfile {
 	LIST_HEAD(, nfsstate)	lf_open;	/* Open list */
 	LIST_HEAD(, nfsstate)	lf_deleg;	/* Delegation list */
+	LIST_HEAD(, nfsstate)	lf_layout;	/* Layout list */
 	LIST_HEAD(, nfslock)	lf_lock;	/* Lock list */
 	LIST_HEAD(, nfslock)	lf_locallock;	/* Local lock list */
 	LIST_HEAD(, nfsrollback) lf_rollback;	/* Local lock rollback list */
@@ -288,9 +318,56 @@ struct nfsf_rec {
 	u_int32_t	numboots;		/* Number of boottimes */
 };
 
-#if defined(_KERNEL) || defined(KERNEL)
 void nfsrv_cleanclient(struct nfsclient *, NFSPROC_T *);
 void nfsrv_freedeleglist(struct nfsstatehead *);
-#endif
+
+/*
+ * This structure is used to create the list of device info entries for
+ * a GetDeviceInfo operation and stores the DS server info.
+ * The nfsdev_addrandhost field has the fully qualified host domain name
+ * followed by the network address in XDR.
+ * It is allocated with nfsrv_dsdirsize nfsdev_dsdir[] entries.
+ */
+struct nfsdevice {
+	TAILQ_ENTRY(nfsdevice)	nfsdev_list;
+	vnode_t			nfsdev_dvp;
+	struct nfsmount		*nfsdev_nmp;
+	char			nfsdev_deviceid[NFSX_V4DEVICEID];
+	uint16_t		nfsdev_hostnamelen;
+	uint16_t		nfsdev_fileaddrlen;
+	char			*nfsdev_fileaddr;
+	char			*nfsdev_host;
+	uint32_t		nfsdev_nextdir;
+	vnode_t			nfsdev_dsdir[0];
+};
+TAILQ_HEAD(nfsdevicehead, nfsdevice);
+
+/*
+ * This structure holds the va_size, va_filerev and va_mtime for the DS
+ * file and is stored in the metadata file's extended attribute pnfsd.dsattr.
+ */
+struct pnfsdsattr {
+	uint64_t	dsa_filerev;
+	uint64_t	dsa_size;
+	struct timespec	dsa_mtime;
+};
+
+#endif	/* defined(_KERNEL) || defined(KERNEL) */
+
+/*
+ * This structure holds the information about the DS file and is stored
+ * in the metadata file's extended attribute called pnfsd.dsfile.
+ * dsf_nam[0] is defined as the actual length of sa_len for the addr.
+ */
+struct pnfsdsfile {
+	fhandle_t	dsf_fh;
+	uint32_t	dsf_dir;
+	union {
+		struct sockaddr_in	sin;
+		struct sockaddr_in6	sin6;
+	} dsf_nam;
+};
+#define	dsf_sin		dsf_nam.sin
+#define	dsf_sin6	dsf_nam.sin6
 
 #endif	/* _NFS_NFSRVSTATE_H_ */

From owner-svn-src-projects@freebsd.org  Sun Jun 11 20:07:14 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 26087D8DE25
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Sun, 11 Jun 2017 20:07:14 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id D45D975368;
 Sun, 11 Jun 2017 20:07:13 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5BK7CR9063731;
 Sun, 11 Jun 2017 20:07:12 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5BK7Ceu063729;
 Sun, 11 Jun 2017 20:07:12 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706112007.v5BK7Ceu063729@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Sun, 11 Jun 2017 20:07:12 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319831 -
 projects/pnfs-planb-server-stable11/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 11 Jun 2017 20:07:14 -0000

Author: rmacklem
Date: Sun Jun 11 20:07:12 2017
New Revision: 319831
URL: https://svnweb.freebsd.org/changeset/base/319831

Log:
  Update some nfs files for the pNFS server.

Modified:
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdkrpc.c
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdkrpc.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdkrpc.c	Sun Jun 11 19:31:42 2017	(r319830)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdkrpc.c	Sun Jun 11 20:07:12 2017	(r319831)
@@ -103,6 +103,7 @@ static int nfs_proc(struct nfsrv_descript *, u_int32_t
 extern u_long sb_max_adj;
 extern int newnfs_numnfsd;
 extern struct proc *nfsd_master_proc;
+extern time_t nfsdev_time;
 
 /*
  * NFS server system calls
@@ -493,6 +494,7 @@ nfsrvd_nfsd(struct thread *td, struct nfsd_nfsd_args *
 	 */
 	NFSD_LOCK();
 	if (newnfs_numnfsd == 0) {
+		nfsdev_time = time_second;
 		p = td->td_proc;
 		PROC_LOCK(p);
 		p->p_flag2 |= P2_AST_SU;
@@ -500,6 +502,7 @@ nfsrvd_nfsd(struct thread *td, struct nfsd_nfsd_args *
 		newnfs_numnfsd++;
 
 		NFSD_UNLOCK();
+		nfsrv_createdevids(args, td);
 
 		/* An empty string implies AUTH_SYS only. */
 		if (principal[0] != '\0') {
@@ -553,6 +556,7 @@ nfsrvd_init(int terminating)
 	if (terminating) {
 		nfsd_master_proc = NULL;
 		NFSD_UNLOCK();
+		nfsrv_freealllayoutsanddevids();
 		nfsrv_freeallbackchannel_xprts();
 		svcpool_close(nfsrvd_pool);
 		NFSD_LOCK();

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Sun Jun 11 19:31:42 2017	(r319830)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Sun Jun 11 20:07:12 2017	(r319831)
@@ -35,6 +35,7 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/capsicum.h>
+#include <sys/extattr.h>
 
 /*
  * Functions that perform the vfs operations required by the routines in
@@ -63,8 +64,12 @@ extern struct nfslockhashhead *nfslockhash;
 extern struct nfssessionhash *nfssessionhash;
 extern int nfsrv_sessionhashsize;
 extern struct nfsstatsv1 nfsstatsv1;
+extern struct nfslayouthash *nfslayouthash;
+extern int nfsrv_layouthashsize;
+extern struct mtx nfsrv_dslock_mtx;
 struct vfsoptlist nfsv4root_opt, nfsv4root_newopt;
 NFSDLOCKMUTEX;
+NFSSTATESPINLOCK;
 struct nfsrchash_bucket nfsrchash_table[NFSRVCACHE_HASHSIZE];
 struct nfsrchash_bucket nfsrcahash_table[NFSRVCACHE_HASHSIZE];
 struct mtx nfsrc_udpmtx;
@@ -87,7 +92,31 @@ static int nfs_commit_miss;
 extern int nfsrv_issuedelegs;
 extern int nfsrv_dolocallocks;
 extern int nfsd_enable_stringtouid;
+extern struct nfsdevicehead nfsrv_devidhead;
 
+static void nfsrv_pnfscreate(struct vnode *, struct vattr *, struct ucred *,
+    NFSPROC_T *);
+static void nfsrv_pnfsremovesetup(struct vnode *, NFSPROC_T *, struct vnode **,
+    fhandle_t *);
+static void nfsrv_pnfsremove(struct vnode *, fhandle_t *, NFSPROC_T *);
+static int nfsrv_proxyds(struct nfsrv_descript *, struct vnode *, off_t, int,
+    struct ucred *, struct thread *, int, struct mbuf **, char *,
+    struct mbuf **, struct nfsvattr *, struct acl *);
+static int nfsrv_dsgetsockmnt(struct vnode *, int, char *, int,
+    NFSPROC_T *, struct vnode **, struct nfsmount **, fhandle_t *, char *);
+static int nfsrv_setextattr(struct vnode *, struct nfsvattr *, NFSPROC_T *);
+static int nfsrv_readdsrpc(fhandle_t *, off_t, int, struct ucred *,
+    NFSPROC_T *, struct nfsmount *, struct mbuf **, struct mbuf **);
+static int nfsrv_writedsrpc(fhandle_t *, off_t, int, struct ucred *,
+    NFSPROC_T *, struct vnode *, struct nfsmount *, struct mbuf **, char *);
+static int nfsrv_setacldsrpc(fhandle_t *, struct ucred *, NFSPROC_T *,
+    struct vnode *, struct nfsmount *, struct acl *);
+static int nfsrv_setattrdsrpc(fhandle_t *, struct ucred *, NFSPROC_T *,
+    struct vnode *, struct nfsmount *, struct nfsvattr *);
+static int nfsrv_getattrdsrpc(fhandle_t *, struct ucred *, NFSPROC_T *,
+    struct vnode *, struct nfsmount *, struct nfsvattr *);
+static int nfsrv_putfhname(fhandle_t *, char *);
+
 SYSCTL_NODE(_vfs, OID_AUTO, nfsd, CTLFLAG_RW, 0, "NFS server");
 SYSCTL_INT(_vfs_nfsd, OID_AUTO, mirrormnt, CTLFLAG_RW,
     &nfsrv_enable_crossmntpt, 0, "Enable nfsd to cross mount points");
@@ -103,7 +132,36 @@ SYSCTL_INT(_vfs_nfsd, OID_AUTO, debuglevel, CTLFLAG_RW
     0, "Debug level for NFS server");
 SYSCTL_INT(_vfs_nfsd, OID_AUTO, enable_stringtouid, CTLFLAG_RW,
     &nfsd_enable_stringtouid, 0, "Enable nfsd to accept numeric owner_names");
+static int nfsrv_pnfsgetdsattr = 1;
+SYSCTL_INT(_vfs_nfsd, OID_AUTO, pnfsgetdsattr, CTLFLAG_RW,
+    &nfsrv_pnfsgetdsattr, 0, "When set getattr gets DS attributes via RPC");
 
+/*
+ * nfsrv_dsdirsize can only be increased and only when the nfsd threads are
+ * not running.
+ * The dsN subdirectories for the increased values must have been created
+ * on all DS servers before this increase is done.
+ */
+u_int	nfsrv_dsdirsize = 20;
+static int
+sysctl_dsdirsize(SYSCTL_HANDLER_ARGS)
+{
+	int error, newdsdirsize;
+
+	newdsdirsize = nfsrv_dsdirsize;
+	error = sysctl_handle_int(oidp, &newdsdirsize, 0, req);
+	if (error != 0 || req->newptr == NULL)
+		return (error);
+	if (newdsdirsize <= nfsrv_dsdirsize || newdsdirsize > 10000 ||
+	    newnfs_numnfsd != 0)
+		return (EINVAL);
+	nfsrv_dsdirsize = newdsdirsize;
+	return (0);
+}
+SYSCTL_PROC(_vfs_nfsd, OID_AUTO, dsdirsize, CTLTYPE_UINT | CTLFLAG_RW, 0,
+    sizeof(nfsrv_dsdirsize), sysctl_dsdirsize, "IU",
+    "Number of dsN subdirs on the DS servers");
+
 #define	MAX_REORDERED_RPC	16
 #define	NUM_HEURISTIC		1031
 #define	NHUSE_INIT		64
@@ -179,10 +237,12 @@ nfsrv_sequential_heuristic(struct uio *uio, struct vno
  * Get attributes into nfsvattr structure.
  */
 int
-nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap, struct ucred *cred,
-    struct thread *p, int vpislocked)
+nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap,
+    struct nfsrv_descript *nd, struct thread *p, int vpislocked,
+    nfsattrbit_t *attrbitp)
 {
-	int error, lockedit = 0;
+	int error, gotattr, lockedit = 0;
+	struct nfsvattr na;
 
 	if (vpislocked == 0) {
 		/*
@@ -195,10 +255,45 @@ nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap
 			NFSVOPLOCK(vp, LK_SHARED | LK_RETRY);
 		}
 	}
-	error = VOP_GETATTR(vp, &nvap->na_vattr, cred);
+
+	/*
+	 * Acquire the Change, Size and TimeModify attributes, as required.
+	 * This needs to be done for regular files if:
+	 * - non-NFSv4 RPCs or
+	 * - when attrbitp == NULL or
+	 * - an NFSv4 RPC with any of the above attributes in attrbitp.
+	 * A return of 0 for nfsrv_proxyds() indicates that it has acquired
+	 * these attributes.  nfsrv_proxyds() will return an error if the
+	 * server is not a pNFS one.
+	 */
+	gotattr = 0;
+	if (vp->v_type == VREG && (attrbitp == NULL ||
+	    (nd->nd_flag & ND_NFSV4) == 0 ||
+	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_CHANGE) ||
+	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_SIZE) ||
+	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_TIMEMODIFY))) {
+		error = nfsrv_proxyds(nd, vp, 0, 0, nd->nd_cred, p,
+		    NFSPROC_GETATTR, NULL, NULL, NULL, &na, NULL);
+		if (error == 0)
+			gotattr = 1;
+	}
+
+	error = VOP_GETATTR(vp, &nvap->na_vattr, nd->nd_cred);
 	if (lockedit != 0)
 		NFSVOPUNLOCK(vp, 0);
 
+	/*
+	 * If we got the Change, Size and Modify Time from the DS,
+	 * replace them.
+	 */
+	if (gotattr != 0) {
+		nvap->na_mtime = na.na_mtime;
+		nvap->na_filerev = na.na_filerev;
+		nvap->na_size = na.na_size;
+	}
+	NFSD_DEBUG(4, "nfsvno_getattr: gotattr=%d err=%d chg=%ju\n", gotattr,
+	    error, (uintmax_t)na.na_filerev);
+
 	NFSEXITCODE(error);
 	return (error);
 }
@@ -328,6 +423,17 @@ nfsvno_setattr(struct vnode *vp, struct nfsvattr *nvap
 	int error;
 
 	error = VOP_SETATTR(vp, &nvap->na_vattr, cred);
+	if (error == 0 && (nvap->na_vattr.va_uid != (uid_t)VNOVAL ||
+	    nvap->na_vattr.va_gid != (gid_t)VNOVAL ||
+	    nvap->na_vattr.va_size != VNOVAL ||
+	    nvap->na_vattr.va_mode != (mode_t)VNOVAL ||
+	    nvap->na_vattr.va_mtime.tv_sec != VNOVAL)) {
+		/* For a pNFS server, set the attributes on the DS file. */
+		error = nfsrv_proxyds(NULL, vp, 0, 0, cred, p, NFSPROC_SETATTR,
+		    NULL, NULL, NULL, nvap, NULL);
+		if (error == ENOENT)
+			error = 0;
+	}
 	NFSEXITCODE(error);
 	return (error);
 }
@@ -640,6 +746,15 @@ nfsvno_read(struct vnode *vp, off_t off, int cnt, stru
 	struct uio io, *uiop = &io;
 	struct nfsheur *nh;
 
+	/*
+	 * Attempt to read from a DS file. A return of ENOENT implies
+	 * there is no DS file to read.
+	 */
+	error = nfsrv_proxyds(NULL, vp, off, cnt, cred, p, NFSPROC_READDS, mpp,
+	    NULL, mpendp, NULL, NULL);
+	if (error != ENOENT)
+		return (error);
+
 	len = left = NFSM_RNDUP(cnt);
 	m3 = NULL;
 	/*
@@ -717,7 +832,7 @@ out:
  * Write vnode op from an mbuf list.
  */
 int
-nfsvno_write(struct vnode *vp, off_t off, int retlen, int cnt, int stable,
+nfsvno_write(struct vnode *vp, off_t off, int retlen, int cnt, int *stable,
     struct mbuf *mp, char *cp, struct ucred *cred, struct thread *p)
 {
 	struct iovec *ivp;
@@ -727,6 +842,17 @@ nfsvno_write(struct vnode *vp, off_t off, int retlen, 
 	struct uio io, *uiop = &io;
 	struct nfsheur *nh;
 
+	/*
+	 * Attempt to write to a DS file. A return of ENOENT implies
+	 * there is no DS file to write.
+	 */
+	error = nfsrv_proxyds(NULL, vp, off, retlen, cred, p, NFSPROC_WRITEDS,
+	    &mp, cp, NULL, NULL, NULL);
+	if (error != ENOENT) {
+		*stable = NFSWRITE_FILESYNC;
+		return (error);
+	}
+
 	MALLOC(ivp, struct iovec *, cnt * sizeof (struct iovec), M_TEMP,
 	    M_WAITOK);
 	uiop->uio_iov = iv = ivp;
@@ -750,7 +876,7 @@ nfsvno_write(struct vnode *vp, off_t off, int retlen, 
 		}
 	}
 
-	if (stable == NFSWRITE_UNSTABLE)
+	if (*stable == NFSWRITE_UNSTABLE)
 		ioflags = IO_NODELOCKED;
 	else
 		ioflags = (IO_SYNC | IO_NODELOCKED);
@@ -789,6 +915,16 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nam
 			vrele(ndp->ni_startdir);
 			error = VOP_CREATE(ndp->ni_dvp,
 			    &ndp->ni_vp, &ndp->ni_cnd, &nvap->na_vattr);
+			/* For a pNFS server, create the data file on a DS. */
+			if (error == 0 && nvap->na_type == VREG) {
+				/*
+				 * Create a data file on a DS for a pNFS server.
+				 * This function just returns if not
+				 * running a pNFS DS or the creation fails.
+				 */
+				nfsrv_pnfscreate(ndp->ni_vp, &nvap->na_vattr,
+				    nd->nd_cred, p);
+			}
 			vput(ndp->ni_dvp);
 			nfsvno_relpathbuf(ndp);
 			if (!error) {
@@ -1055,16 +1191,25 @@ int
 nfsvno_removesub(struct nameidata *ndp, int is_v4, struct ucred *cred,
     struct thread *p, struct nfsexstuff *exp)
 {
-	struct vnode *vp;
+	struct vnode *vp, *dsdvp;
+	fhandle_t fh;
 	int error = 0;
 
 	vp = ndp->ni_vp;
+	dsdvp = NULL;
 	if (vp->v_type == VDIR)
 		error = NFSERR_ISDIR;
 	else if (is_v4)
 		error = nfsrv_checkremove(vp, 1, p);
+	if (error == 0)
+		nfsrv_pnfsremovesetup(vp, p, &dsdvp, &fh);
 	if (!error)
 		error = VOP_REMOVE(ndp->ni_dvp, vp, &ndp->ni_cnd);
+	if (dsdvp != NULL) {
+		if (error == 0)
+			nfsrv_pnfsremove(dsdvp, &fh, p);
+		NFSVOPUNLOCK(dsdvp, 0);
+	}
 	if (ndp->ni_dvp == vp)
 		vrele(ndp->ni_dvp);
 	else
@@ -1124,9 +1269,11 @@ int
 nfsvno_rename(struct nameidata *fromndp, struct nameidata *tondp,
     u_int32_t ndstat, u_int32_t ndflag, struct ucred *cred, struct thread *p)
 {
-	struct vnode *fvp, *tvp, *tdvp;
+	struct vnode *fvp, *tvp, *tdvp, *dsdvp;
+	fhandle_t fh;
 	int error = 0;
 
+	dsdvp = NULL;
 	fvp = fromndp->ni_vp;
 	if (ndstat) {
 		vrele(fromndp->ni_dvp);
@@ -1201,6 +1348,11 @@ nfsvno_rename(struct nameidata *fromndp, struct nameid
 		 */
 		nfsd_recalldelegation(fvp, p);
 	}
+	if (error == 0 && tvp != NULL) {
+		nfsrv_pnfsremovesetup(tvp, p, &dsdvp, &fh);
+		NFSD_DEBUG(4, "nfsvno_rename: pnfsremovesetup"
+		    " dsdvp=%p\n", dsdvp);
+	}
 out:
 	if (!error) {
 		error = VOP_RENAME(fromndp->ni_dvp, fromndp->ni_vp,
@@ -1218,6 +1370,20 @@ out:
 		if (error == -1)
 			error = 0;
 	}
+
+	/*
+	 * If dsdvp != NULL, it was set up by nfsrv_pnfsremovesetup() and
+	 * if the rename succeeded, the DS file for the tvp needs to be
+	 * removed.
+	 */
+	if (dsdvp != NULL) {
+		if (error == 0) {
+			nfsrv_pnfsremove(dsdvp, &fh, p);
+			NFSD_DEBUG(4, "nfsvno_rename: pnfsremove\n");
+		}
+		NFSVOPUNLOCK(dsdvp, 0);
+	}
+
 	vrele(tondp->ni_startdir);
 	nfsvno_relpathbuf(tondp);
 out1:
@@ -1422,6 +1588,16 @@ nfsvno_open(struct nfsrv_descript *nd, struct nameidat
 			vrele(ndp->ni_startdir);
 			nd->nd_repstat = VOP_CREATE(ndp->ni_dvp,
 			    &ndp->ni_vp, &ndp->ni_cnd, &nvap->na_vattr);
+			/* For a pNFS server, create the data file on a DS. */
+			if (nd->nd_repstat == 0) {
+				/*
+				 * Create a data file on a DS for a pNFS server.
+				 * This function just returns if not
+				 * running a pNFS DS or the creation fails.
+				 */
+				nfsrv_pnfscreate(ndp->ni_vp, &nvap->na_vattr,
+				    cred, p);
+			}
 			vput(ndp->ni_dvp);
 			nfsvno_relpathbuf(ndp);
 			if (!nd->nd_repstat) {
@@ -1505,7 +1681,7 @@ nfsvno_open(struct nfsrv_descript *nd, struct nameidat
  */
 int
 nfsvno_updfilerev(struct vnode *vp, struct nfsvattr *nvap,
-    struct ucred *cred, struct thread *p)
+    struct nfsrv_descript *nd, struct thread *p)
 {
 	struct vattr va;
 
@@ -1516,8 +1692,8 @@ nfsvno_updfilerev(struct vnode *vp, struct nfsvattr *n
 		if ((vp->v_iflag & VI_DOOMED) != 0)
 			return (ESTALE);
 	}
-	(void) VOP_SETATTR(vp, &va, cred);
-	(void) nfsvno_getattr(vp, nvap, cred, p, 1);
+	(void) VOP_SETATTR(vp, &va, nd->nd_cred);
+	(void) nfsvno_getattr(vp, nvap, nd, p, 1, NULL);
 	return (0);
 }
 
@@ -1601,8 +1777,8 @@ nfsrvd_readdir(struct nfsrv_descript *nd, int isdgram,
 	siz = ((cnt + DIRBLKSIZ - 1) & ~(DIRBLKSIZ - 1));
 	fullsiz = siz;
 	if (nd->nd_flag & ND_NFSV3) {
-		nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd->nd_cred,
-		    p, 1);
+		nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd, p, 1,
+		    NULL);
 #if 0
 		/*
 		 * va_filerev is not sufficient as a cookie verifier,
@@ -1660,7 +1836,7 @@ again:
 	if (!cookies && !nd->nd_repstat)
 		nd->nd_repstat = NFSERR_PERM;
 	if (nd->nd_flag & ND_NFSV3) {
-		getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+		getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL);
 		if (!nd->nd_repstat)
 			nd->nd_repstat = getret;
 	}
@@ -1875,7 +2051,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdg
 		NFSZERO_ATTRBIT(&attrbits);
 	}
 	fullsiz = siz;
-	nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+	nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL);
 	if (!nd->nd_repstat) {
 	    if (off && verf != at.na_filerev) {
 		/*
@@ -1935,7 +2111,7 @@ again:
 	if (io.uio_resid)
 		siz -= io.uio_resid;
 
-	getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+	getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL);
 
 	if (!cookies && !nd->nd_repstat)
 		nd->nd_repstat = NFSERR_PERM;
@@ -2158,8 +2334,8 @@ again:
 					 NFSNONZERO_ATTRBIT(&attrbits))) {
 					r = nfsvno_getfh(nvp, &nfh, p);
 					if (!r)
-					    r = nfsvno_getattr(nvp, nvap,
-						nd->nd_cred, p, 1);
+					    r = nfsvno_getattr(nvp, nvap, nd, p,
+						1, &attrbits);
 					if (r == 0 && is_zfs == 1 &&
 					    nfsrv_enable_crossmntpt != 0 &&
 					    (nd->nd_flag & ND_NFSV4) != 0 &&
@@ -3067,8 +3243,10 @@ nfssvc_nfsd(struct thread *td, struct nfssvc_args *uap
 	struct file *fp;
 	struct nfsd_addsock_args sockarg;
 	struct nfsd_nfsd_args nfsdarg;
+	struct nfsd_nfsd_oargs onfsdarg;
 	cap_rights_t rights;
 	int error;
+	char *cp;
 
 	if (uap->flag & NFSSVC_NFSDADDSOCK) {
 		error = copyin(uap->argp, (caddr_t)&sockarg, sizeof (sockarg));
@@ -3095,11 +3273,69 @@ nfssvc_nfsd(struct thread *td, struct nfssvc_args *uap
 			error = EINVAL;
 			goto out;
 		}
-		error = copyin(uap->argp, (caddr_t)&nfsdarg,
-		    sizeof (nfsdarg));
+		if ((uap->flag & NFSSVC_NEWSTRUCT) == 0) {
+			error = copyin(uap->argp, &onfsdarg, sizeof(onfsdarg));
+			if (error == 0) {
+				nfsdarg.principal = onfsdarg.principal;
+				nfsdarg.minthreads = onfsdarg.minthreads;
+				nfsdarg.maxthreads = onfsdarg.maxthreads;
+				nfsdarg.version = 1;
+				nfsdarg.addr = NULL;
+				nfsdarg.addrlen = 0;
+				nfsdarg.dnshost = NULL;
+				nfsdarg.dnshostlen = 0;
+			}
+		} else
+			error = copyin(uap->argp, &nfsdarg, sizeof(nfsdarg));
 		if (error)
 			goto out;
+		if (nfsdarg.addrlen > 0 && nfsdarg.addrlen < 10000 &&
+		    nfsdarg.dnshostlen > 0 && nfsdarg.dnshostlen < 10000 &&
+		    nfsdarg.dspathlen > 0 && nfsdarg.dspathlen < 10000 &&
+		    nfsdarg.addr != NULL && nfsdarg.dnshost != NULL &&
+		    nfsdarg.dspath != NULL) {
+			NFSD_DEBUG(1, "addrlen=%d dspathlen=%d dnslen=%d\n",
+			    nfsdarg.addrlen, nfsdarg.dspathlen,
+			    nfsdarg.dnshostlen);
+			cp = malloc(nfsdarg.addrlen + 1, M_TEMP, M_WAITOK);
+			error = copyin(nfsdarg.addr, cp, nfsdarg.addrlen);
+			if (error != 0) {
+				free(cp, M_TEMP);
+				goto out;
+			}
+			cp[nfsdarg.addrlen] = '\0';	/* Ensure nul term. */
+			nfsdarg.addr = cp;
+			cp = malloc(nfsdarg.dnshostlen + 1, M_TEMP, M_WAITOK);
+			error = copyin(nfsdarg.dnshost, cp, nfsdarg.dnshostlen);
+			if (error != 0) {
+				free(nfsdarg.addr, M_TEMP);
+				free(cp, M_TEMP);
+				goto out;
+			}
+			cp[nfsdarg.dnshostlen] = '\0';	/* Ensure nul term. */
+			nfsdarg.dnshost = cp;
+			cp = malloc(nfsdarg.dspathlen + 1, M_TEMP, M_WAITOK);
+			error = copyin(nfsdarg.dspath, cp, nfsdarg.dspathlen);
+			if (error != 0) {
+				free(nfsdarg.addr, M_TEMP);
+				free(nfsdarg.dnshost, M_TEMP);
+				free(cp, M_TEMP);
+				goto out;
+			}
+			cp[nfsdarg.dspathlen] = '\0';	/* Ensure nul term. */
+			nfsdarg.dspath = cp;
+		} else {
+			nfsdarg.addr = NULL;
+			nfsdarg.addrlen = 0;
+			nfsdarg.dnshost = NULL;
+			nfsdarg.dnshostlen = 0;
+			nfsdarg.dspath = NULL;
+			nfsdarg.dspathlen = 0;
+		}
 		error = nfsrvd_nfsd(td, &nfsdarg);
+		free(nfsdarg.addr, M_TEMP);
+		free(nfsdarg.dnshost, M_TEMP);
+		free(nfsdarg.dspath, M_TEMP);
 	} else {
 		error = nfssvc_srvcall(td, uap, td->td_ucred);
 	}
@@ -3318,6 +3554,886 @@ nfsrv_backupstable(void)
 	}
 }
 
+/*
+ * Create a pNFS data file on a Data Server.
+ */
+static void
+nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, struct ucred *cred,
+    NFSPROC_T *p)
+{
+	struct vnode *dvp, *nvp;
+	struct nfsdevice *ds;
+	fhandle_t fh;
+	struct nameidata named;
+	char *bufp;
+	u_long *hashp;
+	struct mount *mp;
+	struct nfsnode *np;
+	struct nfsmount *nmp;
+	struct pnfsdsfile *pf;
+	struct pnfsdsattr dsattr;
+	struct vattr va;
+	uid_t vauid;
+	gid_t vagid;
+	u_short vamode;
+	struct ucred *tcred;
+	int error;
+	uint32_t dsdir;
+
+	/* Get a DS server directory in a round-robin order. */
+	NFSDDSLOCK();
+	ds = TAILQ_FIRST(&nfsrv_devidhead);
+	if (ds == NULL) {
+		NFSDDSUNLOCK();
+		NFSD_DEBUG(4, "nfsrv_pnfscreate: no srv\n");
+		return;
+	}
+	/* Put at end of list to implement round-robin usage. */
+	TAILQ_REMOVE(&nfsrv_devidhead, ds, nfsdev_list);
+	TAILQ_INSERT_TAIL(&nfsrv_devidhead, ds, nfsdev_list);
+	dsdir = ds->nfsdev_nextdir;
+	ds->nfsdev_nextdir = (ds->nfsdev_nextdir + 1) % nfsrv_dsdirsize;
+	dvp = ds->nfsdev_dsdir[dsdir];
+	NFSDDSUNLOCK();
+
+	error = nfsvno_getfh(vp, &fh, p);
+	if (error == 0)
+		error = VOP_GETATTR(vp, &va, cred);
+	if (error != 0) {
+		printf("pNFS: pnfscreate getfh+attr=%d\n", error);
+		return;
+	}
+
+	NFSD_DEBUG(4, "nfsrv_pnfscreate: cruid=%d crgid=%d uid=%d gid=%d\n",
+	    cred->cr_uid, cred->cr_gid, va.va_uid, va.va_gid);
+	/* Make date file name based on FH. */
+	tcred = newnfs_getcred();
+	NFSNAMEICNDSET(&named.ni_cnd, tcred, CREATE,
+	    LOCKPARENT | LOCKLEAF | SAVESTART | NOCACHE);
+	nfsvno_setpathbuf(&named, &bufp, &hashp);
+	named.ni_cnd.cn_lkflags = LK_EXCLUSIVE;
+	named.ni_cnd.cn_thread = p;
+	named.ni_cnd.cn_nameptr = bufp;
+	named.ni_cnd.cn_namelen = nfsrv_putfhname(&fh, bufp);
+
+	/* Create the date file in the DS mount. */
+	error = NFSVOPLOCK(dvp, LK_EXCLUSIVE);
+	if (error == 0) {
+		error = VOP_CREATE(dvp, &nvp, &named.ni_cnd, vap);
+		NFSVOPUNLOCK(dvp, 0);
+		if (error == 0) {
+			/* Set the ownership of the file. */
+			vauid = va.va_uid;
+			vagid = va.va_gid;
+			vamode = va.va_mode;
+			VATTR_NULL(&va);
+			va.va_uid = vauid;
+			va.va_gid = vagid;
+			va.va_mode = vamode;
+			error = VOP_SETATTR(nvp, &va, tcred);
+			NFSD_DEBUG(4, "nfsrv_pnfscreate: setattr-uid=%d\n",
+			    error);
+			if (error != 0)
+				vput(nvp);
+		}
+		if (error != 0)
+			printf("pNFS: pnfscreate failed=%d\n", error);
+	} else
+		printf("pNFS: pnfscreate vnlock=%d\n", error);
+	NFSFREECRED(tcred);
+	nfsvno_relpathbuf(&named);
+	if (error == 0) {
+		pf = NULL;
+		np = VTONFS(nvp);
+		nmp = VFSTONFS(nvp->v_mount);
+		if (strcmp(nvp->v_mount->mnt_vfc->vfc_name, "nfs") != 0 ||
+		    nmp->nm_nam->sa_len > sizeof(struct sockaddr_in6) ||
+		    np->n_fhp->nfh_len != NFSX_MYFH) {
+			printf("Bad DS file: fstype=%s salen=%d fhlen=%d\n",
+			    nvp->v_mount->mnt_vfc->vfc_name,
+			    nmp->nm_nam->sa_len, np->n_fhp->nfh_len);
+			error = ENOENT;
+		}
+
+		/* Get the attributes of the DS file. */
+		error = VOP_GETATTR(nvp, &va, cred);
+		/* Set extattrs for the DS on the MDS file. */
+		if (error == 0) {
+			dsattr.dsa_filerev = va.va_filerev;
+			dsattr.dsa_size = va.va_size;
+			dsattr.dsa_mtime = va.va_mtime;
+			pf = malloc(sizeof(*pf), M_TEMP, M_WAITOK | M_ZERO);
+			pf->dsf_dir = dsdir;
+			NFSBCOPY(np->n_fhp->nfh_fh, &pf->dsf_fh, NFSX_MYFH);
+			NFSBCOPY(nmp->nm_nam, &pf->dsf_sin,
+			    nmp->nm_nam->sa_len);
+			error = vn_start_write(vp, &mp, V_WAIT);
+		} else
+			printf("pNFS: pnfscreate can't get DS attr=%d\n",
+			    error);
+		if (error == 0) {
+			error = vn_extattr_set(vp, IO_NODELOCKED,
+			    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
+			    sizeof(*pf), (char *)pf, p);
+			if (error == 0)
+				error = vn_extattr_set(vp, IO_NODELOCKED,
+				    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsattr",
+				    sizeof(dsattr), (char *)&dsattr, p);
+			vn_finished_write(mp);
+			if (error != 0)
+				printf("pNFS: pnfscreate setextattr=%d\n",
+				    error);
+		} else
+			printf("pNFS: pnfscreate startwrite=%d\n", error);
+		vput(nvp);
+		free(pf, M_TEMP);
+	} else
+		printf("pNFS: pnfscreate=%d\n", error);
+}
+
+/*
+ * Get the information needed to remove the pNFS Data Server file from the
+ * Metadata file.  Upon success, ddvp is set non-NULL to the locked
+ * DS directory vnode.  The caller must unlock *ddvp when done with it.
+ */
+static void
+nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, struct vnode **dvpp,
+    fhandle_t *fhp)
+{
+	struct vnode *dvp;
+	struct nfsmount *nmp;
+	struct vattr va;
+	struct ucred *tcred;
+	char *buf;
+	int buflen, error;
+
+	*dvpp = NULL;
+	/* If not an exported regular file or not a pNFS server, just return. */
+	NFSDDSLOCK();
+	if (vp->v_type != VREG || (vp->v_mount->mnt_flag & MNT_EXPORTED) == 0 ||
+	    TAILQ_EMPTY(&nfsrv_devidhead)) {
+		NFSDDSUNLOCK();
+		return;
+	}
+	NFSDDSUNLOCK();
+
+	/* Check to see if this is the last hard link. */
+	tcred = newnfs_getcred();
+	error = VOP_GETATTR(vp, &va, tcred);
+	NFSFREECRED(tcred);
+	if (error != 0) {
+		printf("pNFS: nfsrv_pnfsremovesetup getattr=%d\n", error);
+		return;
+	}
+	if (va.va_nlink > 1)
+		return;
+
+	buflen = 1024;
+	buf = malloc(buflen, M_TEMP, M_WAITOK);
+	/* Get the directory vnode for the DS mount and the file handle. */
+	error = nfsrv_dsgetsockmnt(vp, LK_EXCLUSIVE, buf, buflen, p, &dvp,
+	    &nmp, NULL, NULL);
+	if (error == 0) {
+		error = nfsvno_getfh(vp, fhp, p);
+		if (error != 0) {
+			NFSVOPUNLOCK(dvp, 0);
+			printf("pNFS: nfsrv_pnfsremovesetup getfh=%d\n", error);
+		}
+	} else
+		printf("pNFS: nfsrv_pnfsremovesetup getsockmnt=%d\n", error);
+	free(buf, M_TEMP);
+	if (error == 0)
+		*dvpp = dvp;
+}
+
+/*
+ * Remove a pNFS data file from a Data Server.
+ * nfsrv_pnfsremovesetup() must have been called before the MDS file was
+ * removed to set up the dvp and fill in the FH.
+ */
+static void
+nfsrv_pnfsremove(struct vnode *dvp, fhandle_t *fhp, NFSPROC_T *p)
+{
+	struct vnode *nvp;
+	struct nameidata named;
+	struct ucred *tcred;
+	char *bufp;
+	u_long *hashp;
+	int error;
+
+	/* Look up the data file and remove it. */
+	tcred = newnfs_getcred();
+	named.ni_cnd.cn_nameiop = DELETE;
+	named.ni_cnd.cn_lkflags = LK_EXCLUSIVE | LK_RETRY;
+	named.ni_cnd.cn_cred = tcred;
+	named.ni_cnd.cn_thread = p;
+	named.ni_cnd.cn_flags = ISLASTCN | LOCKPARENT | LOCKLEAF | SAVENAME;
+	nfsvno_setpathbuf(&named, &bufp, &hashp);
+	named.ni_cnd.cn_nameptr = bufp;
+	named.ni_cnd.cn_namelen = nfsrv_putfhname(fhp, bufp);
+	NFSD_DEBUG(4, "nfsrv_pnfsremove: filename=%s\n", bufp);
+	error = VOP_LOOKUP(dvp, &nvp, &named.ni_cnd);
+	NFSD_DEBUG(4, "nfsrv_pnfsremove: aft LOOKUP=%d\n", error);
+	if (error == 0) {
+		error = VOP_REMOVE(dvp, nvp, &named.ni_cnd);
+		vput(nvp);
+	}
+	NFSFREECRED(tcred);
+	nfsvno_relpathbuf(&named);
+	if (error != 0)
+		printf("pNFS: nfsrv_pnfsremove failed=%d\n", error);
+}
+
+/*
+ * Generate a file name based on the file handle and put it in *bufp.
+ * Return the number of bytes generated.
+ */
+static int
+nfsrv_putfhname(fhandle_t *fhp, char *bufp)
+{
+	int i;
+	uint8_t *cp;
+	const uint8_t *hexdigits = "0123456789abcdef";
+
+	cp = (uint8_t *)fhp;
+	for (i = 0; i < sizeof(*fhp); i++) {
+		bufp[2 * i] = hexdigits[(*cp >> 4) & 0xf];
+		bufp[2 * i + 1] = hexdigits[*cp++ & 0xf];
+	}
+	bufp[2 * i] = '\0';
+	return (2 * i);
+}
+
+/*
+ * Update the Metadata file's attributes from the DS file when a Read/Write
+ * layout is returned.
+ * Basically just call nfsrv_proxyds() with procedure == NFSPROC_LAYOUTRETURN
+ * so that it does a nfsrv_getattrdsrpc() and nfsrv_setextattr() on the DS file.
+ */
+int
+nfsrv_updatemdsattr(struct vnode *vp, struct nfsvattr *nap, NFSPROC_T *p)
+{
+	struct ucred *tcred;
+	int error;
+
+	/* Do this as root so that it won't fail with EACCES. */
+	tcred = newnfs_getcred();
+	error = nfsrv_proxyds(NULL, vp, 0, 0, tcred, p, NFSPROC_LAYOUTRETURN,
+	    NULL, NULL, NULL, nap, NULL);
+	NFSFREECRED(tcred);
+	return (error);
+}
+
+/*
+ * Set the NFSv4 ACL on the DS file to the same ACL as the MDS file.
+ */
+int
+nfsrv_dssetacl(struct vnode *vp, struct acl *aclp, struct ucred *cred,
+    NFSPROC_T *p)
+{
+	int error;
+
+	error = nfsrv_proxyds(NULL, vp, 0, 0, cred, p, NFSPROC_SETACL,
+	    NULL, NULL, NULL, NULL, aclp);
+	return (error);
+}
+
+static int
+nfsrv_proxyds(struct nfsrv_descript *nd, struct vnode *vp, off_t off, int cnt,
+    struct ucred *cred, struct thread *p, int ioproc, struct mbuf **mpp,
+    char *cp, struct mbuf **mpp2, struct nfsvattr *nap, struct acl *aclp)
+{
+	struct nfsmount *nmp;
+	fhandle_t fh;
+	struct vnode *dvp;
+	struct pnfsdsattr dsattr;
+	char *buf;
+	int buflen, error;
+
+	NFSD_DEBUG(4, "in nfsrv_proxyds\n");
+	/*
+	 * If not a regular file, not exported or not a pNFS server,
+	 * just return ENOENT.
+	 */
+	NFSDDSLOCK();
+	if (vp->v_type != VREG || (vp->v_mount->mnt_flag & MNT_EXPORTED) == 0 ||
+	    TAILQ_EMPTY(&nfsrv_devidhead)) {
+		NFSDDSUNLOCK();
+		return (ENOENT);
+	}
+	NFSDDSUNLOCK();
+
+	buflen = 1024;
+	buf = malloc(buflen, M_TEMP, M_WAITOK);
+	error = 0;
+
+	/*
+	 * For Getattr, get the Change attribute (va_filerev) and size (va_size)
+	 * from the MetaData file's extended attribute.
+	 */
+	if (ioproc == NFSPROC_GETATTR) {
+		error = vn_extattr_get(vp, IO_NODELOCKED,
+		    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsattr", &buflen, buf,
+		    p);
+		if (error == 0 && buflen != sizeof(dsattr))
+			error = ENXIO;
+		if (error == 0) {
+			NFSBCOPY(buf, &dsattr, buflen);
+			nap->na_filerev = dsattr.dsa_filerev;
+			nap->na_size = dsattr.dsa_size;
+			nap->na_mtime = dsattr.dsa_mtime;
+		}
+
+		/*
+		 * If nfsrv_pnfsgetdsattr is 0 or nfsrv_checkdsattr() returns
+		 * 0, just return now.  nfsrv_checkdsattr() returns 0 if there
+		 * is no Read/Write layout + either an Open/Write_access or
+		 * Write delegation issued to a client for the file.
+		 */
+		if (nfsrv_pnfsgetdsattr == 0 || nfsrv_checkdsattr(nd, vp, p) ==
+		    0) {
+			free(buf, M_TEMP);
+			return (error);
+		}
+	}
+
+	if (error == 0) {
+		buflen = 1024;
+		error = nfsrv_dsgetsockmnt(vp, LK_SHARED, buf, buflen, p,
+		    &dvp, &nmp, &fh, NULL);
+		if (error != 0)
+			printf("pNFS: proxy getextattr sockaddr=%d\n", error);
+	} else
+		printf("pNFS: nfsrv_dsgetsockmnt=%d\n", error);
+	if (error == 0) {
+		if (ioproc == NFSPROC_READDS)
+			error = nfsrv_readdsrpc(&fh, off, cnt, cred, p, nmp,
+			    mpp, mpp2);
+		else if (ioproc == NFSPROC_WRITEDS)
+			error = nfsrv_writedsrpc(&fh, off, cnt, cred, p, vp,
+			    nmp, mpp, cp);
+		else if (ioproc == NFSPROC_SETATTR)
+			error = nfsrv_setattrdsrpc(&fh, cred, p, vp, nmp,
+			    nap);
+		else if (ioproc == NFSPROC_SETACL)
+			error = nfsrv_setacldsrpc(&fh, cred, p, vp, nmp,
+			    aclp);
+		else
+			error = nfsrv_getattrdsrpc(&fh, cred, p, vp, nmp,
+			    nap);
+		NFSVOPUNLOCK(dvp, 0);
+		NFSD_DEBUG(4, "nfsrv_proxyds: aft RPC=%d\n", error);
+	} else {
+		/* Return ENOENT for any Extended Attribute error. */
+		error = ENOENT;
+	}
+	free(buf, M_TEMP);
+	NFSD_DEBUG(4, "nfsrv_proxyds: error=%d\n", error);
+	return (error);
+}
+
+/*
+ * Get the DS mount point, fh and directory from the "pnfsd.dsfile" extended
+ * attribute.
+ */
+static int
+nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char *buf, int buflen,
+    NFSPROC_T *p, struct vnode **dvpp, struct nfsmount **nmpp, fhandle_t *fhp,
+    char *devid)
+{
+	struct vnode *dvp;
+	struct nfsmount *nmp;
+	struct sockaddr *sad;
+	struct nfsdevice *ds;
+	struct pnfsdsfile *pf;
+	uint32_t dsdir;
+	int error;
+
+	if (dvpp != NULL) {
+		*dvpp = NULL;
+		*nmpp = NULL;
+	}
+	error = vn_extattr_get(vp, IO_NODELOCKED, EXTATTR_NAMESPACE_SYSTEM,
+	    "pnfsd.dsfile", &buflen, buf, p);
+	if (error == 0 && buflen != sizeof(*pf))
+		error = ENOATTR;
+	if (error == 0) {
+		pf = (struct pnfsdsfile *)buf;
+		sad = (struct sockaddr *)&pf->dsf_sin;
+		dsdir = pf->dsf_dir;
+		if (dsdir >= nfsrv_dsdirsize) {
+			printf("nfsrv_dsgetsockmnt: dsdir=%d\n", dsdir);
+			error = ENOATTR;
+		}
+	}
+	if (error == 0) {
+		/* Use the socket address to find the mount point. */
+		NFSDDSLOCK();
+		TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) {
+			dvp = ds->nfsdev_dvp;
+			nmp = VFSTONFS(dvp->v_mount);
+			if (nfsaddr2_match(sad, nmp->nm_nam))
+				break;
+		}
+		NFSDDSUNLOCK();
+		if (ds != NULL) {
+			if (dvpp != NULL) {
+				dvp = ds->nfsdev_dsdir[dsdir];
+				if (error == 0)
+					error = vn_lock(dvp, lktype);
+			}
+			if (devid != NULL)
+				NFSBCOPY(ds->nfsdev_deviceid, devid,
+				    NFSX_V4DEVICEID);
+		} else
+			error = ENOENT;
+	}
+	if (error == 0) {
+		if (dvpp != NULL) {
+			*dvpp = dvp;
+			*nmpp = nmp;
+		}
+		if (fhp != NULL)
+			NFSBCOPY(&pf->dsf_fh, fhp, NFSX_MYFH);
+	} else
+		NFSD_DEBUG(4, "nfsrv_dsgetsockmnt err=%d\n", error);
+	return (error);
+}
+
+/*
+ * Set the extended attribute for the Change attribute.
+ */
+static int
+nfsrv_setextattr(struct vnode *vp, struct nfsvattr *nap, NFSPROC_T *p)
+{
+	struct pnfsdsattr dsattr;
+	struct mount *mp;
+	int error;
+
+	error = vn_start_write(vp, &mp, V_WAIT);
+	if (error == 0) {
+		dsattr.dsa_filerev = nap->na_filerev;
+		dsattr.dsa_size = nap->na_size;
+		dsattr.dsa_mtime = nap->na_mtime;
+		error = vn_extattr_set(vp, IO_NODELOCKED,
+		    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsattr",
+		    sizeof(dsattr), (char *)&dsattr, p);
+		vn_finished_write(mp);
+	}
+	if (error != 0)
+		printf("pNFS: setextattr=%d\n", error);
+	return (error);
+}
+
+static int
+nfsrv_readdsrpc(fhandle_t *fhp, off_t off, int len, struct ucred *cred,
+    NFSPROC_T *p, struct nfsmount *nmp, struct mbuf **mpp, struct mbuf **mpendp)
+{
+	uint32_t *tl;
+	struct nfsrv_descript nfsd, *nd = &nfsd;
+	nfsv4stateid_t st;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@freebsd.org  Sun Jun 11 20:27:40 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2B9E0B942BF
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Sun, 11 Jun 2017 20:27:40 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id C334A75AF0;
 Sun, 11 Jun 2017 20:27:39 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5BKRd0M071906;
 Sun, 11 Jun 2017 20:27:39 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5BKRdIG071904;
 Sun, 11 Jun 2017 20:27:39 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706112027.v5BKRdIG071904@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Sun, 11 Jun 2017 20:27:39 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319833 -
 projects/pnfs-planb-server-stable11/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 11 Jun 2017 20:27:40 -0000

Author: rmacklem
Date: Sun Jun 11 20:27:38 2017
New Revision: 319833
URL: https://svnweb.freebsd.org/changeset/base/319833

Log:
  Update some NFS server files with the pNFS code.

Modified:
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdsocket.c
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdsubs.c

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c	Sun Jun 11 20:18:18 2017	(r319832)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c	Sun Jun 11 20:27:38 2017	(r319833)
@@ -54,6 +54,11 @@ extern struct timeval nfsboottime;
 extern int nfs_rootfhset;
 extern int nfsrv_enable_crossmntpt;
 extern int nfsrv_statehashsize;
+extern int nfsrv_layouthashsize;
+extern time_t nfsdev_time;
+extern struct nfsdevicehead nfsrv_devidhead;
+extern int nfsd_debuglevel;
+extern u_long sb_max_adj;
 #endif	/* !APPLEKEXT */
 
 static int	nfs_async = 0;
@@ -151,7 +156,7 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int 
 	}
 	nfsmode &= supported;
 	if (nd->nd_flag & ND_NFSV3) {
-		getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		getret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
 		nfsrv_postopattr(nd, getret, &nva);
 	}
 	vput(vp);
@@ -235,14 +240,14 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
 		}
 	}
 	if (!nd->nd_repstat)
-		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, &attrbits);
 	if (!nd->nd_repstat) {
 		if (nd->nd_flag & ND_NFSV4) {
 			if (NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_FILEHANDLE))
 				nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
 			if (!nd->nd_repstat)
 				nd->nd_repstat = nfsrv_checkgetattr(nd, vp,
-				    &nva, &attrbits, nd->nd_cred, p);
+				    &nva, &attrbits, p);
 			if (nd->nd_repstat == 0) {
 				supports_nfsv4acls = nfs_supportsnfsv4acls(vp);
 				mp = vp->v_mount;
@@ -307,6 +312,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int
 	struct nfsvattr nva, nva2;
 	u_int32_t *tl;
 	int preat_ret = 1, postat_ret = 1, gcheck = 0, error = 0;
+	int gotproxystateid;
 	struct timespec guard = { 0, 0 };
 	nfsattrbit_t attrbits, retbits;
 	nfsv4stateid_t stateid;
@@ -320,19 +326,32 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int
 	aclp = acl_alloc(M_WAITOK);
 	aclp->acl_cnt = 0;
 #endif
+	gotproxystateid = 0;
 	NFSVNO_ATTRINIT(&nva);
-	NFSZERO_ATTRBIT(&retbits);
 	if (nd->nd_flag & ND_NFSV4) {
 		NFSM_DISSECT(tl, u_int32_t *, NFSX_STATEID);
 		stateid.seqid = fxdr_unsigned(u_int32_t, *tl++);
-		NFSBCOPY((caddr_t)tl,(caddr_t)stateid.other,NFSX_STATEIDOTHER);
+		stateid.other[0] = *tl++;
+		stateid.other[1] = *tl++;
+		stateid.other[2] = *tl;
+		if (stateid.other[0] == 0x55555555 &&
+		    stateid.other[1] == 0x55555555 &&
+		    stateid.other[2] == 0x55555555 &&
+		    stateid.seqid == 0xffffffff)
+			gotproxystateid = 1;
 	}
 	error = nfsrv_sattr(nd, vp, &nva, &attrbits, aclp, p);
 	if (error)
 		goto nfsmout;
-	preat_ret = nfsvno_getattr(vp, &nva2, nd->nd_cred, p, 1);
+
+	/* For NFSv4, only va_uid is used from nva2. */
+	NFSZERO_ATTRBIT(&retbits);
+	NFSSETBIT_ATTRBIT(&retbits, NFSATTRBIT_OWNER);
+	preat_ret = nfsvno_getattr(vp, &nva2, nd, p, 1, &retbits);
 	if (!nd->nd_repstat)
 		nd->nd_repstat = preat_ret;
+
+	NFSZERO_ATTRBIT(&retbits);
 	if (nd->nd_flag & ND_NFSV3) {
 		NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
 		gcheck = fxdr_unsigned(int, *tl);
@@ -376,7 +395,12 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int
 				    NFSACCCHK_VPISLOCKED, NULL);
 		}
 	}
-	if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4))
+	/*
+	 * Proxy operations from the MDS are allowed via the all 0s special
+	 * stateid.
+	 */
+	if (nd->nd_repstat == 0 && (nd->nd_flag & ND_NFSV4) != 0 &&
+	    gotproxystateid == 0)
 		nd->nd_repstat = nfsrv_checksetattr(vp, nd, &stateid,
 		    &nva, &attrbits, exp, p);
 
@@ -450,7 +474,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int
 		    exp);
 	}
 	if (nd->nd_flag & (ND_NFSV2 | ND_NFSV3)) {
-		postat_ret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		postat_ret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
 		if (!nd->nd_repstat)
 			nd->nd_repstat = postat_ret;
 	}
@@ -534,8 +558,8 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int 
 	if (nd->nd_repstat) {
 		if (dirp) {
 			if (nd->nd_flag & ND_NFSV3)
-				dattr_ret = nfsvno_getattr(dirp, &dattr,
-				    nd->nd_cred, p, 0);
+				dattr_ret = nfsvno_getattr(dirp, &dattr, nd, p,
+				    0, NULL);
 			vrele(dirp);
 		}
 		if (nd->nd_flag & ND_NFSV3)
@@ -556,15 +580,15 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int 
 	if (nd->nd_repstat == 0)
 		nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
 	if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
-		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
 	if (vpp != NULL && nd->nd_repstat == 0)
 		*vpp = vp;
 	else
 		vput(vp);
 	if (dirp) {
 		if (nd->nd_flag & ND_NFSV3)
-			dattr_ret = nfsvno_getattr(dirp, &dattr, nd->nd_cred,
-			    p, 0);
+			dattr_ret = nfsvno_getattr(dirp, &dattr, nd, p, 0,
+			    NULL);
 		vrele(dirp);
 	}
 	if (nd->nd_repstat) {
@@ -612,7 +636,7 @@ nfsrvd_readlink(struct nfsrv_descript *nd, __unused in
 		nd->nd_repstat = nfsvno_readlink(vp, nd->nd_cred, p,
 		    &mp, &mpend, &len);
 	if (nd->nd_flag & ND_NFSV3)
-		getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		getret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
 	vput(vp);
 	if (nd->nd_flag & ND_NFSV3)
 		nfsrv_postopattr(nd, getret, &nva);
@@ -637,7 +661,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int is
     vnode_t vp, NFSPROC_T *p, struct nfsexstuff *exp)
 {
 	u_int32_t *tl;
-	int error = 0, cnt, getret = 1, reqlen, eof = 0;
+	int error = 0, cnt, getret = 1, gotproxystateid, reqlen, eof = 0;
 	mbuf_t m2, m3;
 	struct nfsvattr nva;
 	off_t off = 0x0;
@@ -669,6 +693,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int is
 		error = EBADRPC;
 		goto nfsmout;
 	}
+	gotproxystateid = 0;
 	if (nd->nd_flag & ND_NFSV4) {
 		stp->ls_flags = (NFSLCK_CHECK | NFSLCK_READACCESS);
 		lop->lo_flags = NFSLCK_READ;
@@ -690,6 +715,24 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int is
 			nd->nd_clientid.qval = clientid.qval;
 		}
 		stp->ls_stateid.other[2] = *tl++;
+		/*
+		 * Don't allow the client to use a special stateid for a DS op.
+		 */
+		if ((nd->nd_flag & ND_DSSERVER) != 0 &&
+		    ((stp->ls_stateid.other[0] == 0x0 &&
+		    stp->ls_stateid.other[1] == 0x0 &&
+		    stp->ls_stateid.other[2] == 0x0) ||
+		    (stp->ls_stateid.other[0] == 0xffffffff &&
+		    stp->ls_stateid.other[1] == 0xffffffff &&
+		    stp->ls_stateid.other[2] == 0xffffffff) ||
+		    stp->ls_stateid.seqid != 0))
+			nd->nd_repstat = NFSERR_BADSTATEID;
+		/* However, allow the proxy stateid. */
+		if (stp->ls_stateid.seqid == 0xffffffff &&
+		    stp->ls_stateid.other[0] == 0x55555555 &&
+		    stp->ls_stateid.other[1] == 0x55555555 &&
+		    stp->ls_stateid.other[2] == 0x55555555)
+			gotproxystateid = 1;
 		off = fxdr_hyper(tl);
 		lop->lo_first = off;
 		tl += 2;
@@ -707,7 +750,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int is
 			nd->nd_repstat = (vnode_vtype(vp) == VDIR) ? EISDIR :
 			    EINVAL;
 	}
-	getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+	getret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
 	if (!nd->nd_repstat)
 		nd->nd_repstat = getret;
 	if (!nd->nd_repstat &&
@@ -721,7 +764,12 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int is
 			    nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
 			    NFSACCCHK_VPISLOCKED, NULL);
 	}
-	if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
+	/*
+	 * DS reads are marked by ND_DSSERVER or use the proxy special
+	 * stateid.
+	 */
+	if (nd->nd_repstat == 0 && (nd->nd_flag & (ND_NFSV4 | ND_DSSERVER)) ==
+	    ND_NFSV4 && gotproxystateid == 0)
 		nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
 		    &stateid, exp, nd, p);
 	if (nd->nd_repstat) {
@@ -745,7 +793,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int is
 		nd->nd_repstat = nfsvno_read(vp, off, cnt, nd->nd_cred, p,
 		    &m3, &m2);
 		if (!(nd->nd_flag & ND_NFSV4)) {
-			getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+			getret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
 			if (!nd->nd_repstat)
 				nd->nd_repstat = getret;
 		}
@@ -802,17 +850,19 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int i
 	mbuf_t mp;
 	struct nfsvattr nva, forat;
 	int aftat_ret = 1, retlen, len, error = 0, forat_ret = 1;
-	int stable = NFSWRITE_FILESYNC;
+	int gotproxystateid, stable = NFSWRITE_FILESYNC;
 	off_t off;
 	struct nfsstate st, *stp = &st;
 	struct nfslock lo, *lop = &lo;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
+	nfsattrbit_t attrbits;
 
 	if (nd->nd_repstat) {
 		nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
 		goto out;
 	}
+	gotproxystateid = 0;
 	if (nd->nd_flag & ND_NFSV2) {
 		NFSM_DISSECT(tl, u_int32_t *, 4 * NFSX_UNSIGNED);
 		off = (off_t)fxdr_unsigned(u_int32_t, *++tl);
@@ -846,6 +896,24 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int i
 			nd->nd_clientid.qval = clientid.qval;
 		}
 		stp->ls_stateid.other[2] = *tl++;
+		/*
+		 * Don't allow the client to use a special stateid for a DS op.
+		 */
+		if ((nd->nd_flag & ND_DSSERVER) != 0 &&
+		    ((stp->ls_stateid.other[0] == 0x0 &&
+		    stp->ls_stateid.other[1] == 0x0 &&
+		    stp->ls_stateid.other[2] == 0x0) ||
+		    (stp->ls_stateid.other[0] == 0xffffffff &&
+		    stp->ls_stateid.other[1] == 0xffffffff &&
+		    stp->ls_stateid.other[2] == 0xffffffff) ||
+		    stp->ls_stateid.seqid != 0))
+			nd->nd_repstat = NFSERR_BADSTATEID;
+		/* However, allow the proxy stateid. */
+		if (stp->ls_stateid.seqid == 0xffffffff &&
+		    stp->ls_stateid.other[0] == 0x55555555 &&
+		    stp->ls_stateid.other[1] == 0x55555555 &&
+		    stp->ls_stateid.other[2] == 0x55555555)
+			gotproxystateid = 1;
 		off = fxdr_hyper(tl);
 		lop->lo_first = off;
 		tl += 2;
@@ -891,7 +959,9 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int i
 			nd->nd_repstat = (vnode_vtype(vp) == VDIR) ? EISDIR :
 			    EINVAL;
 	}
-	forat_ret = nfsvno_getattr(vp, &forat, nd->nd_cred, p, 1);
+	NFSZERO_ATTRBIT(&attrbits);
+	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_OWNER);
+	forat_ret = nfsvno_getattr(vp, &forat, nd, p, 1, &attrbits);
 	if (!nd->nd_repstat)
 		nd->nd_repstat = forat_ret;
 	if (!nd->nd_repstat &&
@@ -900,10 +970,14 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int i
 		nd->nd_repstat = nfsvno_accchk(vp, VWRITE,
 		    nd->nd_cred, exp, p,
 		    NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED, NULL);
-	if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
+	/*
+	 * DS reads are marked by ND_DSSERVER or use the proxy special
+	 * stateid.
+	 */
+	if (nd->nd_repstat == 0 && (nd->nd_flag & (ND_NFSV4 | ND_DSSERVER)) ==
+	    ND_NFSV4 && gotproxystateid == 0)
 		nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
 		    &stateid, exp, nd, p);
-	}
 	if (nd->nd_repstat) {
 		vput(vp);
 		if (nd->nd_flag & ND_NFSV3)
@@ -917,7 +991,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int i
 	 * which is to return ok so long as there are no permission problems.
 	 */
 	if (retlen > 0) {
-		nd->nd_repstat = nfsvno_write(vp, off, retlen, cnt, stable,
+		nd->nd_repstat = nfsvno_write(vp, off, retlen, cnt, &stable,
 		    nd->nd_md, nd->nd_dpos, nd->nd_cred, p);
 		error = nfsm_advance(nd, NFSM_RNDUP(retlen), -1);
 		if (error)
@@ -926,7 +1000,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int i
 	if (nd->nd_flag & ND_NFSV4)
 		aftat_ret = 0;
 	else
-		aftat_ret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		aftat_ret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
 	vput(vp);
 	if (!nd->nd_repstat)
 		nd->nd_repstat = aftat_ret;
@@ -1048,8 +1122,8 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int 
 	if (nd->nd_repstat) {
 		nfsvno_relpathbuf(&named);
 		if (nd->nd_flag & ND_NFSV3) {
-			dirfor_ret = nfsvno_getattr(dp, &dirfor, nd->nd_cred,
-			    p, 1);
+			dirfor_ret = nfsvno_getattr(dp, &dirfor, nd, p, 1,
+			    NULL);
 			nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
 			    &diraft);
 		}
@@ -1063,8 +1137,8 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int 
 			vrele(dirp);
 			dirp = NULL;
 		} else {
-			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
-			    p, 0);
+			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0,
+			    NULL);
 		}
 	}
 	if (nd->nd_repstat) {
@@ -1102,8 +1176,8 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int 
 	if (!nd->nd_repstat) {
 		nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
 		if (!nd->nd_repstat)
-			nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
-			    p, 1);
+			nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1,
+			    NULL);
 		vput(vp);
 		if (!nd->nd_repstat) {
 			tverf[0] = nva.na_atime.tv_sec;
@@ -1119,7 +1193,7 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int 
 		if (exclusive_flag && !nd->nd_repstat && (cverf[0] != tverf[0]
 		    || cverf[1] != tverf[1]))
 			nd->nd_repstat = EEXIST;
-		diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
+		diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0, NULL);
 		vrele(dirp);
 		if (!nd->nd_repstat) {
 			(void) nfsm_fhtom(nd, (u_int8_t *)&fh, 0, 1);
@@ -1229,7 +1303,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int i
 		}
 	}
 
-	dirfor_ret = nfsvno_getattr(dp, &dirfor, nd->nd_cred, p, 0);
+	dirfor_ret = nfsvno_getattr(dp, &dirfor, nd, p, 0, NULL);
 	if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4)) {
 		if (!dirfor_ret && NFSVNO_ISSETGID(&nva) &&
 		    dirfor.na_gid == nva.na_gid)
@@ -1267,8 +1341,8 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int i
 	if (nd->nd_repstat) {
 		if (dirp) {
 			if (nd->nd_flag & ND_NFSV3)
-				dirfor_ret = nfsvno_getattr(dirp, &dirfor,
-				    nd->nd_cred, p, 0);
+				dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd,
+				    p, 0, NULL);
 			vrele(dirp);
 		}
 #ifdef NFS4_ACL_EXTATTR_NAME
@@ -1280,7 +1354,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int i
 		goto out;
 	}
 	if (dirp)
-		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
+		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0, NULL);
 
 	if ((nd->nd_flag & ND_NFSV4) && (vtyp == VDIR || vtyp == VLNK)) {
 		if (vtyp == VDIR) {
@@ -1309,8 +1383,8 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int i
 		nfsrv_fixattr(nd, vp, &nva, aclp, p, &attrbits, exp);
 		nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
 		if ((nd->nd_flag & ND_NFSV3) && !nd->nd_repstat)
-			nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
-			    p, 1);
+			nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1,
+			    NULL);
 		if (vpp != NULL && nd->nd_repstat == 0) {
 			NFSVOPUNLOCK(vp, 0);
 			*vpp = vp;
@@ -1318,7 +1392,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int i
 			vput(vp);
 	}
 
-	diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
+	diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0, NULL);
 	vrele(dirp);
 	if (!nd->nd_repstat) {
 		if (nd->nd_flag & ND_NFSV3) {
@@ -1392,8 +1466,8 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int 
 	}
 	if (dirp) {
 		if (!(nd->nd_flag & ND_NFSV2)) {
-			dirfor_ret = nfsvno_getattr(dirp, &dirfor,
-			    nd->nd_cred, p, 0);
+			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0,
+			    NULL);
 		} else {
 			vrele(dirp);
 			dirp = NULL;
@@ -1417,8 +1491,8 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int 
 	}
 	if (!(nd->nd_flag & ND_NFSV2)) {
 		if (dirp) {
-			diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred,
-			    p, 0);
+			diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0,
+			    NULL);
 			vrele(dirp);
 		}
 		if (nd->nd_flag & ND_NFSV3) {
@@ -1464,7 +1538,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
 		goto out;
 	}
 	if (!(nd->nd_flag & ND_NFSV2))
-		fdirfor_ret = nfsvno_getattr(dp, &fdirfor, nd->nd_cred, p, 1);
+		fdirfor_ret = nfsvno_getattr(dp, &fdirfor, nd, p, 1, NULL);
 	tond.ni_cnd.cn_nameiop = 0;
 	tond.ni_startdir = NULL;
 	NFSNAMEICNDSET(&fromnd.ni_cnd, nd->nd_cred, DELETE, WANTPARENT | SAVESTART);
@@ -1487,11 +1561,12 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
 		tnes = *toexp;
 		if (dp != tdp) {
 			NFSVOPUNLOCK(dp, 0);
-			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
-			    p, 0);	/* Might lock tdp. */
+			/* Might lock tdp. */
+			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd, p, 0,
+			    NULL);
 		} else {
-			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
-			    p, 1);
+			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd, p, 1,
+			    NULL);
 			NFSVOPUNLOCK(dp, 0);
 		}
 	} else {
@@ -1512,8 +1587,8 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
 			VREF(dp);
 			tdp = dp;
 			tnes = *exp;
-			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
-			    p, 1);
+			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd, p, 1,
+			    NULL);
 			NFSVOPUNLOCK(dp, 0);
 		} else {
 			NFSVOPUNLOCK(dp, 0);
@@ -1521,8 +1596,8 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
 			nfsd_fhtovp(nd, &tfh, LK_EXCLUSIVE, &tdp, &tnes, NULL,
 			    0, p);	/* Locks tdp. */
 			if (tdp) {
-				tdirfor_ret = nfsvno_getattr(tdp, &tdirfor,
-				    nd->nd_cred, p, 1);
+				tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd,
+				    p, 1, NULL);
 				NFSVOPUNLOCK(tdp, 0);
 			}
 		}
@@ -1579,11 +1654,9 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
 	nd->nd_repstat = nfsvno_rename(&fromnd, &tond, nd->nd_repstat,
 	    nd->nd_flag, nd->nd_cred, p);
 	if (fdirp)
-		fdiraft_ret = nfsvno_getattr(fdirp, &fdiraft, nd->nd_cred, p,
-		    0);
+		fdiraft_ret = nfsvno_getattr(fdirp, &fdiraft, nd, p, 0, NULL);
 	if (tdirp)
-		tdiraft_ret = nfsvno_getattr(tdirp, &tdiraft, nd->nd_cred, p,
-		    0);
+		tdiraft_ret = nfsvno_getattr(tdirp, &tdiraft, nd, p, 0, NULL);
 	if (fdirp)
 		vrele(fdirp);
 	if (tdirp)
@@ -1684,16 +1757,16 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
 			vrele(dirp);
 			dirp = NULL;
 		} else {
-			dirfor_ret = nfsvno_getattr(dirp, &dirfor,
-			    nd->nd_cred, p, 0);
+			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0,
+			    NULL);
 		}
 	}
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsvno_link(&named, vp, nd->nd_cred, p, exp);
 	if (nd->nd_flag & ND_NFSV3)
-		getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 0);
+		getret = nfsvno_getattr(vp, &at, nd, p, 0, NULL);
 	if (dirp) {
-		diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
+		diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0, NULL);
 		vrele(dirp);
 	}
 	vrele(vp);
@@ -1763,13 +1836,13 @@ nfsrvd_symlink(struct nfsrv_descript *nd, __unused int
 	 */
 	if (!nd->nd_repstat) {
 		if (dirp != NULL)
-			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
-			    p, 0);
+			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0,
+			    NULL);
 		nfsrvd_symlinksub(nd, &named, &nva, fhp, vpp, dirp,
 		    &dirfor, &diraft, &diraft_ret, NULL, NULL, p, exp,
 		    pathcp, pathlen);
 	} else if (dirp != NULL) {
-		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
+		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0, NULL);
 		vrele(dirp);
 	}
 	if (pathcp)
@@ -1809,7 +1882,7 @@ nfsrvd_symlinksub(struct nfsrv_descript *nd, struct na
 			nd->nd_repstat = nfsvno_getfh(ndp->ni_vp, fhp, p);
 			if (!nd->nd_repstat)
 				nd->nd_repstat = nfsvno_getattr(ndp->ni_vp,
-				    nvap, nd->nd_cred, p, 1);
+				    nvap, nd, p, 1, NULL);
 		}
 		if (vpp != NULL && nd->nd_repstat == 0) {
 			NFSVOPUNLOCK(ndp->ni_vp, 0);
@@ -1818,7 +1891,7 @@ nfsrvd_symlinksub(struct nfsrv_descript *nd, struct na
 			vput(ndp->ni_vp);
 	}
 	if (dirp) {
-		*diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p, 0);
+		*diraft_retp = nfsvno_getattr(dirp, diraftp, nd, p, 0, NULL);
 		vrele(dirp);
 	}
 	if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
@@ -1882,8 +1955,8 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int i
 	}
 	if (nd->nd_repstat) {
 		if (dirp != NULL) {
-			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
-			    p, 0);
+			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0,
+			    NULL);
 			vrele(dirp);
 		}
 		if (nd->nd_flag & ND_NFSV3)
@@ -1892,7 +1965,7 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int i
 		goto out;
 	}
 	if (dirp != NULL)
-		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
+		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0, NULL);
 
 	/*
 	 * Call nfsrvd_mkdirsub() for the code common to V4 as well.
@@ -1942,8 +2015,8 @@ nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct name
 		nfsrv_fixattr(nd, vp, nvap, aclp, p, attrbitp, exp);
 		nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
 		if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
-			nd->nd_repstat = nfsvno_getattr(vp, nvap, nd->nd_cred,
-			    p, 1);
+			nd->nd_repstat = nfsvno_getattr(vp, nvap, nd, p, 1,
+			    NULL);
 		if (vpp && !nd->nd_repstat) {
 			NFSVOPUNLOCK(vp, 0);
 			*vpp = vp;
@@ -1952,7 +2025,7 @@ nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct name
 		}
 	}
 	if (dirp) {
-		*diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p, 0);
+		*diraft_retp = nfsvno_getattr(dirp, diraftp, nd, p, 0, NULL);
 		vrele(dirp);
 	}
 	if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
@@ -2002,10 +2075,10 @@ nfsrvd_commit(struct nfsrv_descript *nd, __unused int 
 	tl += 2;
 	cnt = fxdr_unsigned(int, *tl);
 	if (nd->nd_flag & ND_NFSV3)
-		for_ret = nfsvno_getattr(vp, &bfor, nd->nd_cred, p, 1);
+		for_ret = nfsvno_getattr(vp, &bfor, nd, p, 1, NULL);
 	nd->nd_repstat = nfsvno_fsync(vp, off, cnt, nd->nd_cred, p);
 	if (nd->nd_flag & ND_NFSV3) {
-		aft_ret = nfsvno_getattr(vp, &aft, nd->nd_cred, p, 1);
+		aft_ret = nfsvno_getattr(vp, &aft, nd, p, 1, NULL);
 		nfsrv_wcc(nd, for_ret, &bfor, aft_ret, &aft);
 	}
 	vput(vp);
@@ -2044,7 +2117,7 @@ nfsrvd_statfs(struct nfsrv_descript *nd, __unused int 
 	}
 	sf = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK);
 	nd->nd_repstat = nfsvno_statfs(vp, sf);
-	getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+	getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL);
 	vput(vp);
 	if (nd->nd_flag & ND_NFSV3)
 		nfsrv_postopattr(nd, getret, &at);
@@ -2099,7 +2172,7 @@ nfsrvd_fsinfo(struct nfsrv_descript *nd, int isdgram,
 		nfsrv_postopattr(nd, getret, &at);
 		goto out;
 	}
-	getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+	getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL);
 	nfsvno_getfs(&fs, isdgram);
 	vput(vp);
 	nfsrv_postopattr(nd, getret, &at);
@@ -2149,7 +2222,7 @@ nfsrvd_pathconf(struct nfsrv_descript *nd, __unused in
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsvno_pathconf(vp, _PC_NO_TRUNC, &notrunc,
 		    nd->nd_cred, p);
-	getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+	getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL);
 	vput(vp);
 	nfsrv_postopattr(nd, getret, &at);
 	if (!nd->nd_repstat) {
@@ -2232,6 +2305,25 @@ nfsrvd_lock(struct nfsrv_descript *nd, __unused int is
 		NFSBCOPY((caddr_t)tl, (caddr_t)stp->ls_stateid.other,
 			NFSX_STATEIDOTHER);
 		tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+
+		/*
+		 * For the special stateid of other all 0s and seqid == 1, set
+		 * the stateid to the current stateid, if it is set.
+		 */
+		if ((nd->nd_flag & ND_NFSV41) != 0 &&
+		    stp->ls_stateid.seqid == 1 &&
+		    stp->ls_stateid.other[0] == 0 &&
+		    stp->ls_stateid.other[1] == 0 &&
+		    stp->ls_stateid.other[2] == 0) {
+			if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+				stp->ls_stateid = nd->nd_curstateid;
+				stp->ls_stateid.seqid = 0;
+			} else {
+				nd->nd_repstat = NFSERR_BADSTATEID;
+				goto nfsmout;
+			}
+		}
+
 		stp->ls_opentolockseq = fxdr_unsigned(int, *tl++);
 		clientid.lval[0] = *tl++;
 		clientid.lval[1] = *tl++;
@@ -2259,6 +2351,25 @@ nfsrvd_lock(struct nfsrv_descript *nd, __unused int is
 		NFSBCOPY((caddr_t)tl, (caddr_t)stp->ls_stateid.other,
 			NFSX_STATEIDOTHER);
 		tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+
+		/*
+		 * For the special stateid of other all 0s and seqid == 1, set
+		 * the stateid to the current stateid, if it is set.
+		 */
+		if ((nd->nd_flag & ND_NFSV41) != 0 &&
+		    stp->ls_stateid.seqid == 1 &&
+		    stp->ls_stateid.other[0] == 0 &&
+		    stp->ls_stateid.other[1] == 0 &&
+		    stp->ls_stateid.other[2] == 0) {
+			if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+				stp->ls_stateid = nd->nd_curstateid;
+				stp->ls_stateid.seqid = 0;
+			} else {
+				nd->nd_repstat = NFSERR_BADSTATEID;
+				goto nfsmout;
+			}
+		}
+
 		stp->ls_seq = fxdr_unsigned(int, *tl);
 		clientid.lval[0] = stp->ls_stateid.other[0];
 		clientid.lval[1] = stp->ls_stateid.other[1];
@@ -2325,6 +2436,11 @@ nfsrvd_lock(struct nfsrv_descript *nd, __unused int is
 	if (stp)
 		FREE((caddr_t)stp, M_NFSDSTATE);
 	if (!nd->nd_repstat) {
+		/* For NFSv4.1, set the Current StateID. */
+		if ((nd->nd_flag & ND_NFSV41) != 0) {
+			nd->nd_curstateid = stateid;
+			nd->nd_flag |= ND_CURSTATEID;
+		}
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
 		NFSBCOPY((caddr_t)stateid.other,(caddr_t)tl,NFSX_STATEIDOTHER);
@@ -2518,6 +2634,23 @@ nfsrvd_locku(struct nfsrv_descript *nd, __unused int i
 	NFSBCOPY((caddr_t)tl, (caddr_t)stp->ls_stateid.other,
 	    NFSX_STATEIDOTHER);
 	tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if ((nd->nd_flag & ND_NFSV41) != 0 && stp->ls_stateid.seqid == 1 &&
+	    stp->ls_stateid.other[0] == 0 && stp->ls_stateid.other[1] == 0 &&
+	    stp->ls_stateid.other[2] == 0) {
+		if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+			stp->ls_stateid = nd->nd_curstateid;
+			stp->ls_stateid.seqid = 0;
+		} else {
+			nd->nd_repstat = NFSERR_BADSTATEID;
+			goto nfsmout;
+		}
+	}
+
 	lop->lo_first = fxdr_hyper(tl);
 	tl += 2;
 	len = fxdr_hyper(tl);
@@ -2697,7 +2830,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int is
 	NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
 	create = fxdr_unsigned(int, *tl);
 	if (!nd->nd_repstat)
-		nd->nd_repstat = nfsvno_getattr(dp, &dirfor, nd->nd_cred, p, 0);
+		nd->nd_repstat = nfsvno_getattr(dp, &dirfor, nd, p, 0, NULL);
 	if (create == NFSV4OPEN_CREATE) {
 		nva.na_type = VREG;
 		nva.na_mode = 0;
@@ -2896,7 +3029,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int is
 	}
 
 	if (!nd->nd_repstat) {
-		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
 		if (!nd->nd_repstat) {
 			tverf[0] = nva.na_atime.tv_sec;
 			tverf[1] = nva.na_atime.tv_nsec;
@@ -2922,9 +3055,13 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int is
 	if (stp)
 		FREE((caddr_t)stp, M_NFSDSTATE);
 	if (!nd->nd_repstat && dirp)
-		nd->nd_repstat = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p,
-		    0);
+		nd->nd_repstat = nfsvno_getattr(dirp, &diraft, nd, p, 0, NULL);
 	if (!nd->nd_repstat) {
+		/* For NFSv4.1, set the Current StateID. */
+		if ((nd->nd_flag & ND_NFSV41) != 0) {
+			nd->nd_curstateid = stateid;
+			nd->nd_flag |= ND_CURSTATEID;
+		}
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID + 6 * NFSX_UNSIGNED);
 		*tl++ = txdr_unsigned(stateid.seqid);
 		NFSBCOPY((caddr_t)stateid.other,(caddr_t)tl,NFSX_STATEIDOTHER);
@@ -3024,9 +3161,10 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 {
 	u_int32_t *tl;
 	struct nfsstate st, *stp = &st;
-	int error = 0;
+	int error = 0, writeacc;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
+	struct nfsvattr na;
 
 	NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED + NFSX_STATEID);
 	stp->ls_seq = fxdr_unsigned(u_int32_t, *tl++);
@@ -3036,6 +3174,22 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 	stp->ls_stateid.seqid = fxdr_unsigned(u_int32_t, *tl++);
 	NFSBCOPY((caddr_t)tl, (caddr_t)stp->ls_stateid.other,
 	    NFSX_STATEIDOTHER);
+
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if ((nd->nd_flag & ND_NFSV41) != 0 && stp->ls_stateid.seqid == 1 &&
+	    stp->ls_stateid.other[0] == 0 && stp->ls_stateid.other[1] == 0 &&
+	    stp->ls_stateid.other[2] == 0) {
+		if ((nd->nd_flag & ND_CURSTATEID) != 0)
+			stp->ls_stateid = nd->nd_curstateid;
+		else {
+			nd->nd_repstat = NFSERR_BADSTATEID;
+			goto nfsmout;
+		}
+	}
+
 	stp->ls_flags = NFSLCK_CLOSE;
 	clientid.lval[0] = stp->ls_stateid.other[0];
 	clientid.lval[1] = stp->ls_stateid.other[1];
@@ -3050,9 +3204,22 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
+	    &writeacc);
+	/* For pNFS, update the attributes. */
+	if (writeacc != 0)
+		nfsrv_updatemdsattr(vp, &na, p);
 	vput(vp);
 	if (!nd->nd_repstat) {
+		/*
+		 * If the stateid that has been closed is the current stateid,
+		 * unset it.
+		 */
+		if ((nd->nd_flag & ND_CURSTATEID) != 0 &&
+		    stateid.other[0] == nd->nd_curstateid.other[0] &&
+		    stateid.other[1] == nd->nd_curstateid.other[1] &&
+		    stateid.other[2] == nd->nd_curstateid.other[2])
+			nd->nd_flag &= ~ND_CURSTATEID;
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
 		NFSBCOPY((caddr_t)stateid.other,(caddr_t)tl,NFSX_STATEIDOTHER);
@@ -3095,7 +3262,7 @@ nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused 
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, NULL, NULL,
-	    NFSV4OP_DELEGPURGE, nd->nd_cred, p);
+	    NFSV4OP_DELEGPURGE, nd->nd_cred, p, NULL);
 nfsmout:
 	NFSEXITCODE2(error, nd);
 	return (error);
@@ -3109,9 +3276,10 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
     vnode_t vp, NFSPROC_T *p, __unused struct nfsexstuff *exp)
 {
 	u_int32_t *tl;
-	int error = 0;
+	int error = 0, writeacc;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
+	struct nfsvattr na;
 
 	NFSM_DISSECT(tl, u_int32_t *, NFSX_STATEID);
 	stateid.seqid = fxdr_unsigned(u_int32_t, *tl++);
@@ -3130,7 +3298,10 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, &stateid, vp,
-	    NFSV4OP_DELEGRETURN, nd->nd_cred, p);
+	    NFSV4OP_DELEGRETURN, nd->nd_cred, p, &writeacc);
+	/* For pNFS, update the attributes. */
+	if (writeacc != 0)
+		nfsrv_updatemdsattr(vp, &na, p);
 nfsmout:
 	vput(vp);
 	NFSEXITCODE2(error, nd);
@@ -3194,7 +3365,8 @@ nfsrvd_openconfirm(struct nfsrv_descript *nd, __unused
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
+	    NULL);
 	if (!nd->nd_repstat) {
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
@@ -3233,6 +3405,22 @@ nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unus
 	NFSBCOPY((caddr_t)tl, (caddr_t)stp->ls_stateid.other,
 	    NFSX_STATEIDOTHER);
 	tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if ((nd->nd_flag & ND_NFSV41) != 0 && stp->ls_stateid.seqid == 1 &&
+	    stp->ls_stateid.other[0] == 0 && stp->ls_stateid.other[1] == 0 &&
+	    stp->ls_stateid.other[2] == 0) {
+		if ((nd->nd_flag & ND_CURSTATEID) != 0)
+			stp->ls_stateid = nd->nd_curstateid;
+		else {
+			nd->nd_repstat = NFSERR_BADSTATEID;
+			goto nfsmout;
+		}
+	}
+
 	stp->ls_seq = fxdr_unsigned(u_int32_t, *tl++);
 	i = fxdr_unsigned(int, *tl++);
 	switch (i) {
@@ -3281,8 +3469,13 @@ nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unus
 	}
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid,
-		    nd, p);
+		    nd, p, NULL);
 	if (!nd->nd_repstat) {
+		/* For NFSv4.1, set the Current StateID. */
+		if ((nd->nd_flag & ND_NFSV41) != 0) {
+			nd->nd_curstateid = stateid;
+			nd->nd_flag |= ND_CURSTATEID;
+		}
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
 		NFSBCOPY((caddr_t)stateid.other,(caddr_t)tl,NFSX_STATEIDOTHER);
@@ -3609,7 +3802,7 @@ nfsrvd_verify(struct nfsrv_descript *nd, int isdgram,
 	fhandle_t fh;
 
 	sf = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK);
-	nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+	nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsvno_statfs(vp, sf);
 	if (!nd->nd_repstat)
@@ -3787,7 +3980,10 @@ nfsrvd_exchangeid(struct nfsrv_descript *nd, __unused 
 		confirm.lval[1] = 1;
 	else
 		confirm.lval[1] = 0;
-	v41flags = NFSV4EXCH_USENONPNFS;
+	if (TAILQ_EMPTY(&nfsrv_devidhead))
+		v41flags = NFSV4EXCH_USENONPNFS | NFSV4EXCH_USEPNFSDS;
+ 	else
+ 		v41flags = NFSV4EXCH_USEPNFSMDS;
 	sp4type = fxdr_unsigned(uint32_t, *tl);
 	if (sp4type != NFSV4EXCH_SP4NONE) {
 		nd->nd_repstat = NFSERR_NOTSUPP;
@@ -3878,7 +4074,15 @@ nfsrvd_createsession(struct nfsrv_descript *nd, __unus
 	NFSM_DISSECT(tl, uint32_t *, 7 * NFSX_UNSIGNED);
 	tl++;					/* Header pad always 0. */
 	sep->sess_maxreq = fxdr_unsigned(uint32_t, *tl++);
+	if (sep->sess_maxreq > sb_max_adj - NFS_MAXXDR) {
+		sep->sess_maxreq = sb_max_adj - NFS_MAXXDR;
+		printf("Consider increasing kern.ipc.maxsockbuf\n");
+	}
 	sep->sess_maxresp = fxdr_unsigned(uint32_t, *tl++);
+	if (sep->sess_maxresp > sb_max_adj - NFS_MAXXDR) {
+		sep->sess_maxresp = sb_max_adj - NFS_MAXXDR;
+		printf("Consider increasing kern.ipc.maxsockbuf\n");
+	}
 	sep->sess_maxrespcached = fxdr_unsigned(uint32_t, *tl++);
 	sep->sess_maxops = fxdr_unsigned(uint32_t, *tl++);
 	sep->sess_maxslots = fxdr_unsigned(uint32_t, *tl++);
@@ -4080,7 +4284,361 @@ nfsrvd_freestateid(struct nfsrv_descript *nd, __unused
 	NFSM_DISSECT(tl, uint32_t *, NFSX_STATEID);
 	stateid.seqid = fxdr_unsigned(uint32_t, *tl++);
 	NFSBCOPY(tl, stateid.other, NFSX_STATEIDOTHER);
+
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if (stateid.seqid == 1 && stateid.other[0] == 0 &&
+	    stateid.other[1] == 0 && stateid.other[2] == 0) {
+		if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+			stateid = nd->nd_curstateid;
+			stateid.seqid = 0;
+		} else {
+			nd->nd_repstat = NFSERR_BADSTATEID;
+			goto nfsmout;
+		}
+	}
+
 	nd->nd_repstat = nfsrv_freestateid(nd, &stateid, p);
+
+	/* If the current stateid has been free'd, unset it. */
+	if (nd->nd_repstat == 0 && (nd->nd_flag & ND_CURSTATEID) != 0 &&
+	    stateid.other[0] == nd->nd_curstateid.other[0] &&
+	    stateid.other[1] == nd->nd_curstateid.other[1] &&
+	    stateid.other[2] == nd->nd_curstateid.other[2])
+		nd->nd_flag &= ~ND_CURSTATEID;
+nfsmout:
+	NFSEXITCODE2(error, nd);
+	return (error);
+}
+
+/*
+ * nfsv4 layoutget service
+ */
+APPLESTATIC int
+nfsrvd_layoutget(struct nfsrv_descript *nd, __unused int isdgram,
+    vnode_t vp, NFSPROC_T *p, struct nfsexstuff *exp)
+{
+	uint32_t *tl;
+	nfsv4stateid_t stateid;
+	int error = 0, layoutlen, layouttype, iomode, maxcnt, retonclose;
+	uint64_t offset, len, minlen;
+	char *layp = NULL;
+
+	if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
+		nd->nd_repstat = NFSERR_WRONGSEC;
+		goto nfsmout;
+	}
+	NFSM_DISSECT(tl, uint32_t *, 4 * NFSX_UNSIGNED + 3 * NFSX_HYPER +
+	    NFSX_STATEID);
+	tl++;		/* Signal layout available. Ignore for now. */
+	layouttype = fxdr_unsigned(int, *tl++);
+	iomode = fxdr_unsigned(int, *tl++);
+	offset = fxdr_hyper(tl); tl += 2;
+	len = fxdr_hyper(tl); tl += 2;
+	minlen = fxdr_hyper(tl); tl += 2;
+	stateid.seqid = fxdr_unsigned(uint32_t, *tl++);
+	NFSBCOPY(tl, stateid.other, NFSX_STATEIDOTHER);
+	tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+	maxcnt = fxdr_unsigned(int, tl);
+	NFSD_DEBUG(4, "layoutget ltyp=%d iom=%d off=%ju len=%ju mlen=%ju\n",
+	    layouttype, iomode, (uintmax_t)offset, (uintmax_t)len,
+	    (uintmax_t)minlen);
+	if (len < minlen ||
+	    (minlen != UINT64_MAX && offset + minlen < offset) ||
+	    (len != UINT64_MAX && offset + len < offset)) {
+		nd->nd_repstat = NFSERR_INVAL;
+		goto nfsmout;
+	}
+
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if (stateid.seqid == 1 && stateid.other[0] == 0 &&
+	    stateid.other[1] == 0 && stateid.other[2] == 0) {

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@freebsd.org  Sun Jun 11 21:50:00 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id CE933BEE02F
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Sun, 11 Jun 2017 21:50:00 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 84605784B3;
 Sun, 11 Jun 2017 21:50:00 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5BLnxT7005124;
 Sun, 11 Jun 2017 21:49:59 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5BLnxnd005123;
 Sun, 11 Jun 2017 21:49:59 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706112149.v5BLnxnd005123@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Sun, 11 Jun 2017 21:49:59 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319837 - projects/pnfs-planb-server-stable11/usr.sbin
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 11 Jun 2017 21:50:00 -0000

Author: rmacklem
Date: Sun Jun 11 21:49:59 2017
New Revision: 319837
URL: https://svnweb.freebsd.org/changeset/base/319837

Log:
  Copy nfsd over to the stable/11 projects tree.

Added:
  projects/pnfs-planb-server-stable11/usr.sbin/
     - copied from r319836, head/usr.sbin/nfsd/
Directory Properties:
  projects/pnfs-planb-server-stable11/usr.sbin/nfsd/   (props changed)

From owner-svn-src-projects@freebsd.org  Sun Jun 11 22:05:33 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id AC03BBEE397
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Sun, 11 Jun 2017 22:05:33 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 8673C78AEB;
 Sun, 11 Jun 2017 22:05:33 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5BM5W8H012904;
 Sun, 11 Jun 2017 22:05:32 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5BM5WmI012902;
 Sun, 11 Jun 2017 22:05:32 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706112205.v5BM5WmI012902@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Sun, 11 Jun 2017 22:05:32 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319838 -
 projects/pnfs-planb-server-stable11/usr.sbin/nfsd
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 11 Jun 2017 22:05:33 -0000

Author: rmacklem
Date: Sun Jun 11 22:05:32 2017
New Revision: 319838
URL: https://svnweb.freebsd.org/changeset/base/319838

Log:
  Update nfsd to support the pNFS server.

Modified:
  projects/pnfs-planb-server-stable11/usr.sbin/nfsd/nfsd.8
  projects/pnfs-planb-server-stable11/usr.sbin/nfsd/nfsd.c

Modified: projects/pnfs-planb-server-stable11/usr.sbin/nfsd/nfsd.8
==============================================================================
--- projects/pnfs-planb-server-stable11/usr.sbin/nfsd/nfsd.8	Sun Jun 11 21:49:59 2017	(r319837)
+++ projects/pnfs-planb-server-stable11/usr.sbin/nfsd/nfsd.8	Sun Jun 11 22:05:32 2017	(r319838)
@@ -41,6 +41,7 @@ server
 .Op Fl ardute
 .Op Fl n Ar num_servers
 .Op Fl h Ar bindip
+.Op Fl p Ar pnfs_setup
 .Op Fl Fl maxthreads Ar max_threads
 .Op Fl Fl minthreads Ar min_threads
 .Sh DESCRIPTION
@@ -103,6 +104,35 @@ It may also be specified in addition to any
 options given.
 Note that NFS/UDP does not operate properly when
 bound to the wildcard IP address whether you use -a or do not use -h.
+.It Fl p Ar pnfs_setup
+Enables pNFS support in the server and specifies the information that the
+daemon needs to start it.
+This option can only be used on one server and specifies that this server
+will be the MetaData Server (MDS) for the pNFS service.
+This can only be done if there is at least one FreeBSD system configured
+as a Data Server (DS) for it to use.
+.Pp
+The
+.Ar pnfs_setup
+string is a set of ',' separated fields:
+.Bl -tag -width Ds
+.It
+Each of these fields specifies one Data Server.
+It consists of a server hostname, followed by a ':'
+and the directory path where the DS's data storage file system is mounted on
+this MDS server.
+The DS storage file systems must be mounted on this system before the
+.Nm
+is started with this option specified.
+For example:
+.sp
+nfsv4-ds0:/DS0,nfsv4-ds1:/DS1
+.sp
+Would specify two DS servers called nfsv4-ds0 and nfsv4-ds1 that comprise the
+data storage component of the pNFS service.
+The directories "/DS0" and "/DS1" are where the DS storage servers exported
+storage directories are mounted on this system (which will act as the MDS).
+.El
 .It Fl t
 Serve
 .Tn TCP NFS

Modified: projects/pnfs-planb-server-stable11/usr.sbin/nfsd/nfsd.c
==============================================================================
--- projects/pnfs-planb-server-stable11/usr.sbin/nfsd/nfsd.c	Sun Jun 11 21:49:59 2017	(r319837)
+++ projects/pnfs-planb-server-stable11/usr.sbin/nfsd/nfsd.c	Sun Jun 11 22:05:32 2017	(r319838)
@@ -62,9 +62,12 @@ static const char rcsid[] =
 
 #include <netdb.h>
 #include <arpa/inet.h>
-#include <nfsserver/nfs.h>
 #include <nfs/nfssvc.h>
 
+#include <fs/nfs/nfsproto.h>
+#include <fs/nfs/nfskpiport.h>
+#include <fs/nfs/nfs.h>
+
 #include <err.h>
 #include <errno.h>
 #include <signal.h>
@@ -95,6 +98,8 @@ static int stablefd = -1;	/* Fd for the stable restart
 static int backupfd;		/* Fd for the backup stable restart file */
 static const char *getopt_shortopts;
 static const char *getopt_usage;
+static char *dshost = NULL;
+static int dshostc = 0;
 
 static int minthreads_set;
 static int maxthreads_set;
@@ -103,9 +108,18 @@ static struct option longopts[] = {
 	{ "debug", no_argument, &debug, 1 },
 	{ "minthreads", required_argument, &minthreads_set, 1 },
 	{ "maxthreads", required_argument, &maxthreads_set, 1 },
+	{ "pnfs", required_argument, NULL, 'p' },
 	{ NULL, 0, NULL, 0}
 };
 
+struct nfhret {
+	u_long		stat;
+	long		vers;
+	long		auth;
+	long		fhsize;
+	u_char		nfh[NFS3_FHSIZE];
+};
+
 static void	cleanup(int);
 static void	child_cleanup(int);
 static void	killchildren(void);
@@ -114,13 +128,14 @@ static void	nonfs(int);
 static void	reapchild(int);
 static int	setbindhost(struct addrinfo **ia, const char *bindhost,
 		    struct addrinfo hints);
-static void	start_server(int);
+static void	start_server(int, struct nfsd_nfsd_args *);
 static void	unregistration(void);
 static void	usage(void);
 static void	open_stable(int *, int *);
 static void	copy_stable(int, int);
 static void	backup_stable(int);
 static void	set_nfsdcnt(int);
+static void	parse_dsserver(const char *, struct nfsd_nfsd_args *);
 
 /*
  * Nfs server daemon mostly just a user context for nfssvc()
@@ -166,15 +181,18 @@ main(int argc, char **argv)
 	const char *lopt;
 	char **bindhost = NULL;
 	pid_t pid;
+	struct nfsd_nfsd_args nfsdargs;
 
 	nfsdcnt = DEFNFSDCNT;
 	unregister = reregister = tcpflag = maxsock = 0;
 	bindanyflag = udpflag = connect_type_cnt = bindhostc = 0;
-	getopt_shortopts = "ah:n:rdtue";
+	getopt_shortopts = "ah:n:rdtuep:";
 	getopt_usage =
 	    "usage:\n"
 	    "  nfsd [-ardtue] [-h bindip]\n"
-	    "       [-n numservers] [--minthreads #] [--maxthreads #]\n";
+	    "       [-n numservers] [--minthreads #] [--maxthreads #]\n"
+	    "       [-p/--pnfs dsserver0:/dsserver0-mounted-on-dir,...,"
+	    "dsserverN:/dsserverN-mounted-on-dir\n";
 	while ((ch = getopt_long(argc, argv, getopt_shortopts, longopts,
 		    &longindex)) != -1)
 		switch (ch) {
@@ -208,6 +226,10 @@ main(int argc, char **argv)
 		case 'e':
 			/* now a no-op, since this is the default */
 			break;
+		case 'p':
+			/* Parse out the DS server host names and mount pts. */
+			parse_dsserver(optarg, &nfsdargs);
+			break;
 		case 0:
 			lopt = longopts[longindex].name;
 			if (!strcmp(lopt, "minthreads")) {
@@ -427,7 +449,7 @@ main(int argc, char **argv)
 		exit(1);
 	}
 	nfssvc_addsock = NFSSVC_NFSDADDSOCK;
-	nfssvc_nfsd = NFSSVC_NFSDNFSD;
+	nfssvc_nfsd = NFSSVC_NFSDNFSD | NFSSVC_NEWSTRUCT;
 
 	if (tcpflag) {
 		/*
@@ -445,7 +467,7 @@ main(int argc, char **argv)
 		} else {
 			(void)signal(SIGUSR1, child_cleanup);
 			setproctitle("server");
-			start_server(0);
+			start_server(0, &nfsdargs);
 		}
 	}
 
@@ -766,7 +788,7 @@ main(int argc, char **argv)
 	 * a "server" too. start_server will not return.
 	 */
 	if (!tcpflag)
-		start_server(1);
+		start_server(1, &nfsdargs);
 
 	/*
 	 * Loop forever accepting connections and passing the sockets
@@ -990,10 +1012,9 @@ get_tuned_nfsdcount(void)
 }
 
 static void
-start_server(int master)
+start_server(int master, struct nfsd_nfsd_args *nfsdargp)
 {
 	char principal[MAXHOSTNAMELEN + 5];
-	struct nfsd_nfsd_args nfsdargs;
 	int status, error;
 	char hostname[MAXHOSTNAMELEN + 1], *cp;
 	struct addrinfo *aip, hints;
@@ -1016,17 +1037,17 @@ start_server(int master)
 			freeaddrinfo(aip);
 		}
 	}
-	nfsdargs.principal = principal;
+	nfsdargp->principal = principal;
 
 	if (nfsdcnt_set)
-		nfsdargs.minthreads = nfsdargs.maxthreads = nfsdcnt;
+		nfsdargp->minthreads = nfsdargp->maxthreads = nfsdcnt;
 	else {
-		nfsdargs.minthreads = minthreads_set ? minthreads : get_tuned_nfsdcount();
-		nfsdargs.maxthreads = maxthreads_set ? maxthreads : nfsdargs.minthreads;
-		if (nfsdargs.maxthreads < nfsdargs.minthreads)
-			nfsdargs.maxthreads = nfsdargs.minthreads;
+		nfsdargp->minthreads = minthreads_set ? minthreads : get_tuned_nfsdcount();
+		nfsdargp->maxthreads = maxthreads_set ? maxthreads : nfsdargp->minthreads;
+		if (nfsdargp->maxthreads < nfsdargp->minthreads)
+			nfsdargp->maxthreads = nfsdargp->minthreads;
 	}
-	error = nfssvc(nfssvc_nfsd, &nfsdargs);
+	error = nfssvc(nfssvc_nfsd, nfsdargp);
 	if (error < 0 && errno == EAUTH) {
 		/*
 		 * This indicates that it could not register the
@@ -1036,7 +1057,7 @@ start_server(int master)
 		 */
 		syslog(LOG_ERR, "No gssd, using AUTH_SYS only");
 		principal[0] = '\0';
-		error = nfssvc(nfssvc_nfsd, &nfsdargs);
+		error = nfssvc(nfssvc_nfsd, nfsdargp);
 	}
 	if (error < 0) {
 		syslog(LOG_ERR, "nfssvc: %m");
@@ -1138,4 +1159,127 @@ backup_stable(__unused int signo)
 	if (stablefd >= 0)
 		copy_stable(stablefd, backupfd);
 }
+
+/*
+ * Parse the pNFS string and extract the DS servers and ports numbers.
+ */
+static void
+parse_dsserver(const char *optarg, struct nfsd_nfsd_args *nfsdargp)
+{
+	char *ad, *cp, *cp2, *dsaddr, *dshost, *dspath, *dsvol, nfsprt[9];
+	int adsiz, dsaddrcnt, dshostcnt, dspathcnt, ecode, hostsiz, pathsiz;
+	size_t dsaddrsiz, dshostsiz, dspathsiz, nfsprtsiz;
+	struct addrinfo hints, *ai_tcp;
+	struct sockaddr_in *sin;
+
+	cp = strdup(optarg);
+	if (cp == NULL)
+		errx(1, "Out of memory");
+
+	/* Now, do the host names. */
+	dspathsiz = 1024;
+	dspathcnt = 0;
+	dspath = malloc(dspathsiz);
+	if (dspath == NULL)
+		errx(1, "Out of memory");
+	dshostsiz = 1024;
+	dshostcnt = 0;
+	dshost = malloc(dshostsiz);
+	if (dshost == NULL)
+		errx(1, "Out of memory");
+	dsaddrsiz = 1024;
+	dsaddrcnt = 0;
+	dsaddr = malloc(dsaddrsiz);
+	if (dsaddr == NULL)
+		errx(1, "Out of memory");
+
+	/* Put the NFS port# in "." form. */
+	snprintf(nfsprt, 9, ".%d.%d", 2049 >> 8, 2049 & 0xff);
+	nfsprtsiz = strlen(nfsprt);
+
+	ai_tcp = NULL;
+	/* Loop around for each DS server name. */
+	do {
+		cp2 = strchr(cp, ',');
+		if (cp2 != NULL) {
+			*cp2++ = '\0';
+			if (*cp2 == '\0')
+				usage();
+		}
+		dsvol = strchr(cp, ':');
+		if (dsvol == NULL || *(dsvol + 1) == '\0')
+			usage();
+		*dsvol++ = '\0';
+
+printf("pnfs path=%s\n", dsvol);
+		/* Append this pathname to dspath. */
+		pathsiz = strlen(dsvol);
+		if (dspathcnt + pathsiz + 1 > dspathsiz) {
+			dspathsiz *= 2;
+			dspath = realloc(dspath, dspathsiz);
+			if (dspath == NULL)
+				errx(1, "Out of memory");
+		}
+		strcpy(&dspath[dspathcnt], dsvol);
+		dspathcnt += pathsiz + 1;
+
+		if (ai_tcp != NULL)
+			freeaddrinfo(ai_tcp);
+
+		/* Get the fully qualified domain name and IP address. */
+		memset(&hints, 0, sizeof(hints));
+		hints.ai_flags = AI_CANONNAME;
+		hints.ai_family = AF_INET;
+		hints.ai_socktype = SOCK_STREAM;
+		hints.ai_protocol = IPPROTO_TCP;
+		ecode = getaddrinfo(cp, NULL, &hints, &ai_tcp);
+		if (ecode != 0)
+			err(1, "getaddrinfo pnfs: %s %s", cp,
+			    gai_strerror(ecode));
+		sin = (struct sockaddr_in *)ai_tcp->ai_addr;
+		if (sin->sin_family != AF_INET)
+			err(1, "getaddrinfo() returned non-INET address");
+
+		/* Append this address to dsaddr. */
+		ad = inet_ntoa(sin->sin_addr);
+		adsiz = strlen(ad);
+		if (dsaddrcnt + adsiz + nfsprtsiz + 1 > dsaddrsiz) {
+			dsaddrsiz *= 2;
+			dsaddr = realloc(dsaddr, dsaddrsiz);
+			if (dsaddr == NULL)
+				errx(1, "Out of memory");
+		}
+		strcpy(&dsaddr[dsaddrcnt], ad);
+		strcat(&dsaddr[dsaddrcnt], nfsprt);
+		dsaddrcnt += adsiz + nfsprtsiz + 1;
+
+		/* Append this hostname to dshost. */
+		hostsiz = strlen(ai_tcp->ai_canonname);
+		if (dshostcnt + hostsiz + 1 > dshostsiz) {
+			dshostsiz *= 2;
+			dshost = realloc(dshost, dshostsiz);
+			if (dshost == NULL)
+				errx(1, "Out of memory");
+		}
+		strcpy(&dshost[dshostcnt], ai_tcp->ai_canonname);
+		dshostcnt += hostsiz + 1;
+
+		cp = cp2;
+	} while (cp != NULL);
+
+	/*
+	 * At the point, ai_tcp refers to the last DS server host and
+	 * sin is set to point to the sockaddr structure in it.
+	 * Set the port# for the DS Mount protocol and get the DS root FH.
+	 */
+	sin->sin_port = htons(2049);
+	nfsdargp->addr = dsaddr;
+	nfsdargp->addrlen = dsaddrcnt;
+	nfsdargp->dnshost = dshost;
+	nfsdargp->dnshostlen = dshostcnt;
+	nfsdargp->dspath = dspath;
+	nfsdargp->dspathlen = dspathcnt;
+	freeaddrinfo(ai_tcp);
+}
+
 

From owner-svn-src-projects@freebsd.org  Sun Jun 11 22:14:34 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 3259CBEE5A8
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Sun, 11 Jun 2017 22:14:34 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 09A9D78F23;
 Sun, 11 Jun 2017 22:14:33 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5BMEX19016957;
 Sun, 11 Jun 2017 22:14:33 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5BMEWWK016954;
 Sun, 11 Jun 2017 22:14:32 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706112214.v5BMEWWK016954@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Sun, 11 Jun 2017 22:14:32 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319839 - in projects/pnfs-planb-server-stable11/usr.bin:
 . pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 11 Jun 2017 22:14:34 -0000

Author: rmacklem
Date: Sun Jun 11 22:14:32 2017
New Revision: 319839
URL: https://svnweb.freebsd.org/changeset/base/319839

Log:
  Add the pnfsdsfile command to the pNFS server tree.

Added:
  projects/pnfs-planb-server-stable11/usr.bin/
  projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/
  projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/Makefile   (contents, props changed)
  projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1   (contents, props changed)
  projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c   (contents, props changed)

Added: projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/Makefile	Sun Jun 11 22:14:32 2017	(r319839)
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+PROG=	pnfsdsfile
+
+.include <bsd.prog.mk>

Added: projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1	Sun Jun 11 22:14:32 2017	(r319839)
@@ -0,0 +1,55 @@
+.\" Copyright (c) 2017 Rick Macklem
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd April 1, 2017
+.Dt PNFSDSFILE 1
+.Os
+.Sh NAME
+.Nm pnfsdsfile
+.Nd display
+a pNFS data storage file location
+.Sh SYNOPSIS
+.Nm
+.Ar metadata_file
+.Sh DESCRIPTION
+The
+.Nm
+command displays the location of a data storage file for a pNFS service.
+A pNFS service maintains a data storage file for each regular file on
+the MetaData Server (MDS) on one of the Data Storage (DS) servers.
+This command can be used on the MDS to find out where that data storage
+file is.
+It must be used on the MDS and the
+.Ar metadata_file
+must be a file on the exported local file system and not an NFSv4.1 mount.
+.El
+.Sh SEE ALSO
+.Xr nfsv4 4 ,
+.Xr nfsd 8
+.Sh HISTORY
+The
+.Nm
+command appeared in FreeBSD12.

Added: projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c	Sun Jun 11 22:14:32 2017	(r319839)
@@ -0,0 +1,106 @@
+/*-
+ * Copyright (c) 2017 Rick Macklem
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <err.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/param.h>
+#include <sys/extattr.h>
+#include <sys/mount.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <fs/nfs/nfsrvstate.h>
+
+static void usage(void);
+static void nfsrv_putfhname(fhandle_t *fhp, char *bufp);
+
+/*
+ * This program displays the location information of a data storage file
+ * for a given file on a MetaData Server (MDS) in a pNFS service.  This program
+ * must be run on the MDS and the file argument must be a file in a local
+ * file system that has been exported for the pNFS service.
+ */
+int
+main(int argc, char *argv[])
+{
+	fhandle_t fh;
+	char buf[sizeof(fh) * 2 + 1], hostn[NI_MAXHOST + 1];
+	struct pnfsdsfile dsfile;
+
+	if (argc != 2)
+		usage();
+
+	/*
+	 * The file's name is a hexadecimal representation of the MetaData
+	 * Server's file handle.
+	 */
+	if (getfh(argv[1], &fh) < 0)
+		err(1, "Getfh of %s failed", argv[1]);
+	nfsrv_putfhname(&fh, buf);
+
+	/*
+	 * The host address and directory where the data storage file is
+	 * located is in the extended attribute "pnfsd.dsfile".
+	 */
+	if (extattr_get_file(argv[1], EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
+	    &dsfile, sizeof(dsfile)) != sizeof(dsfile))
+		err(1, "Can't get extattr pnfsd.dsfile\n");
+
+	/* Translate the IP address to a hostname. */
+	if (getnameinfo((struct sockaddr *)&dsfile.dsf_sin,
+	    dsfile.dsf_sin.sin_len, hostn, sizeof(hostn), NULL, 0, 0) < 0)
+		err(1, "Can't get hostname\n");
+
+	printf("%s\tds%d/%s\n", hostn, dsfile.dsf_dir, buf);
+}
+
+/*
+ * Generate a file name based on the file handle and put it in *bufp.
+ */
+static void
+nfsrv_putfhname(fhandle_t *fhp, char *bufp)
+{
+	int i;
+	uint8_t *cp;
+
+	cp = (uint8_t *)fhp;
+	for (i = 0; i < sizeof(*fhp); i++)
+		sprintf(&bufp[2 * i], "%02x", *cp++);
+}
+
+static void
+usage(void)
+{
+
+	fprintf(stderr, "pnfsdsfile [filepath]\n");
+	exit(1);
+}
+

From owner-svn-src-projects@freebsd.org  Sun Jun 11 22:22:18 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 89305BEE68A
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Sun, 11 Jun 2017 22:22:18 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 5420A792C4;
 Sun, 11 Jun 2017 22:22:18 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5BMMHvS020883;
 Sun, 11 Jun 2017 22:22:17 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5BMMHDB020882;
 Sun, 11 Jun 2017 22:22:17 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706112222.v5BMMHDB020882@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Sun, 11 Jun 2017 22:22:17 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319840 - projects/pnfs-planb-server/usr.sbin/nfsd
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 11 Jun 2017 22:22:18 -0000

Author: rmacklem
Date: Sun Jun 11 22:22:17 2017
New Revision: 319840
URL: https://svnweb.freebsd.org/changeset/base/319840

Log:
  Fix a comment in nfsd.c.

Modified:
  projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c

Modified: projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c
==============================================================================
--- projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c	Sun Jun 11 22:14:32 2017	(r319839)
+++ projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c	Sun Jun 11 22:22:17 2017	(r319840)
@@ -228,7 +228,7 @@ main(int argc, char **argv)
 			/* now a no-op, since this is the default */
 			break;
 		case 'p':
-			/* Parse out the DS server host names and the port#s. */
+			/* Parse out the DS server host names and mount pts. */
 			parse_dsserver(optarg, &nfsdargs);
 			break;
 		case 0:

From owner-svn-src-projects@freebsd.org  Mon Jun 12 23:50:34 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id D829CD86CA1
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Mon, 12 Jun 2017 23:50:34 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 759B484C15;
 Mon, 12 Jun 2017 23:50:34 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5CNoXpR058891;
 Mon, 12 Jun 2017 23:50:33 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5CNoUDS058859;
 Mon, 12 Jun 2017 23:50:30 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706122350.v5CNoUDS058859@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Mon, 12 Jun 2017 23:50:30 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319883 - in projects/pnfs-planb-server/sys: amd64/amd64
 amd64/cloudabi32 amd64/cloudabi64 amd64/ia32 amd64/include amd64/linux
 amd64/linux32 arm/allwinner arm/annapurna/alpine arm/arm ...
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 12 Jun 2017 23:50:34 -0000

Author: rmacklem
Date: Mon Jun 12 23:50:30 2017
New Revision: 319883
URL: https://svnweb.freebsd.org/changeset/base/319883

Log:
  Update the kernel in the pNFS project to head.

Added:
  projects/pnfs-planb-server/sys/arm/allwinner/aw_console.c
     - copied unchanged from r319882, head/sys/arm/allwinner/aw_console.c
  projects/pnfs-planb-server/sys/arm/annapurna/alpine/alpine_common.c
     - copied unchanged from r319882, head/sys/arm/annapurna/alpine/alpine_common.c
  projects/pnfs-planb-server/sys/arm/freescale/imx/imx_console.c
     - copied unchanged from r319882, head/sys/arm/freescale/imx/imx_console.c
  projects/pnfs-planb-server/sys/arm/mv/mv_pci_ctrl.c
     - copied unchanged from r319882, head/sys/arm/mv/mv_pci_ctrl.c
  projects/pnfs-planb-server/sys/arm/samsung/exynos/exynos5_mp.h
     - copied unchanged from r319882, head/sys/arm/samsung/exynos/exynos5_mp.h
  projects/pnfs-planb-server/sys/arm/xilinx/zy7_mp.h
     - copied unchanged from r319882, head/sys/arm/xilinx/zy7_mp.h
  projects/pnfs-planb-server/sys/compat/linuxkpi/common/src/linux_schedule.c
     - copied unchanged from r319882, head/sys/compat/linuxkpi/common/src/linux_schedule.c
  projects/pnfs-planb-server/sys/conf/kmod_syms_prefix.awk
     - copied unchanged from r319882, head/sys/conf/kmod_syms_prefix.awk
  projects/pnfs-planb-server/sys/contrib/dev/iwm/iwm-7265D-22.fw.uu
     - copied unchanged from r319882, head/sys/contrib/dev/iwm/iwm-7265D-22.fw.uu
  projects/pnfs-planb-server/sys/contrib/dev/iwm/iwm-8000C-22.fw.uu
     - copied unchanged from r319882, head/sys/contrib/dev/iwm/iwm-8000C-22.fw.uu
  projects/pnfs-planb-server/sys/dev/iwm/if_iwm_sf.c
     - copied unchanged from r319882, head/sys/dev/iwm/if_iwm_sf.c
  projects/pnfs-planb-server/sys/dev/iwm/if_iwm_sf.h
     - copied unchanged from r319882, head/sys/dev/iwm/if_iwm_sf.h
  projects/pnfs-planb-server/sys/dev/mii/mii_fdt.c
     - copied unchanged from r319882, head/sys/dev/mii/mii_fdt.c
  projects/pnfs-planb-server/sys/dev/mii/mii_fdt.h
     - copied unchanged from r319882, head/sys/dev/mii/mii_fdt.h
  projects/pnfs-planb-server/sys/dev/mii/vscphy.c
     - copied unchanged from r319882, head/sys/dev/mii/vscphy.c
  projects/pnfs-planb-server/sys/modules/ffec/
     - copied from r319882, head/sys/modules/ffec/
Deleted:
  projects/pnfs-planb-server/sys/arm/allwinner/console.c
  projects/pnfs-planb-server/sys/arm/annapurna/alpine/common.c
  projects/pnfs-planb-server/sys/arm/freescale/imx/console.c
  projects/pnfs-planb-server/sys/arm/freescale/vybrid/vf_common.c
  projects/pnfs-planb-server/sys/arm/samsung/exynos/exynos5_common.c
  projects/pnfs-planb-server/sys/arm/versatile/versatile_timer.c
  projects/pnfs-planb-server/sys/fs/msdosfs/msdosfs_fileno.c
Modified:
  projects/pnfs-planb-server/sys/amd64/amd64/pmap.c
  projects/pnfs-planb-server/sys/amd64/amd64/trap.c
  projects/pnfs-planb-server/sys/amd64/cloudabi32/cloudabi32_sysvec.c
  projects/pnfs-planb-server/sys/amd64/cloudabi64/cloudabi64_sysvec.c
  projects/pnfs-planb-server/sys/amd64/ia32/ia32_syscall.c
  projects/pnfs-planb-server/sys/amd64/include/proc.h
  projects/pnfs-planb-server/sys/amd64/linux/linux_sysvec.c
  projects/pnfs-planb-server/sys/amd64/linux32/linux32_sysvec.c
  projects/pnfs-planb-server/sys/arm/allwinner/files.allwinner
  projects/pnfs-planb-server/sys/arm/annapurna/alpine/files.alpine
  projects/pnfs-planb-server/sys/arm/arm/machdep.c
  projects/pnfs-planb-server/sys/arm/arm/mpcore_timer.c
  projects/pnfs-planb-server/sys/arm/arm/syscall.c
  projects/pnfs-planb-server/sys/arm/cloudabi32/cloudabi32_sysvec.c
  projects/pnfs-planb-server/sys/arm/conf/AML8726
  projects/pnfs-planb-server/sys/arm/conf/ARMADAXP
  projects/pnfs-planb-server/sys/arm/conf/BEAGLEBONE
  projects/pnfs-planb-server/sys/arm/conf/EFIKA_MX
  projects/pnfs-planb-server/sys/arm/conf/EXYNOS5.common
  projects/pnfs-planb-server/sys/arm/conf/IMX53
  projects/pnfs-planb-server/sys/arm/conf/RT1310
  projects/pnfs-planb-server/sys/arm/conf/VYBRID
  projects/pnfs-planb-server/sys/arm/conf/ZEDBOARD
  projects/pnfs-planb-server/sys/arm/freescale/imx/files.imx5
  projects/pnfs-planb-server/sys/arm/freescale/imx/files.imx6
  projects/pnfs-planb-server/sys/arm/freescale/imx/imx51_machdep.c
  projects/pnfs-planb-server/sys/arm/freescale/imx/imx53_machdep.c
  projects/pnfs-planb-server/sys/arm/freescale/vybrid/files.vybrid
  projects/pnfs-planb-server/sys/arm/freescale/vybrid/vf_machdep.c
  projects/pnfs-planb-server/sys/arm/mv/armada38x/rtc.c
  projects/pnfs-planb-server/sys/arm/mv/files.mv
  projects/pnfs-planb-server/sys/arm/mv/mv_common.c
  projects/pnfs-planb-server/sys/arm/mv/mv_pci.c
  projects/pnfs-planb-server/sys/arm/samsung/exynos/exynos5_machdep.c
  projects/pnfs-planb-server/sys/arm/samsung/exynos/exynos5_mp.c
  projects/pnfs-planb-server/sys/arm/samsung/exynos/files.exynos5
  projects/pnfs-planb-server/sys/arm/versatile/files.versatile
  projects/pnfs-planb-server/sys/arm/versatile/sp804.c
  projects/pnfs-planb-server/sys/arm/xilinx/zy7_machdep.c
  projects/pnfs-planb-server/sys/arm/xilinx/zy7_mp.c
  projects/pnfs-planb-server/sys/arm64/arm64/genassym.c
  projects/pnfs-planb-server/sys/arm64/arm64/pmap.c
  projects/pnfs-planb-server/sys/arm64/arm64/swtch.S
  projects/pnfs-planb-server/sys/arm64/arm64/trap.c
  projects/pnfs-planb-server/sys/arm64/cloudabi64/cloudabi64_sysvec.c
  projects/pnfs-planb-server/sys/arm64/include/pcb.h
  projects/pnfs-planb-server/sys/arm64/include/proc.h
  projects/pnfs-planb-server/sys/arm64/include/vfp.h
  projects/pnfs-planb-server/sys/boot/fdt/dts/arm/armada-380.dtsi
  projects/pnfs-planb-server/sys/boot/fdt/dts/arm/armada-385.dtsi
  projects/pnfs-planb-server/sys/boot/fdt/dts/arm/armada-388-gp.dts
  projects/pnfs-planb-server/sys/boot/fdt/dts/arm/armada-38x.dtsi
  projects/pnfs-planb-server/sys/boot/forth/loader.conf
  projects/pnfs-planb-server/sys/cam/ctl/ctl_ha.c
  projects/pnfs-planb-server/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
  projects/pnfs-planb-server/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
  projects/pnfs-planb-server/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
  projects/pnfs-planb-server/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c
  projects/pnfs-planb-server/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h
  projects/pnfs-planb-server/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
  projects/pnfs-planb-server/sys/cddl/dev/dtrace/powerpc/dtrace_subr.c
  projects/pnfs-planb-server/sys/compat/freebsd32/freebsd32_misc.c
  projects/pnfs-planb-server/sys/compat/ia32/ia32_util.h
  projects/pnfs-planb-server/sys/compat/linux/linux_file.c
  projects/pnfs-planb-server/sys/compat/linux/linux_misc.c
  projects/pnfs-planb-server/sys/compat/linuxkpi/common/include/asm/atomic.h
  projects/pnfs-planb-server/sys/compat/linuxkpi/common/include/asm/atomic64.h
  projects/pnfs-planb-server/sys/compat/linuxkpi/common/include/linux/io.h
  projects/pnfs-planb-server/sys/compat/linuxkpi/common/include/linux/pci.h
  projects/pnfs-planb-server/sys/compat/linuxkpi/common/include/linux/sched.h
  projects/pnfs-planb-server/sys/compat/linuxkpi/common/include/linux/wait.h
  projects/pnfs-planb-server/sys/compat/linuxkpi/common/src/linux_compat.c
  projects/pnfs-planb-server/sys/compat/linuxkpi/common/src/linux_idr.c
  projects/pnfs-planb-server/sys/compat/linuxkpi/common/src/linux_kthread.c
  projects/pnfs-planb-server/sys/conf/NOTES
  projects/pnfs-planb-server/sys/conf/config.mk
  projects/pnfs-planb-server/sys/conf/files
  projects/pnfs-planb-server/sys/conf/files.amd64
  projects/pnfs-planb-server/sys/conf/files.i386
  projects/pnfs-planb-server/sys/conf/kmod.mk
  projects/pnfs-planb-server/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_reset.c
  projects/pnfs-planb-server/sys/dev/cxgbe/common/t4_hw.c
  projects/pnfs-planb-server/sys/dev/cxgbe/crypto/t4_crypto.c
  projects/pnfs-planb-server/sys/dev/cxgbe/t4_sge.c
  projects/pnfs-planb-server/sys/dev/etherswitch/e6000sw/e6000sw.c
  projects/pnfs-planb-server/sys/dev/etherswitch/e6000sw/e6000swreg.h
  projects/pnfs-planb-server/sys/dev/ffec/if_ffec.c
  projects/pnfs-planb-server/sys/dev/hyperv/pcib/vmbus_pcib.c
  projects/pnfs-planb-server/sys/dev/iscsi/icl_soft_proxy.c
  projects/pnfs-planb-server/sys/dev/iwm/if_iwm.c
  projects/pnfs-planb-server/sys/dev/iwm/if_iwm_binding.c
  projects/pnfs-planb-server/sys/dev/iwm/if_iwm_debug.h
  projects/pnfs-planb-server/sys/dev/iwm/if_iwm_phy_db.c
  projects/pnfs-planb-server/sys/dev/iwm/if_iwmreg.h
  projects/pnfs-planb-server/sys/dev/iwm/if_iwmvar.h
  projects/pnfs-planb-server/sys/dev/ixl/ixl_txrx.c
  projects/pnfs-planb-server/sys/dev/mii/miidevs
  projects/pnfs-planb-server/sys/dev/mii/miivar.h
  projects/pnfs-planb-server/sys/dev/netmap/if_ixl_netmap.h
  projects/pnfs-planb-server/sys/dev/netmap/netmap.c
  projects/pnfs-planb-server/sys/dev/netmap/netmap_freebsd.c
  projects/pnfs-planb-server/sys/dev/netmap/netmap_generic.c
  projects/pnfs-planb-server/sys/dev/netmap/netmap_kern.h
  projects/pnfs-planb-server/sys/dev/netmap/netmap_mbq.h
  projects/pnfs-planb-server/sys/dev/netmap/netmap_mem2.c
  projects/pnfs-planb-server/sys/dev/netmap/netmap_mem2.h
  projects/pnfs-planb-server/sys/dev/netmap/netmap_monitor.c
  projects/pnfs-planb-server/sys/dev/netmap/netmap_pipe.c
  projects/pnfs-planb-server/sys/dev/netmap/netmap_pt.c
  projects/pnfs-planb-server/sys/dev/netmap/netmap_vale.c
  projects/pnfs-planb-server/sys/dev/rtwn/rtl8188e/r88e_rom_defs.h
  projects/pnfs-planb-server/sys/dev/uart/uart_bus_fdt.c
  projects/pnfs-planb-server/sys/dev/vt/vt_core.c
  projects/pnfs-planb-server/sys/dev/xen/netfront/netfront.c
  projects/pnfs-planb-server/sys/fs/ext2fs/ext2_acl.c
  projects/pnfs-planb-server/sys/fs/ext2fs/ext2_extattr.c
  projects/pnfs-planb-server/sys/fs/ext2fs/ext2_vnops.c
  projects/pnfs-planb-server/sys/fs/msdosfs/denode.h
  projects/pnfs-planb-server/sys/fs/msdosfs/direntry.h
  projects/pnfs-planb-server/sys/fs/msdosfs/fat.h
  projects/pnfs-planb-server/sys/fs/msdosfs/msdosfs_conv.c
  projects/pnfs-planb-server/sys/fs/msdosfs/msdosfs_denode.c
  projects/pnfs-planb-server/sys/fs/msdosfs/msdosfs_fat.c
  projects/pnfs-planb-server/sys/fs/msdosfs/msdosfs_vfsops.c
  projects/pnfs-planb-server/sys/fs/msdosfs/msdosfs_vnops.c
  projects/pnfs-planb-server/sys/fs/msdosfs/msdosfsmount.h
  projects/pnfs-planb-server/sys/i386/cloudabi32/cloudabi32_sysvec.c
  projects/pnfs-planb-server/sys/i386/i386/trap.c
  projects/pnfs-planb-server/sys/i386/include/proc.h
  projects/pnfs-planb-server/sys/i386/linux/linux_sysvec.c
  projects/pnfs-planb-server/sys/kern/init_main.c
  projects/pnfs-planb-server/sys/kern/kern_descrip.c
  projects/pnfs-planb-server/sys/kern/kern_fork.c
  projects/pnfs-planb-server/sys/kern/kern_jail.c
  projects/pnfs-planb-server/sys/kern/kern_proc.c
  projects/pnfs-planb-server/sys/kern/kern_sendfile.c
  projects/pnfs-planb-server/sys/kern/kern_sig.c
  projects/pnfs-planb-server/sys/kern/kern_thread.c
  projects/pnfs-planb-server/sys/kern/kern_uuid.c
  projects/pnfs-planb-server/sys/kern/subr_blist.c
  projects/pnfs-planb-server/sys/kern/subr_param.c
  projects/pnfs-planb-server/sys/kern/subr_syscall.c
  projects/pnfs-planb-server/sys/kern/sys_process.c
  projects/pnfs-planb-server/sys/kern/sys_socket.c
  projects/pnfs-planb-server/sys/kern/uipc_accf.c
  projects/pnfs-planb-server/sys/kern/uipc_debug.c
  projects/pnfs-planb-server/sys/kern/uipc_sockbuf.c
  projects/pnfs-planb-server/sys/kern/uipc_socket.c
  projects/pnfs-planb-server/sys/kern/uipc_syscalls.c
  projects/pnfs-planb-server/sys/kern/uipc_usrreq.c
  projects/pnfs-planb-server/sys/kern/vfs_default.c
  projects/pnfs-planb-server/sys/kern/vfs_subr.c
  projects/pnfs-planb-server/sys/kern/vfs_syscalls.c
  projects/pnfs-planb-server/sys/kern/vnode_if.src
  projects/pnfs-planb-server/sys/libkern/arm64/crc32c_armv8.S
  projects/pnfs-planb-server/sys/mips/include/proc.h
  projects/pnfs-planb-server/sys/mips/mips/stack_machdep.c
  projects/pnfs-planb-server/sys/mips/mips/tlb.c
  projects/pnfs-planb-server/sys/mips/mips/trap.c
  projects/pnfs-planb-server/sys/modules/Makefile
  projects/pnfs-planb-server/sys/modules/iwm/Makefile
  projects/pnfs-planb-server/sys/modules/iwmfw/iwm7265Dfw/Makefile
  projects/pnfs-planb-server/sys/modules/iwmfw/iwm8000Cfw/Makefile
  projects/pnfs-planb-server/sys/modules/linux/Makefile
  projects/pnfs-planb-server/sys/modules/linux64/Makefile
  projects/pnfs-planb-server/sys/modules/linuxkpi/Makefile
  projects/pnfs-planb-server/sys/modules/msdosfs/Makefile
  projects/pnfs-planb-server/sys/modules/rtwn/Makefile
  projects/pnfs-planb-server/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
  projects/pnfs-planb-server/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c
  projects/pnfs-planb-server/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c
  projects/pnfs-planb-server/sys/netgraph/ng_ksocket.c
  projects/pnfs-planb-server/sys/netinet/sctp_input.c
  projects/pnfs-planb-server/sys/netinet/sctp_pcb.c
  projects/pnfs-planb-server/sys/netinet/sctp_syscalls.c
  projects/pnfs-planb-server/sys/netinet/sctp_sysctl.c
  projects/pnfs-planb-server/sys/netinet/sctp_usrreq.c
  projects/pnfs-planb-server/sys/netinet/sctputil.c
  projects/pnfs-planb-server/sys/netinet/tcp_subr.c
  projects/pnfs-planb-server/sys/netinet/tcp_syncache.c
  projects/pnfs-planb-server/sys/netinet/tcp_syncache.h
  projects/pnfs-planb-server/sys/netinet/tcp_timewait.c
  projects/pnfs-planb-server/sys/netinet/tcp_var.h
  projects/pnfs-planb-server/sys/ofed/drivers/infiniband/core/iwcm.c
  projects/pnfs-planb-server/sys/ofed/drivers/infiniband/ulp/sdp/sdp_main.c
  projects/pnfs-planb-server/sys/powerpc/include/proc.h
  projects/pnfs-planb-server/sys/powerpc/powerpc/trap.c
  projects/pnfs-planb-server/sys/riscv/include/proc.h
  projects/pnfs-planb-server/sys/riscv/riscv/trap.c
  projects/pnfs-planb-server/sys/rpc/svc_vc.c
  projects/pnfs-planb-server/sys/sparc64/include/proc.h
  projects/pnfs-planb-server/sys/sparc64/sparc64/trap.c
  projects/pnfs-planb-server/sys/sys/blist.h
  projects/pnfs-planb-server/sys/sys/jail.h
  projects/pnfs-planb-server/sys/sys/module.h
  projects/pnfs-planb-server/sys/sys/param.h
  projects/pnfs-planb-server/sys/sys/proc.h
  projects/pnfs-planb-server/sys/sys/ptrace.h
  projects/pnfs-planb-server/sys/sys/sockbuf.h
  projects/pnfs-planb-server/sys/sys/socket.h
  projects/pnfs-planb-server/sys/sys/socketvar.h
  projects/pnfs-planb-server/sys/sys/sockopt.h
  projects/pnfs-planb-server/sys/sys/sysent.h
  projects/pnfs-planb-server/sys/sys/systm.h
  projects/pnfs-planb-server/sys/sys/unpcb.h
  projects/pnfs-planb-server/sys/sys/uuid.h
  projects/pnfs-planb-server/sys/sys/vnode.h
  projects/pnfs-planb-server/sys/ufs/ffs/ffs_softdep.c
  projects/pnfs-planb-server/sys/ufs/ffs/ffs_vfsops.c
  projects/pnfs-planb-server/sys/ufs/ffs/softdep.h
  projects/pnfs-planb-server/sys/vm/swap_pager.c
  projects/pnfs-planb-server/sys/vm/uma_core.c
  projects/pnfs-planb-server/sys/vm/vm_page.c
  projects/pnfs-planb-server/sys/vm/vm_pageout.c
  projects/pnfs-planb-server/sys/x86/acpica/acpi_wakeup.c
  projects/pnfs-planb-server/sys/x86/x86/identcpu.c
Directory Properties:
  projects/pnfs-planb-server/sys/   (props changed)
  projects/pnfs-planb-server/sys/cddl/contrib/opensolaris/   (props changed)

Modified: projects/pnfs-planb-server/sys/amd64/amd64/pmap.c
==============================================================================
--- projects/pnfs-planb-server/sys/amd64/amd64/pmap.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/amd64/amd64/pmap.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -4313,6 +4313,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, v
 	pv_entry_t pv;
 	vm_paddr_t opa, pa;
 	vm_page_t mpte, om;
+	int rv;
 	boolean_t nosleep;
 
 	PG_A = pmap_accessed_bit(pmap);
@@ -4387,10 +4388,8 @@ retry:
 		mpte = _pmap_allocpte(pmap, pmap_pde_pindex(va),
 		    nosleep ? NULL : &lock);
 		if (mpte == NULL && nosleep) {
-			if (lock != NULL)
-				rw_wunlock(lock);
-			PMAP_UNLOCK(pmap);
-			return (KERN_RESOURCE_SHORTAGE);
+			rv = KERN_RESOURCE_SHORTAGE;
+			goto out;
 		}
 		goto retry;
 	} else
@@ -4516,10 +4515,12 @@ unchanged:
 	    vm_reserv_level_iffullpop(m) == 0)
 		pmap_promote_pde(pmap, pde, va, &lock);
 
+	rv = KERN_SUCCESS;
+out:
 	if (lock != NULL)
 		rw_wunlock(lock);
 	PMAP_UNLOCK(pmap);
-	return (KERN_SUCCESS);
+	return (rv);
 }
 
 /*

Modified: projects/pnfs-planb-server/sys/amd64/amd64/trap.c
==============================================================================
--- projects/pnfs-planb-server/sys/amd64/amd64/trap.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/amd64/amd64/trap.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -829,16 +829,18 @@ dblfault_handler(struct trapframe *frame)
 }
 
 int
-cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+cpu_fetch_syscall_args(struct thread *td)
 {
 	struct proc *p;
 	struct trapframe *frame;
 	register_t *argp;
+	struct syscall_args *sa;
 	caddr_t params;
 	int reg, regcnt, error;
 
 	p = td->td_proc;
 	frame = td->td_frame;
+	sa = &td->td_sa;
 	reg = 0;
 	regcnt = 6;
 
@@ -889,7 +891,6 @@ cpu_fetch_syscall_args(struct thread *td, struct sysca
 void
 amd64_syscall(struct thread *td, int traced)
 {
-	struct syscall_args sa;
 	int error;
 	ksiginfo_t ksi;
 
@@ -899,7 +900,7 @@ amd64_syscall(struct thread *td, int traced)
 		/* NOT REACHED */
 	}
 #endif
-	error = syscallenter(td, &sa);
+	error = syscallenter(td);
 
 	/*
 	 * Traced syscall.
@@ -915,15 +916,16 @@ amd64_syscall(struct thread *td, int traced)
 
 	KASSERT(PCB_USER_FPU(td->td_pcb),
 	    ("System call %s returning with kernel FPU ctx leaked",
-	     syscallname(td->td_proc, sa.code)));
+	     syscallname(td->td_proc, td->td_sa.code)));
 	KASSERT(td->td_pcb->pcb_save == get_pcb_user_save_td(td),
 	    ("System call %s returning with mangled pcb_save",
-	     syscallname(td->td_proc, sa.code)));
+	     syscallname(td->td_proc, td->td_sa.code)));
 	KASSERT(td->td_md.md_invl_gen.gen == 0,
 	    ("System call %s returning with leaked invl_gen %lu",
-	    syscallname(td->td_proc, sa.code), td->td_md.md_invl_gen.gen));
+	    syscallname(td->td_proc, td->td_sa.code),
+	    td->td_md.md_invl_gen.gen));
 
-	syscallret(td, error, &sa);
+	syscallret(td, error);
 
 	/*
 	 * If the user-supplied value of %rip is not a canonical

Modified: projects/pnfs-planb-server/sys/amd64/cloudabi32/cloudabi32_sysvec.c
==============================================================================
--- projects/pnfs-planb-server/sys/amd64/cloudabi32/cloudabi32_sysvec.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/amd64/cloudabi32/cloudabi32_sysvec.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -90,10 +90,14 @@ cloudabi32_proc_setregs(struct thread *td, struct imag
 }
 
 static int
-cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+cloudabi32_fetch_syscall_args(struct thread *td)
 {
-	struct trapframe *frame = td->td_frame;
+	struct trapframe *frame;
+	struct syscall_args *sa;
 	int error;
+
+	frame = td->td_frame;
+	sa = &td->td_sa;
 
 	/* Obtain system call number. */
 	sa->code = frame->tf_rax;

Modified: projects/pnfs-planb-server/sys/amd64/cloudabi64/cloudabi64_sysvec.c
==============================================================================
--- projects/pnfs-planb-server/sys/amd64/cloudabi64/cloudabi64_sysvec.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/amd64/cloudabi64/cloudabi64_sysvec.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -87,9 +87,13 @@ cloudabi64_proc_setregs(struct thread *td, struct imag
 }
 
 static int
-cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+cloudabi64_fetch_syscall_args(struct thread *td)
 {
-	struct trapframe *frame = td->td_frame;
+	struct trapframe *frame;
+	struct syscall_args *sa;
+
+	frame = td->td_frame;
+	sa = &td->td_sa;
 
 	/* Obtain system call number. */
 	sa->code = frame->tf_rax;

Modified: projects/pnfs-planb-server/sys/amd64/ia32/ia32_syscall.c
==============================================================================
--- projects/pnfs-planb-server/sys/amd64/ia32/ia32_syscall.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/amd64/ia32/ia32_syscall.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -105,16 +105,18 @@ ia32_set_syscall_retval(struct thread *td, int error)
 }
 
 int
-ia32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+ia32_fetch_syscall_args(struct thread *td)
 {
 	struct proc *p;
 	struct trapframe *frame;
+	struct syscall_args *sa;
 	caddr_t params;
 	u_int32_t args[8], tmp;
 	int error, i;
 
 	p = td->td_proc;
 	frame = td->td_frame;
+	sa = &td->td_sa;
 
 	params = (caddr_t)frame->tf_rsp + sizeof(u_int32_t);
 	sa->code = frame->tf_rax;
@@ -175,7 +177,6 @@ void
 ia32_syscall(struct trapframe *frame)
 {
 	struct thread *td;
-	struct syscall_args sa;
 	register_t orig_tf_rflags;
 	int error;
 	ksiginfo_t ksi;
@@ -184,7 +185,7 @@ ia32_syscall(struct trapframe *frame)
 	td = curthread;
 	td->td_frame = frame;
 
-	error = syscallenter(td, &sa);
+	error = syscallenter(td);
 
 	/*
 	 * Traced syscall.
@@ -198,7 +199,7 @@ ia32_syscall(struct trapframe *frame)
 		trapsignal(td, &ksi);
 	}
 
-	syscallret(td, error, &sa);
+	syscallret(td, error);
 }
 
 static void

Modified: projects/pnfs-planb-server/sys/amd64/include/proc.h
==============================================================================
--- projects/pnfs-planb-server/sys/amd64/include/proc.h	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/amd64/include/proc.h	Mon Jun 12 23:50:30 2017	(r319883)
@@ -70,6 +70,13 @@ struct mdproc {
 #define	KINFO_PROC_SIZE 1088
 #define	KINFO_PROC32_SIZE 768
 
+struct syscall_args {
+	u_int code;
+	struct sysent *callp;
+	register_t args[8];
+	int narg;
+};
+
 #ifdef	_KERNEL
 
 /* Get the current kernel thread stack usage. */
@@ -92,13 +99,6 @@ int amd64_set_ldt_data(struct thread *td, int start, i
 
 extern struct mtx dt_lock;
 extern int max_ldt_segment;
-
-struct syscall_args {
-	u_int code;
-	struct sysent *callp;
-	register_t args[8];
-	int narg;
-};
 #endif  /* _KERNEL */
 
 #endif /* !_MACHINE_PROC_H_ */

Modified: projects/pnfs-planb-server/sys/amd64/linux/linux_sysvec.c
==============================================================================
--- projects/pnfs-planb-server/sys/amd64/linux/linux_sysvec.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/amd64/linux/linux_sysvec.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -126,7 +126,7 @@ static boolean_t linux_trans_osrel(const Elf_Note *not
 static void	linux_vdso_install(void *param);
 static void	linux_vdso_deinstall(void *param);
 static void	linux_set_syscall_retval(struct thread *td, int error);
-static int	linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa);
+static int	linux_fetch_syscall_args(struct thread *td);
 static void	linux_exec_setregs(struct thread *td, struct image_params *imgp,
 		    u_long stack);
 static int	linux_vsyscall(struct thread *td);
@@ -217,13 +217,15 @@ translate_traps(int signal, int trap_code)
 }
 
 static int
-linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+linux_fetch_syscall_args(struct thread *td)
 {
 	struct proc *p;
 	struct trapframe *frame;
+	struct syscall_args *sa;
 
 	p = td->td_proc;
 	frame = td->td_frame;
+	sa = &td->td_sa;
 
 	sa->args[0] = frame->tf_rdi;
 	sa->args[1] = frame->tf_rsi;

Modified: projects/pnfs-planb-server/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- projects/pnfs-planb-server/sys/amd64/linux32/linux32_sysvec.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/amd64/linux32/linux32_sysvec.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -725,13 +725,15 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_
 }
 
 static int
-linux32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+linux32_fetch_syscall_args(struct thread *td)
 {
 	struct proc *p;
 	struct trapframe *frame;
+	struct syscall_args *sa;
 
 	p = td->td_proc;
 	frame = td->td_frame;
+	sa = &td->td_sa;
 
 	sa->args[0] = frame->tf_rbx;
 	sa->args[1] = frame->tf_rcx;

Copied: projects/pnfs-planb-server/sys/arm/allwinner/aw_console.c (from r319882, head/sys/arm/allwinner/aw_console.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/pnfs-planb-server/sys/arm/allwinner/aw_console.c	Mon Jun 12 23:50:30 2017	(r319883, copy of r319882, head/sys/arm/allwinner/aw_console.c)
@@ -0,0 +1,142 @@
+/*-
+ * Copyright (c) 2012 Ganbold Tsagaankhuu <ganbold@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* Simple UART console driver for Allwinner A10 */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/cons.h>
+#include <sys/consio.h>
+#include <sys/kernel.h>
+
+#ifndef	A10_UART_BASE
+#define	A10_UART_BASE	0xe1c28000 	/* UART0 */
+#endif
+
+#define	REG_SHIFT	2
+
+#define	UART_DLL	0	/* Out: Divisor Latch Low */
+#define	UART_DLM	1	/* Out: Divisor Latch High */
+#define	UART_FCR	2	/* Out: FIFO Control Register */
+#define	UART_LCR	3	/* Out: Line Control Register */
+#define	UART_MCR	4	/* Out: Modem Control Register */
+#define	UART_LSR	5	/* In:  Line Status Register */
+#define	UART_LSR_THRE	0x20	/* Transmit-hold-register empty */
+#define	UART_LSR_DR	0x01	/* Receiver data ready */
+#define	UART_MSR	6	/* In:  Modem Status Register */
+#define	UART_SCR	7	/* I/O: Scratch Register */
+
+static uint32_t
+uart_getreg(uint32_t *bas)
+{
+	return *((volatile uint32_t *)(bas)) & 0xff;
+}
+
+static void
+uart_setreg(uint32_t *bas, uint32_t val)
+{
+	*((volatile uint32_t *)(bas)) = val;
+}
+
+static int
+ub_getc(void)
+{
+	while ((uart_getreg((uint32_t *)(A10_UART_BASE + 
+	    (UART_LSR << REG_SHIFT))) & UART_LSR_DR) == 0);
+		__asm __volatile("nop");
+
+	return (uart_getreg((uint32_t *)A10_UART_BASE) & 0xff);
+}
+
+static void
+ub_putc(unsigned char c)
+{
+	if (c == '\n')
+		ub_putc('\r');
+
+	while ((uart_getreg((uint32_t *)(A10_UART_BASE + 
+	    (UART_LSR << REG_SHIFT))) & UART_LSR_THRE) == 0)
+		__asm __volatile("nop");
+
+	uart_setreg((uint32_t *)A10_UART_BASE, c);
+}
+
+static cn_probe_t	uart_cnprobe;
+static cn_init_t	uart_cninit;
+static cn_term_t	uart_cnterm;
+static cn_getc_t	uart_cngetc;
+static cn_putc_t	uart_cnputc;
+static cn_grab_t	uart_cngrab;
+static cn_ungrab_t	uart_cnungrab;
+
+static void
+uart_cngrab(struct consdev *cp)
+{
+}
+
+static void
+uart_cnungrab(struct consdev *cp)
+{
+}
+
+
+static void
+uart_cnprobe(struct consdev *cp)
+{
+	sprintf(cp->cn_name, "uart");
+	cp->cn_pri = CN_NORMAL;
+}
+
+static void
+uart_cninit(struct consdev *cp)
+{
+	uart_setreg((uint32_t *)(A10_UART_BASE + 
+	    (UART_FCR << REG_SHIFT)), 0x06);
+}
+
+void
+uart_cnputc(struct consdev *cp, int c)
+{
+	ub_putc(c);
+}
+
+int
+uart_cngetc(struct consdev * cp)
+{
+	return ub_getc();
+}
+
+static void
+uart_cnterm(struct consdev * cp)
+{
+}
+
+CONSOLE_DRIVER(uart);
+

Modified: projects/pnfs-planb-server/sys/arm/allwinner/files.allwinner
==============================================================================
--- projects/pnfs-planb-server/sys/arm/allwinner/files.allwinner	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/allwinner/files.allwinner	Mon Jun 12 23:50:30 2017	(r319883)
@@ -30,7 +30,7 @@ arm/allwinner/aw_sid.c			standard
 arm/allwinner/aw_thermal.c		standard
 dev/iicbus/sy8106a.c			optional	sy8106a
 arm/allwinner/aw_cir.c			optional	aw_cir evdev
-#arm/allwinner/console.c		standard
+#arm/allwinner/aw_console.c		standard
 
 arm/allwinner/a10_fb.c			optional	vt
 arm/allwinner/a10_hdmi.c		optional	hdmi

Copied: projects/pnfs-planb-server/sys/arm/annapurna/alpine/alpine_common.c (from r319882, head/sys/arm/annapurna/alpine/alpine_common.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/pnfs-planb-server/sys/arm/annapurna/alpine/alpine_common.c	Mon Jun 12 23:50:30 2017	(r319883, copy of r319882, head/sys/arm/annapurna/alpine/alpine_common.c)
@@ -0,0 +1,159 @@
+/*-
+ * Copyright (c) 2013 Ruslan Bukin <br@bsdpad.com>
+ * Copyright (c) 2015 Semihalf.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_platform.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/openfirm.h>
+
+#include <machine/bus.h>
+#include <machine/fdt.h>
+#include <machine/intr.h>
+
+#define WDTLOAD		0x000
+#define LOAD_MIN	0x00000001
+#define LOAD_MAX	0xFFFFFFFF
+#define WDTVALUE	0x004
+#define WDTCONTROL	0x008
+/* control register masks */
+#define INT_ENABLE	(1 << 0)
+#define RESET_ENABLE	(1 << 1)
+#define WDTLOCK		0xC00
+#define UNLOCK		0x1ACCE551
+#define LOCK		0x00000001
+
+extern bus_addr_t  al_devmap_pa;
+
+static int alpine_get_wdt_base(uint32_t *pbase, uint32_t *psize);
+static int alpine_pic_decode_fdt(uint32_t iparent, uint32_t *intr,
+    int *interrupt, int *trig, int *pol);
+
+int alpine_get_devmap_base(bus_addr_t *pa, bus_addr_t *size);
+
+int alpine_get_devmap_base(bus_addr_t *pa, bus_addr_t *size)
+{
+	phandle_t node;
+
+	if ((node = OF_finddevice("/")) == 0)
+		return (ENXIO);
+
+	if ((node = fdt_find_compatible(node, "simple-bus", 1)) == 0)
+		return (ENXIO);
+
+	return fdt_get_range(node, 0, pa, size);
+}
+
+static int
+alpine_get_wdt_base(uint32_t *pbase, uint32_t *psize)
+{
+	phandle_t node;
+	u_long base = 0;
+	u_long size = 0;
+
+	if (pbase == NULL || psize == NULL)
+		return (EINVAL);
+
+	if ((node = OF_finddevice("/")) == -1)
+		return (EFAULT);
+
+	if ((node = fdt_find_compatible(node, "simple-bus", 1)) == 0)
+		return (EFAULT);
+
+	if ((node =
+	    fdt_find_compatible(node, "arm,sp805", 1)) == 0)
+		return (EFAULT);
+
+	if (fdt_regsize(node, &base, &size))
+		return (EFAULT);
+
+	*pbase = base;
+	*psize = size;
+
+	return (0);
+}
+
+void
+cpu_reset(void)
+{
+	uint32_t wdbase, wdsize;
+	bus_addr_t wdbaddr;
+	int ret;
+
+	ret = alpine_get_wdt_base(&wdbase, &wdsize);
+	if (ret) {
+		printf("Unable to get WDT base, do power down manually...");
+		goto infinite;
+	}
+
+	ret = bus_space_map(fdtbus_bs_tag, al_devmap_pa + wdbase,
+	    wdsize, 0, &wdbaddr);
+	if (ret) {
+		printf("Unable to map WDT base, do power down manually...");
+		goto infinite;
+	}
+
+	bus_space_write_4(fdtbus_bs_tag, wdbaddr, WDTLOCK, UNLOCK);
+	bus_space_write_4(fdtbus_bs_tag, wdbaddr, WDTLOAD, LOAD_MIN);
+	bus_space_write_4(fdtbus_bs_tag, wdbaddr, WDTCONTROL, INT_ENABLE | RESET_ENABLE);
+
+infinite:
+	while (1) {}
+}
+
+#ifndef INTRNG
+static int
+alpine_pic_decode_fdt(uint32_t iparent, uint32_t *intr, int *interrupt,
+    int *trig, int *pol)
+{
+	int rv = 0;
+
+	rv = gic_decode_fdt(iparent, intr, interrupt, trig, pol);
+	if (rv == 0) {
+		/* This was recognized as our PIC and decoded. */
+		interrupt = FDT_MAP_IRQ(iparent, interrupt);
+
+		/* Configure the interrupt if callback provided */
+		if (arm_config_irq)
+			(*arm_config_irq)(*interrupt, *trig, *pol);
+	}
+	return (rv);
+}
+
+fdt_pic_decode_t fdt_pic_table[] = {
+	&alpine_pic_decode_fdt,
+	NULL
+};
+#endif

Modified: projects/pnfs-planb-server/sys/arm/annapurna/alpine/files.alpine
==============================================================================
--- projects/pnfs-planb-server/sys/arm/annapurna/alpine/files.alpine	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/annapurna/alpine/files.alpine	Mon Jun 12 23:50:30 2017	(r319883)
@@ -3,9 +3,8 @@
 kern/kern_clocksource.c				standard
 
 arm/versatile/sp804.c				standard
-arm/versatile/versatile_timer.c			standard
 dev/uart/uart_dev_ns8250.c			optional	uart
 
-arm/annapurna/alpine/common.c			standard
+arm/annapurna/alpine/alpine_common.c		standard
 arm/annapurna/alpine/alpine_machdep.c		standard
 arm/annapurna/alpine/alpine_machdep_mp.c	optional	smp

Modified: projects/pnfs-planb-server/sys/arm/arm/machdep.c
==============================================================================
--- projects/pnfs-planb-server/sys/arm/arm/machdep.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/arm/machdep.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -103,6 +103,10 @@ __FBSDID("$FreeBSD$");
 #error FreeBSD/arm doesn't provide compatibility with releases prior to 10
 #endif
 
+#if __ARM_ARCH >= 6 && !defined(INTRNG)
+#error armv6 requires INTRNG
+#endif
+
 struct pcpu __pcpu[MAXCPU];
 struct pcpu *pcpup = &__pcpu[0];
 
@@ -297,6 +301,7 @@ cpu_idle_wakeup(int cpu)
 	return (0);
 }
 
+#ifdef NO_EVENTTIMERS
 /*
  * Most ARM platforms don't need to do anything special to init their clocks
  * (they get intialized during normal device attachment), and by not defining a
@@ -307,8 +312,14 @@ cpu_idle_wakeup(int cpu)
 void
 arm_generic_initclocks(void)
 {
+}
+__weak_reference(arm_generic_initclocks, cpu_initclocks);
 
-#ifndef NO_EVENTTIMERS
+#else
+void
+cpu_initclocks(void)
+{
+
 #ifdef SMP
 	if (PCPU_GET(cpuid) == 0)
 		cpu_initclocks_bsp();
@@ -317,9 +328,8 @@ arm_generic_initclocks(void)
 #else
 	cpu_initclocks_bsp();
 #endif
-#endif
 }
-__weak_reference(arm_generic_initclocks, cpu_initclocks);
+#endif
 
 #ifdef MULTIDELAY
 void

Modified: projects/pnfs-planb-server/sys/arm/arm/mpcore_timer.c
==============================================================================
--- projects/pnfs-planb-server/sys/arm/arm/mpcore_timer.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/arm/mpcore_timer.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -59,6 +59,10 @@ __FBSDID("$FreeBSD$");
 #include <machine/cpu.h>
 #include <machine/intr.h>
 
+#ifdef MULTIDELAY
+#include <machine/machdep.h> /* For arm_set_delay */
+#endif
+
 #include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
@@ -115,6 +119,8 @@ static boolean_t arm_tmr_freq_varies;
 #define	tmr_gbl_read_4(sc, reg)         bus_read_4((sc)->gbl_mem, reg)
 #define	tmr_gbl_write_4(sc, reg, val)   bus_write_4((sc)->gbl_mem, reg, val)
 
+static void arm_tmr_delay(int, void *);
+
 static timecounter_get_t arm_tmr_get_timecount;
 
 static struct timecounter arm_tmr_timecount = {
@@ -431,6 +437,11 @@ arm_tmr_attach(device_t dev)
 	if (tc_err != 0 && et_err != 0) {
 		return (ENXIO);
 	}
+
+#ifdef MULTIDELAY
+	arm_set_delay(arm_tmr_delay, sc);
+#endif
+
 	return (0);
 }
 
@@ -482,37 +493,14 @@ arm_tmr_change_frequency(uint64_t newfreq)
 		et_change_frequency(arm_tmr_et, newfreq);
 }
 
-/**
- *	DELAY - Delay for at least usec microseconds.
- *	@usec: number of microseconds to delay by
- *
- *	This function is called all over the kernel and is suppose to provide a
- *	consistent delay.  This function may also be called before the console
- *	is setup so no printf's can be called here.
- *
- *	RETURNS:
- *	nothing
- */
-static void __used /* Must emit function code for the weak ref below. */
-arm_tmr_DELAY(int usec)
+static void
+arm_tmr_delay(int usec, void *arg)
 {
-	struct arm_tmr_softc *sc;
+	struct arm_tmr_softc *sc = arg;
 	int32_t counts_per_usec;
 	int32_t counts;
 	uint32_t first, last;
 
-	/* Check the timers are setup, if not just use a for loop for the meantime */
-	if (arm_tmr_tc == NULL || arm_tmr_timecount.tc_frequency == 0) {
-		for (; usec > 0; usec--)
-			for (counts = 200; counts > 0; counts--)
-				cpufunc_nullop();	/* Prevent gcc from optimizing
-							 * out the loop
-							 */
-		return;
-	}
-
-	sc = arm_tmr_tc->tc_priv;
-
 	/* Get the number of times to count */
 	counts_per_usec = ((arm_tmr_timecount.tc_frequency / 1000000) + 1);
 
@@ -536,10 +524,34 @@ arm_tmr_DELAY(int usec)
 	}
 }
 
-/*
- * Supply a DELAY() implementation via weak linkage.  A platform may want to use
- * the mpcore per-cpu eventtimers but provide its own DELAY() routine,
- * especially when the core frequency can change on the fly.
+#ifndef MULTIDELAY
+/**
+ *	DELAY - Delay for at least usec microseconds.
+ *	@usec: number of microseconds to delay by
+ *
+ *	This function is called all over the kernel and is suppose to provide a
+ *	consistent delay.  This function may also be called before the console
+ *	is setup so no printf's can be called here.
+ *
+ *	RETURNS:
+ *	nothing
  */
-__weak_reference(arm_tmr_DELAY, DELAY);
+void
+DELAY(int usec)
+{
+	struct arm_tmr_softc *sc;
+	int32_t counts;
 
+	/* Check the timers are setup, if not just use a for loop for the meantime */
+	if (arm_tmr_tc == NULL || arm_tmr_timecount.tc_frequency == 0) {
+		for (; usec > 0; usec--)
+			for (counts = 200; counts > 0; counts--)
+				cpufunc_nullop();	/* Prevent gcc from optimizing
+							 * out the loop
+							 */
+	} else {
+		sc = arm_tmr_tc->tc_priv;
+		arm_tmr_delay(usec, sc);
+	}
+}
+#endif

Modified: projects/pnfs-planb-server/sys/arm/arm/syscall.c
==============================================================================
--- projects/pnfs-planb-server/sys/arm/arm/syscall.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/arm/syscall.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -99,12 +99,14 @@ __FBSDID("$FreeBSD$");
 void swi_handler(struct trapframe *);
 
 int
-cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+cpu_fetch_syscall_args(struct thread *td)
 {
 	struct proc *p;
 	register_t *ap;
+	struct syscall_args *sa;
 	int error;
 
+	sa = &td->td_sa;
 	sa->code = td->td_frame->tf_r7;
 	ap = &td->td_frame->tf_r0;
 	if (sa->code == SYS_syscall) {
@@ -141,15 +143,14 @@ cpu_fetch_syscall_args(struct thread *td, struct sysca
 static void
 syscall(struct thread *td, struct trapframe *frame)
 {
-	struct syscall_args sa;
 	int error;
 
-	sa.nap = 4;
+	td->td_sa.nap = 4;
 
-	error = syscallenter(td, &sa);
+	error = syscallenter(td);
 	KASSERT(error != 0 || td->td_ar == NULL,
 	    ("returning from syscall with td_ar set!"));
-	syscallret(td, error, &sa);
+	syscallret(td, error);
 }
 
 void

Modified: projects/pnfs-planb-server/sys/arm/cloudabi32/cloudabi32_sysvec.c
==============================================================================
--- projects/pnfs-planb-server/sys/arm/cloudabi32/cloudabi32_sysvec.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/cloudabi32/cloudabi32_sysvec.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -67,10 +67,14 @@ cloudabi32_proc_setregs(struct thread *td, struct imag
 }
 
 static int
-cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+cloudabi32_fetch_syscall_args(struct thread *td)
 {
-	struct trapframe *frame = td->td_frame;
+	struct trapframe *frame;
+	struct syscall_args *sa;
 	int error;
+
+	frame = td->td_frame;
+	sa = &td->td_sa;
 
 	/* Obtain system call number. */
 	sa->code = frame->tf_r12;

Modified: projects/pnfs-planb-server/sys/arm/conf/AML8726
==============================================================================
--- projects/pnfs-planb-server/sys/arm/conf/AML8726	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/conf/AML8726	Mon Jun 12 23:50:30 2017	(r319883)
@@ -18,6 +18,9 @@
 #
 # $FreeBSD$
 
+# TODO: Port to INTRNG
+#NO_UNIVERSE
+
 ident		AML8726
 
 include 	"std.armv6"

Modified: projects/pnfs-planb-server/sys/arm/conf/ARMADAXP
==============================================================================
--- projects/pnfs-planb-server/sys/arm/conf/ARMADAXP	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/conf/ARMADAXP	Mon Jun 12 23:50:30 2017	(r319883)
@@ -18,6 +18,9 @@
 #
 # $FreeBSD$
 
+# TODO: Port to INTRNG
+#NO_UNIVERSE
+
 ident		MV-88F78XX0
 
 include 	"std.armv6"

Modified: projects/pnfs-planb-server/sys/arm/conf/BEAGLEBONE
==============================================================================
--- projects/pnfs-planb-server/sys/arm/conf/BEAGLEBONE	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/conf/BEAGLEBONE	Mon Jun 12 23:50:30 2017	(r319883)
@@ -29,6 +29,7 @@ include 	"../ti/am335x/std.am335x"
 makeoptions	MODULES_EXTRA="dtb/am335x am335x_dmtpps"
 
 options 	INTRNG
+options 	MULTIDELAY
 
 options 	SCHED_4BSD		# 4BSD scheduler
 options 	PLATFORM

Modified: projects/pnfs-planb-server/sys/arm/conf/EFIKA_MX
==============================================================================
--- projects/pnfs-planb-server/sys/arm/conf/EFIKA_MX	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/conf/EFIKA_MX	Mon Jun 12 23:50:30 2017	(r319883)
@@ -31,6 +31,7 @@ options 	SCHED_4BSD		# 4BSD scheduler
 #options 	MD_ROOT			# MD is a potential root device
 #options 	NFSD			# Network Filesystem Server
 options 	PLATFORM
+options 	MULTIDELAY
 options 	INCLUDE_CONFIG_FILE	# Include this file in kernel
 
 # NFS root from boopt/dhcp

Modified: projects/pnfs-planb-server/sys/arm/conf/EXYNOS5.common
==============================================================================
--- projects/pnfs-planb-server/sys/arm/conf/EXYNOS5.common	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/conf/EXYNOS5.common	Mon Jun 12 23:50:30 2017	(r319883)
@@ -22,6 +22,8 @@ makeoptions	WERROR="-Werror"
 
 include 	"std.armv6"
 options 	SCHED_ULE		# ULE scheduler
+options 	PLATFORM		# Platform based SoC
+options 	PLATFORM_SMP
 options 	PREEMPTION		# Enable kernel thread preemption
 options 	INET			# InterNETworking
 options 	INET6			# IPv6 communications protocols

Modified: projects/pnfs-planb-server/sys/arm/conf/IMX53
==============================================================================
--- projects/pnfs-planb-server/sys/arm/conf/IMX53	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/conf/IMX53	Mon Jun 12 23:50:30 2017	(r319883)
@@ -28,6 +28,7 @@ options 	SOC_IMX53
 options 	SCHED_4BSD		# 4BSD scheduler
 #options 	NFSD			# Network Filesystem Server
 options 	PLATFORM
+options 	MULTIDELAY
 options 	INCLUDE_CONFIG_FILE	# Include this file in kernel
 
 # kernel/memory size reduction

Modified: projects/pnfs-planb-server/sys/arm/conf/RT1310
==============================================================================
--- projects/pnfs-planb-server/sys/arm/conf/RT1310	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/conf/RT1310	Mon Jun 12 23:50:30 2017	(r319883)
@@ -3,6 +3,8 @@
 #
 # $FreeBSD$
 #
+# TODO: This fails to build under universe, irnore it until it's fixed
+#NO_UNIVERSE
 
 ident		RT1310
 include 	"std.arm"

Modified: projects/pnfs-planb-server/sys/arm/conf/VYBRID
==============================================================================
--- projects/pnfs-planb-server/sys/arm/conf/VYBRID	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/conf/VYBRID	Mon Jun 12 23:50:30 2017	(r319883)
@@ -25,6 +25,7 @@ include 	"../freescale/vybrid/std.vybrid"
 makeoptions	WERROR="-Werror"
 
 options 	SCHED_4BSD		# 4BSD scheduler
+options 	PLATFORM		# Platform based SoC
 #options 	NANDFS			# NAND Filesystem
 #options 	SMP			# Enable multiple cores
 

Modified: projects/pnfs-planb-server/sys/arm/conf/ZEDBOARD
==============================================================================
--- projects/pnfs-planb-server/sys/arm/conf/ZEDBOARD	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/conf/ZEDBOARD	Mon Jun 12 23:50:30 2017	(r319883)
@@ -27,6 +27,8 @@ include 	"../xilinx/std.zynq7"
 makeoptions	MODULES_EXTRA="dtb/zynq"
 
 options 	SCHED_ULE		# ULE scheduler
+options 	PLATFORM		# Platform based SoC
+options 	PLATFORM_SMP
 #options 	NFSSD			# Network Filesystem Server
 options 	SMP			# Enable multiple cores
 

Modified: projects/pnfs-planb-server/sys/arm/freescale/imx/files.imx5
==============================================================================
--- projects/pnfs-planb-server/sys/arm/freescale/imx/files.imx5	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/freescale/imx/files.imx5	Mon Jun 12 23:50:30 2017	(r319883)
@@ -8,7 +8,7 @@ arm/freescale/imx/imx51_machdep.c	optional	soc_imx51
 arm/freescale/imx/imx53_machdep.c	optional	soc_imx53
 
 # Special serial console for debuging early boot code
-#arm/freescale/imx/console.c		standard
+#arm/freescale/imx/imx_console.c	standard
 
 # UART driver (includes serial console support)
 dev/uart/uart_dev_imx.c			optional uart

Modified: projects/pnfs-planb-server/sys/arm/freescale/imx/files.imx6
==============================================================================
--- projects/pnfs-planb-server/sys/arm/freescale/imx/files.imx6	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/freescale/imx/files.imx6	Mon Jun 12 23:50:30 2017	(r319883)
@@ -47,7 +47,7 @@ arm/freescale/imx/imx6_usbphy.c		optional ehci
 #
 # Low-level serial console for debugging early kernel startup.
 #
-#arm/freescale/imx/console.c  		standard
+#arm/freescale/imx/imx_console.c  	standard
 
 #
 # Not ready yet...

Modified: projects/pnfs-planb-server/sys/arm/freescale/imx/imx51_machdep.c
==============================================================================
--- projects/pnfs-planb-server/sys/arm/freescale/imx/imx51_machdep.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/freescale/imx/imx51_machdep.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -99,4 +99,4 @@ static platform_method_t imx51_methods[] = {
 	PLATFORMMETHOD_END,
 };
 
-FDT_PLATFORM_DEF(imx51, "i.MX51", 0, "fsl,imx51", 0);
+FDT_PLATFORM_DEF(imx51, "i.MX51", 0, "fsl,imx51", 100);

Modified: projects/pnfs-planb-server/sys/arm/freescale/imx/imx53_machdep.c
==============================================================================
--- projects/pnfs-planb-server/sys/arm/freescale/imx/imx53_machdep.c	Mon Jun 12 23:41:20 2017	(r319882)
+++ projects/pnfs-planb-server/sys/arm/freescale/imx/imx53_machdep.c	Mon Jun 12 23:50:30 2017	(r319883)
@@ -95,5 +95,4 @@ static platform_method_t imx53_methods[] = {
 	PLATFORMMETHOD_END,
 };
 
-FDT_PLATFORM_DEF(imx53, "i.MX53", 0, "fsl,imx53", 0);
-
+FDT_PLATFORM_DEF(imx53, "i.MX53", 0, "fsl,imx53", 100);

Copied: projects/pnfs-planb-server/sys/arm/freescale/imx/imx_console.c (from r319882, head/sys/arm/freescale/imx/imx_console.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/pnfs-planb-server/sys/arm/freescale/imx/imx_console.c	Mon Jun 12 23:50:30 2017	(r319883, copy of r319882, head/sys/arm/freescale/imx/imx_console.c)
@@ -0,0 +1,177 @@
+/*-
+ * Copyright (c) 2012, 2013 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Oleksandr Rybalko under sponsorship
+ * from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.	Redistributions of source code must retain the above copyright
+ *	notice, this list of conditions and the following disclaimer.
+ * 2.	Redistributions in binary form must reproduce the above copyright
+ *	notice, this list of conditions and the following disclaimer in the
+ *	documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* Simple UART console driver for Freescale i.MX515 */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/cons.h>
+#include <sys/consio.h>
+#include <sys/kernel.h>
+
+/* Allow it to be predefined, to be able to use another UART for console */
+#ifndef	IMX_UART_BASE
+#define	IMX_UART_BASE	0xe3fbc000 /* imx51 UART1 */
+#endif
+
+#define	IMX_RXD			0x00
+#define	IMX_TXD			0x40
+
+#define	IMX_UFCR		0x90
+#define	IMX_USR1		0x94
+#define	IMX_USR1_TRDY		(1 << 13)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@freebsd.org  Wed Jun 14 00:21:10 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 206F2C0A2C2
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Wed, 14 Jun 2017 00:21:10 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id D109671EAB;
 Wed, 14 Jun 2017 00:21:09 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5E0L9AP067612;
 Wed, 14 Jun 2017 00:21:09 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5E0L8WQ067607;
 Wed, 14 Jun 2017 00:21:08 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706140021.v5E0L8WQ067607@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Wed, 14 Jun 2017 00:21:08 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319924 - in projects/pnfs-planb-server-stable11/sys/fs:
 nfs nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 14 Jun 2017 00:21:10 -0000

Author: rmacklem
Date: Wed Jun 14 00:21:08 2017
New Revision: 319924
URL: https://svnweb.freebsd.org/changeset/base/319924

Log:
  Add support for atime to the set of attributes updated through the DS file.
  Also add the DS file name to the pnfsd.dsfile attribute, so it will still
  be removed if the FH of the metadata file were to change, due to a
  backup/recovery of the metadata exported directory tree.

Modified:
  projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h
  projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsrvstate.h
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h	Tue Jun 13 23:50:55 2017	(r319923)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h	Wed Jun 14 00:21:08 2017	(r319924)
@@ -109,9 +109,9 @@ int nfsrv_openctrl(struct nfsrv_descript *, vnode_t,
 int nfsrv_opencheck(nfsquad_t, nfsv4stateid_t *, struct nfsstate *,
     vnode_t, struct nfsrv_descript *, NFSPROC_T *, int);
 int nfsrv_openupdate(vnode_t, struct nfsstate *, nfsquad_t,
-    nfsv4stateid_t *, struct nfsrv_descript *, NFSPROC_T *, int *);
+    nfsv4stateid_t *, struct nfsrv_descript *, NFSPROC_T *);
 int nfsrv_delegupdate(struct nfsrv_descript *, nfsquad_t, nfsv4stateid_t *,
-    vnode_t, int, struct ucred *, NFSPROC_T *, int *);
+    vnode_t, int, struct ucred *, NFSPROC_T *);
 int nfsrv_releaselckown(struct nfsstate *, nfsquad_t, NFSPROC_T *);
 void nfsrv_zapclient(struct nfsclient *, NFSPROC_T *);
 int nfssvc_idname(struct nfsd_idargs *);

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsrvstate.h
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsrvstate.h	Tue Jun 13 23:50:55 2017	(r319923)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsrvstate.h	Wed Jun 14 00:21:08 2017	(r319924)
@@ -343,12 +343,13 @@ struct nfsdevice {
 TAILQ_HEAD(nfsdevicehead, nfsdevice);
 
 /*
- * This structure holds the va_size, va_filerev and va_mtime for the DS
- * file and is stored in the metadata file's extended attribute pnfsd.dsattr.
+ * This structure holds the va_size, va_filerev, va_atime and va_mtime for the
+ * DS file and is stored in the metadata file's extended attribute pnfsd.dsattr.
  */
 struct pnfsdsattr {
 	uint64_t	dsa_filerev;
 	uint64_t	dsa_size;
+	struct timespec	dsa_atime;
 	struct timespec	dsa_mtime;
 };
 
@@ -357,8 +358,8 @@ struct pnfsdsattr {
 /*
  * This structure holds the information about the DS file and is stored
  * in the metadata file's extended attribute called pnfsd.dsfile.
- * dsf_nam[0] is defined as the actual length of sa_len for the addr.
  */
+#define	PNFS_FILENAME_LEN	(2 * sizeof(fhandle_t))
 struct pnfsdsfile {
 	fhandle_t	dsf_fh;
 	uint32_t	dsf_dir;
@@ -366,6 +367,7 @@ struct pnfsdsfile {
 		struct sockaddr_in	sin;
 		struct sockaddr_in6	sin6;
 	} dsf_nam;
+	char		dsf_filename[PNFS_FILENAME_LEN + 1];
 };
 #define	dsf_sin		dsf_nam.sin
 #define	dsf_sin6	dsf_nam.sin6

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Tue Jun 13 23:50:55 2017	(r319923)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Wed Jun 14 00:21:08 2017	(r319924)
@@ -97,13 +97,13 @@ extern struct nfsdevicehead nfsrv_devidhead;
 static void nfsrv_pnfscreate(struct vnode *, struct vattr *, struct ucred *,
     NFSPROC_T *);
 static void nfsrv_pnfsremovesetup(struct vnode *, NFSPROC_T *, struct vnode **,
-    fhandle_t *);
-static void nfsrv_pnfsremove(struct vnode *, fhandle_t *, NFSPROC_T *);
+    fhandle_t *, char *);
+static void nfsrv_pnfsremove(struct vnode *, fhandle_t *, char *, NFSPROC_T *);
 static int nfsrv_proxyds(struct nfsrv_descript *, struct vnode *, off_t, int,
     struct ucred *, struct thread *, int, struct mbuf **, char *,
     struct mbuf **, struct nfsvattr *, struct acl *);
-static int nfsrv_dsgetsockmnt(struct vnode *, int, char *, int,
-    NFSPROC_T *, struct vnode **, struct nfsmount **, fhandle_t *, char *);
+static int nfsrv_dsgetsockmnt(struct vnode *, int, char *, int, NFSPROC_T *,
+    struct vnode **, struct nfsmount **, fhandle_t *, char *, char *);
 static int nfsrv_setextattr(struct vnode *, struct nfsvattr *, NFSPROC_T *);
 static int nfsrv_readdsrpc(fhandle_t *, off_t, int, struct ucred *,
     NFSPROC_T *, struct nfsmount *, struct mbuf **, struct mbuf **);
@@ -271,6 +271,7 @@ nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap
 	    (nd->nd_flag & ND_NFSV4) == 0 ||
 	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_CHANGE) ||
 	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_SIZE) ||
+	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_TIMEACCESS) ||
 	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_TIMEMODIFY))) {
 		error = nfsrv_proxyds(nd, vp, 0, 0, nd->nd_cred, p,
 		    NFSPROC_GETATTR, NULL, NULL, NULL, &na, NULL);
@@ -287,6 +288,7 @@ nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap
 	 * replace them.
 	 */
 	if (gotattr != 0) {
+		nvap->na_atime = na.na_atime;
 		nvap->na_mtime = na.na_mtime;
 		nvap->na_filerev = na.na_filerev;
 		nvap->na_size = na.na_size;
@@ -427,6 +429,7 @@ nfsvno_setattr(struct vnode *vp, struct nfsvattr *nvap
 	    nvap->na_vattr.va_gid != (gid_t)VNOVAL ||
 	    nvap->na_vattr.va_size != VNOVAL ||
 	    nvap->na_vattr.va_mode != (mode_t)VNOVAL ||
+	    nvap->na_vattr.va_atime.tv_sec != VNOVAL ||
 	    nvap->na_vattr.va_mtime.tv_sec != VNOVAL)) {
 		/* For a pNFS server, set the attributes on the DS file. */
 		error = nfsrv_proxyds(NULL, vp, 0, 0, cred, p, NFSPROC_SETATTR,
@@ -1194,6 +1197,7 @@ nfsvno_removesub(struct nameidata *ndp, int is_v4, str
 	struct vnode *vp, *dsdvp;
 	fhandle_t fh;
 	int error = 0;
+	char fname[PNFS_FILENAME_LEN + 1];
 
 	vp = ndp->ni_vp;
 	dsdvp = NULL;
@@ -1202,12 +1206,12 @@ nfsvno_removesub(struct nameidata *ndp, int is_v4, str
 	else if (is_v4)
 		error = nfsrv_checkremove(vp, 1, p);
 	if (error == 0)
-		nfsrv_pnfsremovesetup(vp, p, &dsdvp, &fh);
+		nfsrv_pnfsremovesetup(vp, p, &dsdvp, &fh, fname);
 	if (!error)
 		error = VOP_REMOVE(ndp->ni_dvp, vp, &ndp->ni_cnd);
 	if (dsdvp != NULL) {
 		if (error == 0)
-			nfsrv_pnfsremove(dsdvp, &fh, p);
+			nfsrv_pnfsremove(dsdvp, &fh, fname, p);
 		NFSVOPUNLOCK(dsdvp, 0);
 	}
 	if (ndp->ni_dvp == vp)
@@ -1272,6 +1276,7 @@ nfsvno_rename(struct nameidata *fromndp, struct nameid
 	struct vnode *fvp, *tvp, *tdvp, *dsdvp;
 	fhandle_t fh;
 	int error = 0;
+	char fname[PNFS_FILENAME_LEN + 1];
 
 	dsdvp = NULL;
 	fvp = fromndp->ni_vp;
@@ -1349,7 +1354,7 @@ nfsvno_rename(struct nameidata *fromndp, struct nameid
 		nfsd_recalldelegation(fvp, p);
 	}
 	if (error == 0 && tvp != NULL) {
-		nfsrv_pnfsremovesetup(tvp, p, &dsdvp, &fh);
+		nfsrv_pnfsremovesetup(tvp, p, &dsdvp, &fh, fname);
 		NFSD_DEBUG(4, "nfsvno_rename: pnfsremovesetup"
 		    " dsdvp=%p\n", dsdvp);
 	}
@@ -1378,7 +1383,7 @@ out:
 	 */
 	if (dsdvp != NULL) {
 		if (error == 0) {
-			nfsrv_pnfsremove(dsdvp, &fh, p);
+			nfsrv_pnfsremove(dsdvp, &fh, fname, p);
 			NFSD_DEBUG(4, "nfsvno_rename: pnfsremove\n");
 		}
 		NFSVOPUNLOCK(dsdvp, 0);
@@ -3641,7 +3646,6 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 	} else
 		printf("pNFS: pnfscreate vnlock=%d\n", error);
 	NFSFREECRED(tcred);
-	nfsvno_relpathbuf(&named);
 	if (error == 0) {
 		pf = NULL;
 		np = VTONFS(nvp);
@@ -3661,12 +3665,15 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 		if (error == 0) {
 			dsattr.dsa_filerev = va.va_filerev;
 			dsattr.dsa_size = va.va_size;
+			dsattr.dsa_atime = va.va_atime;
 			dsattr.dsa_mtime = va.va_mtime;
 			pf = malloc(sizeof(*pf), M_TEMP, M_WAITOK | M_ZERO);
 			pf->dsf_dir = dsdir;
 			NFSBCOPY(np->n_fhp->nfh_fh, &pf->dsf_fh, NFSX_MYFH);
 			NFSBCOPY(nmp->nm_nam, &pf->dsf_sin,
 			    nmp->nm_nam->sa_len);
+			NFSBCOPY(named.ni_cnd.cn_nameptr, pf->dsf_filename,
+			    sizeof(pf->dsf_filename));
 			error = vn_start_write(vp, &mp, V_WAIT);
 		} else
 			printf("pNFS: pnfscreate can't get DS attr=%d\n",
@@ -3689,6 +3696,7 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 		free(pf, M_TEMP);
 	} else
 		printf("pNFS: pnfscreate=%d\n", error);
+	nfsvno_relpathbuf(&named);
 }
 
 /*
@@ -3698,7 +3706,7 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
  */
 static void
 nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, struct vnode **dvpp,
-    fhandle_t *fhp)
+    fhandle_t *fhp, char *fname)
 {
 	struct vnode *dvp;
 	struct nfsmount *nmp;
@@ -3732,7 +3740,7 @@ nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, 
 	buf = malloc(buflen, M_TEMP, M_WAITOK);
 	/* Get the directory vnode for the DS mount and the file handle. */
 	error = nfsrv_dsgetsockmnt(vp, LK_EXCLUSIVE, buf, buflen, p, &dvp,
-	    &nmp, NULL, NULL);
+	    &nmp, NULL, NULL, fname);
 	if (error == 0) {
 		error = nfsvno_getfh(vp, fhp, p);
 		if (error != 0) {
@@ -3752,7 +3760,7 @@ nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, 
  * removed to set up the dvp and fill in the FH.
  */
 static void
-nfsrv_pnfsremove(struct vnode *dvp, fhandle_t *fhp, NFSPROC_T *p)
+nfsrv_pnfsremove(struct vnode *dvp, fhandle_t *fhp, char *fname, NFSPROC_T *p)
 {
 	struct vnode *nvp;
 	struct nameidata named;
@@ -3770,7 +3778,8 @@ nfsrv_pnfsremove(struct vnode *dvp, fhandle_t *fhp, NF
 	named.ni_cnd.cn_flags = ISLASTCN | LOCKPARENT | LOCKLEAF | SAVENAME;
 	nfsvno_setpathbuf(&named, &bufp, &hashp);
 	named.ni_cnd.cn_nameptr = bufp;
-	named.ni_cnd.cn_namelen = nfsrv_putfhname(fhp, bufp);
+	named.ni_cnd.cn_namelen = strlen(fname);
+	strlcpy(bufp, fname, NAME_MAX);
 	NFSD_DEBUG(4, "nfsrv_pnfsremove: filename=%s\n", bufp);
 	error = VOP_LOOKUP(dvp, &nvp, &named.ni_cnd);
 	NFSD_DEBUG(4, "nfsrv_pnfsremove: aft LOOKUP=%d\n", error);
@@ -3881,6 +3890,7 @@ nfsrv_proxyds(struct nfsrv_descript *nd, struct vnode 
 			NFSBCOPY(buf, &dsattr, buflen);
 			nap->na_filerev = dsattr.dsa_filerev;
 			nap->na_size = dsattr.dsa_size;
+			nap->na_atime = dsattr.dsa_atime;
 			nap->na_mtime = dsattr.dsa_mtime;
 		}
 
@@ -3900,7 +3910,7 @@ nfsrv_proxyds(struct nfsrv_descript *nd, struct vnode 
 	if (error == 0) {
 		buflen = 1024;
 		error = nfsrv_dsgetsockmnt(vp, LK_SHARED, buf, buflen, p,
-		    &dvp, &nmp, &fh, NULL);
+		    &dvp, &nmp, &fh, NULL, NULL);
 		if (error != 0)
 			printf("pNFS: proxy getextattr sockaddr=%d\n", error);
 	} else
@@ -3939,7 +3949,7 @@ nfsrv_proxyds(struct nfsrv_descript *nd, struct vnode 
 static int
 nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char *buf, int buflen,
     NFSPROC_T *p, struct vnode **dvpp, struct nfsmount **nmpp, fhandle_t *fhp,
-    char *devid)
+    char *devid, char *fnamep)
 {
 	struct vnode *dvp;
 	struct nfsmount *nmp;
@@ -3995,6 +4005,9 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 		}
 		if (fhp != NULL)
 			NFSBCOPY(&pf->dsf_fh, fhp, NFSX_MYFH);
+		if (fnamep != NULL)
+			strlcpy(fnamep, pf->dsf_filename,
+			    sizeof(pf->dsf_filename));
 	} else
 		NFSD_DEBUG(4, "nfsrv_dsgetsockmnt err=%d\n", error);
 	return (error);
@@ -4014,6 +4027,7 @@ nfsrv_setextattr(struct vnode *vp, struct nfsvattr *na
 	if (error == 0) {
 		dsattr.dsa_filerev = nap->na_filerev;
 		dsattr.dsa_size = nap->na_size;
+		dsattr.dsa_atime = nap->na_atime;
 		dsattr.dsa_mtime = nap->na_mtime;
 		error = vn_extattr_set(vp, IO_NODELOCKED,
 		    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsattr",
@@ -4185,6 +4199,7 @@ nfsrv_writedsrpc(fhandle_t *fhp, off_t off, int len, s
 	NFSZERO_ATTRBIT(&attrbits);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_CHANGE);
+	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESS);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEMODIFY);
 	NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
 	*tl = txdr_unsigned(NFSV4OP_GETATTR);
@@ -4223,8 +4238,8 @@ nfsrv_writedsrpc(fhandle_t *fhp, off_t off, int len, s
 	/* We have no use for the Write Verifier since we use FileSync. */
 
 	/*
-	 * Get the Change and Modify Time attributes and set on the
-	 * Metadata file, so its attributes will be what the file's
+	 * Get the Change, Size, Access Time and Modify Time attributes and set
+	 * on the Metadata file, so its attributes will be what the file's
 	 * would be if it had been written.
 	 */
 	if (error == 0) {
@@ -4271,10 +4286,11 @@ nfsrv_setattrdsrpc(fhandle_t *fhp, struct ucred *cred,
 	nfsm_stateidtom(nd, &st, NFSSTATEID_PUTSTATEID);
 	nfscl_fillsattr(nd, &nap->na_vattr, vp, NFSSATTR_FULL, 0);
 
-	/* Do a Getattr for Size, Change and Modify Time. */
+	/* Do a Getattr for Size, Change, Access Time and Modify Time. */
 	NFSZERO_ATTRBIT(&attrbits);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_CHANGE);
+	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESS);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEMODIFY);
 	NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
 	*tl = txdr_unsigned(NFSV4OP_GETATTR);
@@ -4307,8 +4323,8 @@ nfsrv_setattrdsrpc(fhandle_t *fhp, struct ucred *cred,
 	if (nd->nd_repstat != 0)
 		error = nd->nd_repstat;
 	/*
-	 * Get the Change and Modify Time attributes and set on the
-	 * Metadata file, so its attributes will be what the file's
+	 * Get the Change, Size, Access Time and Modify Time attributes and set
+	 * on the Metadata file, so its attributes will be what the file's
 	 * would be if it had been written.
 	 */
 	if (error == 0) {
@@ -4392,6 +4408,7 @@ nfsrv_getattrdsrpc(fhandle_t *fhp, struct ucred *cred,
 	NFSZERO_ATTRBIT(&attrbits);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_CHANGE);
+	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESS);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEMODIFY);
 	(void) nfsrv_putattrbit(nd, &attrbits);
 	error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred,
@@ -4429,7 +4446,7 @@ nfsrv_dsgetdevandfh(struct vnode *vp, NFSPROC_T *p, fh
 	buflen = 1024;
 	buf = malloc(buflen, M_TEMP, M_WAITOK);
 	error = nfsrv_dsgetsockmnt(vp, 0, buf, buflen, p, NULL, NULL, fhp,
-	    devid);
+	    devid, NULL);
 	free(buf, M_TEMP);
 	return (error);
 }

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c	Tue Jun 13 23:50:55 2017	(r319923)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c	Wed Jun 14 00:21:08 2017	(r319924)
@@ -3161,7 +3161,7 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 {
 	u_int32_t *tl;
 	struct nfsstate st, *stp = &st;
-	int error = 0, writeacc;
+	int error = 0;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
 	struct nfsvattr na;
@@ -3204,11 +3204,9 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
-	    &writeacc);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
 	/* For pNFS, update the attributes. */
-	if (writeacc != 0)
-		nfsrv_updatemdsattr(vp, &na, p);
+	nfsrv_updatemdsattr(vp, &na, p);
 	vput(vp);
 	if (!nd->nd_repstat) {
 		/*
@@ -3262,7 +3260,7 @@ nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused 
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, NULL, NULL,
-	    NFSV4OP_DELEGPURGE, nd->nd_cred, p, NULL);
+	    NFSV4OP_DELEGPURGE, nd->nd_cred, p);
 nfsmout:
 	NFSEXITCODE2(error, nd);
 	return (error);
@@ -3276,7 +3274,7 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
     vnode_t vp, NFSPROC_T *p, __unused struct nfsexstuff *exp)
 {
 	u_int32_t *tl;
-	int error = 0, writeacc;
+	int error = 0;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
 	struct nfsvattr na;
@@ -3298,10 +3296,9 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, &stateid, vp,
-	    NFSV4OP_DELEGRETURN, nd->nd_cred, p, &writeacc);
+	    NFSV4OP_DELEGRETURN, nd->nd_cred, p);
 	/* For pNFS, update the attributes. */
-	if (writeacc != 0)
-		nfsrv_updatemdsattr(vp, &na, p);
+	nfsrv_updatemdsattr(vp, &na, p);
 nfsmout:
 	vput(vp);
 	NFSEXITCODE2(error, nd);
@@ -3365,8 +3362,7 @@ nfsrvd_openconfirm(struct nfsrv_descript *nd, __unused
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
-	    NULL);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
 	if (!nd->nd_repstat) {
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
@@ -3469,7 +3465,7 @@ nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unus
 	}
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid,
-		    nd, p, NULL);
+		    nd, p);
 	if (!nd->nd_repstat) {
 		/* For NFSv4.1, set the Current StateID. */
 		if ((nd->nd_flag & ND_NFSV41) != 0) {

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c	Tue Jun 13 23:50:55 2017	(r319923)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c	Wed Jun 14 00:21:08 2017	(r319924)
@@ -90,6 +90,11 @@ SYSCTL_INT(_vfs_nfsd, OID_AUTO, allowreadforwriteopen,
     &nfsrv_allowreadforwriteopen, 0,
     "Allow Reads to be done with Write Access StateIDs");
 
+static int	nfsrv_pnfsatime = 0;
+SYSCTL_INT(_vfs_nfsd, OID_AUTO, pnfsgetatime, CTLFLAG_RW,
+    &nfsrv_pnfsatime, 0,
+    "For pNFS service, do Getattr ops to keep atime up-to-date");
+
 /*
  * Hash lists for nfs V4.
  */
@@ -3286,8 +3291,7 @@ out:
  */
 APPLESTATIC int
 nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
-    nfsv4stateid_t *stateidp, struct nfsrv_descript *nd, NFSPROC_T *p,
-    int *retwriteaccessp)
+    nfsv4stateid_t *stateidp, struct nfsrv_descript *nd, NFSPROC_T *p)
 {
 	struct nfsstate *stp, *ownerstp;
 	struct nfsclient *clp;
@@ -3390,12 +3394,6 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp,
 	} else if (new_stp->ls_flags & NFSLCK_CLOSE) {
 		ownerstp = stp->ls_openowner;
 		lfp = stp->ls_lfp;
-		if (retwriteaccessp != NULL) {
-			if ((stp->ls_flags & NFSLCK_WRITEACCESS) != 0)
-				*retwriteaccessp = 1;
-			else
-				*retwriteaccessp = 0;
-		}
 		if (nfsrv_dolocallocks != 0 && !LIST_EMPTY(&stp->ls_open)) {
 			/* Get the lf lock */
 			nfsrv_locklf(lfp);
@@ -3452,7 +3450,7 @@ out:
 APPLESTATIC int
 nfsrv_delegupdate(struct nfsrv_descript *nd, nfsquad_t clientid,
     nfsv4stateid_t *stateidp, vnode_t vp, int op, struct ucred *cred,
-    NFSPROC_T *p, int *retwriteaccessp)
+    NFSPROC_T *p)
 {
 	struct nfsstate *stp;
 	struct nfsclient *clp;
@@ -3517,12 +3515,6 @@ nfsrv_delegupdate(struct nfsrv_descript *nd, nfsquad_t
 			error = NFSERR_BADSTATEID;
 			goto out;
 		}
-		if (retwriteaccessp != NULL) {
-			if ((stp->ls_flags & NFSLCK_DELEGWRITE) != 0)
-				*retwriteaccessp = 1;
-			else
-				*retwriteaccessp = 0;
-		}
 		nfsrv_freedeleg(stp);
 	} else {
 		nfsrv_freedeleglist(&clp->lc_olddeleg);
@@ -6846,8 +6838,8 @@ nfsrv_checkdsattr(struct nfsrv_descript *nd, vnode_t v
 	lhyp = NFSLAYOUTHASH(&fh);
 	NFSLOCKLAYOUT(lhyp);
 	LIST_FOREACH(lyp, &lhyp->list, lay_list) {
-		if (NFSBCMP(&lyp->lay_fh, &fh, sizeof(fh)) == 0 && lyp->lay_rw
-		    != 0) {
+		if (NFSBCMP(&lyp->lay_fh, &fh, sizeof(fh)) == 0 && (lyp->lay_rw
+		    != 0 || (lyp->lay_read != 0 && nfsrv_pnfsatime != 0))) {
 			if (clidcnt < NFSCLIDVECSIZE)
 				clid[clidcnt].qval = lyp->lay_clientid.qval;
 			clidcnt++;

From owner-svn-src-projects@freebsd.org  Wed Jun 14 00:40:35 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 08987C0A895
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Wed, 14 Jun 2017 00:40:35 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id C52EB72633;
 Wed, 14 Jun 2017 00:40:34 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5E0eXi7075320;
 Wed, 14 Jun 2017 00:40:33 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5E0eXHk075314;
 Wed, 14 Jun 2017 00:40:33 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706140040.v5E0eXHk075314@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Wed, 14 Jun 2017 00:40:33 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319925 - in projects/pnfs-planb-server/sys/fs: nfs
 nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 14 Jun 2017 00:40:35 -0000

Author: rmacklem
Date: Wed Jun 14 00:40:33 2017
New Revision: 319925
URL: https://svnweb.freebsd.org/changeset/base/319925

Log:
  Add support for atime to the attributes handled through the DS file.
  Also add the DS file name to the extended attribute pnfsd.dsfile so
  that removal of it still works if the FH of the metadata file changes,
  due to a backup/recovery or similar.

Modified:
  projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
  projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Wed Jun 14 00:21:08 2017	(r319924)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Wed Jun 14 00:40:33 2017	(r319925)
@@ -109,9 +109,9 @@ int nfsrv_openctrl(struct nfsrv_descript *, vnode_t,
 int nfsrv_opencheck(nfsquad_t, nfsv4stateid_t *, struct nfsstate *,
     vnode_t, struct nfsrv_descript *, NFSPROC_T *, int);
 int nfsrv_openupdate(vnode_t, struct nfsstate *, nfsquad_t,
-    nfsv4stateid_t *, struct nfsrv_descript *, NFSPROC_T *, int *);
+    nfsv4stateid_t *, struct nfsrv_descript *, NFSPROC_T *);
 int nfsrv_delegupdate(struct nfsrv_descript *, nfsquad_t, nfsv4stateid_t *,
-    vnode_t, int, struct ucred *, NFSPROC_T *, int *);
+    vnode_t, int, struct ucred *, NFSPROC_T *);
 int nfsrv_releaselckown(struct nfsstate *, nfsquad_t, NFSPROC_T *);
 void nfsrv_zapclient(struct nfsclient *, NFSPROC_T *);
 int nfssvc_idname(struct nfsd_idargs *);

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h	Wed Jun 14 00:21:08 2017	(r319924)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h	Wed Jun 14 00:40:33 2017	(r319925)
@@ -343,12 +343,13 @@ struct nfsdevice {
 TAILQ_HEAD(nfsdevicehead, nfsdevice);
 
 /*
- * This structure holds the va_size, va_filerev and va_mtime for the DS
- * file and is stored in the metadata file's extended attribute pnfsd.dsattr.
+ * This structure holds the va_size, va_filerev, va_atime and va_mtime for the
+ * DS file and is stored in the metadata file's extended attribute pnfsd.dsattr.
  */
 struct pnfsdsattr {
 	uint64_t	dsa_filerev;
 	uint64_t	dsa_size;
+	struct timespec	dsa_atime;
 	struct timespec	dsa_mtime;
 };
 
@@ -357,8 +358,8 @@ struct pnfsdsattr {
 /*
  * This structure holds the information about the DS file and is stored
  * in the metadata file's extended attribute called pnfsd.dsfile.
- * dsf_nam[0] is defined as the actual length of sa_len for the addr.
  */
+#define	PNFS_FILENAME_LEN	(2 * sizeof(fhandle_t))
 struct pnfsdsfile {
 	fhandle_t	dsf_fh;
 	uint32_t	dsf_dir;
@@ -366,6 +367,7 @@ struct pnfsdsfile {
 		struct sockaddr_in	sin;
 		struct sockaddr_in6	sin6;
 	} dsf_nam;
+	char		dsf_filename[PNFS_FILENAME_LEN + 1];
 };
 #define	dsf_sin		dsf_nam.sin
 #define	dsf_sin6	dsf_nam.sin6

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Wed Jun 14 00:21:08 2017	(r319924)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Wed Jun 14 00:40:33 2017	(r319925)
@@ -97,13 +97,13 @@ extern struct nfsdevicehead nfsrv_devidhead;
 static void nfsrv_pnfscreate(struct vnode *, struct vattr *, struct ucred *,
     NFSPROC_T *);
 static void nfsrv_pnfsremovesetup(struct vnode *, NFSPROC_T *, struct vnode **,
-    fhandle_t *);
-static void nfsrv_pnfsremove(struct vnode *, fhandle_t *, NFSPROC_T *);
+    fhandle_t *, char *);
+static void nfsrv_pnfsremove(struct vnode *, fhandle_t *, char *, NFSPROC_T *);
 static int nfsrv_proxyds(struct nfsrv_descript *, struct vnode *, off_t, int,
     struct ucred *, struct thread *, int, struct mbuf **, char *,
     struct mbuf **, struct nfsvattr *, struct acl *);
-static int nfsrv_dsgetsockmnt(struct vnode *, int, char *, int,
-    NFSPROC_T *, struct vnode **, struct nfsmount **, fhandle_t *, char *);
+static int nfsrv_dsgetsockmnt(struct vnode *, int, char *, int, NFSPROC_T *,
+    struct vnode **, struct nfsmount **, fhandle_t *, char *, char *);
 static int nfsrv_setextattr(struct vnode *, struct nfsvattr *, NFSPROC_T *);
 static int nfsrv_readdsrpc(fhandle_t *, off_t, int, struct ucred *,
     NFSPROC_T *, struct nfsmount *, struct mbuf **, struct mbuf **);
@@ -271,6 +271,7 @@ nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap
 	    (nd->nd_flag & ND_NFSV4) == 0 ||
 	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_CHANGE) ||
 	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_SIZE) ||
+	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_TIMEACCESS) ||
 	    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_TIMEMODIFY))) {
 		error = nfsrv_proxyds(nd, vp, 0, 0, nd->nd_cred, p,
 		    NFSPROC_GETATTR, NULL, NULL, NULL, &na, NULL);
@@ -287,6 +288,7 @@ nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap
 	 * replace them.
 	 */
 	if (gotattr != 0) {
+		nvap->na_atime = na.na_atime;
 		nvap->na_mtime = na.na_mtime;
 		nvap->na_filerev = na.na_filerev;
 		nvap->na_size = na.na_size;
@@ -427,6 +429,7 @@ nfsvno_setattr(struct vnode *vp, struct nfsvattr *nvap
 	    nvap->na_vattr.va_gid != (gid_t)VNOVAL ||
 	    nvap->na_vattr.va_size != VNOVAL ||
 	    nvap->na_vattr.va_mode != (mode_t)VNOVAL ||
+	    nvap->na_vattr.va_atime.tv_sec != VNOVAL ||
 	    nvap->na_vattr.va_mtime.tv_sec != VNOVAL)) {
 		/* For a pNFS server, set the attributes on the DS file. */
 		error = nfsrv_proxyds(NULL, vp, 0, 0, cred, p, NFSPROC_SETATTR,
@@ -1194,6 +1197,7 @@ nfsvno_removesub(struct nameidata *ndp, int is_v4, str
 	struct vnode *vp, *dsdvp;
 	fhandle_t fh;
 	int error = 0;
+	char fname[PNFS_FILENAME_LEN + 1];
 
 	vp = ndp->ni_vp;
 	dsdvp = NULL;
@@ -1202,12 +1206,12 @@ nfsvno_removesub(struct nameidata *ndp, int is_v4, str
 	else if (is_v4)
 		error = nfsrv_checkremove(vp, 1, p);
 	if (error == 0)
-		nfsrv_pnfsremovesetup(vp, p, &dsdvp, &fh);
+		nfsrv_pnfsremovesetup(vp, p, &dsdvp, &fh, fname);
 	if (!error)
 		error = VOP_REMOVE(ndp->ni_dvp, vp, &ndp->ni_cnd);
 	if (dsdvp != NULL) {
 		if (error == 0)
-			nfsrv_pnfsremove(dsdvp, &fh, p);
+			nfsrv_pnfsremove(dsdvp, &fh, fname, p);
 		NFSVOPUNLOCK(dsdvp, 0);
 	}
 	if (ndp->ni_dvp == vp)
@@ -1272,6 +1276,7 @@ nfsvno_rename(struct nameidata *fromndp, struct nameid
 	struct vnode *fvp, *tvp, *tdvp, *dsdvp;
 	fhandle_t fh;
 	int error = 0;
+	char fname[PNFS_FILENAME_LEN + 1];
 
 	dsdvp = NULL;
 	fvp = fromndp->ni_vp;
@@ -1349,7 +1354,7 @@ nfsvno_rename(struct nameidata *fromndp, struct nameid
 		nfsd_recalldelegation(fvp, p);
 	}
 	if (error == 0 && tvp != NULL) {
-		nfsrv_pnfsremovesetup(tvp, p, &dsdvp, &fh);
+		nfsrv_pnfsremovesetup(tvp, p, &dsdvp, &fh, fname);
 		NFSD_DEBUG(4, "nfsvno_rename: pnfsremovesetup"
 		    " dsdvp=%p\n", dsdvp);
 	}
@@ -1378,7 +1383,7 @@ out:
 	 */
 	if (dsdvp != NULL) {
 		if (error == 0) {
-			nfsrv_pnfsremove(dsdvp, &fh, p);
+			nfsrv_pnfsremove(dsdvp, &fh, fname, p);
 			NFSD_DEBUG(4, "nfsvno_rename: pnfsremove\n");
 		}
 		NFSVOPUNLOCK(dsdvp, 0);
@@ -3658,7 +3663,6 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 	} else
 		printf("pNFS: pnfscreate vnlock=%d\n", error);
 	NFSFREECRED(tcred);
-	nfsvno_relpathbuf(&named);
 	if (error == 0) {
 		pf = NULL;
 		np = VTONFS(nvp);
@@ -3678,12 +3682,15 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 		if (error == 0) {
 			dsattr.dsa_filerev = va.va_filerev;
 			dsattr.dsa_size = va.va_size;
+			dsattr.dsa_atime = va.va_atime;
 			dsattr.dsa_mtime = va.va_mtime;
 			pf = malloc(sizeof(*pf), M_TEMP, M_WAITOK | M_ZERO);
 			pf->dsf_dir = dsdir;
 			NFSBCOPY(np->n_fhp->nfh_fh, &pf->dsf_fh, NFSX_MYFH);
 			NFSBCOPY(nmp->nm_nam, &pf->dsf_sin,
 			    nmp->nm_nam->sa_len);
+			NFSBCOPY(named.ni_cnd.cn_nameptr, pf->dsf_filename,
+			    sizeof(pf->dsf_filename));
 			error = vn_start_write(vp, &mp, V_WAIT);
 		} else
 			printf("pNFS: pnfscreate can't get DS attr=%d\n",
@@ -3706,6 +3713,7 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 		free(pf, M_TEMP);
 	} else
 		printf("pNFS: pnfscreate=%d\n", error);
+	nfsvno_relpathbuf(&named);
 }
 
 /*
@@ -3715,7 +3723,7 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
  */
 static void
 nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, struct vnode **dvpp,
-    fhandle_t *fhp)
+    fhandle_t *fhp, char *fname)
 {
 	struct vnode *dvp;
 	struct nfsmount *nmp;
@@ -3749,7 +3757,7 @@ nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, 
 	buf = malloc(buflen, M_TEMP, M_WAITOK);
 	/* Get the directory vnode for the DS mount and the file handle. */
 	error = nfsrv_dsgetsockmnt(vp, LK_EXCLUSIVE, buf, buflen, p, &dvp,
-	    &nmp, NULL, NULL);
+	    &nmp, NULL, NULL, fname);
 	if (error == 0) {
 		error = nfsvno_getfh(vp, fhp, p);
 		if (error != 0) {
@@ -3769,7 +3777,7 @@ nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, 
  * removed to set up the dvp and fill in the FH.
  */
 static void
-nfsrv_pnfsremove(struct vnode *dvp, fhandle_t *fhp, NFSPROC_T *p)
+nfsrv_pnfsremove(struct vnode *dvp, fhandle_t *fhp, char *fname, NFSPROC_T *p)
 {
 	struct vnode *nvp;
 	struct nameidata named;
@@ -3787,7 +3795,8 @@ nfsrv_pnfsremove(struct vnode *dvp, fhandle_t *fhp, NF
 	named.ni_cnd.cn_flags = ISLASTCN | LOCKPARENT | LOCKLEAF | SAVENAME;
 	nfsvno_setpathbuf(&named, &bufp, &hashp);
 	named.ni_cnd.cn_nameptr = bufp;
-	named.ni_cnd.cn_namelen = nfsrv_putfhname(fhp, bufp);
+	named.ni_cnd.cn_namelen = strlen(fname);
+	strlcpy(bufp, fname, NAME_MAX);
 	NFSD_DEBUG(4, "nfsrv_pnfsremove: filename=%s\n", bufp);
 	error = VOP_LOOKUP(dvp, &nvp, &named.ni_cnd);
 	NFSD_DEBUG(4, "nfsrv_pnfsremove: aft LOOKUP=%d\n", error);
@@ -3898,6 +3907,7 @@ nfsrv_proxyds(struct nfsrv_descript *nd, struct vnode 
 			NFSBCOPY(buf, &dsattr, buflen);
 			nap->na_filerev = dsattr.dsa_filerev;
 			nap->na_size = dsattr.dsa_size;
+			nap->na_atime = dsattr.dsa_atime;
 			nap->na_mtime = dsattr.dsa_mtime;
 		}
 
@@ -3917,7 +3927,7 @@ nfsrv_proxyds(struct nfsrv_descript *nd, struct vnode 
 	if (error == 0) {
 		buflen = 1024;
 		error = nfsrv_dsgetsockmnt(vp, LK_SHARED, buf, buflen, p,
-		    &dvp, &nmp, &fh, NULL);
+		    &dvp, &nmp, &fh, NULL, NULL);
 		if (error != 0)
 			printf("pNFS: proxy getextattr sockaddr=%d\n", error);
 	} else
@@ -3956,7 +3966,7 @@ nfsrv_proxyds(struct nfsrv_descript *nd, struct vnode 
 static int
 nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char *buf, int buflen,
     NFSPROC_T *p, struct vnode **dvpp, struct nfsmount **nmpp, fhandle_t *fhp,
-    char *devid)
+    char *devid, char *fnamep)
 {
 	struct vnode *dvp;
 	struct nfsmount *nmp;
@@ -4012,6 +4022,9 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 		}
 		if (fhp != NULL)
 			NFSBCOPY(&pf->dsf_fh, fhp, NFSX_MYFH);
+		if (fnamep != NULL)
+			strlcpy(fnamep, pf->dsf_filename,
+			    sizeof(pf->dsf_filename));
 	} else
 		NFSD_DEBUG(4, "nfsrv_dsgetsockmnt err=%d\n", error);
 	return (error);
@@ -4031,6 +4044,7 @@ nfsrv_setextattr(struct vnode *vp, struct nfsvattr *na
 	if (error == 0) {
 		dsattr.dsa_filerev = nap->na_filerev;
 		dsattr.dsa_size = nap->na_size;
+		dsattr.dsa_atime = nap->na_atime;
 		dsattr.dsa_mtime = nap->na_mtime;
 		error = vn_extattr_set(vp, IO_NODELOCKED,
 		    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsattr",
@@ -4202,6 +4216,7 @@ nfsrv_writedsrpc(fhandle_t *fhp, off_t off, int len, s
 	NFSZERO_ATTRBIT(&attrbits);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_CHANGE);
+	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESS);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEMODIFY);
 	NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
 	*tl = txdr_unsigned(NFSV4OP_GETATTR);
@@ -4240,8 +4255,8 @@ nfsrv_writedsrpc(fhandle_t *fhp, off_t off, int len, s
 	/* We have no use for the Write Verifier since we use FileSync. */
 
 	/*
-	 * Get the Change and Modify Time attributes and set on the
-	 * Metadata file, so its attributes will be what the file's
+	 * Get the Change, Size, Access Time and Modify Time attributes and set
+	 * on the Metadata file, so its attributes will be what the file's
 	 * would be if it had been written.
 	 */
 	if (error == 0) {
@@ -4288,10 +4303,11 @@ nfsrv_setattrdsrpc(fhandle_t *fhp, struct ucred *cred,
 	nfsm_stateidtom(nd, &st, NFSSTATEID_PUTSTATEID);
 	nfscl_fillsattr(nd, &nap->na_vattr, vp, NFSSATTR_FULL, 0);
 
-	/* Do a Getattr for Size, Change and Modify Time. */
+	/* Do a Getattr for Size, Change, Access Time and Modify Time. */
 	NFSZERO_ATTRBIT(&attrbits);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_CHANGE);
+	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESS);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEMODIFY);
 	NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
 	*tl = txdr_unsigned(NFSV4OP_GETATTR);
@@ -4324,8 +4340,8 @@ nfsrv_setattrdsrpc(fhandle_t *fhp, struct ucred *cred,
 	if (nd->nd_repstat != 0)
 		error = nd->nd_repstat;
 	/*
-	 * Get the Change and Modify Time attributes and set on the
-	 * Metadata file, so its attributes will be what the file's
+	 * Get the Change, Size, Access Time and Modify Time attributes and set
+	 * on the Metadata file, so its attributes will be what the file's
 	 * would be if it had been written.
 	 */
 	if (error == 0) {
@@ -4409,6 +4425,7 @@ nfsrv_getattrdsrpc(fhandle_t *fhp, struct ucred *cred,
 	NFSZERO_ATTRBIT(&attrbits);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_CHANGE);
+	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESS);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEMODIFY);
 	(void) nfsrv_putattrbit(nd, &attrbits);
 	error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred,
@@ -4446,7 +4463,7 @@ nfsrv_dsgetdevandfh(struct vnode *vp, NFSPROC_T *p, fh
 	buflen = 1024;
 	buf = malloc(buflen, M_TEMP, M_WAITOK);
 	error = nfsrv_dsgetsockmnt(vp, 0, buf, buflen, p, NULL, NULL, fhp,
-	    devid);
+	    devid, NULL);
 	free(buf, M_TEMP);
 	return (error);
 }

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c	Wed Jun 14 00:21:08 2017	(r319924)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c	Wed Jun 14 00:40:33 2017	(r319925)
@@ -3161,7 +3161,7 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 {
 	u_int32_t *tl;
 	struct nfsstate st, *stp = &st;
-	int error = 0, writeacc;
+	int error = 0;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
 	struct nfsvattr na;
@@ -3204,11 +3204,9 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
-	    &writeacc);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
 	/* For pNFS, update the attributes. */
-	if (writeacc != 0)
-		nfsrv_updatemdsattr(vp, &na, p);
+	nfsrv_updatemdsattr(vp, &na, p);
 	vput(vp);
 	if (!nd->nd_repstat) {
 		/*
@@ -3262,7 +3260,7 @@ nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused 
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, NULL, NULL,
-	    NFSV4OP_DELEGPURGE, nd->nd_cred, p, NULL);
+	    NFSV4OP_DELEGPURGE, nd->nd_cred, p);
 nfsmout:
 	NFSEXITCODE2(error, nd);
 	return (error);
@@ -3276,7 +3274,7 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
     vnode_t vp, NFSPROC_T *p, __unused struct nfsexstuff *exp)
 {
 	u_int32_t *tl;
-	int error = 0, writeacc;
+	int error = 0;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
 	struct nfsvattr na;
@@ -3298,10 +3296,9 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, &stateid, vp,
-	    NFSV4OP_DELEGRETURN, nd->nd_cred, p, &writeacc);
+	    NFSV4OP_DELEGRETURN, nd->nd_cred, p);
 	/* For pNFS, update the attributes. */
-	if (writeacc != 0)
-		nfsrv_updatemdsattr(vp, &na, p);
+	nfsrv_updatemdsattr(vp, &na, p);
 nfsmout:
 	vput(vp);
 	NFSEXITCODE2(error, nd);
@@ -3365,8 +3362,7 @@ nfsrvd_openconfirm(struct nfsrv_descript *nd, __unused
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
-	    NULL);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
 	if (!nd->nd_repstat) {
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
@@ -3469,7 +3465,7 @@ nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unus
 	}
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid,
-		    nd, p, NULL);
+		    nd, p);
 	if (!nd->nd_repstat) {
 		/* For NFSv4.1, set the Current StateID. */
 		if ((nd->nd_flag & ND_NFSV41) != 0) {

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Wed Jun 14 00:21:08 2017	(r319924)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Wed Jun 14 00:40:33 2017	(r319925)
@@ -90,6 +90,11 @@ SYSCTL_INT(_vfs_nfsd, OID_AUTO, allowreadforwriteopen,
     &nfsrv_allowreadforwriteopen, 0,
     "Allow Reads to be done with Write Access StateIDs");
 
+static int	nfsrv_pnfsatime = 0;
+SYSCTL_INT(_vfs_nfsd, OID_AUTO, pnfsgetatime, CTLFLAG_RW,
+    &nfsrv_pnfsatime, 0,
+    "For pNFS service, do Getattr ops to keep atime up-to-date");
+
 /*
  * Hash lists for nfs V4.
  */
@@ -3286,8 +3291,7 @@ out:
  */
 APPLESTATIC int
 nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
-    nfsv4stateid_t *stateidp, struct nfsrv_descript *nd, NFSPROC_T *p,
-    int *retwriteaccessp)
+    nfsv4stateid_t *stateidp, struct nfsrv_descript *nd, NFSPROC_T *p)
 {
 	struct nfsstate *stp, *ownerstp;
 	struct nfsclient *clp;
@@ -3390,12 +3394,6 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp,
 	} else if (new_stp->ls_flags & NFSLCK_CLOSE) {
 		ownerstp = stp->ls_openowner;
 		lfp = stp->ls_lfp;
-		if (retwriteaccessp != NULL) {
-			if ((stp->ls_flags & NFSLCK_WRITEACCESS) != 0)
-				*retwriteaccessp = 1;
-			else
-				*retwriteaccessp = 0;
-		}
 		if (nfsrv_dolocallocks != 0 && !LIST_EMPTY(&stp->ls_open)) {
 			/* Get the lf lock */
 			nfsrv_locklf(lfp);
@@ -3452,7 +3450,7 @@ out:
 APPLESTATIC int
 nfsrv_delegupdate(struct nfsrv_descript *nd, nfsquad_t clientid,
     nfsv4stateid_t *stateidp, vnode_t vp, int op, struct ucred *cred,
-    NFSPROC_T *p, int *retwriteaccessp)
+    NFSPROC_T *p)
 {
 	struct nfsstate *stp;
 	struct nfsclient *clp;
@@ -3517,12 +3515,6 @@ nfsrv_delegupdate(struct nfsrv_descript *nd, nfsquad_t
 			error = NFSERR_BADSTATEID;
 			goto out;
 		}
-		if (retwriteaccessp != NULL) {
-			if ((stp->ls_flags & NFSLCK_DELEGWRITE) != 0)
-				*retwriteaccessp = 1;
-			else
-				*retwriteaccessp = 0;
-		}
 		nfsrv_freedeleg(stp);
 	} else {
 		nfsrv_freedeleglist(&clp->lc_olddeleg);
@@ -6846,8 +6838,8 @@ nfsrv_checkdsattr(struct nfsrv_descript *nd, vnode_t v
 	lhyp = NFSLAYOUTHASH(&fh);
 	NFSLOCKLAYOUT(lhyp);
 	LIST_FOREACH(lyp, &lhyp->list, lay_list) {
-		if (NFSBCMP(&lyp->lay_fh, &fh, sizeof(fh)) == 0 && lyp->lay_rw
-		    != 0) {
+		if (NFSBCMP(&lyp->lay_fh, &fh, sizeof(fh)) == 0 && (lyp->lay_rw
+		    != 0 || (lyp->lay_read != 0 && nfsrv_pnfsatime != 0))) {
 			if (clidcnt < NFSCLIDVECSIZE)
 				clid[clidcnt].qval = lyp->lay_clientid.qval;
 			clidcnt++;

From owner-svn-src-projects@freebsd.org  Wed Jun 14 01:57:23 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id F419CC77099
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Wed, 14 Jun 2017 01:57:22 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id BF2077473E;
 Wed, 14 Jun 2017 01:57:22 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5E1vLkg008052;
 Wed, 14 Jun 2017 01:57:21 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5E1vL5b008051;
 Wed, 14 Jun 2017 01:57:21 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706140157.v5E1vL5b008051@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Wed, 14 Jun 2017 01:57:21 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319926 - projects/pnfs-planb-server/usr.bin/pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 14 Jun 2017 01:57:23 -0000

Author: rmacklem
Date: Wed Jun 14 01:57:21 2017
New Revision: 319926
URL: https://svnweb.freebsd.org/changeset/base/319926

Log:
  Fix pnfsdsfile so that it uses the filename now in the extended attribute.

Modified:
  projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c

Modified: projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c
==============================================================================
--- projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c	Wed Jun 14 00:40:33 2017	(r319925)
+++ projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c	Wed Jun 14 01:57:21 2017	(r319926)
@@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$");
 #include <fs/nfs/nfsrvstate.h>
 
 static void usage(void);
-static void nfsrv_putfhname(fhandle_t *fhp, char *bufp);
 
 /*
  * This program displays the location information of a data storage file
@@ -51,22 +50,13 @@ static void nfsrv_putfhname(fhandle_t *fhp, char *bufp
 int
 main(int argc, char *argv[])
 {
-	fhandle_t fh;
-	char buf[sizeof(fh) * 2 + 1], hostn[NI_MAXHOST + 1];
+	char hostn[NI_MAXHOST + 1];
 	struct pnfsdsfile dsfile;
 
 	if (argc != 2)
 		usage();
 
 	/*
-	 * The file's name is a hexadecimal representation of the MetaData
-	 * Server's file handle.
-	 */
-	if (getfh(argv[1], &fh) < 0)
-		err(1, "Getfh of %s failed", argv[1]);
-	nfsrv_putfhname(&fh, buf);
-
-	/*
 	 * The host address and directory where the data storage file is
 	 * located is in the extended attribute "pnfsd.dsfile".
 	 */
@@ -79,21 +69,7 @@ main(int argc, char *argv[])
 	    dsfile.dsf_sin.sin_len, hostn, sizeof(hostn), NULL, 0, 0) < 0)
 		err(1, "Can't get hostname\n");
 
-	printf("%s\tds%d/%s\n", hostn, dsfile.dsf_dir, buf);
-}
-
-/*
- * Generate a file name based on the file handle and put it in *bufp.
- */
-static void
-nfsrv_putfhname(fhandle_t *fhp, char *bufp)
-{
-	int i;
-	uint8_t *cp;
-
-	cp = (uint8_t *)fhp;
-	for (i = 0; i < sizeof(*fhp); i++)
-		sprintf(&bufp[2 * i], "%02x", *cp++);
+	printf("%s\tds%d/%s\n", hostn, dsfile.dsf_dir, dsfile.dsf_filename);
 }
 
 static void

From owner-svn-src-projects@freebsd.org  Wed Jun 14 01:59:42 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 6F25DC771A0
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Wed, 14 Jun 2017 01:59:42 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 3F47074906;
 Wed, 14 Jun 2017 01:59:42 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5E1xfcf008326;
 Wed, 14 Jun 2017 01:59:41 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5E1xfBQ008325;
 Wed, 14 Jun 2017 01:59:41 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706140159.v5E1xfBQ008325@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Wed, 14 Jun 2017 01:59:41 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319927 -
 projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 14 Jun 2017 01:59:42 -0000

Author: rmacklem
Date: Wed Jun 14 01:59:41 2017
New Revision: 319927
URL: https://svnweb.freebsd.org/changeset/base/319927

Log:
  Fix pnfsdsfile to use the file name now in the extended attribute.

Modified:
  projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c

Modified: projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c
==============================================================================
--- projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c	Wed Jun 14 01:57:21 2017	(r319926)
+++ projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c	Wed Jun 14 01:59:41 2017	(r319927)
@@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$");
 #include <fs/nfs/nfsrvstate.h>
 
 static void usage(void);
-static void nfsrv_putfhname(fhandle_t *fhp, char *bufp);
 
 /*
  * This program displays the location information of a data storage file
@@ -51,22 +50,13 @@ static void nfsrv_putfhname(fhandle_t *fhp, char *bufp
 int
 main(int argc, char *argv[])
 {
-	fhandle_t fh;
-	char buf[sizeof(fh) * 2 + 1], hostn[NI_MAXHOST + 1];
+	char hostn[NI_MAXHOST + 1];
 	struct pnfsdsfile dsfile;
 
 	if (argc != 2)
 		usage();
 
 	/*
-	 * The file's name is a hexadecimal representation of the MetaData
-	 * Server's file handle.
-	 */
-	if (getfh(argv[1], &fh) < 0)
-		err(1, "Getfh of %s failed", argv[1]);
-	nfsrv_putfhname(&fh, buf);
-
-	/*
 	 * The host address and directory where the data storage file is
 	 * located is in the extended attribute "pnfsd.dsfile".
 	 */
@@ -79,21 +69,7 @@ main(int argc, char *argv[])
 	    dsfile.dsf_sin.sin_len, hostn, sizeof(hostn), NULL, 0, 0) < 0)
 		err(1, "Can't get hostname\n");
 
-	printf("%s\tds%d/%s\n", hostn, dsfile.dsf_dir, buf);
-}
-
-/*
- * Generate a file name based on the file handle and put it in *bufp.
- */
-static void
-nfsrv_putfhname(fhandle_t *fhp, char *bufp)
-{
-	int i;
-	uint8_t *cp;
-
-	cp = (uint8_t *)fhp;
-	for (i = 0; i < sizeof(*fhp); i++)
-		sprintf(&bufp[2 * i], "%02x", *cp++);
+	printf("%s\tds%d/%s\n", hostn, dsfile.dsf_dir, dsfile.dsf_filename);
 }
 
 static void

From owner-svn-src-projects@freebsd.org  Wed Jun 14 20:27:15 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id B684BBF33B0
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Wed, 14 Jun 2017 20:27:15 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 927197790F;
 Wed, 14 Jun 2017 20:27:15 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5EKRExD066225;
 Wed, 14 Jun 2017 20:27:14 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5EKREbV066222;
 Wed, 14 Jun 2017 20:27:14 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706142027.v5EKREbV066222@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Wed, 14 Jun 2017 20:27:14 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319958 - in projects/pnfs-planb-server-stable11/sys/fs:
 nfs nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 14 Jun 2017 20:27:15 -0000

Author: rmacklem
Date: Wed Jun 14 20:27:14 2017
New Revision: 319958
URL: https://svnweb.freebsd.org/changeset/base/319958

Log:
  Revert the changes related to Close that updated attributes when only
  reading has been done. Make updating changes upon Close conditional upon
  vfs.nfsd.pnfsstrictattr being set, since it is a performance hit.

Modified:
  projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h	Wed Jun 14 19:36:28 2017	(r319957)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h	Wed Jun 14 20:27:14 2017	(r319958)
@@ -109,9 +109,9 @@ int nfsrv_openctrl(struct nfsrv_descript *, vnode_t,
 int nfsrv_opencheck(nfsquad_t, nfsv4stateid_t *, struct nfsstate *,
     vnode_t, struct nfsrv_descript *, NFSPROC_T *, int);
 int nfsrv_openupdate(vnode_t, struct nfsstate *, nfsquad_t,
-    nfsv4stateid_t *, struct nfsrv_descript *, NFSPROC_T *);
+    nfsv4stateid_t *, struct nfsrv_descript *, NFSPROC_T *, int *);
 int nfsrv_delegupdate(struct nfsrv_descript *, nfsquad_t, nfsv4stateid_t *,
-    vnode_t, int, struct ucred *, NFSPROC_T *);
+    vnode_t, int, struct ucred *, NFSPROC_T *, int *);
 int nfsrv_releaselckown(struct nfsstate *, nfsquad_t, NFSPROC_T *);
 void nfsrv_zapclient(struct nfsclient *, NFSPROC_T *);
 int nfssvc_idname(struct nfsd_idargs *);

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c	Wed Jun 14 19:36:28 2017	(r319957)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdserv.c	Wed Jun 14 20:27:14 2017	(r319958)
@@ -59,6 +59,7 @@ extern time_t nfsdev_time;
 extern struct nfsdevicehead nfsrv_devidhead;
 extern int nfsd_debuglevel;
 extern u_long sb_max_adj;
+extern int nfsrv_pnfsatime;
 #endif	/* !APPLEKEXT */
 
 static int	nfs_async = 0;
@@ -3161,7 +3162,7 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 {
 	u_int32_t *tl;
 	struct nfsstate st, *stp = &st;
-	int error = 0;
+	int error = 0, writeacc;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
 	struct nfsvattr na;
@@ -3204,9 +3205,11 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
+	    &writeacc);
 	/* For pNFS, update the attributes. */
-	nfsrv_updatemdsattr(vp, &na, p);
+	if (writeacc != 0 || nfsrv_pnfsatime != 0)
+		nfsrv_updatemdsattr(vp, &na, p);
 	vput(vp);
 	if (!nd->nd_repstat) {
 		/*
@@ -3260,7 +3263,7 @@ nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused 
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, NULL, NULL,
-	    NFSV4OP_DELEGPURGE, nd->nd_cred, p);
+	    NFSV4OP_DELEGPURGE, nd->nd_cred, p, NULL);
 nfsmout:
 	NFSEXITCODE2(error, nd);
 	return (error);
@@ -3274,7 +3277,7 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
     vnode_t vp, NFSPROC_T *p, __unused struct nfsexstuff *exp)
 {
 	u_int32_t *tl;
-	int error = 0;
+	int error = 0, writeacc;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
 	struct nfsvattr na;
@@ -3296,9 +3299,10 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, &stateid, vp,
-	    NFSV4OP_DELEGRETURN, nd->nd_cred, p);
+	    NFSV4OP_DELEGRETURN, nd->nd_cred, p, &writeacc);
 	/* For pNFS, update the attributes. */
-	nfsrv_updatemdsattr(vp, &na, p);
+	if (writeacc != 0 || nfsrv_pnfsatime != 0)
+		nfsrv_updatemdsattr(vp, &na, p);
 nfsmout:
 	vput(vp);
 	NFSEXITCODE2(error, nd);
@@ -3362,7 +3366,8 @@ nfsrvd_openconfirm(struct nfsrv_descript *nd, __unused
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
+	    NULL);
 	if (!nd->nd_repstat) {
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
@@ -3465,7 +3470,7 @@ nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unus
 	}
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid,
-		    nd, p);
+		    nd, p, NULL);
 	if (!nd->nd_repstat) {
 		/* For NFSv4.1, set the Current StateID. */
 		if ((nd->nd_flag & ND_NFSV41) != 0) {

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c	Wed Jun 14 19:36:28 2017	(r319957)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c	Wed Jun 14 20:27:14 2017	(r319958)
@@ -90,8 +90,8 @@ SYSCTL_INT(_vfs_nfsd, OID_AUTO, allowreadforwriteopen,
     &nfsrv_allowreadforwriteopen, 0,
     "Allow Reads to be done with Write Access StateIDs");
 
-static int	nfsrv_pnfsatime = 0;
-SYSCTL_INT(_vfs_nfsd, OID_AUTO, pnfsgetatime, CTLFLAG_RW,
+int	nfsrv_pnfsatime = 0;
+SYSCTL_INT(_vfs_nfsd, OID_AUTO, pnfsstrictatime, CTLFLAG_RW,
     &nfsrv_pnfsatime, 0,
     "For pNFS service, do Getattr ops to keep atime up-to-date");
 
@@ -3291,7 +3291,8 @@ out:
  */
 APPLESTATIC int
 nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
-    nfsv4stateid_t *stateidp, struct nfsrv_descript *nd, NFSPROC_T *p)
+    nfsv4stateid_t *stateidp, struct nfsrv_descript *nd, NFSPROC_T *p,
+    int *retwriteaccessp)
 {
 	struct nfsstate *stp, *ownerstp;
 	struct nfsclient *clp;
@@ -3394,6 +3395,12 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp,
 	} else if (new_stp->ls_flags & NFSLCK_CLOSE) {
 		ownerstp = stp->ls_openowner;
 		lfp = stp->ls_lfp;
+		if (retwriteaccessp != NULL) {
+			if ((stp->ls_flags & NFSLCK_WRITEACCESS) != 0)
+				*retwriteaccessp = 1;
+			else
+				*retwriteaccessp = 0;
+		}
 		if (nfsrv_dolocallocks != 0 && !LIST_EMPTY(&stp->ls_open)) {
 			/* Get the lf lock */
 			nfsrv_locklf(lfp);
@@ -3450,7 +3457,7 @@ out:
 APPLESTATIC int
 nfsrv_delegupdate(struct nfsrv_descript *nd, nfsquad_t clientid,
     nfsv4stateid_t *stateidp, vnode_t vp, int op, struct ucred *cred,
-    NFSPROC_T *p)
+    NFSPROC_T *p, int *retwriteaccessp)
 {
 	struct nfsstate *stp;
 	struct nfsclient *clp;
@@ -3515,6 +3522,12 @@ nfsrv_delegupdate(struct nfsrv_descript *nd, nfsquad_t
 			error = NFSERR_BADSTATEID;
 			goto out;
 		}
+		if (retwriteaccessp != NULL) {
+			if ((stp->ls_flags & NFSLCK_DELEGWRITE) != 0)
+				*retwriteaccessp = 1;
+			else
+				*retwriteaccessp = 0;
+		}
 		nfsrv_freedeleg(stp);
 	} else {
 		nfsrv_freedeleglist(&clp->lc_olddeleg);
@@ -6336,7 +6349,7 @@ nfsrv_layoutreturn(struct nfsrv_descript *nd, vnode_t 
 	if (kind == NFSV4LAYOUTRET_FILE) {
 		*fndp = 0;
 		error = nfsvno_getfh(vp, &fh, p);
-		if (error == 0 && (iomode & NFSLAYOUTIOMODE_RW) != 0) {
+		if (error == 0) {
 			error = nfsrv_updatemdsattr(vp, &na, p);
 			if (error != 0)
 				printf("nfsrv_layoutreturn: updatemdsattr"

From owner-svn-src-projects@freebsd.org  Wed Jun 14 20:34:04 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 43C3FBF3791
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Wed, 14 Jun 2017 20:34:04 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 1B22377D75;
 Wed, 14 Jun 2017 20:34:04 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5EKY3Xk070209;
 Wed, 14 Jun 2017 20:34:03 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5EKY2gX070205;
 Wed, 14 Jun 2017 20:34:02 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706142034.v5EKY2gX070205@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Wed, 14 Jun 2017 20:34:02 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319959 - in projects/pnfs-planb-server/sys/fs: nfs
 nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 14 Jun 2017 20:34:04 -0000

Author: rmacklem
Date: Wed Jun 14 20:34:02 2017
New Revision: 319959
URL: https://svnweb.freebsd.org/changeset/base/319959

Log:
  Revert the changes related to Close that updated attributes when only
  reading has been done. Make updating changes upon Close conditional upon
  vfs.nfsd.pnfsstrictattr being set, since it is a performance hit.

Modified:
  projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Wed Jun 14 20:27:14 2017	(r319958)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Wed Jun 14 20:34:02 2017	(r319959)
@@ -109,9 +109,9 @@ int nfsrv_openctrl(struct nfsrv_descript *, vnode_t,
 int nfsrv_opencheck(nfsquad_t, nfsv4stateid_t *, struct nfsstate *,
     vnode_t, struct nfsrv_descript *, NFSPROC_T *, int);
 int nfsrv_openupdate(vnode_t, struct nfsstate *, nfsquad_t,
-    nfsv4stateid_t *, struct nfsrv_descript *, NFSPROC_T *);
+    nfsv4stateid_t *, struct nfsrv_descript *, NFSPROC_T *, int *);
 int nfsrv_delegupdate(struct nfsrv_descript *, nfsquad_t, nfsv4stateid_t *,
-    vnode_t, int, struct ucred *, NFSPROC_T *);
+    vnode_t, int, struct ucred *, NFSPROC_T *, int *);
 int nfsrv_releaselckown(struct nfsstate *, nfsquad_t, NFSPROC_T *);
 void nfsrv_zapclient(struct nfsclient *, NFSPROC_T *);
 int nfssvc_idname(struct nfsd_idargs *);

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c	Wed Jun 14 20:27:14 2017	(r319958)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c	Wed Jun 14 20:34:02 2017	(r319959)
@@ -59,6 +59,7 @@ extern time_t nfsdev_time;
 extern struct nfsdevicehead nfsrv_devidhead;
 extern int nfsd_debuglevel;
 extern u_long sb_max_adj;
+extern int nfsrv_pnfsatime;
 #endif	/* !APPLEKEXT */
 
 static int	nfs_async = 0;
@@ -3161,7 +3162,7 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 {
 	u_int32_t *tl;
 	struct nfsstate st, *stp = &st;
-	int error = 0;
+	int error = 0, writeacc;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
 	struct nfsvattr na;
@@ -3204,9 +3205,11 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
+	    &writeacc);
 	/* For pNFS, update the attributes. */
-	nfsrv_updatemdsattr(vp, &na, p);
+	if (writeacc != 0 || nfsrv_pnfsatime != 0)
+		nfsrv_updatemdsattr(vp, &na, p);
 	vput(vp);
 	if (!nd->nd_repstat) {
 		/*
@@ -3260,7 +3263,7 @@ nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused 
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, NULL, NULL,
-	    NFSV4OP_DELEGPURGE, nd->nd_cred, p);
+	    NFSV4OP_DELEGPURGE, nd->nd_cred, p, NULL);
 nfsmout:
 	NFSEXITCODE2(error, nd);
 	return (error);
@@ -3274,7 +3277,7 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
     vnode_t vp, NFSPROC_T *p, __unused struct nfsexstuff *exp)
 {
 	u_int32_t *tl;
-	int error = 0;
+	int error = 0, writeacc;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
 	struct nfsvattr na;
@@ -3296,9 +3299,10 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, &stateid, vp,
-	    NFSV4OP_DELEGRETURN, nd->nd_cred, p);
+	    NFSV4OP_DELEGRETURN, nd->nd_cred, p, &writeacc);
 	/* For pNFS, update the attributes. */
-	nfsrv_updatemdsattr(vp, &na, p);
+	if (writeacc != 0 || nfsrv_pnfsatime != 0)
+		nfsrv_updatemdsattr(vp, &na, p);
 nfsmout:
 	vput(vp);
 	NFSEXITCODE2(error, nd);
@@ -3362,7 +3366,8 @@ nfsrvd_openconfirm(struct nfsrv_descript *nd, __unused
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
+	    NULL);
 	if (!nd->nd_repstat) {
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
@@ -3465,7 +3470,7 @@ nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unus
 	}
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid,
-		    nd, p);
+		    nd, p, NULL);
 	if (!nd->nd_repstat) {
 		/* For NFSv4.1, set the Current StateID. */
 		if ((nd->nd_flag & ND_NFSV41) != 0) {

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Wed Jun 14 20:27:14 2017	(r319958)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Wed Jun 14 20:34:02 2017	(r319959)
@@ -90,8 +90,8 @@ SYSCTL_INT(_vfs_nfsd, OID_AUTO, allowreadforwriteopen,
     &nfsrv_allowreadforwriteopen, 0,
     "Allow Reads to be done with Write Access StateIDs");
 
-static int	nfsrv_pnfsatime = 0;
-SYSCTL_INT(_vfs_nfsd, OID_AUTO, pnfsgetatime, CTLFLAG_RW,
+int	nfsrv_pnfsatime = 0;
+SYSCTL_INT(_vfs_nfsd, OID_AUTO, pnfsstrictatime, CTLFLAG_RW,
     &nfsrv_pnfsatime, 0,
     "For pNFS service, do Getattr ops to keep atime up-to-date");
 
@@ -3291,7 +3291,8 @@ out:
  */
 APPLESTATIC int
 nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
-    nfsv4stateid_t *stateidp, struct nfsrv_descript *nd, NFSPROC_T *p)
+    nfsv4stateid_t *stateidp, struct nfsrv_descript *nd, NFSPROC_T *p,
+    int *retwriteaccessp)
 {
 	struct nfsstate *stp, *ownerstp;
 	struct nfsclient *clp;
@@ -3394,6 +3395,12 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp,
 	} else if (new_stp->ls_flags & NFSLCK_CLOSE) {
 		ownerstp = stp->ls_openowner;
 		lfp = stp->ls_lfp;
+		if (retwriteaccessp != NULL) {
+			if ((stp->ls_flags & NFSLCK_WRITEACCESS) != 0)
+				*retwriteaccessp = 1;
+			else
+				*retwriteaccessp = 0;
+		}
 		if (nfsrv_dolocallocks != 0 && !LIST_EMPTY(&stp->ls_open)) {
 			/* Get the lf lock */
 			nfsrv_locklf(lfp);
@@ -3450,7 +3457,7 @@ out:
 APPLESTATIC int
 nfsrv_delegupdate(struct nfsrv_descript *nd, nfsquad_t clientid,
     nfsv4stateid_t *stateidp, vnode_t vp, int op, struct ucred *cred,
-    NFSPROC_T *p)
+    NFSPROC_T *p, int *retwriteaccessp)
 {
 	struct nfsstate *stp;
 	struct nfsclient *clp;
@@ -3515,6 +3522,12 @@ nfsrv_delegupdate(struct nfsrv_descript *nd, nfsquad_t
 			error = NFSERR_BADSTATEID;
 			goto out;
 		}
+		if (retwriteaccessp != NULL) {
+			if ((stp->ls_flags & NFSLCK_DELEGWRITE) != 0)
+				*retwriteaccessp = 1;
+			else
+				*retwriteaccessp = 0;
+		}
 		nfsrv_freedeleg(stp);
 	} else {
 		nfsrv_freedeleglist(&clp->lc_olddeleg);
@@ -6336,7 +6349,7 @@ nfsrv_layoutreturn(struct nfsrv_descript *nd, vnode_t 
 	if (kind == NFSV4LAYOUTRET_FILE) {
 		*fndp = 0;
 		error = nfsvno_getfh(vp, &fh, p);
-		if (error == 0 && (iomode & NFSLAYOUTIOMODE_RW) != 0) {
+		if (error == 0) {
 			error = nfsrv_updatemdsattr(vp, &na, p);
 			if (error != 0)
 				printf("nfsrv_layoutreturn: updatemdsattr"

From owner-svn-src-projects@freebsd.org  Thu Jun 15 00:26:28 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id B3486BF7152
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 15 Jun 2017 00:26:28 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 81E417E4BC;
 Thu, 15 Jun 2017 00:26:28 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5F0QRJO064642;
 Thu, 15 Jun 2017 00:26:27 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5F0QRF6064641;
 Thu, 15 Jun 2017 00:26:27 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706150026.v5F0QRF6064641@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Thu, 15 Jun 2017 00:26:27 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319960 -
 projects/pnfs-planb-server-stable11/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 15 Jun 2017 00:26:28 -0000

Author: rmacklem
Date: Thu Jun 15 00:26:27 2017
New Revision: 319960
URL: https://svnweb.freebsd.org/changeset/base/319960

Log:
  Modify the handling of getattr for the DS attributes so that instead
  of failing for the case where the pnfsd.dsattr extended attribute does not
  exist, a Getattr RPC against the DS is attempted to (re)create this
  extended attribute.
  
  This allows a sysadmin to "rmextattr system pnfsd.dsattr <filename>" on
  the MDS exported file system file, if these attributes somehow get messed up.

Modified:
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Wed Jun 14 20:34:02 2017	(r319959)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Thu Jun 15 00:26:27 2017	(r319960)
@@ -3892,19 +3892,28 @@ nfsrv_proxyds(struct nfsrv_descript *nd, struct vnode 
 			nap->na_size = dsattr.dsa_size;
 			nap->na_atime = dsattr.dsa_atime;
 			nap->na_mtime = dsattr.dsa_mtime;
+
+			/*
+			 * If nfsrv_pnfsgetdsattr is 0 or nfsrv_checkdsattr()
+			 * returns 0, just return now.  nfsrv_checkdsattr()
+			 * returns 0 if there is no Read/Write layout
+			 * plus either an Open/Write_access or Write
+			 * delegation issued to a client for the file.
+			 */
+			if (nfsrv_pnfsgetdsattr == 0 ||
+			    nfsrv_checkdsattr(nd, vp, p) == 0) {
+				free(buf, M_TEMP);
+				return (error);
+			}
 		}
 
 		/*
-		 * If nfsrv_pnfsgetdsattr is 0 or nfsrv_checkdsattr() returns
-		 * 0, just return now.  nfsrv_checkdsattr() returns 0 if there
-		 * is no Read/Write layout + either an Open/Write_access or
-		 * Write delegation issued to a client for the file.
+		 * Clear ENOATTR so the code below will attempt to do a
+		 * nfsrv_getattrdsrpc() to get the attributes and (re)create
+		 * the extended attribute.
 		 */
-		if (nfsrv_pnfsgetdsattr == 0 || nfsrv_checkdsattr(nd, vp, p) ==
-		    0) {
-			free(buf, M_TEMP);
-			return (error);
-		}
+		if (error == ENOATTR)
+			error = 0;
 	}
 
 	if (error == 0) {
@@ -4422,7 +4431,6 @@ nfsrv_getattrdsrpc(fhandle_t *fhp, struct ucred *cred,
 		    NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL,
 		    NULL, NULL);
 		if (error == 0) {
-			/* Do this as root so that it won't EACCES fail. */
 			error = nfsrv_setextattr(vp, nap, p);
 			NFSD_DEBUG(4, "nfsrv_getattrdsrpc: aft setextat=%d\n",
 			    error);

From owner-svn-src-projects@freebsd.org  Thu Jun 15 00:32:02 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 62440BF7419
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 15 Jun 2017 00:32:02 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 2D5BE7E7C1;
 Thu, 15 Jun 2017 00:32:02 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5F0W1o5067842;
 Thu, 15 Jun 2017 00:32:01 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5F0W1tn067841;
 Thu, 15 Jun 2017 00:32:01 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706150032.v5F0W1tn067841@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Thu, 15 Jun 2017 00:32:01 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319961 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 15 Jun 2017 00:32:02 -0000

Author: rmacklem
Date: Thu Jun 15 00:32:01 2017
New Revision: 319961
URL: https://svnweb.freebsd.org/changeset/base/319961

Log:
  Modify the handling of getattr for the DS attributes so that instead
  of failing for the case where the pnfsd.dsattr extended attribute does not
  exist, a Getattr RPC against the DS is attempted to (re)create this
  extended attribute.
  
  This allows a sysadmin to "rmextattr system pnfsd.dsattr <filename>" on
  the MDS exported file system file, if these attributes somehow get messed up.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Thu Jun 15 00:26:27 2017	(r319960)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Thu Jun 15 00:32:01 2017	(r319961)
@@ -3909,19 +3909,28 @@ nfsrv_proxyds(struct nfsrv_descript *nd, struct vnode 
 			nap->na_size = dsattr.dsa_size;
 			nap->na_atime = dsattr.dsa_atime;
 			nap->na_mtime = dsattr.dsa_mtime;
+
+			/*
+			 * If nfsrv_pnfsgetdsattr is 0 or nfsrv_checkdsattr()
+			 * returns 0, just return now.  nfsrv_checkdsattr()
+			 * returns 0 if there is no Read/Write layout
+			 * plus either an Open/Write_access or Write
+			 * delegation issued to a client for the file.
+			 */
+			if (nfsrv_pnfsgetdsattr == 0 ||
+			    nfsrv_checkdsattr(nd, vp, p) == 0) {
+				free(buf, M_TEMP);
+				return (error);
+			}
 		}
 
 		/*
-		 * If nfsrv_pnfsgetdsattr is 0 or nfsrv_checkdsattr() returns
-		 * 0, just return now.  nfsrv_checkdsattr() returns 0 if there
-		 * is no Read/Write layout + either an Open/Write_access or
-		 * Write delegation issued to a client for the file.
+		 * Clear ENOATTR so the code below will attempt to do a
+		 * nfsrv_getattrdsrpc() to get the attributes and (re)create
+		 * the extended attribute.
 		 */
-		if (nfsrv_pnfsgetdsattr == 0 || nfsrv_checkdsattr(nd, vp, p) ==
-		    0) {
-			free(buf, M_TEMP);
-			return (error);
-		}
+		if (error == ENOATTR)
+			error = 0;
 	}
 
 	if (error == 0) {
@@ -4439,7 +4448,6 @@ nfsrv_getattrdsrpc(fhandle_t *fhp, struct ucred *cred,
 		    NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL,
 		    NULL, NULL);
 		if (error == 0) {
-			/* Do this as root so that it won't EACCES fail. */
 			error = nfsrv_setextattr(vp, nap, p);
 			NFSD_DEBUG(4, "nfsrv_getattrdsrpc: aft setextat=%d\n",
 			    error);

From owner-svn-src-projects@freebsd.org  Thu Jun 15 12:18:48 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1B187D897A8
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 15 Jun 2017 12:18:48 +0000 (UTC)
 (envelope-from hselasky@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id C2E3173796;
 Thu, 15 Jun 2017 12:18:47 +0000 (UTC)
 (envelope-from hselasky@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5FCIkOF054825;
 Thu, 15 Jun 2017 12:18:46 GMT (envelope-from hselasky@FreeBSD.org)
Received: (from hselasky@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5FCIk20054824;
 Thu, 15 Jun 2017 12:18:46 GMT (envelope-from hselasky@FreeBSD.org)
Message-Id: <201706151218.v5FCIk20054824@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: hselasky set sender to
 hselasky@FreeBSD.org using -f
From: Hans Petter Selasky <hselasky@FreeBSD.org>
Date: Thu, 15 Jun 2017 12:18:46 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319973 - projects/bsd_rdma_4_9
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 15 Jun 2017 12:18:48 -0000

Author: hselasky
Date: Thu Jun 15 12:18:46 2017
New Revision: 319973
URL: https://svnweb.freebsd.org/changeset/base/319973

Log:
  Create new projects branch to update the RDMA code to Linux v4.9.
  
  Discussed with:	np @
  Sponsored by:	Mellanox Technologies

Added:
     - copied from r319972, head/
Directory Properties:
  projects/bsd_rdma_4_9/   (props changed)

From owner-svn-src-projects@freebsd.org  Thu Jun 15 12:47:49 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id F0C90D89FE3
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 15 Jun 2017 12:47:49 +0000 (UTC)
 (envelope-from hselasky@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 905307463A;
 Thu, 15 Jun 2017 12:47:49 +0000 (UTC)
 (envelope-from hselasky@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5FClmdD066909;
 Thu, 15 Jun 2017 12:47:48 GMT (envelope-from hselasky@FreeBSD.org)
Received: (from hselasky@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5FClmMK066907;
 Thu, 15 Jun 2017 12:47:48 GMT (envelope-from hselasky@FreeBSD.org)
Message-Id: <201706151247.v5FClmMK066907@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: hselasky set sender to
 hselasky@FreeBSD.org using -f
From: Hans Petter Selasky <hselasky@FreeBSD.org>
Date: Thu, 15 Jun 2017 12:47:48 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r319974 - in projects/bsd_rdma_4_9/sys:
 contrib/rdma/krping modules/ibcore modules/ipoib modules/rdma/krping
 ofed/drivers/infiniband/core ofed/drivers/infiniband/debug
 ofed/drivers/infi...
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 15 Jun 2017 12:47:50 -0000

Author: hselasky
Date: Thu Jun 15 12:47:48 2017
New Revision: 319974
URL: https://svnweb.freebsd.org/changeset/base/319974

Log:
  Initial RoCE/infiniband kernel update to Linux v4.9.
  
  This patch currently supports:
  - ibcore as a kernel module only
  - krping as a kernel module only
  - ipoib as a kernel module only
  
  Sponsored by:	Mellanox Technologies

Added:
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_addr.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_cache.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_cq.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_iwpm_msg.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_iwpm_util.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_smi.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_sysfs.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_umem.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_umem_odp.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_umem_rbtree.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ib_verbs.c   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/iwpm_util.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/opa_smi.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_hdrs.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_umem_odp.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/iw_portmap.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/opa_port_info.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/opa_smi.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/rdma_vt.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/rdmavt_cq.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/rdmavt_mr.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/rdmavt_qp.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/uapi/
  projects/bsd_rdma_4_9/sys/ofed/include/uapi/rdma/
  projects/bsd_rdma_4_9/sys/ofed/include/uapi/rdma/mlx4-abi.h   (contents, props changed)
  projects/bsd_rdma_4_9/sys/ofed/include/uapi/rdma/mlx5-abi.h   (contents, props changed)
Deleted:
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/addr.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/cache.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/peer_mem.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/smi.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/sysfs.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/umem.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/verbs.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/debug/Makefile
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/debug/memtrack.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/debug/memtrack.h
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/debug/mtrack.h
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/ulp/ipoib/Kconfig
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_peer_mem.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_user_verbs_exp.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_verbs_exp.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/peer_mem.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/sdp_socket.h
Modified:
  projects/bsd_rdma_4_9/sys/contrib/rdma/krping/krping.c
  projects/bsd_rdma_4_9/sys/contrib/rdma/krping/krping.h
  projects/bsd_rdma_4_9/sys/contrib/rdma/krping/krping_dev.c
  projects/bsd_rdma_4_9/sys/modules/ibcore/Makefile
  projects/bsd_rdma_4_9/sys/modules/ipoib/Makefile
  projects/bsd_rdma_4_9/sys/modules/rdma/krping/Makefile
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/agent.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/agent.h
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/cm.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/cm_msgs.h
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/cma.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/core_priv.h
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/device.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/fmr_pool.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/iwcm.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/iwcm.h
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/mad.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/mad_priv.h
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/mad_rmpp.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/multicast.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/packer.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/sa_query.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/smi.h
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ucm.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ucma.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/ud_header.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/user_mad.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/uverbs.h
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/uverbs_cmd.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/uverbs_main.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/core/uverbs_marshall.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  projects/bsd_rdma_4_9/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_addr.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_cache.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_cm.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_mad.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_pack.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_pma.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_sa.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_smi.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_umem.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_user_mad.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_user_verbs.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/ib_verbs.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/iw_cm.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/rdma_cm.h
  projects/bsd_rdma_4_9/sys/ofed/include/rdma/rdma_user_cm.h

Modified: projects/bsd_rdma_4_9/sys/contrib/rdma/krping/krping.c
==============================================================================
--- projects/bsd_rdma_4_9/sys/contrib/rdma/krping/krping.c	Thu Jun 15 12:18:46 2017	(r319973)
+++ projects/bsd_rdma_4_9/sys/contrib/rdma/krping/krping.c	Thu Jun 15 12:47:48 2017	(r319974)
@@ -53,13 +53,14 @@ __FBSDID("$FreeBSD$");
 #include "krping.h"
 #include "getopt.h"
 
+#define PFX "krping: "
+
 extern int krping_debug;
-#define DEBUG_LOG(cb, x...) if (krping_debug) log(LOG_INFO, x)
-#define PRINTF(cb, x...) log(LOG_INFO, x)
+#define DEBUG_LOG(...) do { if (krping_debug) log(LOG_INFO, __VA_ARGS__); } while (0)
 #define BIND_INFO 1
 
 MODULE_AUTHOR("Steve Wise");
-MODULE_DESCRIPTION("RDMA ping client/server");
+MODULE_DESCRIPTION("RDMA ping server");
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(krping, 1);
 MODULE_DEPEND(krping, linuxkpi, 1, 1, 1);
@@ -76,21 +77,19 @@ typedef uint64_t cycles_t;
 
 enum mem_type {
 	DMA = 1,
-	FASTREG = 2,
-	MW = 3,
-	MR = 4
+	REG = 2,
 };
 
 static const struct krping_option krping_opts[] = {
 	{"count", OPT_INT, 'C'},
 	{"size", OPT_INT, 'S'},
 	{"addr", OPT_STRING, 'a'},
+	{"addr6", OPT_STRING, 'A'},
 	{"port", OPT_INT, 'p'},
 	{"verbose", OPT_NOPARAM, 'v'},
 	{"validate", OPT_NOPARAM, 'V'},
 	{"server", OPT_NOPARAM, 's'},
 	{"client", OPT_NOPARAM, 'c'},
-	{"mem_mode", OPT_STRING, 'm'},
 	{"server_inv", OPT_NOPARAM, 'I'},
  	{"wlat", OPT_NOPARAM, 'l'},
  	{"rlat", OPT_NOPARAM, 'L'},
@@ -100,14 +99,14 @@ static const struct krping_option krping_opts[] = {
  	{"poll", OPT_NOPARAM, 'P'},
  	{"local_dma_lkey", OPT_NOPARAM, 'Z'},
  	{"read_inv", OPT_NOPARAM, 'R'},
- 	{"fr", OPT_INT, 'f'},
+ 	{"fr", OPT_NOPARAM, 'f'},
 	{NULL, 0, 0}
 };
 
 #define htonll(x) cpu_to_be64((x))
 #define ntohll(x) cpu_to_be64((x))
 
-static struct mutex krping_mutex;
+static DEFINE_MUTEX(krping_mutex);
 
 /*
  * List of running krping threads.
@@ -115,6 +114,13 @@ static struct mutex krping_mutex;
 static LIST_HEAD(krping_cbs);
 
 /*
+ * Invoke like this, one on each side, using the server's address on
+ * the RDMA device (iw%d):
+ *
+ * /bin/echo server,port=9999,addr=192.168.69.142,validate > /proc/krping  
+ * /bin/echo client,port=9999,addr=192.168.69.142,validate > /proc/krping  
+ * /bin/echo client,port=9999,addr6=2001:db8:0:f101::1,validate > /proc/krping
+ *
  * krping "ping/pong" loop:
  * 	client sends source rkey/addr/len
  *	server receives source rkey/add/len
@@ -163,42 +169,35 @@ struct krping_rdma_info {
  * Control block struct.
  */
 struct krping_cb {
-	void *cookie;
 	int server;			/* 0 iff client */
 	struct ib_cq *cq;
 	struct ib_pd *pd;
 	struct ib_qp *qp;
 
-	enum mem_type mem;
 	struct ib_mr *dma_mr;
 
 	struct ib_fast_reg_page_list *page_list;
 	int page_list_len;
-	struct ib_send_wr fastreg_wr;
+	struct ib_reg_wr reg_mr_wr;
 	struct ib_send_wr invalidate_wr;
-	struct ib_mr *fastreg_mr;
+	struct ib_mr *reg_mr;
 	int server_invalidate;
 	int read_inv;
 	u8 key;
 
-	struct ib_mw *mw;
-	struct ib_mw_bind bind_attr;
-
 	struct ib_recv_wr rq_wr;	/* recv work request record */
 	struct ib_sge recv_sgl;		/* recv single SGE */
-	struct krping_rdma_info recv_buf;/* malloc'd buffer */
+	struct krping_rdma_info recv_buf __aligned(16);	/* malloc'd buffer */
 	u64 recv_dma_addr;
 	DECLARE_PCI_UNMAP_ADDR(recv_mapping)
-	struct ib_mr *recv_mr;
 
 	struct ib_send_wr sq_wr;	/* send work requrest record */
 	struct ib_sge send_sgl;
-	struct krping_rdma_info send_buf;/* single send buf */
+	struct krping_rdma_info send_buf __aligned(16); /* single send buf */
 	u64 send_dma_addr;
 	DECLARE_PCI_UNMAP_ADDR(send_mapping)
-	struct ib_mr *send_mr;
 
-	struct ib_send_wr rdma_sq_wr;	/* rdma work request record */
+	struct ib_rdma_wr rdma_sq_wr;	/* rdma work request record */
 	struct ib_sge rdma_sgl;		/* rdma single SGE */
 	char *rdma_buf;			/* used as rdma sink */
 	u64  rdma_dma_addr;
@@ -219,8 +218,9 @@ struct krping_cb {
 	struct krping_stats stats;
 
 	uint16_t port;			/* dst port in NBO */
-	struct in_addr addr;		/* dst addr in NBO */
+	u8 addr[16];			/* dst addr in NBO */
 	char *addr_str;			/* dst addr string */
+	uint8_t addr_type;		/* ADDR_FAMILY - IPv4/V6 */
 	int verbose;			/* verbose logging */
 	int count;			/* ping count */
 	int size;			/* ping data size */
@@ -232,8 +232,7 @@ struct krping_cb {
 	int poll;			/* poll or block for rlat test */
 	int txdepth;			/* SQ depth */
 	int local_dma_lkey;		/* use 0 for lkey */
-	int frtest;			/* fastreg test */
-	int testnum;
+	int frtest;			/* reg test */
 
 	/* CM stuff */
 	struct rdma_cm_id *cm_id;	/* connection on client side,*/
@@ -248,39 +247,34 @@ static int krping_cma_event_handler(struct rdma_cm_id 
 	int ret;
 	struct krping_cb *cb = cma_id->context;
 
-	DEBUG_LOG(cb, "cma_event type %d cma_id %p (%s)\n", event->event,
-	    cma_id, (cma_id == cb->cm_id) ? "parent" : "child");
+	DEBUG_LOG("cma_event type %d cma_id %p (%s)\n", event->event, cma_id,
+		  (cma_id == cb->cm_id) ? "parent" : "child");
 
 	switch (event->event) {
 	case RDMA_CM_EVENT_ADDR_RESOLVED:
 		cb->state = ADDR_RESOLVED;
 		ret = rdma_resolve_route(cma_id, 2000);
 		if (ret) {
-			PRINTF(cb, "rdma_resolve_route error %d\n", ret);
+			printk(KERN_ERR PFX "rdma_resolve_route error %d\n", 
+			       ret);
 			wake_up_interruptible(&cb->sem);
 		}
 		break;
 
 	case RDMA_CM_EVENT_ROUTE_RESOLVED:
 		cb->state = ROUTE_RESOLVED;
-		cb->child_cm_id = cma_id;
 		wake_up_interruptible(&cb->sem);
 		break;
 
 	case RDMA_CM_EVENT_CONNECT_REQUEST:
-		if (cb->state == IDLE) {
-			cb->state = CONNECT_REQUEST;
-			cb->child_cm_id = cma_id;
-		} else {
-			PRINTF(cb, "Received connection request in wrong state"
-			    " (%d)\n", cb->state);
-		}
-		DEBUG_LOG(cb, "child cma %p\n", cb->child_cm_id);
+		cb->state = CONNECT_REQUEST;
+		cb->child_cm_id = cma_id;
+		DEBUG_LOG("child cma %p\n", cb->child_cm_id);
 		wake_up_interruptible(&cb->sem);
 		break;
 
 	case RDMA_CM_EVENT_ESTABLISHED:
-		DEBUG_LOG(cb, "ESTABLISHED\n");
+		DEBUG_LOG("ESTABLISHED\n");
 		if (!cb->server) {
 			cb->state = CONNECTED;
 		}
@@ -292,24 +286,24 @@ static int krping_cma_event_handler(struct rdma_cm_id 
 	case RDMA_CM_EVENT_CONNECT_ERROR:
 	case RDMA_CM_EVENT_UNREACHABLE:
 	case RDMA_CM_EVENT_REJECTED:
-		PRINTF(cb, "cma event %d, error %d\n", event->event,
+		printk(KERN_ERR PFX "cma event %d, error %d\n", event->event,
 		       event->status);
 		cb->state = ERROR;
 		wake_up_interruptible(&cb->sem);
 		break;
 
 	case RDMA_CM_EVENT_DISCONNECTED:
-		PRINTF(cb, "DISCONNECT EVENT...\n");
+		printk(KERN_ERR PFX "DISCONNECT EVENT...\n");
 		cb->state = ERROR;
 		wake_up_interruptible(&cb->sem);
 		break;
 
 	case RDMA_CM_EVENT_DEVICE_REMOVAL:
-		PRINTF(cb, "cma detected device removal!!!!\n");
+		printk(KERN_ERR PFX "cma detected device removal!!!!\n");
 		break;
 
 	default:
-		PRINTF(cb, "oof bad type!\n");
+		printk(KERN_ERR PFX "oof bad type!\n");
 		wake_up_interruptible(&cb->sem);
 		break;
 	}
@@ -319,7 +313,7 @@ static int krping_cma_event_handler(struct rdma_cm_id 
 static int server_recv(struct krping_cb *cb, struct ib_wc *wc)
 {
 	if (wc->byte_len != sizeof(cb->recv_buf)) {
-		PRINTF(cb, "Received bogus data, size %d\n", 
+		printk(KERN_ERR PFX "Received bogus data, size %d\n", 
 		       wc->byte_len);
 		return -1;
 	}
@@ -327,7 +321,7 @@ static int server_recv(struct krping_cb *cb, struct ib
 	cb->remote_rkey = ntohl(cb->recv_buf.rkey);
 	cb->remote_addr = ntohll(cb->recv_buf.buf);
 	cb->remote_len  = ntohl(cb->recv_buf.size);
-	DEBUG_LOG(cb, "Received rkey %x addr %llx len %d from peer\n",
+	DEBUG_LOG("Received rkey %x addr %llx len %d from peer\n",
 		  cb->remote_rkey, (unsigned long long)cb->remote_addr, 
 		  cb->remote_len);
 
@@ -342,7 +336,7 @@ static int server_recv(struct krping_cb *cb, struct ib
 static int client_recv(struct krping_cb *cb, struct ib_wc *wc)
 {
 	if (wc->byte_len != sizeof(cb->recv_buf)) {
-		PRINTF(cb, "Received bogus data, size %d\n", 
+		printk(KERN_ERR PFX "Received bogus data, size %d\n", 
 		       wc->byte_len);
 		return -1;
 	}
@@ -364,18 +358,22 @@ static void krping_cq_event_handler(struct ib_cq *cq, 
 
 	BUG_ON(cb->cq != cq);
 	if (cb->state == ERROR) {
-		PRINTF(cb, "cq completion in ERROR state\n");
+		printk(KERN_ERR PFX "cq completion in ERROR state\n");
 		return;
 	}
-	if (!cb->wlat && !cb->rlat && !cb->bw && !cb->frtest)
+	if (cb->frtest) {
+		printk(KERN_ERR PFX "cq completion event in frtest!\n");
+		return;
+	}
+	if (!cb->wlat && !cb->rlat && !cb->bw)
 		ib_req_notify_cq(cb->cq, IB_CQ_NEXT_COMP);
 	while ((ret = ib_poll_cq(cb->cq, 1, &wc)) == 1) {
 		if (wc.status) {
 			if (wc.status == IB_WC_WR_FLUSH_ERR) {
-				DEBUG_LOG(cb, "cq flushed\n");
+				DEBUG_LOG("cq flushed\n");
 				continue;
 			} else {
-				PRINTF(cb, "cq completion failed with "
+				printk(KERN_ERR PFX "cq completion failed with "
 				       "wr_id %jx status %d opcode %d vender_err %x\n",
 					(uintmax_t)wc.wr_id, wc.status, wc.opcode, wc.vendor_err);
 				goto error;
@@ -384,44 +382,44 @@ static void krping_cq_event_handler(struct ib_cq *cq, 
 
 		switch (wc.opcode) {
 		case IB_WC_SEND:
-			DEBUG_LOG(cb, "send completion\n");
+			DEBUG_LOG("send completion\n");
 			cb->stats.send_bytes += cb->send_sgl.length;
 			cb->stats.send_msgs++;
 			break;
 
 		case IB_WC_RDMA_WRITE:
-			DEBUG_LOG(cb, "rdma write completion\n");
-			cb->stats.write_bytes += cb->rdma_sq_wr.sg_list->length;
+			DEBUG_LOG("rdma write completion\n");
+			cb->stats.write_bytes += cb->rdma_sq_wr.wr.sg_list->length;
 			cb->stats.write_msgs++;
 			cb->state = RDMA_WRITE_COMPLETE;
 			wake_up_interruptible(&cb->sem);
 			break;
 
 		case IB_WC_RDMA_READ:
-			DEBUG_LOG(cb, "rdma read completion\n");
-			cb->stats.read_bytes += cb->rdma_sq_wr.sg_list->length;
+			DEBUG_LOG("rdma read completion\n");
+			cb->stats.read_bytes += cb->rdma_sq_wr.wr.sg_list->length;
 			cb->stats.read_msgs++;
 			cb->state = RDMA_READ_COMPLETE;
 			wake_up_interruptible(&cb->sem);
 			break;
 
 		case IB_WC_RECV:
-			DEBUG_LOG(cb, "recv completion\n");
+			DEBUG_LOG("recv completion\n");
 			cb->stats.recv_bytes += sizeof(cb->recv_buf);
 			cb->stats.recv_msgs++;
-			if (cb->wlat || cb->rlat || cb->bw || cb->frtest)
+			if (cb->wlat || cb->rlat || cb->bw)
 				ret = server_recv(cb, &wc);
 			else
 				ret = cb->server ? server_recv(cb, &wc) :
 						   client_recv(cb, &wc);
 			if (ret) {
-				PRINTF(cb, "recv wc error: %d\n", ret);
+				printk(KERN_ERR PFX "recv wc error: %d\n", ret);
 				goto error;
 			}
 
 			ret = ib_post_recv(cb->qp, &cb->rq_wr, &bad_wr);
 			if (ret) {
-				PRINTF(cb, "post recv error: %d\n", 
+				printk(KERN_ERR PFX "post recv error: %d\n", 
 				       ret);
 				goto error;
 			}
@@ -429,14 +427,14 @@ static void krping_cq_event_handler(struct ib_cq *cq, 
 			break;
 
 		default:
-			PRINTF(cb, 
+			printk(KERN_ERR PFX
 			       "%s:%d Unexpected opcode %d, Shutting down\n",
 			       __func__, __LINE__, wc.opcode);
 			goto error;
 		}
 	}
 	if (ret) {
-		PRINTF(cb, "poll error %d\n", ret);
+		printk(KERN_ERR PFX "poll error %d\n", ret);
 		goto error;
 	}
 	return;
@@ -450,7 +448,7 @@ static int krping_accept(struct krping_cb *cb)
 	struct rdma_conn_param conn_param;
 	int ret;
 
-	DEBUG_LOG(cb, "accepting client connection request\n");
+	DEBUG_LOG("accepting client connection request\n");
 
 	memset(&conn_param, 0, sizeof conn_param);
 	conn_param.responder_resources = 1;
@@ -458,14 +456,14 @@ static int krping_accept(struct krping_cb *cb)
 
 	ret = rdma_accept(cb->child_cm_id, &conn_param);
 	if (ret) {
-		PRINTF(cb, "rdma_accept error: %d\n", ret);
+		printk(KERN_ERR PFX "rdma_accept error: %d\n", ret);
 		return ret;
 	}
 
-	if (!cb->wlat && !cb->rlat && !cb->bw && !cb->frtest) {
+	if (!cb->wlat && !cb->rlat && !cb->bw) {
 		wait_event_interruptible(cb->sem, cb->state >= CONNECTED);
 		if (cb->state == ERROR) {
-			PRINTF(cb, "wait for CONNECTED state %d\n", 
+			printk(KERN_ERR PFX "wait for CONNECTED state %d\n", 
 				cb->state);
 			return -1;
 		}
@@ -477,278 +475,120 @@ static void krping_setup_wr(struct krping_cb *cb)
 {
 	cb->recv_sgl.addr = cb->recv_dma_addr;
 	cb->recv_sgl.length = sizeof cb->recv_buf;
-	if (cb->local_dma_lkey)
-		cb->recv_sgl.lkey = cb->qp->device->local_dma_lkey;
-	else if (cb->mem == DMA)
-		cb->recv_sgl.lkey = cb->dma_mr->lkey;
-	else
-		cb->recv_sgl.lkey = cb->recv_mr->lkey;
+	cb->recv_sgl.lkey = cb->pd->local_dma_lkey;
 	cb->rq_wr.sg_list = &cb->recv_sgl;
 	cb->rq_wr.num_sge = 1;
 
 	cb->send_sgl.addr = cb->send_dma_addr;
 	cb->send_sgl.length = sizeof cb->send_buf;
-	if (cb->local_dma_lkey)
-		cb->send_sgl.lkey = cb->qp->device->local_dma_lkey;
-	else if (cb->mem == DMA)
-		cb->send_sgl.lkey = cb->dma_mr->lkey;
-	else
-		cb->send_sgl.lkey = cb->send_mr->lkey;
+	cb->send_sgl.lkey = cb->pd->local_dma_lkey;
 
 	cb->sq_wr.opcode = IB_WR_SEND;
 	cb->sq_wr.send_flags = IB_SEND_SIGNALED;
 	cb->sq_wr.sg_list = &cb->send_sgl;
 	cb->sq_wr.num_sge = 1;
 
-	if (cb->server || cb->wlat || cb->rlat || cb->bw || cb->frtest) {
+	if (cb->server || cb->wlat || cb->rlat || cb->bw) {
 		cb->rdma_sgl.addr = cb->rdma_dma_addr;
-		if (cb->mem == MR)
-			cb->rdma_sgl.lkey = cb->rdma_mr->lkey;
-		cb->rdma_sq_wr.send_flags = IB_SEND_SIGNALED;
-		cb->rdma_sq_wr.sg_list = &cb->rdma_sgl;
-		cb->rdma_sq_wr.num_sge = 1;
+		cb->rdma_sq_wr.wr.send_flags = IB_SEND_SIGNALED;
+		cb->rdma_sq_wr.wr.sg_list = &cb->rdma_sgl;
+		cb->rdma_sq_wr.wr.num_sge = 1;
 	}
 
-	switch(cb->mem) {
-	case FASTREG:
+	/* 
+	 * A chain of 2 WRs, INVALDATE_MR + REG_MR.
+	 * both unsignaled.  The client uses them to reregister
+	 * the rdma buffers with a new key each iteration.
+	 */
+	cb->reg_mr_wr.wr.opcode = IB_WR_REG_MR;
+	cb->reg_mr_wr.mr = cb->reg_mr;
 
-		/* 
-		 * A chain of 2 WRs, INVALDATE_MR + FAST_REG_MR.
-		 * both unsignaled.  The client uses them to reregister
-		 * the rdma buffers with a new key each iteration.
-		 */
-		cb->fastreg_wr.opcode = IB_WR_FAST_REG_MR;
-		cb->fastreg_wr.wr.fast_reg.page_shift = PAGE_SHIFT;
-		cb->fastreg_wr.wr.fast_reg.length = cb->size;
-		cb->fastreg_wr.wr.fast_reg.page_list = cb->page_list;
-		cb->fastreg_wr.wr.fast_reg.page_list_len = cb->page_list_len;
-
-		cb->invalidate_wr.next = &cb->fastreg_wr;
-		cb->invalidate_wr.opcode = IB_WR_LOCAL_INV;
-		break;
-	case MW:
-		cb->bind_attr.wr_id = 0xabbaabba;
-		cb->bind_attr.send_flags = 0; /* unsignaled */
-#ifdef BIND_INFO
-		cb->bind_attr.bind_info.length = cb->size;
-#else
-		cb->bind_attr.length = cb->size;
-#endif
-		break;
-	default:
-		break;
-	}
+	cb->invalidate_wr.next = &cb->reg_mr_wr.wr;
+	cb->invalidate_wr.opcode = IB_WR_LOCAL_INV;
 }
 
 static int krping_setup_buffers(struct krping_cb *cb)
 {
 	int ret;
-	struct ib_phys_buf buf;
-	u64 iovbase;
 
-	DEBUG_LOG(cb, "krping_setup_buffers called on cb %p\n", cb);
+	DEBUG_LOG(PFX "krping_setup_buffers called on cb %p\n", cb);
 
-	cb->recv_dma_addr = ib_dma_map_single(cb->pd->device, 
+	cb->recv_dma_addr = ib_dma_map_single(cb->pd->device,
 				   &cb->recv_buf, 
 				   sizeof(cb->recv_buf), DMA_BIDIRECTIONAL);
 	pci_unmap_addr_set(cb, recv_mapping, cb->recv_dma_addr);
-	cb->send_dma_addr = ib_dma_map_single(cb->pd->device, 
+	cb->send_dma_addr = ib_dma_map_single(cb->pd->device,
 					   &cb->send_buf, sizeof(cb->send_buf),
 					   DMA_BIDIRECTIONAL);
 	pci_unmap_addr_set(cb, send_mapping, cb->send_dma_addr);
 
-	if (cb->mem == DMA) {
-		cb->dma_mr = ib_get_dma_mr(cb->pd, IB_ACCESS_LOCAL_WRITE|
-					   IB_ACCESS_REMOTE_READ|
-				           IB_ACCESS_REMOTE_WRITE);
-		if (IS_ERR(cb->dma_mr)) {
-			DEBUG_LOG(cb, "reg_dmamr failed\n");
-			ret = PTR_ERR(cb->dma_mr);
-			goto bail;
-		}
-	} else {
-		if (!cb->local_dma_lkey) {
-			buf.addr = cb->recv_dma_addr;
-			buf.size = sizeof cb->recv_buf;
-			DEBUG_LOG(cb, "recv buf dma_addr %jx size %d\n",
-			    (uintmax_t)buf.addr, (int)buf.size);
-			iovbase = cb->recv_dma_addr;
-			cb->recv_mr = ib_reg_phys_mr(cb->pd, &buf, 1, 
-						     IB_ACCESS_LOCAL_WRITE, 
-						     &iovbase);
-
-			if (IS_ERR(cb->recv_mr)) {
-				DEBUG_LOG(cb, "recv_buf reg_mr failed\n");
-				ret = PTR_ERR(cb->recv_mr);
-				goto bail;
-			}
-
-			buf.addr = cb->send_dma_addr;
-			buf.size = sizeof cb->send_buf;
-			DEBUG_LOG(cb, "send buf dma_addr %jx size %d\n",
-			    (uintmax_t)buf.addr, (int)buf.size);
-			iovbase = cb->send_dma_addr;
-			cb->send_mr = ib_reg_phys_mr(cb->pd, &buf, 1, 
-						     0, &iovbase);
-
-			if (IS_ERR(cb->send_mr)) {
-				DEBUG_LOG(cb, "send_buf reg_mr failed\n");
-				ret = PTR_ERR(cb->send_mr);
-				goto bail;
-			}
-		}
-	}
-
-	cb->rdma_buf = kmalloc(cb->size, GFP_KERNEL);
+	cb->rdma_buf = ib_dma_alloc_coherent(cb->pd->device, cb->size,
+					     &cb->rdma_dma_addr,
+					     GFP_KERNEL);
 	if (!cb->rdma_buf) {
-		DEBUG_LOG(cb, "rdma_buf malloc failed\n");
+		DEBUG_LOG(PFX "rdma_buf allocation failed\n");
 		ret = -ENOMEM;
 		goto bail;
 	}
-
-	cb->rdma_dma_addr = ib_dma_map_single(cb->pd->device, 
-			       cb->rdma_buf, cb->size, 
-			       DMA_BIDIRECTIONAL);
 	pci_unmap_addr_set(cb, rdma_mapping, cb->rdma_dma_addr);
-	if (cb->mem != DMA) {
-		switch (cb->mem) {
-		case FASTREG:
-			cb->page_list_len = (((cb->size - 1) & PAGE_MASK) +
-				PAGE_SIZE) >> PAGE_SHIFT;
-			cb->page_list = ib_alloc_fast_reg_page_list(
-						cb->pd->device, 
-						cb->page_list_len);
-			if (IS_ERR(cb->page_list)) {
-				DEBUG_LOG(cb, "recv_buf reg_mr failed\n");
-				ret = PTR_ERR(cb->page_list);
-				goto bail;
-			}
-			cb->fastreg_mr = ib_alloc_fast_reg_mr(cb->pd, 
-					cb->page_list->max_page_list_len);
-			if (IS_ERR(cb->fastreg_mr)) {
-				DEBUG_LOG(cb, "recv_buf reg_mr failed\n");
-				ret = PTR_ERR(cb->fastreg_mr);
-				goto bail;
-			}
-			DEBUG_LOG(cb, "fastreg rkey 0x%x page_list %p"
-				" page_list_len %u\n", cb->fastreg_mr->rkey, 
-				cb->page_list, cb->page_list_len);
-			break;
-		case MW:
-			cb->mw = ib_alloc_mw(cb->pd,IB_MW_TYPE_1);
-			if (IS_ERR(cb->mw)) {
-				DEBUG_LOG(cb, "recv_buf alloc_mw failed\n");
-				ret = PTR_ERR(cb->mw);
-				goto bail;
-			}
-			DEBUG_LOG(cb, "mw rkey 0x%x\n", cb->mw->rkey);
-			/*FALLTHROUGH*/
-		case MR:
-			buf.addr = cb->rdma_dma_addr;
-			buf.size = cb->size;
-			iovbase = cb->rdma_dma_addr;
-			cb->rdma_mr = ib_reg_phys_mr(cb->pd, &buf, 1, 
-						IB_ACCESS_LOCAL_WRITE|
-					     IB_ACCESS_REMOTE_READ| 
-					     IB_ACCESS_REMOTE_WRITE, 
-					     &iovbase);
-			if (IS_ERR(cb->rdma_mr)) {
-				DEBUG_LOG(cb, "rdma_buf reg_mr failed\n");
-				ret = PTR_ERR(cb->rdma_mr);
-				goto bail;
-			}
-			DEBUG_LOG(cb, "rdma buf dma_addr %jx size %d mr rkey 0x%x\n",
-				(uintmax_t)buf.addr, (int)buf.size, cb->rdma_mr->rkey);
-			break;
-		default:
-			ret = -EINVAL;
-			goto bail;
-			break;
-		}
+	cb->page_list_len = (((cb->size - 1) & PAGE_MASK) + PAGE_SIZE)
+				>> PAGE_SHIFT;
+	cb->reg_mr = ib_alloc_mr(cb->pd,  IB_MR_TYPE_MEM_REG,
+				 cb->page_list_len);
+	if (IS_ERR(cb->reg_mr)) {
+		ret = PTR_ERR(cb->reg_mr);
+		DEBUG_LOG(PFX "recv_buf reg_mr failed %d\n", ret);
+		goto bail;
 	}
+	DEBUG_LOG(PFX "reg rkey 0x%x page_list_len %u\n",
+		cb->reg_mr->rkey, cb->page_list_len);
 
-	if (!cb->server || cb->wlat || cb->rlat || cb->bw || cb->frtest) {
+	if (!cb->server || cb->wlat || cb->rlat || cb->bw) {
 
-		cb->start_buf = kmalloc(cb->size, GFP_KERNEL);
+		cb->start_buf = ib_dma_alloc_coherent(cb->pd->device, cb->size,
+						      &cb->start_dma_addr,
+						      GFP_KERNEL);
 		if (!cb->start_buf) {
-			DEBUG_LOG(cb, "start_buf malloc failed\n");
+			DEBUG_LOG(PFX "start_buf malloc failed\n");
 			ret = -ENOMEM;
 			goto bail;
 		}
-
-		cb->start_dma_addr = ib_dma_map_single(cb->pd->device, 
-						   cb->start_buf, cb->size, 
-						   DMA_BIDIRECTIONAL);
 		pci_unmap_addr_set(cb, start_mapping, cb->start_dma_addr);
-
-		if (cb->mem == MR || cb->mem == MW) {
-			unsigned flags = IB_ACCESS_REMOTE_READ;
-
-			if (cb->wlat || cb->rlat || cb->bw || cb->frtest) {
-				flags |= IB_ACCESS_LOCAL_WRITE |
-					IB_ACCESS_REMOTE_WRITE;
-			}
-
-			buf.addr = cb->start_dma_addr;
-			buf.size = cb->size;
-			DEBUG_LOG(cb, "start buf dma_addr %jx size %d\n",
-				(uintmax_t)buf.addr, (int)buf.size);
-			iovbase = cb->start_dma_addr;
-			cb->start_mr = ib_reg_phys_mr(cb->pd, &buf, 1, 
-					     flags,
-					     &iovbase);
-
-			if (IS_ERR(cb->start_mr)) {
-				DEBUG_LOG(cb, "start_buf reg_mr failed\n");
-				ret = PTR_ERR(cb->start_mr);
-				goto bail;
-			}
-		}
 	}
 
 	krping_setup_wr(cb);
-	DEBUG_LOG(cb, "allocated & registered buffers...\n");
+	DEBUG_LOG(PFX "allocated & registered buffers...\n");
 	return 0;
 bail:
-	if (cb->fastreg_mr && !IS_ERR(cb->fastreg_mr))
-		ib_dereg_mr(cb->fastreg_mr);
-	if (cb->mw && !IS_ERR(cb->mw))
-		ib_dealloc_mw(cb->mw);
+	if (cb->reg_mr && !IS_ERR(cb->reg_mr))
+		ib_dereg_mr(cb->reg_mr);
 	if (cb->rdma_mr && !IS_ERR(cb->rdma_mr))
 		ib_dereg_mr(cb->rdma_mr);
-	if (cb->page_list && !IS_ERR(cb->page_list))
-		ib_free_fast_reg_page_list(cb->page_list);
 	if (cb->dma_mr && !IS_ERR(cb->dma_mr))
 		ib_dereg_mr(cb->dma_mr);
-	if (cb->recv_mr && !IS_ERR(cb->recv_mr))
-		ib_dereg_mr(cb->recv_mr);
-	if (cb->send_mr && !IS_ERR(cb->send_mr))
-		ib_dereg_mr(cb->send_mr);
-	if (cb->rdma_buf)
-		kfree(cb->rdma_buf);
-	if (cb->start_buf)
-		kfree(cb->start_buf);
+	if (cb->rdma_buf) {
+		ib_dma_free_coherent(cb->pd->device, cb->size, cb->rdma_buf,
+				     cb->rdma_dma_addr);
+	}
+	if (cb->start_buf) {
+		ib_dma_free_coherent(cb->pd->device, cb->size, cb->start_buf,
+				     cb->start_dma_addr);
+	}
 	return ret;
 }
 
 static void krping_free_buffers(struct krping_cb *cb)
 {
-	DEBUG_LOG(cb, "krping_free_buffers called on cb %p\n", cb);
+	DEBUG_LOG("krping_free_buffers called on cb %p\n", cb);
 	
 	if (cb->dma_mr)
 		ib_dereg_mr(cb->dma_mr);
-	if (cb->send_mr)
-		ib_dereg_mr(cb->send_mr);
-	if (cb->recv_mr)
-		ib_dereg_mr(cb->recv_mr);
 	if (cb->rdma_mr)
 		ib_dereg_mr(cb->rdma_mr);
 	if (cb->start_mr)
 		ib_dereg_mr(cb->start_mr);
-	if (cb->fastreg_mr)
-		ib_dereg_mr(cb->fastreg_mr);
-	if (cb->mw)
-		ib_dealloc_mw(cb->mw);
+	if (cb->reg_mr)
+		ib_dereg_mr(cb->reg_mr);
 
 	dma_unmap_single(cb->pd->device->dma_device,
 			 pci_unmap_addr(cb, recv_mapping),
@@ -756,15 +596,13 @@ static void krping_free_buffers(struct krping_cb *cb)
 	dma_unmap_single(cb->pd->device->dma_device,
 			 pci_unmap_addr(cb, send_mapping),
 			 sizeof(cb->send_buf), DMA_BIDIRECTIONAL);
-	dma_unmap_single(cb->pd->device->dma_device,
-			 pci_unmap_addr(cb, rdma_mapping),
-			 cb->size, DMA_BIDIRECTIONAL);
-	kfree(cb->rdma_buf);
+
+	ib_dma_free_coherent(cb->pd->device, cb->size, cb->rdma_buf,
+			     cb->rdma_dma_addr);
+
 	if (cb->start_buf) {
-		dma_unmap_single(cb->pd->device->dma_device,
-			 pci_unmap_addr(cb, start_mapping),
-			 cb->size, DMA_BIDIRECTIONAL);
-		kfree(cb->start_buf);
+		ib_dma_free_coherent(cb->pd->device, cb->size, cb->start_buf,
+				     cb->start_dma_addr);
 	}
 }
 
@@ -776,6 +614,11 @@ static int krping_create_qp(struct krping_cb *cb)
 	memset(&init_attr, 0, sizeof(init_attr));
 	init_attr.cap.max_send_wr = cb->txdepth;
 	init_attr.cap.max_recv_wr = 2;
+	
+	/* For flush_qp() */
+	init_attr.cap.max_send_wr++;
+	init_attr.cap.max_recv_wr++;
+
 	init_attr.cap.max_recv_sge = 1;
 	init_attr.cap.max_send_sge = 1;
 	init_attr.qp_type = IB_QPT_RC;
@@ -806,38 +649,42 @@ static void krping_free_qp(struct krping_cb *cb)
 static int krping_setup_qp(struct krping_cb *cb, struct rdma_cm_id *cm_id)
 {
 	int ret;
-	cb->pd = ib_alloc_pd(cm_id->device);
+	struct ib_cq_init_attr attr = {0};
+
+	cb->pd = ib_alloc_pd(cm_id->device, 0);
 	if (IS_ERR(cb->pd)) {
-		PRINTF(cb, "ib_alloc_pd failed\n");
+		printk(KERN_ERR PFX "ib_alloc_pd failed\n");
 		return PTR_ERR(cb->pd);
 	}
-	DEBUG_LOG(cb, "created pd %p\n", cb->pd);
+	DEBUG_LOG("created pd %p\n", cb->pd);
 
 	strlcpy(cb->stats.name, cb->pd->device->name, sizeof(cb->stats.name));
 
+	attr.cqe = cb->txdepth * 2;
+	attr.comp_vector = 0;
 	cb->cq = ib_create_cq(cm_id->device, krping_cq_event_handler, NULL,
-			      cb, cb->txdepth * 2, 0);
+			      cb, &attr);
 	if (IS_ERR(cb->cq)) {
-		PRINTF(cb, "ib_create_cq failed\n");
+		printk(KERN_ERR PFX "ib_create_cq failed\n");
 		ret = PTR_ERR(cb->cq);
 		goto err1;
 	}
-	DEBUG_LOG(cb, "created cq %p\n", cb->cq);
+	DEBUG_LOG("created cq %p\n", cb->cq);
 
 	if (!cb->wlat && !cb->rlat && !cb->bw && !cb->frtest) {
 		ret = ib_req_notify_cq(cb->cq, IB_CQ_NEXT_COMP);
 		if (ret) {
-			PRINTF(cb, "ib_create_cq failed\n");
+			printk(KERN_ERR PFX "ib_create_cq failed\n");
 			goto err2;
 		}
 	}
 
 	ret = krping_create_qp(cb);
 	if (ret) {
-		PRINTF(cb, "krping_create_qp failed: %d\n", ret);
+		printk(KERN_ERR PFX "krping_create_qp failed: %d\n", ret);
 		goto err2;
 	}
-	DEBUG_LOG(cb, "created qp %p\n", cb->qp);
+	DEBUG_LOG("created qp %p\n", cb->qp);
 	return 0;
 err2:
 	ib_destroy_cq(cb->cq);
@@ -848,115 +695,54 @@ err1:
 
 /*
  * return the (possibly rebound) rkey for the rdma buffer.
- * FASTREG mode: invalidate and rebind via fastreg wr.
- * MW mode: rebind the MW.
+ * REG mode: invalidate and rebind via reg wr.
  * other modes: just return the mr rkey.
  */
 static u32 krping_rdma_rkey(struct krping_cb *cb, u64 buf, int post_inv)
 {
-	u32 rkey = 0xffffffff;
-	u64 p;
+	u32 rkey;
 	struct ib_send_wr *bad_wr;
-	int i;
 	int ret;
+	struct scatterlist sg = {0};
 
-	switch (cb->mem) {
-	case FASTREG:
-		cb->invalidate_wr.ex.invalidate_rkey = cb->fastreg_mr->rkey;
+	cb->invalidate_wr.ex.invalidate_rkey = cb->reg_mr->rkey;
 
-		/*
-		 * Update the fastreg key.
-		 */
-		ib_update_fast_reg_key(cb->fastreg_mr, ++cb->key);
-		cb->fastreg_wr.wr.fast_reg.rkey = cb->fastreg_mr->rkey;
+	/*
+	 * Update the reg key.
+	 */
+	ib_update_fast_reg_key(cb->reg_mr, ++cb->key);
+	cb->reg_mr_wr.key = cb->reg_mr->rkey;
 
-		/*
-		 * Update the fastreg WR with new buf info.
-		 */
-		if (buf == (u64)cb->start_dma_addr)
-			cb->fastreg_wr.wr.fast_reg.access_flags = IB_ACCESS_REMOTE_READ;
-		else
-			cb->fastreg_wr.wr.fast_reg.access_flags = IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE;
-		cb->fastreg_wr.wr.fast_reg.iova_start = buf;
-		p = (u64)(buf & PAGE_MASK);
-		for (i=0; i < cb->fastreg_wr.wr.fast_reg.page_list_len; 
-		     i++, p += PAGE_SIZE) {
-			cb->page_list->page_list[i] = p;
-			DEBUG_LOG(cb, "page_list[%d] 0x%jx\n", i, (uintmax_t)p);
-		}
+	/*
+	 * Update the reg WR with new buf info.
+	 */
+	if (buf == (u64)cb->start_dma_addr)
+		cb->reg_mr_wr.access = IB_ACCESS_REMOTE_READ;
+	else
+		cb->reg_mr_wr.access = IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE;
+	sg_dma_address(&sg) = buf;
+	sg_dma_len(&sg) = cb->size;
 
-		DEBUG_LOG(cb, "post_inv = %d, fastreg new rkey 0x%x shift %u len %u"
-			" iova_start %jx page_list_len %u\n",
-			post_inv,
-			cb->fastreg_wr.wr.fast_reg.rkey,
-			cb->fastreg_wr.wr.fast_reg.page_shift,
-			(unsigned)cb->fastreg_wr.wr.fast_reg.length,
-			(uintmax_t)cb->fastreg_wr.wr.fast_reg.iova_start,
-			cb->fastreg_wr.wr.fast_reg.page_list_len);
+	ret = ib_map_mr_sg(cb->reg_mr, &sg, 1, NULL, PAGE_SIZE);
+	BUG_ON(ret <= 0 || ret > cb->page_list_len);
 
-		if (post_inv)
-			ret = ib_post_send(cb->qp, &cb->invalidate_wr, &bad_wr);
-		else
-			ret = ib_post_send(cb->qp, &cb->fastreg_wr, &bad_wr);
-		if (ret) {
-			PRINTF(cb, "post send error %d\n", ret);
-			cb->state = ERROR;
-		}
-		rkey = cb->fastreg_mr->rkey;
-		break;
-	case MW:
-		/*
-		 * Update the MW with new buf info.
-		 */
-		if (buf == (u64)cb->start_dma_addr) {
-#ifdef BIND_INFO
-			cb->bind_attr.bind_info.mw_access_flags = IB_ACCESS_REMOTE_READ;
-			cb->bind_attr.bind_info.mr = cb->start_mr;
-#else
-			cb->bind_attr.mw_access_flags = IB_ACCESS_REMOTE_READ;
-			cb->bind_attr.mr = cb->start_mr;
-#endif
-		} else {
-#ifdef BIND_INFO
-			cb->bind_attr.bind_info.mw_access_flags = IB_ACCESS_REMOTE_WRITE;
-			cb->bind_attr.bind_info.mr = cb->rdma_mr;
-#else
-			cb->bind_attr.mw_access_flags = IB_ACCESS_REMOTE_WRITE;
-			cb->bind_attr.mr = cb->rdma_mr;
-#endif
-		}
-#ifdef BIND_INFO
-		cb->bind_attr.bind_info.addr = buf;
-#else
-		cb->bind_attr.addr = buf;
-#endif
-		DEBUG_LOG(cb, "binding mw rkey 0x%x to buf %jx mr rkey 0x%x\n",
-#ifdef BIND_INFO
-			cb->mw->rkey, (uintmax_t)buf, cb->bind_attr.bind_info.mr->rkey);
-#else
-			cb->mw->rkey, buf, cb->bind_attr.mr->rkey);
-#endif
-		ret = ib_bind_mw(cb->qp, cb->mw, &cb->bind_attr);
-		if (ret) {
-			PRINTF(cb, "bind mw error %d\n", ret);
-			cb->state = ERROR;
-		} else
-			rkey = cb->mw->rkey;
-		break;
-	case MR:
-		if (buf == (u64)cb->start_dma_addr)
-			rkey = cb->start_mr->rkey;
-		else
-			rkey = cb->rdma_mr->rkey;
-		break;
-	case DMA:
-		rkey = cb->dma_mr->rkey;
-		break;
-	default:
-		PRINTF(cb, "%s:%d case ERROR\n", __func__, __LINE__);
+	DEBUG_LOG(PFX "post_inv = %d, reg_mr new rkey 0x%x pgsz %u len %u"
+		" iova_start %llx\n",
+		post_inv,
+		cb->reg_mr_wr.key,
+		cb->reg_mr->page_size,
+		cb->reg_mr->length,
+	        (unsigned long long)cb->reg_mr->iova);
+
+	if (post_inv)
+		ret = ib_post_send(cb->qp, &cb->invalidate_wr, &bad_wr);
+	else
+		ret = ib_post_send(cb->qp, &cb->reg_mr_wr.wr, &bad_wr);
+	if (ret) {
+		printk(KERN_ERR PFX "post send error %d\n", ret);
 		cb->state = ERROR;
-		break;
 	}
+	rkey = cb->reg_mr->rkey;
 	return rkey;
 }
 
@@ -966,16 +752,16 @@ static void krping_format_send(struct krping_cb *cb, u
 	u32 rkey;
 
 	/*
-	 * Client side will do fastreg or mw bind before
+	 * Client side will do reg or mw bind before
 	 * advertising the rdma buffer.  Server side
 	 * sends have no data.
 	 */
-	if (!cb->server || cb->wlat || cb->rlat || cb->bw || cb->frtest) {
+	if (!cb->server || cb->wlat || cb->rlat || cb->bw) {
 		rkey = krping_rdma_rkey(cb, buf, !cb->server_invalidate);
 		info->buf = htonll(buf);
 		info->rkey = htonl(rkey);
 		info->size = htonl(cb->size);
-		DEBUG_LOG(cb, "RDMA addr %llx rkey %x len %d\n",
+		DEBUG_LOG("RDMA addr %llx rkey %x len %d\n",
 			  (unsigned long long)buf, rkey, cb->size);
 	}
 }
@@ -989,111 +775,102 @@ static void krping_test_server(struct krping_cb *cb)
 		/* Wait for client's Start STAG/TO/Len */
 		wait_event_interruptible(cb->sem, cb->state >= RDMA_READ_ADV);
 		if (cb->state != RDMA_READ_ADV) {
-			PRINTF(cb, "wait for RDMA_READ_ADV state %d\n",
+			printk(KERN_ERR PFX "wait for RDMA_READ_ADV state %d\n",
 				cb->state);
 			break;
 		}
 
-		DEBUG_LOG(cb, "server received sink adv\n");
+		DEBUG_LOG("server received sink adv\n");
 
-		cb->rdma_sq_wr.wr.rdma.rkey = cb->remote_rkey;
-		cb->rdma_sq_wr.wr.rdma.remote_addr = cb->remote_addr;
-		cb->rdma_sq_wr.sg_list->length = cb->remote_len;
-		cb->rdma_sgl.lkey = krping_rdma_rkey(cb, cb->rdma_dma_addr, 1);
+		cb->rdma_sq_wr.rkey = cb->remote_rkey;
+		cb->rdma_sq_wr.remote_addr = cb->remote_addr;
+		cb->rdma_sq_wr.wr.sg_list->length = cb->remote_len;
+		cb->rdma_sgl.lkey = krping_rdma_rkey(cb, cb->rdma_dma_addr, !cb->read_inv);
+		cb->rdma_sq_wr.wr.next = NULL;
 
 		/* Issue RDMA Read. */
 		if (cb->read_inv)
-			cb->rdma_sq_wr.opcode = IB_WR_RDMA_READ_WITH_INV;
+			cb->rdma_sq_wr.wr.opcode = IB_WR_RDMA_READ_WITH_INV;
 		else {
 
-			cb->rdma_sq_wr.opcode = IB_WR_RDMA_READ;
-			if (cb->mem == FASTREG) {
-				/* 
-				 * Immediately follow the read with a 
-				 * fenced LOCAL_INV.
-				 */
-				cb->rdma_sq_wr.next = &inv;
-				memset(&inv, 0, sizeof inv);
-				inv.opcode = IB_WR_LOCAL_INV;
-				inv.ex.invalidate_rkey = cb->fastreg_mr->rkey;
-				inv.send_flags = IB_SEND_FENCE;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@freebsd.org  Fri Jun 16 21:20:40 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id ABA30D8975C
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 16 Jun 2017 21:20:40 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 86F1B7062A;
 Fri, 16 Jun 2017 21:20:40 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5GLKdJU068366;
 Fri, 16 Jun 2017 21:20:39 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5GLKdhe068365;
 Fri, 16 Jun 2017 21:20:39 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706162120.v5GLKdhe068365@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 16 Jun 2017 21:20:39 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320025 -
 projects/pnfs-planb-server-stable11/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 16 Jun 2017 21:20:40 -0000

Author: rmacklem
Date: Fri Jun 16 21:20:39 2017
New Revision: 320025
URL: https://svnweb.freebsd.org/changeset/base/320025

Log:
  Modify the pNFS server so that it will do a Lookup for the DS's file handle
  if that file handle is all 0bits in the extended attribute pnfsd.dsfile.
  
  Doing this allows the sysadmin to zero out the file handle if/when the file
  handle changes. Normally it would only change when the DS file is restored
  from a backup.

Modified:
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Fri Jun 16 21:04:29 2017	(r320024)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Fri Jun 16 21:20:39 2017	(r320025)
@@ -82,6 +82,7 @@ static pid_t nfsd_master_pid = (pid_t)-1;
 static char nfsd_master_comm[MAXCOMLEN + 1];
 static struct timeval nfsd_master_start;
 static uint32_t nfsv4_sysid = 0;
+static fhandle_t zerofh;
 
 static int nfssvc_srvcall(struct thread *, struct nfssvc_args *,
     struct ucred *);
@@ -116,6 +117,8 @@ static int nfsrv_setattrdsrpc(fhandle_t *, struct ucre
 static int nfsrv_getattrdsrpc(fhandle_t *, struct ucred *, NFSPROC_T *,
     struct vnode *, struct nfsmount *, struct nfsvattr *);
 static int nfsrv_putfhname(fhandle_t *, char *);
+static int nfsrv_pnfslookupds(struct vnode *, struct pnfsdsfile *,
+    struct vnode *, NFSPROC_T *);
 
 SYSCTL_NODE(_vfs, OID_AUTO, nfsd, CTLFLAG_RW, 0, "NFS server");
 SYSCTL_INT(_vfs_nfsd, OID_AUTO, mirrormnt, CTLFLAG_RW,
@@ -3966,8 +3969,11 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 	struct nfsdevice *ds;
 	struct pnfsdsfile *pf;
 	uint32_t dsdir;
-	int error;
+	int error, fhiszero;
 
+	fhiszero = 0;
+	if (lktype == 0)
+		lktype = LK_SHARED;
 	if (dvpp != NULL) {
 		*dvpp = NULL;
 		*nmpp = NULL;
@@ -3986,6 +3992,8 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 		}
 	}
 	if (error == 0) {
+		if (NFSBCMP(&zerofh, &pf->dsf_fh, sizeof(zerofh)) == 0)
+			fhiszero = 1;
 		/* Use the socket address to find the mount point. */
 		NFSDDSLOCK();
 		TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) {
@@ -3996,10 +4004,19 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 		}
 		NFSDDSUNLOCK();
 		if (ds != NULL) {
-			if (dvpp != NULL) {
+			if (dvpp != NULL || fhiszero != 0) {
 				dvp = ds->nfsdev_dsdir[dsdir];
-				if (error == 0)
-					error = vn_lock(dvp, lktype);
+				error = vn_lock(dvp, lktype);
+				/*
+				 * If the file handle is all 0's, try to do a
+				 * Lookup against the DS to acquire it.
+				 */
+				if (error == 0 && fhiszero != 0) {
+					error = nfsrv_pnfslookupds(vp, pf, dvp,
+					    p);
+					if (error != 0 || dvpp == NULL)
+						NFSVOPUNLOCK(dvp, 0);
+				}
 			}
 			if (devid != NULL)
 				NFSBCOPY(ds->nfsdev_deviceid, devid,
@@ -4456,6 +4473,67 @@ nfsrv_dsgetdevandfh(struct vnode *vp, NFSPROC_T *p, fh
 	error = nfsrv_dsgetsockmnt(vp, 0, buf, buflen, p, NULL, NULL, fhp,
 	    devid, NULL);
 	free(buf, M_TEMP);
+	return (error);
+}
+
+/*
+ * Do a Lookup against the DS for the filename and set the file handle
+ * to the correct one, if successful.
+ */
+static int
+nfsrv_pnfslookupds(struct vnode *vp, struct pnfsdsfile *pf, struct vnode *dvp,
+    NFSPROC_T *p)
+{
+	struct nameidata named;
+	struct ucred *tcred;
+	struct mount *mp;
+	char *bufp;
+	u_long *hashp;
+	struct vnode *nvp;
+	struct nfsnode *np;
+	int error, ret;
+
+	tcred = newnfs_getcred();
+	named.ni_cnd.cn_nameiop = LOOKUP;
+	named.ni_cnd.cn_lkflags = LK_SHARED | LK_RETRY;
+	named.ni_cnd.cn_cred = tcred;
+	named.ni_cnd.cn_thread = p;
+	named.ni_cnd.cn_flags = ISLASTCN | LOCKPARENT | LOCKLEAF | SAVENAME;
+	nfsvno_setpathbuf(&named, &bufp, &hashp);
+	named.ni_cnd.cn_nameptr = bufp;
+	named.ni_cnd.cn_namelen = strlen(pf->dsf_filename);
+	strlcpy(bufp, pf->dsf_filename, NAME_MAX);
+	NFSD_DEBUG(4, "nfsrv_pnfslookupds: filename=%s\n", bufp);
+	error = VOP_LOOKUP(dvp, &nvp, &named.ni_cnd);
+	NFSD_DEBUG(4, "nfsrv_pnfslookupds: aft LOOKUP=%d\n", error);
+	NFSFREECRED(tcred);
+	nfsvno_relpathbuf(&named);
+	if (error == 0) {
+		np = VTONFS(nvp);
+		NFSBCOPY(np->n_fhp->nfh_fh, &pf->dsf_fh, NFSX_MYFH);
+		vput(nvp);
+		/*
+		 * We can only do a setextattr for an exclusively
+		 * locked vp.  Instead of trying to upgrade a shared
+		 * lock, just leave dsf_fh zeroed out and it will
+		 * keep doing this lookup until it is done with an
+		 * exclusively locked vp.
+		 */
+		if (NFSVOPISLOCKED(vp) == LK_EXCLUSIVE) {
+			ret = vn_start_write(vp, &mp, V_WAIT);
+			NFSD_DEBUG(4, "nfsrv_pnfslookupds: vn_start_write=%d\n",
+			    ret);
+			if (ret == 0) {
+				ret = vn_extattr_set(vp, IO_NODELOCKED,
+				    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
+				    sizeof(*pf), (char *)pf, p);
+				vn_finished_write(mp);
+				NFSD_DEBUG(4, "nfsrv_pnfslookupds: aft "
+				    "vn_extattr_set=%d\n", ret);
+			}
+		}
+	}
+	NFSD_DEBUG(4, "eo nfsrv_pnfslookupds=%d\n", error);
 	return (error);
 }
 

From owner-svn-src-projects@freebsd.org  Fri Jun 16 21:26:43 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8B720D898C5
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 16 Jun 2017 21:26:43 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 656C170968;
 Fri, 16 Jun 2017 21:26:43 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5GLQfgX072139;
 Fri, 16 Jun 2017 21:26:41 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5GLQfir072138;
 Fri, 16 Jun 2017 21:26:41 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706162126.v5GLQfir072138@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 16 Jun 2017 21:26:41 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320026 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 16 Jun 2017 21:26:43 -0000

Author: rmacklem
Date: Fri Jun 16 21:26:41 2017
New Revision: 320026
URL: https://svnweb.freebsd.org/changeset/base/320026

Log:
  Modify the pNFS server so that it does a Lookup when the DS file handle in
  the extended attribute pnfsd.dsfile is all 0bits.
  
  This allows a sysadmin to zero out the file handle when it changes on the DS.
  This would normally happen when the file is restored from a backup.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Fri Jun 16 21:20:39 2017	(r320025)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Fri Jun 16 21:26:41 2017	(r320026)
@@ -82,6 +82,7 @@ static pid_t nfsd_master_pid = (pid_t)-1;
 static char nfsd_master_comm[MAXCOMLEN + 1];
 static struct timeval nfsd_master_start;
 static uint32_t nfsv4_sysid = 0;
+static fhandle_t zerofh;
 
 static int nfssvc_srvcall(struct thread *, struct nfssvc_args *,
     struct ucred *);
@@ -116,6 +117,8 @@ static int nfsrv_setattrdsrpc(fhandle_t *, struct ucre
 static int nfsrv_getattrdsrpc(fhandle_t *, struct ucred *, NFSPROC_T *,
     struct vnode *, struct nfsmount *, struct nfsvattr *);
 static int nfsrv_putfhname(fhandle_t *, char *);
+static int nfsrv_pnfslookupds(struct vnode *, struct pnfsdsfile *,
+    struct vnode *, NFSPROC_T *);
 
 SYSCTL_NODE(_vfs, OID_AUTO, nfsd, CTLFLAG_RW, 0, "NFS server");
 SYSCTL_INT(_vfs_nfsd, OID_AUTO, mirrormnt, CTLFLAG_RW,
@@ -3983,8 +3986,11 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 	struct nfsdevice *ds;
 	struct pnfsdsfile *pf;
 	uint32_t dsdir;
-	int error;
+	int error, fhiszero;
 
+	fhiszero = 0;
+	if (lktype == 0)
+		lktype = LK_SHARED;
 	if (dvpp != NULL) {
 		*dvpp = NULL;
 		*nmpp = NULL;
@@ -4003,6 +4009,8 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 		}
 	}
 	if (error == 0) {
+		if (NFSBCMP(&zerofh, &pf->dsf_fh, sizeof(zerofh)) == 0)
+			fhiszero = 1;
 		/* Use the socket address to find the mount point. */
 		NFSDDSLOCK();
 		TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) {
@@ -4013,10 +4021,19 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 		}
 		NFSDDSUNLOCK();
 		if (ds != NULL) {
-			if (dvpp != NULL) {
+			if (dvpp != NULL || fhiszero != 0) {
 				dvp = ds->nfsdev_dsdir[dsdir];
-				if (error == 0)
-					error = vn_lock(dvp, lktype);
+				error = vn_lock(dvp, lktype);
+				/*
+				 * If the file handle is all 0's, try to do a
+				 * Lookup against the DS to acquire it.
+				 */
+				if (error == 0 && fhiszero != 0) {
+					error = nfsrv_pnfslookupds(vp, pf, dvp,
+					    p);
+					if (error != 0 || dvpp == NULL)
+						NFSVOPUNLOCK(dvp, 0);
+				}
 			}
 			if (devid != NULL)
 				NFSBCOPY(ds->nfsdev_deviceid, devid,
@@ -4473,6 +4490,67 @@ nfsrv_dsgetdevandfh(struct vnode *vp, NFSPROC_T *p, fh
 	error = nfsrv_dsgetsockmnt(vp, 0, buf, buflen, p, NULL, NULL, fhp,
 	    devid, NULL);
 	free(buf, M_TEMP);
+	return (error);
+}
+
+/*
+ * Do a Lookup against the DS for the filename and set the file handle
+ * to the correct one, if successful.
+ */
+static int
+nfsrv_pnfslookupds(struct vnode *vp, struct pnfsdsfile *pf, struct vnode *dvp,
+    NFSPROC_T *p)
+{
+	struct nameidata named;
+	struct ucred *tcred;
+	struct mount *mp;
+	char *bufp;
+	u_long *hashp;
+	struct vnode *nvp;
+	struct nfsnode *np;
+	int error, ret;
+
+	tcred = newnfs_getcred();
+	named.ni_cnd.cn_nameiop = LOOKUP;
+	named.ni_cnd.cn_lkflags = LK_SHARED | LK_RETRY;
+	named.ni_cnd.cn_cred = tcred;
+	named.ni_cnd.cn_thread = p;
+	named.ni_cnd.cn_flags = ISLASTCN | LOCKPARENT | LOCKLEAF | SAVENAME;
+	nfsvno_setpathbuf(&named, &bufp, &hashp);
+	named.ni_cnd.cn_nameptr = bufp;
+	named.ni_cnd.cn_namelen = strlen(pf->dsf_filename);
+	strlcpy(bufp, pf->dsf_filename, NAME_MAX);
+	NFSD_DEBUG(4, "nfsrv_pnfslookupds: filename=%s\n", bufp);
+	error = VOP_LOOKUP(dvp, &nvp, &named.ni_cnd);
+	NFSD_DEBUG(4, "nfsrv_pnfslookupds: aft LOOKUP=%d\n", error);
+	NFSFREECRED(tcred);
+	nfsvno_relpathbuf(&named);
+	if (error == 0) {
+		np = VTONFS(nvp);
+		NFSBCOPY(np->n_fhp->nfh_fh, &pf->dsf_fh, NFSX_MYFH);
+		vput(nvp);
+		/*
+		 * We can only do a setextattr for an exclusively
+		 * locked vp.  Instead of trying to upgrade a shared
+		 * lock, just leave dsf_fh zeroed out and it will
+		 * keep doing this lookup until it is done with an
+		 * exclusively locked vp.
+		 */
+		if (NFSVOPISLOCKED(vp) == LK_EXCLUSIVE) {
+			ret = vn_start_write(vp, &mp, V_WAIT);
+			NFSD_DEBUG(4, "nfsrv_pnfslookupds: vn_start_write=%d\n",
+			    ret);
+			if (ret == 0) {
+				ret = vn_extattr_set(vp, IO_NODELOCKED,
+				    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
+				    sizeof(*pf), (char *)pf, p);
+				vn_finished_write(mp);
+				NFSD_DEBUG(4, "nfsrv_pnfslookupds: aft "
+				    "vn_extattr_set=%d\n", ret);
+			}
+		}
+	}
+	NFSD_DEBUG(4, "eo nfsrv_pnfslookupds=%d\n", error);
 	return (error);
 }
 

From owner-svn-src-projects@freebsd.org  Fri Jun 16 21:36:22 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id E8ABBD89E82
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 16 Jun 2017 21:36:22 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id C33B170EF9;
 Fri, 16 Jun 2017 21:36:22 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5GLaLdp076312;
 Fri, 16 Jun 2017 21:36:21 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5GLaLGY076311;
 Fri, 16 Jun 2017 21:36:21 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706162136.v5GLaLGY076311@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 16 Jun 2017 21:36:21 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320027 -
 projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 16 Jun 2017 21:36:23 -0000

Author: rmacklem
Date: Fri Jun 16 21:36:21 2017
New Revision: 320027
URL: https://svnweb.freebsd.org/changeset/base/320027

Log:
  Add some command line options to pnfsdsfile so that it can be used by a
  sysadmin to zero out the file handle field of the pnfsd.dsfile extended
  attribute. It also adds an option to suppress the default output of where
  the DS file can be found.

Modified:
  projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c

Modified: projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c
==============================================================================
--- projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c	Fri Jun 16 21:26:41 2017	(r320026)
+++ projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c	Fri Jun 16 21:36:21 2017	(r320027)
@@ -29,9 +29,12 @@
 __FBSDID("$FreeBSD$");
 
 #include <err.h>
+#include <getopt.h>
 #include <netdb.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
 #include <sys/param.h>
 #include <sys/extattr.h>
 #include <sys/mount.h>
@@ -41,6 +44,13 @@ __FBSDID("$FreeBSD$");
 
 static void usage(void);
 
+static struct option longopts[] = {
+	{ "quiet",	no_argument,		NULL,	'q'	},
+	{ "ds",		required_argument,	NULL,	's'	},
+	{ "zerofh",	no_argument,		NULL,	'z'	},
+	{ NULL,		0,			NULL,	0	}
+};
+
 /*
  * This program displays the location information of a data storage file
  * for a given file on a MetaData Server (MDS) in a pNFS service.  This program
@@ -50,20 +60,85 @@ static void usage(void);
 int
 main(int argc, char *argv[])
 {
+	struct addrinfo *res, *ad;
+	struct sockaddr_in *sin, *adsin;
+	struct sockaddr_in6 *sin6, *adsin6;
 	char hostn[NI_MAXHOST + 1];
 	struct pnfsdsfile dsfile;
+	int ch, quiet, zerofh;
 
-	if (argc != 2)
+	zerofh = 0;
+	quiet = 0;
+	res = NULL;
+	while ((ch = getopt_long(argc, argv, "qs:z", longopts, NULL)) != -1) {
+		switch (ch) {
+		case 'q':
+			quiet = 1;
+			break;
+		case 's':
+			/* Translate the server name to an IP address. */
+			if (getaddrinfo(optarg, NULL, NULL, &res) != 0)
+				errx(1, "Can't get IP# for %s\n", optarg);
+			break;
+		case 'z':
+			zerofh = 1;
+			break;
+		default:
+			usage();
+		}
+	}
+	argc -= optind;
+	if (argc != 1)
 		usage();
+	argv += optind;
 
 	/*
 	 * The host address and directory where the data storage file is
 	 * located is in the extended attribute "pnfsd.dsfile".
 	 */
-	if (extattr_get_file(argv[1], EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
+	if (extattr_get_file(*argv, EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
 	    &dsfile, sizeof(dsfile)) != sizeof(dsfile))
 		err(1, "Can't get extattr pnfsd.dsfile\n");
 
+	/* Do the zerofh option.  You must be root to use this option. */
+	if (zerofh != 0) {
+		if (geteuid() != 0)
+			errx(1, "Must be root/su to zerofh\n");
+
+		/*
+		 * Do it for the server specified by -s/--ds or all servers,
+		 * if -s/--ds was not sepcified.
+		 */
+		sin = &dsfile.dsf_sin;
+		sin6 = &dsfile.dsf_sin6;
+		ad = res;
+		while (ad != NULL) {
+			adsin = (struct sockaddr_in *)ad->ai_addr;
+			adsin6 = (struct sockaddr_in6 *)ad->ai_addr;
+			if (adsin->sin_family == sin->sin_family) {
+				if (sin->sin_family == AF_INET &&
+				    sin->sin_addr.s_addr ==
+				    adsin->sin_addr.s_addr)
+					break;
+				else if (sin->sin_family == AF_INET6 &&
+				    IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr,
+				    &adsin6->sin6_addr))
+					break;
+			}
+			ad = ad->ai_next;
+		}
+		if (res == NULL || ad != NULL) {
+			memset(&dsfile.dsf_fh, 0, sizeof(dsfile.dsf_fh));
+			if (extattr_set_file(*argv, EXTATTR_NAMESPACE_SYSTEM,
+			    "pnfsd.dsfile", &dsfile, sizeof(dsfile)) !=
+			    sizeof(dsfile))
+				err(1, "Can't set pnfsd.dsfile\n");
+		}
+	}
+
+	if (quiet != 0)
+		exit(0);
+
 	/* Translate the IP address to a hostname. */
 	if (getnameinfo((struct sockaddr *)&dsfile.dsf_sin,
 	    dsfile.dsf_sin.sin_len, hostn, sizeof(hostn), NULL, 0, 0) < 0)
@@ -76,7 +151,8 @@ static void
 usage(void)
 {
 
-	fprintf(stderr, "pnfsdsfile [filepath]\n");
+	fprintf(stderr, "pnfsdsfile [-q/--quiet] [-z/--zerofh] "
+	    "[-s/--ds <dshostname>] <filename>\n");
 	exit(1);
 }
 

From owner-svn-src-projects@freebsd.org  Fri Jun 16 21:40:46 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 12FBBD89F88
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 16 Jun 2017 21:40:46 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id E36437117D;
 Fri, 16 Jun 2017 21:40:45 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5GLejD7076579;
 Fri, 16 Jun 2017 21:40:45 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5GLejRU076578;
 Fri, 16 Jun 2017 21:40:45 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706162140.v5GLejRU076578@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 16 Jun 2017 21:40:45 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320029 - projects/pnfs-planb-server/usr.bin/pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 16 Jun 2017 21:40:46 -0000

Author: rmacklem
Date: Fri Jun 16 21:40:44 2017
New Revision: 320029
URL: https://svnweb.freebsd.org/changeset/base/320029

Log:
  Add options to pnfsdsfile so that it can be used by a sysadmin to zero out
  a DS file handle in the extended attributes. This needs to be done when the
  file handle becomes stale and this would normally happen when the file is
  recovered from backup. It also adds an option to quiet the normal default
  output of where the DS file resides.

Modified:
  projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c

Modified: projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c
==============================================================================
--- projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c	Fri Jun 16 21:37:05 2017	(r320028)
+++ projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c	Fri Jun 16 21:40:44 2017	(r320029)
@@ -29,9 +29,12 @@
 __FBSDID("$FreeBSD$");
 
 #include <err.h>
+#include <getopt.h>
 #include <netdb.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
 #include <sys/param.h>
 #include <sys/extattr.h>
 #include <sys/mount.h>
@@ -41,6 +44,13 @@ __FBSDID("$FreeBSD$");
 
 static void usage(void);
 
+static struct option longopts[] = {
+	{ "quiet",	no_argument,		NULL,	'q'	},
+	{ "ds",		required_argument,	NULL,	's'	},
+	{ "zerofh",	no_argument,		NULL,	'z'	},
+	{ NULL,		0,			NULL,	0	}
+};
+
 /*
  * This program displays the location information of a data storage file
  * for a given file on a MetaData Server (MDS) in a pNFS service.  This program
@@ -50,20 +60,85 @@ static void usage(void);
 int
 main(int argc, char *argv[])
 {
+	struct addrinfo *res, *ad;
+	struct sockaddr_in *sin, *adsin;
+	struct sockaddr_in6 *sin6, *adsin6;
 	char hostn[NI_MAXHOST + 1];
 	struct pnfsdsfile dsfile;
+	int ch, quiet, zerofh;
 
-	if (argc != 2)
+	zerofh = 0;
+	quiet = 0;
+	res = NULL;
+	while ((ch = getopt_long(argc, argv, "qs:z", longopts, NULL)) != -1) {
+		switch (ch) {
+		case 'q':
+			quiet = 1;
+			break;
+		case 's':
+			/* Translate the server name to an IP address. */
+			if (getaddrinfo(optarg, NULL, NULL, &res) != 0)
+				errx(1, "Can't get IP# for %s\n", optarg);
+			break;
+		case 'z':
+			zerofh = 1;
+			break;
+		default:
+			usage();
+		}
+	}
+	argc -= optind;
+	if (argc != 1)
 		usage();
+	argv += optind;
 
 	/*
 	 * The host address and directory where the data storage file is
 	 * located is in the extended attribute "pnfsd.dsfile".
 	 */
-	if (extattr_get_file(argv[1], EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
+	if (extattr_get_file(*argv, EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
 	    &dsfile, sizeof(dsfile)) != sizeof(dsfile))
 		err(1, "Can't get extattr pnfsd.dsfile\n");
 
+	/* Do the zerofh option.  You must be root to use this option. */
+	if (zerofh != 0) {
+		if (geteuid() != 0)
+			errx(1, "Must be root/su to zerofh\n");
+
+		/*
+		 * Do it for the server specified by -s/--ds or all servers,
+		 * if -s/--ds was not sepcified.
+		 */
+		sin = &dsfile.dsf_sin;
+		sin6 = &dsfile.dsf_sin6;
+		ad = res;
+		while (ad != NULL) {
+			adsin = (struct sockaddr_in *)ad->ai_addr;
+			adsin6 = (struct sockaddr_in6 *)ad->ai_addr;
+			if (adsin->sin_family == sin->sin_family) {
+				if (sin->sin_family == AF_INET &&
+				    sin->sin_addr.s_addr ==
+				    adsin->sin_addr.s_addr)
+					break;
+				else if (sin->sin_family == AF_INET6 &&
+				    IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr,
+				    &adsin6->sin6_addr))
+					break;
+			}
+			ad = ad->ai_next;
+		}
+		if (res == NULL || ad != NULL) {
+			memset(&dsfile.dsf_fh, 0, sizeof(dsfile.dsf_fh));
+			if (extattr_set_file(*argv, EXTATTR_NAMESPACE_SYSTEM,
+			    "pnfsd.dsfile", &dsfile, sizeof(dsfile)) !=
+			    sizeof(dsfile))
+				err(1, "Can't set pnfsd.dsfile\n");
+		}
+	}
+
+	if (quiet != 0)
+		exit(0);
+
 	/* Translate the IP address to a hostname. */
 	if (getnameinfo((struct sockaddr *)&dsfile.dsf_sin,
 	    dsfile.dsf_sin.sin_len, hostn, sizeof(hostn), NULL, 0, 0) < 0)
@@ -76,7 +151,8 @@ static void
 usage(void)
 {
 
-	fprintf(stderr, "pnfsdsfile [filepath]\n");
+	fprintf(stderr, "pnfsdsfile [-q/--quiet] [-z/--zerofh] "
+	    "[-s/--ds <dshostname>] <filename>\n");
 	exit(1);
 }
 

From owner-svn-src-projects@freebsd.org  Fri Jun 16 22:05:31 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 34E40D8A47A
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 16 Jun 2017 22:05:31 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id EBD7571CD5;
 Fri, 16 Jun 2017 22:05:30 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5GM5UM1088465;
 Fri, 16 Jun 2017 22:05:30 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5GM5UFU088464;
 Fri, 16 Jun 2017 22:05:30 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706162205.v5GM5UFU088464@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 16 Jun 2017 22:05:30 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320031 -
 projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 16 Jun 2017 22:05:31 -0000

Author: rmacklem
Date: Fri Jun 16 22:05:29 2017
New Revision: 320031
URL: https://svnweb.freebsd.org/changeset/base/320031

Log:
  Document the arguments added to pnfsdsfile.

Modified:
  projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1

Modified: projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1
==============================================================================
--- projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1	Fri Jun 16 21:48:42 2017	(r320030)
+++ projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1	Fri Jun 16 22:05:29 2017	(r320031)
@@ -30,21 +30,41 @@
 .Sh NAME
 .Nm pnfsdsfile
 .Nd display
-a pNFS data storage file location
+a pNFS data storage file location and/or modify the pnfsd.dsfile extended attribute for it
 .Sh SYNOPSIS
 .Nm
+.Op Fl qz
+.Op Fl s Ar dshostname
 .Ar metadata_file
 .Sh DESCRIPTION
 The
 .Nm
-command displays the location of a data storage file for a pNFS service.
+command displays the location of a data storage file for a pNFS service and/or
+modifies the pnfsd.dsfile extended attribute on the file.
 A pNFS service maintains a data storage file for each regular file on
 the MetaData Server (MDS) on one of the Data Storage (DS) servers.
-This command can be used on the MDS to find out where that data storage
-file is.
+Unless command options are specified, this command displays the location
+of the DS file for the MDS file specified by the last command line argument.
 It must be used on the MDS and the
 .Ar metadata_file
 must be a file on the exported local file system and not an NFSv4.1 mount.
+.Pp
+The following options are available:
+.Bl -tag -width Ds
+.It Fl q
+This option suppresses printing of the DS file's location.
+.It Fl z
+This option specifies that the file handle field of the pnfsd.dsfile
+extended attribute is to filled with all zero bits.
+This forces the pNFS MDS to do a Lookup RPC against the DS to acquire the file
+handle to update it.
+Normally this will only be necessary after the DS file has been recovered
+from a backup, causing the file handle to change.
+.It Fl s Ar dshostname
+This option can be used with
+.Fl z
+so that the zeroing out of the file handle is only done if the DS server
+is the one specified by this option.
 .El
 .Sh SEE ALSO
 .Xr nfsv4 4 ,

From owner-svn-src-projects@freebsd.org  Fri Jun 16 22:07:16 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 37097D8A4A3
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 16 Jun 2017 22:07:16 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 05F6371DC0;
 Fri, 16 Jun 2017 22:07:15 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5GM7FBj088563;
 Fri, 16 Jun 2017 22:07:15 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5GM7Flp088562;
 Fri, 16 Jun 2017 22:07:15 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706162207.v5GM7Flp088562@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 16 Jun 2017 22:07:15 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320032 - projects/pnfs-planb-server/usr.bin/pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 16 Jun 2017 22:07:16 -0000

Author: rmacklem
Date: Fri Jun 16 22:07:14 2017
New Revision: 320032
URL: https://svnweb.freebsd.org/changeset/base/320032

Log:
  Document the arguments added to pnfsdsfile.

Modified:
  projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1

Modified: projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1
==============================================================================
--- projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1	Fri Jun 16 22:05:29 2017	(r320031)
+++ projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1	Fri Jun 16 22:07:14 2017	(r320032)
@@ -30,21 +30,41 @@
 .Sh NAME
 .Nm pnfsdsfile
 .Nd display
-a pNFS data storage file location
+a pNFS data storage file location and/or modify the pnfsd.dsfile extended attribute for it
 .Sh SYNOPSIS
 .Nm
+.Op Fl qz
+.Op Fl s Ar dshostname
 .Ar metadata_file
 .Sh DESCRIPTION
 The
 .Nm
-command displays the location of a data storage file for a pNFS service.
+command displays the location of a data storage file for a pNFS service and/or
+modifies the pnfsd.dsfile extended attribute on the file.
 A pNFS service maintains a data storage file for each regular file on
 the MetaData Server (MDS) on one of the Data Storage (DS) servers.
-This command can be used on the MDS to find out where that data storage
-file is.
+Unless command options are specified, this command displays the location
+of the DS file for the MDS file specified by the last command line argument.
 It must be used on the MDS and the
 .Ar metadata_file
 must be a file on the exported local file system and not an NFSv4.1 mount.
+.Pp
+The following options are available:
+.Bl -tag -width Ds
+.It Fl q
+This option suppresses printing of the DS file's location.
+.It Fl z
+This option specifies that the file handle field of the pnfsd.dsfile
+extended attribute is to filled with all zero bits.
+This forces the pNFS MDS to do a Lookup RPC against the DS to acquire the file
+handle to update it.
+Normally this will only be necessary after the DS file has been recovered
+from a backup, causing the file handle to change.
+.It Fl s Ar dshostname
+This option can be used with
+.Fl z
+so that the zeroing out of the file handle is only done if the DS server
+is the one specified by this option.
 .El
 .Sh SEE ALSO
 .Xr nfsv4 4 ,

From owner-svn-src-projects@freebsd.org  Fri Jun 16 23:27:12 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 4C2FBD8B320
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 16 Jun 2017 23:27:12 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 0C58373BAC;
 Fri, 16 Jun 2017 23:27:11 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5GNRBcB021162;
 Fri, 16 Jun 2017 23:27:11 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5GNRBrQ021161;
 Fri, 16 Jun 2017 23:27:11 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706162327.v5GNRBrQ021161@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 16 Jun 2017 23:27:11 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320036 -
 projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 16 Jun 2017 23:27:12 -0000

Author: rmacklem
Date: Fri Jun 16 23:27:10 2017
New Revision: 320036
URL: https://svnweb.freebsd.org/changeset/base/320036

Log:
  Add an option to pnfsdsfile so that a sysadmin can replace the IP# for a DS.
  (This should be avoided, but just in case it has to be done...)

Modified:
  projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c

Modified: projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c
==============================================================================
--- projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c	Fri Jun 16 23:25:11 2017	(r320035)
+++ projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.c	Fri Jun 16 23:27:10 2017	(r320036)
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 static void usage(void);
 
 static struct option longopts[] = {
+	{ "changeds",	required_argument,	NULL,	'c'	},
 	{ "quiet",	no_argument,		NULL,	'q'	},
 	{ "ds",		required_argument,	NULL,	's'	},
 	{ "zerofh",	no_argument,		NULL,	'z'	},
@@ -60,18 +61,35 @@ static struct option longopts[] = {
 int
 main(int argc, char *argv[])
 {
-	struct addrinfo *res, *ad;
+	struct addrinfo *res, *ad, *newres;
 	struct sockaddr_in *sin, *adsin;
 	struct sockaddr_in6 *sin6, *adsin6;
-	char hostn[NI_MAXHOST + 1];
+	char hostn[2 * NI_MAXHOST + 2], *cp;
 	struct pnfsdsfile dsfile;
 	int ch, quiet, zerofh;
+	in_port_t tport;
 
 	zerofh = 0;
 	quiet = 0;
 	res = NULL;
-	while ((ch = getopt_long(argc, argv, "qs:z", longopts, NULL)) != -1) {
+	newres = NULL;
+	while ((ch = getopt_long(argc, argv, "c:qs:z", longopts, NULL)) != -1) {
 		switch (ch) {
+		case 'c':
+			/* Replace the first DS server with the second one. */
+			if (zerofh != 0)
+				errx(1, "-c and -z are mutually exclusive\n");
+			strlcpy(hostn, optarg, 2 * NI_MAXHOST + 2);
+			cp = strchr(hostn, ',');
+			if (cp == NULL)
+				errx(1, "Bad -c argument %s\n", hostn);
+			*cp = '\0';
+			if (getaddrinfo(hostn, NULL, NULL, &res) != 0)
+				errx(1, "Can't get IP# for %s\n", hostn);
+			*cp++ = ',';
+			if (getaddrinfo(cp, NULL, NULL, &newres) != 0)
+				errx(1, "Can't get IP# for %s\n", cp);
+			break;
 		case 'q':
 			quiet = 1;
 			break;
@@ -81,6 +99,8 @@ main(int argc, char *argv[])
 				errx(1, "Can't get IP# for %s\n", optarg);
 			break;
 		case 'z':
+			if (newres != NULL)
+				errx(1, "-c and -z are mutually exclusive\n");
 			zerofh = 1;
 			break;
 		default:
@@ -129,6 +149,61 @@ main(int argc, char *argv[])
 		}
 		if (res == NULL || ad != NULL) {
 			memset(&dsfile.dsf_fh, 0, sizeof(dsfile.dsf_fh));
+			if (extattr_set_file(*argv, EXTATTR_NAMESPACE_SYSTEM,
+			    "pnfsd.dsfile", &dsfile, sizeof(dsfile)) !=
+			    sizeof(dsfile))
+				err(1, "Can't set pnfsd.dsfile\n");
+		}
+	}
+
+	/* Do the -c option to replace the DS host address. */
+	if (newres != NULL) {
+		if (geteuid() != 0)
+			errx(1, "Must be root/su to replace the host addr\n");
+
+		/*
+		 * Check that the old host address matches.
+		 */
+		sin = &dsfile.dsf_sin;
+		sin6 = &dsfile.dsf_sin6;
+		ad = res;
+		while (ad != NULL) {
+			adsin = (struct sockaddr_in *)ad->ai_addr;
+			adsin6 = (struct sockaddr_in6 *)ad->ai_addr;
+			if (adsin->sin_family == sin->sin_family) {
+				if (sin->sin_family == AF_INET &&
+				    sin->sin_addr.s_addr ==
+				    adsin->sin_addr.s_addr)
+					break;
+				else if (sin->sin_family == AF_INET6 &&
+				    IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr,
+				    &adsin6->sin6_addr))
+					break;
+			}
+			ad = ad->ai_next;
+		}
+		if (ad != NULL) {
+			if (sin->sin_family == AF_INET)
+				tport = sin->sin_port;
+			else
+				tport = sin6->sin6_port;
+			/*
+			 * We have a match, so replace it with the first
+			 * AF_INET or AF_INET6 address in the newres list.
+			 */
+			while (newres->ai_addr->sa_family != AF_INET &&
+			    newres->ai_addr->sa_family != AF_INET6) {
+				newres = newres->ai_next;
+				if (newres == NULL)
+					errx(1, "Hostname %s has no IP#\n", cp);
+			}
+			if (newres->ai_addr->sa_family == AF_INET) {
+				memcpy(sin, newres->ai_addr, sizeof(*sin));
+				sin->sin_port = tport;
+			} else if (newres->ai_addr->sa_family == AF_INET6) {
+				memcpy(sin6, newres->ai_addr, sizeof(*sin6));
+				sin6->sin6_port = tport;
+			}
 			if (extattr_set_file(*argv, EXTATTR_NAMESPACE_SYSTEM,
 			    "pnfsd.dsfile", &dsfile, sizeof(dsfile)) !=
 			    sizeof(dsfile))

From owner-svn-src-projects@freebsd.org  Fri Jun 16 23:29:44 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 3461AD8B349
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 16 Jun 2017 23:29:44 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id EE0F873C96;
 Fri, 16 Jun 2017 23:29:43 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5GNThwa021285;
 Fri, 16 Jun 2017 23:29:43 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5GNThiT021284;
 Fri, 16 Jun 2017 23:29:43 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706162329.v5GNThiT021284@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 16 Jun 2017 23:29:43 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320037 - projects/pnfs-planb-server/usr.bin/pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 16 Jun 2017 23:29:44 -0000

Author: rmacklem
Date: Fri Jun 16 23:29:42 2017
New Revision: 320037
URL: https://svnweb.freebsd.org/changeset/base/320037

Log:
  Add an option to pnfsdsfile so that a sysadmin can replace the IP# for a DS.
  (This should be avoided, but just in case it has to be done...)

Modified:
  projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c

Modified: projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c
==============================================================================
--- projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c	Fri Jun 16 23:27:10 2017	(r320036)
+++ projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c	Fri Jun 16 23:29:42 2017	(r320037)
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 static void usage(void);
 
 static struct option longopts[] = {
+	{ "changeds",	required_argument,	NULL,	'c'	},
 	{ "quiet",	no_argument,		NULL,	'q'	},
 	{ "ds",		required_argument,	NULL,	's'	},
 	{ "zerofh",	no_argument,		NULL,	'z'	},
@@ -60,18 +61,35 @@ static struct option longopts[] = {
 int
 main(int argc, char *argv[])
 {
-	struct addrinfo *res, *ad;
+	struct addrinfo *res, *ad, *newres;
 	struct sockaddr_in *sin, *adsin;
 	struct sockaddr_in6 *sin6, *adsin6;
-	char hostn[NI_MAXHOST + 1];
+	char hostn[2 * NI_MAXHOST + 2], *cp;
 	struct pnfsdsfile dsfile;
 	int ch, quiet, zerofh;
+	in_port_t tport;
 
 	zerofh = 0;
 	quiet = 0;
 	res = NULL;
-	while ((ch = getopt_long(argc, argv, "qs:z", longopts, NULL)) != -1) {
+	newres = NULL;
+	while ((ch = getopt_long(argc, argv, "c:qs:z", longopts, NULL)) != -1) {
 		switch (ch) {
+		case 'c':
+			/* Replace the first DS server with the second one. */
+			if (zerofh != 0)
+				errx(1, "-c and -z are mutually exclusive\n");
+			strlcpy(hostn, optarg, 2 * NI_MAXHOST + 2);
+			cp = strchr(hostn, ',');
+			if (cp == NULL)
+				errx(1, "Bad -c argument %s\n", hostn);
+			*cp = '\0';
+			if (getaddrinfo(hostn, NULL, NULL, &res) != 0)
+				errx(1, "Can't get IP# for %s\n", hostn);
+			*cp++ = ',';
+			if (getaddrinfo(cp, NULL, NULL, &newres) != 0)
+				errx(1, "Can't get IP# for %s\n", cp);
+			break;
 		case 'q':
 			quiet = 1;
 			break;
@@ -81,6 +99,8 @@ main(int argc, char *argv[])
 				errx(1, "Can't get IP# for %s\n", optarg);
 			break;
 		case 'z':
+			if (newres != NULL)
+				errx(1, "-c and -z are mutually exclusive\n");
 			zerofh = 1;
 			break;
 		default:
@@ -129,6 +149,61 @@ main(int argc, char *argv[])
 		}
 		if (res == NULL || ad != NULL) {
 			memset(&dsfile.dsf_fh, 0, sizeof(dsfile.dsf_fh));
+			if (extattr_set_file(*argv, EXTATTR_NAMESPACE_SYSTEM,
+			    "pnfsd.dsfile", &dsfile, sizeof(dsfile)) !=
+			    sizeof(dsfile))
+				err(1, "Can't set pnfsd.dsfile\n");
+		}
+	}
+
+	/* Do the -c option to replace the DS host address. */
+	if (newres != NULL) {
+		if (geteuid() != 0)
+			errx(1, "Must be root/su to replace the host addr\n");
+
+		/*
+		 * Check that the old host address matches.
+		 */
+		sin = &dsfile.dsf_sin;
+		sin6 = &dsfile.dsf_sin6;
+		ad = res;
+		while (ad != NULL) {
+			adsin = (struct sockaddr_in *)ad->ai_addr;
+			adsin6 = (struct sockaddr_in6 *)ad->ai_addr;
+			if (adsin->sin_family == sin->sin_family) {
+				if (sin->sin_family == AF_INET &&
+				    sin->sin_addr.s_addr ==
+				    adsin->sin_addr.s_addr)
+					break;
+				else if (sin->sin_family == AF_INET6 &&
+				    IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr,
+				    &adsin6->sin6_addr))
+					break;
+			}
+			ad = ad->ai_next;
+		}
+		if (ad != NULL) {
+			if (sin->sin_family == AF_INET)
+				tport = sin->sin_port;
+			else
+				tport = sin6->sin6_port;
+			/*
+			 * We have a match, so replace it with the first
+			 * AF_INET or AF_INET6 address in the newres list.
+			 */
+			while (newres->ai_addr->sa_family != AF_INET &&
+			    newres->ai_addr->sa_family != AF_INET6) {
+				newres = newres->ai_next;
+				if (newres == NULL)
+					errx(1, "Hostname %s has no IP#\n", cp);
+			}
+			if (newres->ai_addr->sa_family == AF_INET) {
+				memcpy(sin, newres->ai_addr, sizeof(*sin));
+				sin->sin_port = tport;
+			} else if (newres->ai_addr->sa_family == AF_INET6) {
+				memcpy(sin6, newres->ai_addr, sizeof(*sin6));
+				sin6->sin6_port = tport;
+			}
 			if (extattr_set_file(*argv, EXTATTR_NAMESPACE_SYSTEM,
 			    "pnfsd.dsfile", &dsfile, sizeof(dsfile)) !=
 			    sizeof(dsfile))

From owner-svn-src-projects@freebsd.org  Fri Jun 16 23:41:24 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id BBE89D8B559
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 16 Jun 2017 23:41:24 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 8B481742B3;
 Fri, 16 Jun 2017 23:41:24 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5GNfN35028251;
 Fri, 16 Jun 2017 23:41:23 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5GNfNgV028250;
 Fri, 16 Jun 2017 23:41:23 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706162341.v5GNfNgV028250@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 16 Jun 2017 23:41:23 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320039 -
 projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 16 Jun 2017 23:41:24 -0000

Author: rmacklem
Date: Fri Jun 16 23:41:23 2017
New Revision: 320039
URL: https://svnweb.freebsd.org/changeset/base/320039

Log:
  Document the -c option that replaces the DS host IP# in the extended attribute.

Modified:
  projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1

Modified: projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1
==============================================================================
--- projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1	Fri Jun 16 23:41:13 2017	(r320038)
+++ projects/pnfs-planb-server-stable11/usr.bin/pnfsdsfile/pnfsdsfile.1	Fri Jun 16 23:41:23 2017	(r320039)
@@ -34,6 +34,7 @@ a pNFS data storage file location and/or modify the pn
 .Sh SYNOPSIS
 .Nm
 .Op Fl qz
+.Op Fl c Ar old-dshostname,new-dshostname
 .Op Fl s Ar dshostname
 .Ar metadata_file
 .Sh DESCRIPTION
@@ -60,6 +61,17 @@ This forces the pNFS MDS to do a Lookup RPC against th
 handle to update it.
 Normally this will only be necessary after the DS file has been recovered
 from a backup, causing the file handle to change.
+.It Fl c Ar old-dshostname,new-dshostname
+This option allows a sysadmin to replace the host IP# for the DS in the
+pnfsd.dsfile extended attribute.
+The old-hostname must resolve to the IP# already in the pnfsd.dsfile extended
+attribute or the replacement will not be done.
+If the old-dshostname matches, then the IP# is replaced by the first AF_INET
+or AF_INET6 address that
+.Xr getaddrinfo 3
+returns for the new-dshostname.
+Changing a DS server's host IP# should be avoided, but this option will
+allow it to be changed, if the change is unavoidable.
 .It Fl s Ar dshostname
 This option can be used with
 .Fl z

From owner-svn-src-projects@freebsd.org  Fri Jun 16 23:43:07 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 137AED8B6DE
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 16 Jun 2017 23:43:07 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id D81D874512;
 Fri, 16 Jun 2017 23:43:06 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5GNh5UY029095;
 Fri, 16 Jun 2017 23:43:05 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5GNh5hP029094;
 Fri, 16 Jun 2017 23:43:05 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201706162343.v5GNh5hP029094@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 16 Jun 2017 23:43:05 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320040 - projects/pnfs-planb-server/usr.bin/pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 16 Jun 2017 23:43:07 -0000

Author: rmacklem
Date: Fri Jun 16 23:43:05 2017
New Revision: 320040
URL: https://svnweb.freebsd.org/changeset/base/320040

Log:
  Document the -c option that replaces the DS host IP# in the extended attribute.

Modified:
  projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1

Modified: projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1
==============================================================================
--- projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1	Fri Jun 16 23:41:23 2017	(r320039)
+++ projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1	Fri Jun 16 23:43:05 2017	(r320040)
@@ -34,6 +34,7 @@ a pNFS data storage file location and/or modify the pn
 .Sh SYNOPSIS
 .Nm
 .Op Fl qz
+.Op Fl c Ar old-dshostname,new-dshostname
 .Op Fl s Ar dshostname
 .Ar metadata_file
 .Sh DESCRIPTION
@@ -60,6 +61,17 @@ This forces the pNFS MDS to do a Lookup RPC against th
 handle to update it.
 Normally this will only be necessary after the DS file has been recovered
 from a backup, causing the file handle to change.
+.It Fl c Ar old-dshostname,new-dshostname
+This option allows a sysadmin to replace the host IP# for the DS in the
+pnfsd.dsfile extended attribute.
+The old-hostname must resolve to the IP# already in the pnfsd.dsfile extended
+attribute or the replacement will not be done.
+If the old-dshostname matches, then the IP# is replaced by the first AF_INET
+or AF_INET6 address that
+.Xr getaddrinfo 3
+returns for the new-dshostname.
+Changing a DS server's host IP# should be avoided, but this option will
+allow it to be changed, if the change is unavoidable.
 .It Fl s Ar dshostname
 This option can be used with
 .Fl z

From owner-svn-src-projects@freebsd.org  Sat Jun 17 00:09:39 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 0BFD1D8C170
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Sat, 17 Jun 2017 00:09:39 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 92AAD7516E;
 Sat, 17 Jun 2017 00:09:38 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5H09bD7037391;
 Sat, 17 Jun 2017 00:09:37 GMT (envelope-from dim@FreeBSD.org)
Received: (from dim@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5H09ZWa037366;
 Sat, 17 Jun 2017 00:09:35 GMT (envelope-from dim@FreeBSD.org)
Message-Id: <201706170009.v5H09ZWa037366@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org
 using -f
From: Dimitry Andric <dim@FreeBSD.org>
Date: Sat, 17 Jun 2017 00:09:35 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320041 - in projects/clang500-import:
 contrib/compiler-rt/lib/asan contrib/compiler-rt/lib/sanitizer_common
 contrib/compiler-rt/lib/tsan/rtl contrib/compiler-rt/lib/ubsan
 contrib/libc+...
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 17 Jun 2017 00:09:39 -0000

Author: dim
Date: Sat Jun 17 00:09:34 2017
New Revision: 320041
URL: https://svnweb.freebsd.org/changeset/base/320041

Log:
  Merge llvm, clang, lld, lldb, compiler-rt and libc++ r305575, and update
  build glue.

Added:
  projects/clang500-import/contrib/libc++/src/vector.cpp
     - copied unchanged from r320030, vendor/libc++/dist/src/vector.cpp
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/StringsAndChecksums.h
     - copied unchanged from r320028, vendor/llvm/dist/include/llvm/DebugInfo/CodeView/StringsAndChecksums.h
  projects/clang500-import/contrib/llvm/include/llvm/Testing/
     - copied from r320028, vendor/llvm/dist/include/llvm/Testing/
  projects/clang500-import/contrib/llvm/lib/DebugInfo/CodeView/StringsAndChecksums.cpp
     - copied unchanged from r320028, vendor/llvm/dist/lib/DebugInfo/CodeView/StringsAndChecksums.cpp
  projects/clang500-import/contrib/llvm/lib/Testing/
     - copied from r320028, vendor/llvm/dist/lib/Testing/
  projects/clang500-import/contrib/llvm/lib/Transforms/Instrumentation/PGOMemOPSizeOpt.cpp
     - copied unchanged from r320028, vendor/llvm/dist/lib/Transforms/Instrumentation/PGOMemOPSizeOpt.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Arch/
     - copied from r320029, vendor/lld/dist/ELF/Arch/
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/FormatUtil.cpp
     - copied unchanged from r320028, vendor/llvm/dist/tools/llvm-pdbutil/FormatUtil.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/FormatUtil.h
     - copied unchanged from r320028, vendor/llvm/dist/tools/llvm-pdbutil/FormatUtil.h
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/MinimalSymbolDumper.cpp
     - copied unchanged from r320028, vendor/llvm/dist/tools/llvm-pdbutil/MinimalSymbolDumper.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/MinimalSymbolDumper.h
     - copied unchanged from r320028, vendor/llvm/dist/tools/llvm-pdbutil/MinimalSymbolDumper.h
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp
     - copied unchanged from r320028, vendor/llvm/dist/tools/llvm-pdbutil/MinimalTypeDumper.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/MinimalTypeDumper.h
     - copied unchanged from r320028, vendor/llvm/dist/tools/llvm-pdbutil/MinimalTypeDumper.h
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/RawOutputStyle.cpp
     - copied unchanged from r320028, vendor/llvm/dist/tools/llvm-pdbutil/RawOutputStyle.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/RawOutputStyle.h
     - copied unchanged from r320028, vendor/llvm/dist/tools/llvm-pdbutil/RawOutputStyle.h
Deleted:
  projects/clang500-import/contrib/llvm/lib/Testing/CMakeLists.txt
  projects/clang500-import/contrib/llvm/lib/Testing/LLVMBuild.txt
  projects/clang500-import/contrib/llvm/lib/Testing/Support/CMakeLists.txt
  projects/clang500-import/contrib/llvm/lib/Testing/Support/LLVMBuild.txt
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/LLVMOutputStyle.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/LLVMOutputStyle.h
Modified:
  projects/clang500-import/contrib/compiler-rt/lib/asan/asan_allocator.cc
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_combined.h
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_secondary.h
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common.h
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cc
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_win.cc
  projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_report.cc
  projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_sync.h
  projects/clang500-import/contrib/compiler-rt/lib/ubsan/ubsan_handlers.cc
  projects/clang500-import/contrib/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cc
  projects/clang500-import/contrib/libc++/include/__bsd_locale_fallbacks.h
  projects/clang500-import/contrib/libc++/include/__config
  projects/clang500-import/contrib/libc++/include/__functional_03
  projects/clang500-import/contrib/libc++/include/__functional_base
  projects/clang500-import/contrib/libc++/include/array
  projects/clang500-import/contrib/libc++/include/experimental/coroutine
  projects/clang500-import/contrib/libc++/include/fstream
  projects/clang500-import/contrib/libc++/include/functional
  projects/clang500-import/contrib/libc++/include/locale
  projects/clang500-import/contrib/libc++/include/memory
  projects/clang500-import/contrib/libc++/include/numeric
  projects/clang500-import/contrib/libc++/include/utility
  projects/clang500-import/contrib/libc++/include/variant
  projects/clang500-import/contrib/libc++/src/experimental/filesystem/operations.cpp
  projects/clang500-import/contrib/libc++/src/locale.cpp
  projects/clang500-import/contrib/llvm/include/llvm/ADT/AllocatorList.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/ArrayRef.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/BreadthFirstIterator.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/DAGDeltaAlgorithm.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/DeltaAlgorithm.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/DenseMap.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/DenseMapInfo.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/DenseSet.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/DepthFirstIterator.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/EquivalenceClasses.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/FoldingSet.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/GraphTraits.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/ImmutableList.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/ImmutableMap.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/ImmutableSet.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/IndexedMap.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/IntervalMap.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/MapVector.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/Optional.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/PackedVector.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/PointerEmbeddedInt.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/PointerUnion.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/ScopedHashTable.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/SmallBitVector.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/SmallSet.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/StringExtras.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/Triple.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/ilist_base.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/ilist_iterator.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/ilist_node.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/iterator.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/simple_ilist.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/MemorySSA.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/ScalarEvolution.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/TargetTransformInfo.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/TypeMetadataUtils.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/ValueTracking.h
  projects/clang500-import/contrib/llvm/include/llvm/BinaryFormat/ELF.h
  projects/clang500-import/contrib/llvm/include/llvm/Bitcode/BitcodeReader.h
  projects/clang500-import/contrib/llvm/include/llvm/Bitcode/BitcodeWriter.h
  projects/clang500-import/contrib/llvm/include/llvm/Bitcode/LLVMBitCodes.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/BasicTTIImpl.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/RuntimeLibcalls.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/SelectionDAG.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/CodeView.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/DebugSubsectionRecord.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/Formatters.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/TypeIndex.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleList.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/InfoStream.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/PDBFile.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/PDBStringTable.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/PublicsStream.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/RawConstants.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/SymbolStream.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/TpiStreamBuilder.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/Constants.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/DebugInfoMetadata.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/GlobalVariable.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/IRBuilder.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/InstrTypes.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/Instructions.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/IntrinsicInst.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/Intrinsics.td
  projects/clang500-import/contrib/llvm/include/llvm/IR/ModuleSummaryIndex.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/ModuleSummaryIndexYAML.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/Operator.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/PatternMatch.h
  projects/clang500-import/contrib/llvm/include/llvm/LTO/LTO.h
  projects/clang500-import/contrib/llvm/include/llvm/LTO/legacy/LTOModule.h
  projects/clang500-import/contrib/llvm/include/llvm/MC/MCSymbolWasm.h
  projects/clang500-import/contrib/llvm/include/llvm/MC/MCWasmObjectWriter.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/ArchiveWriter.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/WindowsResource.h
  projects/clang500-import/contrib/llvm/include/llvm/ObjectYAML/COFFYAML.h
  projects/clang500-import/contrib/llvm/include/llvm/ObjectYAML/CodeViewYAMLDebugSections.h
  projects/clang500-import/contrib/llvm/include/llvm/ObjectYAML/CodeViewYAMLTypes.h
  projects/clang500-import/contrib/llvm/include/llvm/Option/Arg.h
  projects/clang500-import/contrib/llvm/include/llvm/Option/ArgList.h
  projects/clang500-import/contrib/llvm/include/llvm/Option/OptSpecifier.h
  projects/clang500-import/contrib/llvm/include/llvm/Option/OptTable.h
  projects/clang500-import/contrib/llvm/include/llvm/Option/Option.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/BinaryStreamArray.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/DebugCounter.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/FormatAdapters.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/FormatCommon.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/MathExtras.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/ThreadPool.h
  projects/clang500-import/contrib/llvm/include/llvm/TableGen/Main.h
  projects/clang500-import/contrib/llvm/include/llvm/TableGen/Record.h
  projects/clang500-import/contrib/llvm/include/llvm/TableGen/SetTheory.h
  projects/clang500-import/contrib/llvm/include/llvm/TableGen/StringMatcher.h
  projects/clang500-import/contrib/llvm/include/llvm/Target/TargetLoweringObjectFile.h
  projects/clang500-import/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h
  projects/clang500-import/contrib/llvm/include/llvm/Transforms/Scalar/GVNExpression.h
  projects/clang500-import/contrib/llvm/include/llvm/Transforms/Utils/CodeExtractor.h
  projects/clang500-import/contrib/llvm/include/llvm/Transforms/Utils/Mem2Reg.h
  projects/clang500-import/contrib/llvm/lib/Analysis/BasicAliasAnalysis.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/CallGraphSCCPass.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/DivergenceAnalysis.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/MemorySSA.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/ScalarEvolution.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/TargetTransformInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/ValueTracking.cpp
  projects/clang500-import/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
  projects/clang500-import/contrib/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
  projects/clang500-import/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/CodeGenPrepare.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/MachineBlockPlacement.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/MachineLICM.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SplitKit.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/StackColoring.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/TargetLoweringBase.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/CodeView/TypeDatabase.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/CodeView/TypeIndex.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/CodeView/TypeIndexDiscovery.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/InfoStream.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/PDBStringTable.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/PublicsStream.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/TpiHashing.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/UDTLayout.cpp
  projects/clang500-import/contrib/llvm/lib/IR/ConstantFold.cpp
  projects/clang500-import/contrib/llvm/lib/IR/ConstantsContext.h
  projects/clang500-import/contrib/llvm/lib/IR/DebugInfoMetadata.cpp
  projects/clang500-import/contrib/llvm/lib/IR/IRBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/IR/Metadata.cpp
  projects/clang500-import/contrib/llvm/lib/IR/ModuleSummaryIndex.cpp
  projects/clang500-import/contrib/llvm/lib/IR/Verifier.cpp
  projects/clang500-import/contrib/llvm/lib/LTO/LTO.cpp
  projects/clang500-import/contrib/llvm/lib/LTO/LTOModule.cpp
  projects/clang500-import/contrib/llvm/lib/MC/MCParser/ELFAsmParser.cpp
  projects/clang500-import/contrib/llvm/lib/MC/MCSectionELF.cpp
  projects/clang500-import/contrib/llvm/lib/MC/WasmObjectWriter.cpp
  projects/clang500-import/contrib/llvm/lib/Object/ArchiveWriter.cpp
  projects/clang500-import/contrib/llvm/lib/Object/ELF.cpp
  projects/clang500-import/contrib/llvm/lib/Object/IRSymtab.cpp
  projects/clang500-import/contrib/llvm/lib/Object/WindowsResource.cpp
  projects/clang500-import/contrib/llvm/lib/ObjectYAML/COFFYAML.cpp
  projects/clang500-import/contrib/llvm/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp
  projects/clang500-import/contrib/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
  projects/clang500-import/contrib/llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp
  projects/clang500-import/contrib/llvm/lib/ObjectYAML/ELFYAML.cpp
  projects/clang500-import/contrib/llvm/lib/Option/Arg.cpp
  projects/clang500-import/contrib/llvm/lib/Option/ArgList.cpp
  projects/clang500-import/contrib/llvm/lib/Option/OptTable.cpp
  projects/clang500-import/contrib/llvm/lib/Option/Option.cpp
  projects/clang500-import/contrib/llvm/lib/Passes/PassBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/Support/BinaryStreamWriter.cpp
  projects/clang500-import/contrib/llvm/lib/Support/DebugCounter.cpp
  projects/clang500-import/contrib/llvm/lib/Support/FoldingSet.cpp
  projects/clang500-import/contrib/llvm/lib/Support/ThreadPool.cpp
  projects/clang500-import/contrib/llvm/lib/Support/Unix/Program.inc
  projects/clang500-import/contrib/llvm/lib/TableGen/Record.cpp
  projects/clang500-import/contrib/llvm/lib/TableGen/SetTheory.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64.td
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64FastISel.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64SchedFalkorDetails.td
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64Subtarget.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/FLATInstructions.td
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIInstrInfo.td
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMCallLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMInstrVFP.td
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMTargetTransformInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/BPF/BPFAsmPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/Target/BPF/BPFISelDAGToDAG.cpp
  projects/clang500-import/contrib/llvm/lib/Target/BPF/BPFInstrInfo.td
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/HexagonGenMux.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/HexagonLoopIdiomRecognition.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/HexagonPatterns.td
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsLongBranch.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.h
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsSEISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsSubtarget.h
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.h
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCInstr64Bit.td
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.td
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCInstrVSX.td
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h
  projects/clang500-import/contrib/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
  projects/clang500-import/contrib/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86InstrAVX512.td
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/IPO/CrossDSOCFI.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/IPO/Inliner.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/IPO/PartialInlining.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/EarlyCSE.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/GVNSink.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/NewGVN.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/SCCP.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/CodeExtractor.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/PredicateInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Basic/AllDiagnostics.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsPPC.def
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSerializationKinds.td
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Format/Format.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Lex/MacroArgs.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Sema/Sema.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/AST/ASTContext.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/AST/ExprClassification.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/AST/ODRHash.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGBuiltin.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGCoroutine.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGExprScalar.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGOpenMPRuntime.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/Driver/ToolChains/Clang.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/Format.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/NamespaceEndCommentsFixer.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/UnwrappedLineFormatter.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/UnwrappedLineParser.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/WhitespaceManager.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/Frontend/ASTConsumers.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Index/IndexDecl.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Index/IndexSymbol.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Lex/MacroArgs.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaCoroutine.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaDeclAttr.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaLambda.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
  projects/clang500-import/contrib/llvm/tools/lld/COFF/Driver.cpp
  projects/clang500-import/contrib/llvm/tools/lld/COFF/DriverUtils.cpp
  projects/clang500-import/contrib/llvm/tools/lld/COFF/InputFiles.h
  projects/clang500-import/contrib/llvm/tools/lld/COFF/PDB.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/CMakeLists.txt
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Driver.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/ICF.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/InputFiles.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/InputFiles.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/InputSection.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/LinkerScript.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/LinkerScript.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/MarkLive.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/OutputSections.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/OutputSections.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Relocations.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Relocations.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Strings.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/SyntheticSections.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/SyntheticSections.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Target.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Target.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Writer.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/Core/Debugger.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/Target/StackFrame.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/Target/StackFrameList.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/Target/Thread.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/Utility/Status.h
  projects/clang500-import/contrib/llvm/tools/lldb/source/Commands/CommandObjectThread.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Core/Debugger.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Host/common/Symbols.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Target/StackFrame.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Target/StackFrameList.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Target/Thread.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Utility/Status.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-ar/llvm-ar.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/LinePrinter.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/LinePrinter.h
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/PrettyClassLayoutGraphicalDumper.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbutil/llvm-pdbutil.h
  projects/clang500-import/contrib/llvm/tools/llvm-readobj/COFFDumper.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-readobj/ELFDumper.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-stress/llvm-stress.cpp
  projects/clang500-import/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
  projects/clang500-import/lib/clang/include/clang/Basic/Version.inc
  projects/clang500-import/lib/clang/include/lld/Config/Version.inc
  projects/clang500-import/lib/clang/include/llvm/Support/VCSRevision.h
  projects/clang500-import/lib/clang/libllvm/Makefile
  projects/clang500-import/lib/libc++/Makefile
  projects/clang500-import/usr.bin/clang/lld/Makefile
  projects/clang500-import/usr.bin/clang/llvm-pdbutil/Makefile
Directory Properties:
  projects/clang500-import/contrib/compiler-rt/   (props changed)
  projects/clang500-import/contrib/libc++/   (props changed)
  projects/clang500-import/contrib/llvm/   (props changed)
  projects/clang500-import/contrib/llvm/tools/clang/   (props changed)
  projects/clang500-import/contrib/llvm/tools/lld/   (props changed)
  projects/clang500-import/contrib/llvm/tools/lldb/   (props changed)

Modified: projects/clang500-import/contrib/compiler-rt/lib/asan/asan_allocator.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/asan/asan_allocator.cc	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/asan/asan_allocator.cc	Sat Jun 17 00:09:34 2017	(r320041)
@@ -235,6 +235,8 @@ struct Allocator {
   AllocatorCache fallback_allocator_cache;
   QuarantineCache fallback_quarantine_cache;
 
+  atomic_uint8_t rss_limit_exceeded;
+
   // ------------------- Options --------------------------
   atomic_uint16_t min_redzone;
   atomic_uint16_t max_redzone;
@@ -268,6 +270,14 @@ struct Allocator {
     SharedInitCode(options);
   }
 
+  bool RssLimitExceeded() {
+    return atomic_load(&rss_limit_exceeded, memory_order_relaxed);
+  }
+
+  void SetRssLimitExceeded(bool limit_exceeded) {
+    atomic_store(&rss_limit_exceeded, limit_exceeded, memory_order_relaxed);
+  }
+
   void RePoisonChunk(uptr chunk) {
     // This could be a user-facing chunk (with redzones), or some internal
     // housekeeping chunk, like TransferBatch. Start by assuming the former.
@@ -363,6 +373,8 @@ struct Allocator {
                  AllocType alloc_type, bool can_fill) {
     if (UNLIKELY(!asan_inited))
       AsanInitFromRtl();
+    if (RssLimitExceeded())
+      return allocator.ReturnNullOrDieOnOOM();
     Flags &fl = *flags();
     CHECK(stack);
     const uptr min_alignment = SHADOW_GRANULARITY;
@@ -400,16 +412,15 @@ struct Allocator {
 
     AsanThread *t = GetCurrentThread();
     void *allocated;
-    bool check_rss_limit = true;
     if (t) {
       AllocatorCache *cache = GetAllocatorCache(&t->malloc_storage());
       allocated =
-          allocator.Allocate(cache, needed_size, 8, false, check_rss_limit);
+          allocator.Allocate(cache, needed_size, 8, false);
     } else {
       SpinMutexLock l(&fallback_mutex);
       AllocatorCache *cache = &fallback_allocator_cache;
       allocated =
-          allocator.Allocate(cache, needed_size, 8, false, check_rss_limit);
+          allocator.Allocate(cache, needed_size, 8, false);
     }
 
     if (!allocated) return allocator.ReturnNullOrDieOnOOM();
@@ -866,8 +877,8 @@ void asan_mz_force_unlock() {
   instance.ForceUnlock();
 }
 
-void AsanSoftRssLimitExceededCallback(bool exceeded) {
-  instance.allocator.SetRssLimitIsExceeded(exceeded);
+void AsanSoftRssLimitExceededCallback(bool limit_exceeded) {
+  instance.SetRssLimitExceeded(limit_exceeded);
 }
 
 } // namespace __asan

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_combined.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_combined.h	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_combined.h	Sat Jun 17 00:09:34 2017	(r320041)
@@ -43,12 +43,12 @@ class CombinedAllocator {
   }
 
   void *Allocate(AllocatorCache *cache, uptr size, uptr alignment,
-                 bool cleared = false, bool check_rss_limit = false) {
+                 bool cleared = false) {
     // Returning 0 on malloc(0) may break a lot of code.
     if (size == 0)
       size = 1;
-    if (size + alignment < size) return ReturnNullOrDieOnBadRequest();
-    if (check_rss_limit && RssLimitIsExceeded()) return ReturnNullOrDieOnOOM();
+    if (size + alignment < size)
+      return ReturnNullOrDieOnBadRequest();
     uptr original_size = size;
     // If alignment requirements are to be fulfilled by the frontend allocator
     // rather than by the primary or secondary, passing an alignment lower than
@@ -89,7 +89,8 @@ class CombinedAllocator {
   }
 
   void *ReturnNullOrDieOnOOM() {
-    if (MayReturnNull()) return nullptr;
+    if (MayReturnNull())
+      return nullptr;
     ReportAllocatorCannotReturnNull(true);
   }
 
@@ -106,15 +107,6 @@ class CombinedAllocator {
     primary_.SetReleaseToOSIntervalMs(release_to_os_interval_ms);
   }
 
-  bool RssLimitIsExceeded() {
-    return atomic_load(&rss_limit_is_exceeded_, memory_order_acquire);
-  }
-
-  void SetRssLimitIsExceeded(bool rss_limit_is_exceeded) {
-    atomic_store(&rss_limit_is_exceeded_, rss_limit_is_exceeded,
-                 memory_order_release);
-  }
-
   void Deallocate(AllocatorCache *cache, void *p) {
     if (!p) return;
     if (primary_.PointerIsMine(p))
@@ -228,6 +220,5 @@ class CombinedAllocator {
   SecondaryAllocator secondary_;
   AllocatorGlobalStats stats_;
   atomic_uint8_t may_return_null_;
-  atomic_uint8_t rss_limit_is_exceeded_;
 };
 

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_secondary.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_secondary.h	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_secondary.h	Sat Jun 17 00:09:34 2017	(r320041)
@@ -36,9 +36,12 @@ class LargeMmapAllocator {
     if (alignment > page_size_)
       map_size += alignment;
     // Overflow.
-    if (map_size < size) return ReturnNullOrDieOnBadRequest();
+    if (map_size < size)
+      return ReturnNullOrDieOnBadRequest();
     uptr map_beg = reinterpret_cast<uptr>(
-        MmapOrDie(map_size, "LargeMmapAllocator"));
+        MmapOrDieOnFatalError(map_size, "LargeMmapAllocator"));
+    if (!map_beg)
+      return ReturnNullOrDieOnOOM();
     CHECK(IsAligned(map_beg, page_size_));
     MapUnmapCallback().OnMap(map_beg, map_size);
     uptr map_end = map_beg + map_size;

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common.h	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common.h	Sat Jun 17 00:09:34 2017	(r320041)
@@ -85,6 +85,9 @@ INLINE void *MmapOrDieQuietly(uptr size, const char *m
   return MmapOrDie(size, mem_type, /*raw_report*/ true);
 }
 void UnmapOrDie(void *addr, uptr size);
+// Behaves just like MmapOrDie, but tolerates out of memory condition, in that
+// case returns nullptr.
+void *MmapOrDieOnFatalError(uptr size, const char *mem_type);
 void *MmapFixedNoReserve(uptr fixed_addr, uptr size,
                          const char *name = nullptr);
 void *MmapNoReserveOrDie(uptr size, const char *mem_type);

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc	Sat Jun 17 00:09:34 2017	(r320041)
@@ -93,6 +93,9 @@ COMMON_FLAG(HandleSignalMode, handle_sigill, kHandleSi
 COMMON_FLAG(HandleSignalMode, handle_sigfpe, kHandleSignalYes,
             COMMON_FLAG_HANDLE_SIGNAL_HELP(SIGFPE))
 #undef COMMON_FLAG_HANDLE_SIGNAL_HELP
+COMMON_FLAG(bool, allow_user_segv_handler, true,
+            "Deprecated. True has no effect, use handle_sigbus=1. If false, "
+            "handle_*=1 will be upgraded to handle_*=2.")
 COMMON_FLAG(bool, use_sigaltstack, true,
             "If set, uses alternate stack for signal handling.")
 COMMON_FLAG(bool, detect_deadlocks, false,

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc	Sat Jun 17 00:09:34 2017	(r320041)
@@ -1396,7 +1396,7 @@ AndroidApiLevel AndroidGetApiLevel() {
 
 #endif
 
-HandleSignalMode GetHandleSignalMode(int signum) {
+static HandleSignalMode GetHandleSignalModeImpl(int signum) {
   switch (signum) {
     case SIGABRT:
       return common_flags()->handle_abort;
@@ -1410,6 +1410,13 @@ HandleSignalMode GetHandleSignalMode(int signum) {
       return common_flags()->handle_sigbus;
   }
   return kHandleSignalNo;
+}
+
+HandleSignalMode GetHandleSignalMode(int signum) {
+  HandleSignalMode result = GetHandleSignalModeImpl(signum);
+  if (result == kHandleSignalYes && !common_flags()->allow_user_segv_handler)
+    return kHandleSignalExclusive;
+  return result;
 }
 
 #if !SANITIZER_GO

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cc	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cc	Sat Jun 17 00:09:34 2017	(r320041)
@@ -113,7 +113,6 @@ void GetThreadStackTopAndBottom(bool at_initialization
   my_pthread_attr_getstack(&attr, &stackaddr, &stacksize);
   pthread_attr_destroy(&attr);
 
-  CHECK_LE(stacksize, kMaxThreadStackSize);  // Sanity check.
   *stack_top = (uptr)stackaddr + stacksize;
   *stack_bottom = (uptr)stackaddr;
 }

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc	Sat Jun 17 00:09:34 2017	(r320041)
@@ -414,10 +414,7 @@ void ListOfModules::init() {
   memory_mapping.DumpListOfModules(&modules_);
 }
 
-HandleSignalMode GetHandleSignalMode(int signum) {
-  // Handling fatal signals on watchOS and tvOS devices is disallowed.
-  if ((SANITIZER_WATCHOS || SANITIZER_TVOS) && !(SANITIZER_IOSSIM))
-    return kHandleSignalNo;
+static HandleSignalMode GetHandleSignalModeImpl(int signum) {
   switch (signum) {
     case SIGABRT:
       return common_flags()->handle_abort;
@@ -431,6 +428,16 @@ HandleSignalMode GetHandleSignalMode(int signum) {
       return common_flags()->handle_sigbus;
   }
   return kHandleSignalNo;
+}
+
+HandleSignalMode GetHandleSignalMode(int signum) {
+  // Handling fatal signals on watchOS and tvOS devices is disallowed.
+  if ((SANITIZER_WATCHOS || SANITIZER_TVOS) && !(SANITIZER_IOSSIM))
+    return kHandleSignalNo;
+  HandleSignalMode result = GetHandleSignalModeImpl(signum);
+  if (result == kHandleSignalYes && !common_flags()->allow_user_segv_handler)
+    return kHandleSignalExclusive;
+  return result;
 }
 
 MacosVersion cached_macos_version = MACOS_VERSION_UNINITIALIZED;

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc	Sat Jun 17 00:09:34 2017	(r320041)
@@ -22,6 +22,7 @@
 #include "sanitizer_procmaps.h"
 #include "sanitizer_stacktrace.h"
 
+#include <errno.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <sys/mman.h>
@@ -143,6 +144,21 @@ void UnmapOrDie(void *addr, uptr size) {
     CHECK("unable to unmap" && 0);
   }
   DecreaseTotalMmap(size);
+}
+
+void *MmapOrDieOnFatalError(uptr size, const char *mem_type) {
+  size = RoundUpTo(size, GetPageSizeCached());
+  uptr res = internal_mmap(nullptr, size,
+                           PROT_READ | PROT_WRITE,
+                           MAP_PRIVATE | MAP_ANON, -1, 0);
+  int reserrno;
+  if (internal_iserror(res, &reserrno)) {
+    if (reserrno == ENOMEM)
+      return nullptr;
+    ReportMmapFailureAndDie(size, mem_type, "allocate", reserrno);
+  }
+  IncreaseTotalMmap(size);
+  return (void *)res;
 }
 
 // We want to map a chunk of address space aligned to 'alignment'.

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_win.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_win.cc	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_win.cc	Sat Jun 17 00:09:34 2017	(r320041)
@@ -131,6 +131,16 @@ void UnmapOrDie(void *addr, uptr size) {
   }
 }
 
+void *MmapOrDieOnFatalError(uptr size, const char *mem_type) {
+  void *rv = VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
+  if (rv == 0) {
+    error_t last_error = GetLastError();
+    if (last_error != ERROR_NOT_ENOUGH_MEMORY)
+      ReportMmapFailureAndDie(size, mem_type, "allocate", last_error);
+  }
+  return rv;
+}
+
 // We want to map a chunk of address space aligned to 'alignment'.
 void *MmapAlignedOrDie(uptr size, uptr alignment, const char *mem_type) {
   CHECK(IsPowerOfTwo(size));

Modified: projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_report.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_report.cc	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_report.cc	Sat Jun 17 00:09:34 2017	(r320041)
@@ -92,7 +92,8 @@ static const char *ReportTypeString(ReportType typ, up
   if (typ == ReportTypeVptrUseAfterFree)
     return "heap-use-after-free (virtual call vs free)";
   if (typ == ReportTypeExternalRace) {
-    return GetReportHeaderFromTag(tag) ?: "race on external object";
+    const char *str = GetReportHeaderFromTag(tag);
+    return str ? str : "race on external object";
   }
   if (typ == ReportTypeThreadLeak)
     return "thread leak";
@@ -170,8 +171,9 @@ static void PrintMop(const ReportMop *mop, bool first)
            MopDesc(first, mop->write, mop->atomic), mop->size,
            (void *)mop->addr, thread_name(thrbuf, mop->tid));
   } else {
-    const char *object_type =
-        GetObjectTypeFromTag(mop->external_tag) ?: "external object";
+    const char *object_type = GetObjectTypeFromTag(mop->external_tag);
+    if (object_type == nullptr)
+        object_type = "external object";
     Printf("  %s access of %s at %p by %s",
            ExternalMopDesc(first, mop->write), object_type,
            (void *)mop->addr, thread_name(thrbuf, mop->tid));

Modified: projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_sync.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_sync.h	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_sync.h	Sat Jun 17 00:09:34 2017	(r320041)
@@ -83,7 +83,7 @@ struct SyncVar {
   }
 
   bool IsFlagSet(u32 f) const {
-    return atomic_load_relaxed(&flags);
+    return atomic_load_relaxed(&flags) & f;
   }
 
   void SetFlags(u32 f) {

Modified: projects/clang500-import/contrib/compiler-rt/lib/ubsan/ubsan_handlers.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/ubsan/ubsan_handlers.cc	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/ubsan/ubsan_handlers.cc	Sat Jun 17 00:09:34 2017	(r320041)
@@ -566,8 +566,14 @@ static void handlePointerOverflowImpl(PointerOverflowD
 
   ScopedReport R(Opts, Loc, ET);
 
-  Diag(Loc, DL_Error, "pointer index expression with base %0 overflowed to %1")
-    << (void *)Base << (void*)Result;
+  if ((sptr(Base) >= 0) == (sptr(Result) >= 0))
+    Diag(Loc, DL_Error, "unsigned pointer index expression result is %0, "
+                        "preceding its base %1")
+        << (void *)Result << (void *)Base;
+  else
+    Diag(Loc, DL_Error,
+         "pointer index expression with base %0 overflowed to %1")
+        << (void *)Base << (void *)Result;
 }
 
 void __ubsan::__ubsan_handle_pointer_overflow(PointerOverflowData *Data,

Modified: projects/clang500-import/contrib/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cc	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cc	Sat Jun 17 00:09:34 2017	(r320041)
@@ -197,9 +197,9 @@ struct VtablePrefix {
 };
 VtablePrefix *getVtablePrefix(void *Vtable) {
   VtablePrefix *Vptr = reinterpret_cast<VtablePrefix*>(Vtable);
-  if (!IsAccessibleMemoryRange((uptr)Vptr, sizeof(VtablePrefix)))
-    return nullptr;
   VtablePrefix *Prefix = Vptr - 1;
+  if (!IsAccessibleMemoryRange((uptr)Prefix, sizeof(VtablePrefix)))
+    return nullptr;
   if (!Prefix->TypeInfo)
     // This can't possibly be a valid vtable.
     return nullptr;

Modified: projects/clang500-import/contrib/libc++/include/__bsd_locale_fallbacks.h
==============================================================================
--- projects/clang500-import/contrib/libc++/include/__bsd_locale_fallbacks.h	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/libc++/include/__bsd_locale_fallbacks.h	Sat Jun 17 00:09:34 2017	(r320041)
@@ -15,6 +15,7 @@
 #define _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
 
 #include <stdlib.h>
+#include <stdarg.h>
 #include <memory>
 
 _LIBCPP_BEGIN_NAMESPACE_STD

Modified: projects/clang500-import/contrib/libc++/include/__config
==============================================================================
--- projects/clang500-import/contrib/libc++/include/__config	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/libc++/include/__config	Sat Jun 17 00:09:34 2017	(r320041)
@@ -76,6 +76,9 @@
 // its vtable and typeinfo to libc++ rather than having all other libraries
 // using that class define their own copies.
 #define _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION
+
+// Enable optimized version of __do_get_(un)signed which avoids redundant copies.
+#define _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
 #elif _LIBCPP_ABI_VERSION == 1
 #if !defined(_LIBCPP_OBJECT_FORMAT_COFF)
 // Enable compiling copies of now inline methods into the dylib to support
@@ -289,7 +292,7 @@
 # endif
 #endif  // !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
 
-#if __has_attribute(__no_sanitize__)
+#if __has_attribute(__no_sanitize__) && !defined(_LIBCPP_COMPILER_GCC)
 #define _LIBCPP_NO_CFI __attribute__((__no_sanitize__("cfi")))
 #else
 #define _LIBCPP_NO_CFI
@@ -1132,8 +1135,6 @@ _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_
 # define _LIBCPP_HAS_NO_COROUTINES
 #endif
 
-#endif // __cplusplus
-
 // Decide whether to use availability macros.
 #if !defined(_LIBCPP_BUILDING_LIBRARY) &&                                      \
     !defined(_LIBCPP_DISABLE_AVAILABILITY) &&                                  \
@@ -1236,5 +1237,8 @@ _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_
       _Pragma("pop_macro(\"max\")")
 # endif
 #endif // defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO)
+
+
+#endif // __cplusplus
 
 #endif // _LIBCPP_CONFIG

Modified: projects/clang500-import/contrib/libc++/include/__functional_03
==============================================================================
--- projects/clang500-import/contrib/libc++/include/__functional_03	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/libc++/include/__functional_03	Sat Jun 17 00:09:34 2017	(r320041)
@@ -704,7 +704,7 @@ function<_Rp()>::target()
 {
     if (__f_ == 0)
         return (_Tp*)0;
-    return (_Tp*)__f_->target(typeid(_Tp));
+    return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
 }
 
 template<class _Rp>
@@ -980,7 +980,7 @@ function<_Rp(_A0)>::target()
 {
     if (__f_ == 0)
         return (_Tp*)0;
-    return (_Tp*)__f_->target(typeid(_Tp));
+    return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
 }
 
 template<class _Rp, class _A0>
@@ -1256,7 +1256,7 @@ function<_Rp(_A0, _A1)>::target()
 {
     if (__f_ == 0)
         return (_Tp*)0;
-    return (_Tp*)__f_->target(typeid(_Tp));
+    return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
 }
 
 template<class _Rp, class _A0, class _A1>
@@ -1532,7 +1532,7 @@ function<_Rp(_A0, _A1, _A2)>::target()
 {
     if (__f_ == 0)
         return (_Tp*)0;
-    return (_Tp*)__f_->target(typeid(_Tp));
+    return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
 }
 
 template<class _Rp, class _A0, class _A1, class _A2>

Modified: projects/clang500-import/contrib/libc++/include/__functional_base
==============================================================================
--- projects/clang500-import/contrib/libc++/include/__functional_base	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/libc++/include/__functional_base	Sat Jun 17 00:09:34 2017	(r320041)
@@ -548,16 +548,13 @@ template <class _Tp> void cref(const _Tp&&) = delete;
 #endif
 
 #if _LIBCPP_STD_VER > 11
-template <class _Tp1, class _Tp2 = void>
-struct __is_transparent
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::is_transparent* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp1>(0)) == 1;
-};
+template <class _Tp, class, class = void>
+struct __is_transparent : false_type {};
+
+template <class _Tp, class _Up>
+struct __is_transparent<_Tp, _Up,  
+                        typename __void_t<typename _Tp::is_transparent>::type>
+   : true_type {};
 #endif
 
 // allocator_arg_t

Modified: projects/clang500-import/contrib/libc++/include/array
==============================================================================
--- projects/clang500-import/contrib/libc++/include/array	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/libc++/include/array	Sat Jun 17 00:09:34 2017	(r320041)
@@ -296,6 +296,7 @@ class _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size
 template <size_t _Ip, class _Tp, size_t _Size>
 class _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> >
 {
+    static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)");
 public:
     typedef _Tp type;
 };

Modified: projects/clang500-import/contrib/libc++/include/experimental/coroutine
==============================================================================
--- projects/clang500-import/contrib/libc++/include/experimental/coroutine	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/libc++/include/experimental/coroutine	Sat Jun 17 00:09:34 2017	(r320041)
@@ -250,9 +250,11 @@ class _LIBCPP_TEMPLATE_VIS coroutine_handle : public c
 
     _LIBCPP_ALWAYS_INLINE
     static coroutine_handle from_promise(_Promise& __promise) _NOEXCEPT {
+        typedef typename remove_cv<_Promise>::type _RawPromise;
         coroutine_handle __tmp;
-        __tmp.__handle_ = __builtin_coro_promise(_VSTD::addressof(__promise),
-                                                 __alignof(_Promise), true);
+        __tmp.__handle_ = __builtin_coro_promise(
+            _VSTD::addressof(const_cast<_RawPromise&>(__promise)),
+             __alignof(_Promise), true);
         return __tmp;
     }
 };

Modified: projects/clang500-import/contrib/libc++/include/fstream
==============================================================================
--- projects/clang500-import/contrib/libc++/include/fstream	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/libc++/include/fstream	Sat Jun 17 00:09:34 2017	(r320041)
@@ -617,7 +617,7 @@ basic_filebuf<_CharT, _Traits>::underflow()
                                  static_cast<size_t>(__extbufend_ - __extbufnext_));
             codecvt_base::result __r;
             __st_last_ = __st_;
-            size_t __nr = fread((void*)__extbufnext_, 1, __nmemb, __file_);
+            size_t __nr = fread((void*) const_cast<char *>(__extbufnext_), 1, __nmemb, __file_);
             if (__nr != 0)
             {
                 if (!__cv_)
@@ -630,7 +630,8 @@ basic_filebuf<_CharT, _Traits>::underflow()
                                        this->eback() + __ibs_, __inext);
                 if (__r == codecvt_base::noconv)
                 {
-                    this->setg((char_type*)__extbuf_, (char_type*)__extbuf_, (char_type*)__extbufend_);
+                    this->setg((char_type*)__extbuf_, (char_type*)__extbuf_, 
+                                          (char_type*)const_cast<char *>(__extbufend_));
                     __c = traits_type::to_int_type(*this->gptr());
                 }
                 else if (__inext != this->eback() + __unget_sz)
@@ -722,7 +723,7 @@ basic_filebuf<_CharT, _Traits>::overflow(int_type __c)
                         return traits_type::eof();
                     if (__r == codecvt_base::partial)
                     {
-                        this->setp((char_type*)__e, this->pptr());
+                        this->setp(const_cast<char_type*>(__e), this->pptr());
                         this->pbump(this->epptr() - this->pbase());
                     }
                 }

Modified: projects/clang500-import/contrib/libc++/include/functional
==============================================================================
--- projects/clang500-import/contrib/libc++/include/functional	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/libc++/include/functional	Sat Jun 17 00:09:34 2017	(r320041)
@@ -1941,8 +1941,8 @@ _Tp*
 function<_Rp(_ArgTypes...)>::target() _NOEXCEPT
 {
     if (__f_ == 0)
-        return (_Tp*)0;
-    return (_Tp*)__f_->target(typeid(_Tp));
+        return nullptr;
+    return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
 }
 
 template<class _Rp, class ..._ArgTypes>
@@ -1951,7 +1951,7 @@ const _Tp*
 function<_Rp(_ArgTypes...)>::target() const _NOEXCEPT
 {
     if (__f_ == 0)
-        return (const _Tp*)0;
+        return nullptr;
     return (const _Tp*)__f_->target(typeid(_Tp));
 }
 

Modified: projects/clang500-import/contrib/libc++/include/locale
==============================================================================
--- projects/clang500-import/contrib/libc++/include/locale	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/libc++/include/locale	Sat Jun 17 00:09:34 2017	(r320041)
@@ -372,19 +372,57 @@ template <class _CharT>
 struct __num_get
     : protected __num_get_base
 {
-    static string __stage2_int_prep(ios_base& __iob, _CharT* __atoms, _CharT& __thousands_sep);
     static string __stage2_float_prep(ios_base& __iob, _CharT* __atoms, _CharT& __decimal_point,
                                       _CharT& __thousands_sep);
-    static int __stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end,
-                  unsigned& __dc, _CharT __thousands_sep, const string& __grouping,
-                  unsigned* __g, unsigned*& __g_end, _CharT* __atoms);
+
     static int __stage2_float_loop(_CharT __ct, bool& __in_units, char& __exp,
                                    char* __a, char*& __a_end,
                                    _CharT __decimal_point, _CharT __thousands_sep,
                                    const string& __grouping, unsigned* __g,
                                    unsigned*& __g_end, unsigned& __dc, _CharT* __atoms);
+#ifndef _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
+    static string __stage2_int_prep(ios_base& __iob, _CharT* __atoms, _CharT& __thousands_sep);
+    static int __stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end,
+                  unsigned& __dc, _CharT __thousands_sep, const string& __grouping,
+                  unsigned* __g, unsigned*& __g_end, _CharT* __atoms);
+
+#else
+    static string __stage2_int_prep(ios_base& __iob, _CharT& __thousands_sep)
+    {
+        locale __loc = __iob.getloc();
+        const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
+        __thousands_sep = __np.thousands_sep();
+        return __np.grouping();
+    }
+
+    const _CharT* __do_widen(ios_base& __iob, _CharT* __atoms) const
+    {
+      return __do_widen_p(__iob, __atoms);
+    }
+
+
+    static int __stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end,
+                  unsigned& __dc, _CharT __thousands_sep, const string& __grouping,
+                  unsigned* __g, unsigned*& __g_end, const _CharT* __atoms);
+private:
+    template<typename T>
+    const T* __do_widen_p(ios_base& __iob, T* __atoms) const
+    {
+      locale __loc = __iob.getloc();
+      use_facet<ctype<T> >(__loc).widen(__src, __src + 26, __atoms);
+      return __atoms;
+    }
+
+    const char* __do_widen_p(ios_base& __iob, char* __atoms) const
+    {
+      (void)__iob;
+      (void)__atoms;
+      return __src;
+    }
+#endif
 };
 
+#ifndef _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
 template <class _CharT>
 string
 __num_get<_CharT>::__stage2_int_prep(ios_base& __iob, _CharT* __atoms, _CharT& __thousands_sep)
@@ -395,6 +433,7 @@ __num_get<_CharT>::__stage2_int_prep(ios_base& __iob, 
     __thousands_sep = __np.thousands_sep();
     return __np.grouping();
 }
+#endif
 
 template <class _CharT>
 string
@@ -411,9 +450,16 @@ __num_get<_CharT>::__stage2_float_prep(ios_base& __iob
 
 template <class _CharT>
 int
+#ifndef _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
 __num_get<_CharT>::__stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end,
                   unsigned& __dc, _CharT __thousands_sep, const string& __grouping,
                   unsigned* __g, unsigned*& __g_end, _CharT* __atoms)
+#else
+__num_get<_CharT>::__stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end,
+                  unsigned& __dc, _CharT __thousands_sep, const string& __grouping,
+                  unsigned* __g, unsigned*& __g_end, const _CharT* __atoms)
+
+#endif
 {
     if (__a_end == __a && (__ct == __atoms[24] || __ct == __atoms[25]))
     {
@@ -849,9 +895,16 @@ num_get<_CharT, _InputIterator>::__do_get_signed(iter_
     // Stage 1
     int __base = this->__get_base(__iob);
     // Stage 2
-    char_type __atoms[26];
     char_type __thousands_sep;
+    const int __atoms_size = 26;
+#ifdef _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
+    char_type __atoms1[__atoms_size];
+    const char_type *__atoms = this->__do_widen(__iob, __atoms1);
+    string __grouping = this->__stage2_int_prep(__iob, __thousands_sep);
+#else
+    char_type __atoms[__atoms_size];
     string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep);
+#endif
     string __buf;
     __buf.resize(__buf.capacity());
     char* __a = &__buf[0];
@@ -899,9 +952,16 @@ num_get<_CharT, _InputIterator>::__do_get_unsigned(ite
     // Stage 1
     int __base = this->__get_base(__iob);
     // Stage 2
-    char_type __atoms[26];
     char_type __thousands_sep;
+    const int __atoms_size = 26;
+#ifdef _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
+    char_type __atoms1[__atoms_size];
+    const char_type *__atoms = this->__do_widen(__iob, __atoms1);
+    string __grouping = this->__stage2_int_prep(__iob, __thousands_sep);
+#else
+    char_type __atoms[__atoms_size];
     string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep);
+#endif
     string __buf;
     __buf.resize(__buf.capacity());
     char* __a = &__buf[0];
@@ -3960,7 +4020,8 @@ wbuffer_convert<_Codecvt, _Elem, _Tr>::underflow()
                                        this->egptr(), __inext);
                 if (__r == codecvt_base::noconv)
                 {
-                    this->setg((char_type*)__extbuf_, (char_type*)__extbuf_, (char_type*)__extbufend_);
+                    this->setg((char_type*)__extbuf_, (char_type*)__extbuf_, 
+                               (char_type*) const_cast<char *>(__extbufend_));
                     __c = *this->gptr();
                 }
                 else if (__inext != this->eback() + __unget_sz)
@@ -4048,7 +4109,7 @@ wbuffer_convert<_Codecvt, _Elem, _Tr>::overflow(int_ty
                         return traits_type::eof();
                     if (__r == codecvt_base::partial)
                     {
-                        this->setp((char_type*)__e, this->pptr());
+                        this->setp(const_cast<char_type *>(__e), this->pptr());
                         this->pbump(this->epptr() - this->pbase());
                     }
                 }

Modified: projects/clang500-import/contrib/libc++/include/memory
==============================================================================
--- projects/clang500-import/contrib/libc++/include/memory	Fri Jun 16 23:43:05 2017	(r320040)
+++ projects/clang500-import/contrib/libc++/include/memory	Sat Jun 17 00:09:34 2017	(r320041)
@@ -720,16 +720,12 @@ class _LIBCPP_TEMPLATE_VIS allocator<const void> (publ
 
 // pointer_traits
 
+template <class _Tp, class = void>
+struct __has_element_type : false_type {};
+
 template <class _Tp>
-struct __has_element_type
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::element_type* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
+struct __has_element_type<_Tp, 
+              typename __void_t<typename _Tp::element_type>::type> : true_type {};
 
 template <class _Ptr, bool = __has_element_type<_Ptr>::value>
 struct __pointer_traits_element_type;
@@ -808,16 +804,12 @@ struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1
 
 #endif  // _LIBCPP_HAS_NO_VARIADICS
 
+template <class _Tp, class = void>
+struct __has_difference_type : false_type {};
+
 template <class _Tp>
-struct __has_difference_type
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::difference_type* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
+struct __has_difference_type<_Tp, 
+            typename __void_t<typename _Tp::difference_type>::type> : true_type {};
 
 template <class _Ptr, bool = __has_difference_type<_Ptr>::value>
 struct __pointer_traits_difference_type
@@ -998,17 +990,12 @@ struct __rebind_pointer {
 
 // allocator_traits
 
-struct __has_pointer_type_imp
-{
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::pointer* = 0);
-};
+template <class _Tp, class = void>
+struct __has_pointer_type : false_type {};
 
 template <class _Tp>
-struct __has_pointer_type
-    : public integral_constant<bool, sizeof(__has_pointer_type_imp::__test<_Tp>(0)) == 1>
-{
-};
+struct __has_pointer_type<_Tp, 
+          typename __void_t<typename _Tp::pointer>::type> : true_type {};
 
 namespace __pointer_type_imp
 {
@@ -1033,16 +1020,12 @@ struct __pointer_type
     typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type;
 };
 
+template <class _Tp, class = void>
+struct __has_const_pointer : false_type {};
+
 template <class _Tp>
-struct __has_const_pointer
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::const_pointer* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
+struct __has_const_pointer<_Tp, 
+            typename __void_t<typename _Tp::const_pointer>::type> : true_type {};
 
 template <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value>
 struct __const_pointer
@@ -1060,16 +1043,12 @@ struct __const_pointer<_Tp, _Ptr, _Alloc, false>
 #endif
 };
 
+template <class _Tp, class = void>
+struct __has_void_pointer : false_type {};
+
 template <class _Tp>
-struct __has_void_pointer
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::void_pointer* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
+struct __has_void_pointer<_Tp, 
+               typename __void_t<typename _Tp::void_pointer>::type> : true_type {};
 
 template <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value>
 struct __void_pointer
@@ -1087,16 +1066,12 @@ struct __void_pointer<_Ptr, _Alloc, false>
 #endif
 };
 
+template <class _Tp, class = void>
+struct __has_const_void_pointer : false_type {};
+
 template <class _Tp>
-struct __has_const_void_pointer
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::const_void_pointer* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
+struct __has_const_void_pointer<_Tp, 
+            typename __void_t<typename _Tp::const_void_pointer>::type> : true_type {};
 
 template <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value>
 struct __const_void_pointer
@@ -1130,16 +1105,12 @@ __to_raw_pointer(_Pointer __p) _NOEXCEPT
     return _VSTD::__to_raw_pointer(__p.operator->());
 }
 
+template <class _Tp, class = void>
+struct __has_size_type : false_type {};
+
 template <class _Tp>
-struct __has_size_type
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::size_type* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
+struct __has_size_type<_Tp,
+               typename __void_t<typename _Tp::size_type>::type> : true_type {};
 
 template <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value>
 struct __size_type
@@ -1153,16 +1124,13 @@ struct __size_type<_Alloc, _DiffType, true>
     typedef typename _Alloc::size_type type;
 };
 
+template <class _Tp, class = void>
+struct __has_propagate_on_container_copy_assignment : false_type {};
+
 template <class _Tp>
-struct __has_propagate_on_container_copy_assignment
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::propagate_on_container_copy_assignment* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
+struct __has_propagate_on_container_copy_assignment<_Tp,
+    typename __void_t<typename _Tp::propagate_on_container_copy_assignment>::type>
+        : true_type {};
 
 template <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value>
 struct __propagate_on_container_copy_assignment
@@ -1176,16 +1144,13 @@ struct __propagate_on_container_copy_assignment<_Alloc
     typedef typename _Alloc::propagate_on_container_copy_assignment type;
 };
 
+template <class _Tp, class = void>
+struct __has_propagate_on_container_move_assignment : false_type {};
+
 template <class _Tp>
-struct __has_propagate_on_container_move_assignment
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::propagate_on_container_move_assignment* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
+struct __has_propagate_on_container_move_assignment<_Tp, 
+           typename __void_t<typename _Tp::propagate_on_container_move_assignment>::type>
+               : true_type {};
 
 template <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value>
 struct __propagate_on_container_move_assignment
@@ -1199,16 +1164,13 @@ struct __propagate_on_container_move_assignment<_Alloc
     typedef typename _Alloc::propagate_on_container_move_assignment type;
 };
 
+template <class _Tp, class = void>
+struct __has_propagate_on_container_swap : false_type {};
+
 template <class _Tp>
-struct __has_propagate_on_container_swap
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::propagate_on_container_swap* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
+struct __has_propagate_on_container_swap<_Tp, 
+           typename __void_t<typename _Tp::propagate_on_container_swap>::type>
+               : true_type {};
 
 template <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value>
 struct __propagate_on_container_swap
@@ -1222,16 +1184,13 @@ struct __propagate_on_container_swap<_Alloc, true>
     typedef typename _Alloc::propagate_on_container_swap type;
 };
 
+template <class _Tp, class = void>
+struct __has_is_always_equal : false_type {};
+
 template <class _Tp>
-struct __has_is_always_equal
-{
-private:
-    struct __two {char __lx; char __lxx;};
-    template <class _Up> static __two __test(...);
-    template <class _Up> static char __test(typename _Up::is_always_equal* = 0);
-public:
-    static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
+struct __has_is_always_equal<_Tp, 
+           typename __void_t<typename _Tp::is_always_equal>::type>
+               : true_type {};
 
 template <class _Alloc, bool = __has_is_always_equal<_Alloc>::value>
 struct __is_always_equal
@@ -1884,7 +1843,7 @@ class _LIBCPP_TEMPLATE_VIS allocator<const _Tp> (publi
         return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp)));
     }
     _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT
-        {_VSTD::__libcpp_deallocate((void*)__p);}
+        {_VSTD::__libcpp_deallocate((void*) const_cast<_Tp *>(__p));}
     _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT
         {return size_type(~0) / sizeof(_Tp);}
 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
@@ -1900,7 +1859,7 @@ class _LIBCPP_TEMPLATE_VIS allocator<const _Tp> (publi
         void
         construct(pointer __p)
         {
-            ::new((void*)__p) _Tp();
+            ::new((void*) const_cast<_Tp *>(__p)) _Tp();
         }
 # if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
 
@@ -1909,14 +1868,14 @@ class _LIBCPP_TEMPLATE_VIS allocator<const _Tp> (publi
         void
         construct(pointer __p, _A0& __a0)
         {
-            ::new((void*)__p) _Tp(__a0);
+            ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0);
         }
     template <class _A0>
         _LIBCPP_INLINE_VISIBILITY
         void
         construct(pointer __p, const _A0& __a0)
         {
-            ::new((void*)__p) _Tp(__a0);
+            ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0);
         }
 # endif  // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
     template <class _A0, class _A1>
@@ -1924,28 +1883,28 @@ class _LIBCPP_TEMPLATE_VIS allocator<const _Tp> (publi
         void
         construct(pointer __p, _A0& __a0, _A1& __a1)
         {
-            ::new((void*)__p) _Tp(__a0, __a1);
+            ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1);
         }
     template <class _A0, class _A1>
         _LIBCPP_INLINE_VISIBILITY
         void
         construct(pointer __p, const _A0& __a0, _A1& __a1)
         {
-            ::new((void*)__p) _Tp(__a0, __a1);
+            ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1);
         }
     template <class _A0, class _A1>
         _LIBCPP_INLINE_VISIBILITY
         void
         construct(pointer __p, _A0& __a0, const _A1& __a1)
         {
-            ::new((void*)__p) _Tp(__a0, __a1);
+            ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1);
         }
     template <class _A0, class _A1>
         _LIBCPP_INLINE_VISIBILITY
         void
         construct(pointer __p, const _A0& __a0, const _A1& __a1)
         {
-            ::new((void*)__p) _Tp(__a0, __a1);
+            ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1);
         }
 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
     _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();}
@@ -3890,7 +3849,9 @@ class _LIBCPP_TEMPLATE_VIS shared_ptr (public)
     template <class _Dp>
         _LIBCPP_INLINE_VISIBILITY
         _Dp* __get_deleter() const _NOEXCEPT
-            {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);}
+            {return static_cast<_Dp*>(__cntrl_
+                    ? const_cast<void *>(__cntrl_->__get_deleter(typeid(_Dp))) 

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@freebsd.org  Sat Jun 17 00:14:57 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id ABC44D8C331
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Sat, 17 Jun 2017 00:14:57 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 316E47556B;
 Sat, 17 Jun 2017 00:14:57 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5H0EuS6041375;
 Sat, 17 Jun 2017 00:14:56 GMT (envelope-from dim@FreeBSD.org)
Received: (from dim@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5H0Es85041357;
 Sat, 17 Jun 2017 00:14:54 GMT (envelope-from dim@FreeBSD.org)
Message-Id: <201706170014.v5H0Es85041357@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org
 using -f
From: Dimitry Andric <dim@FreeBSD.org>
Date: Sat, 17 Jun 2017 00:14:54 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320042 - in projects/clang500-import: . bin/df bin/ln
 bin/ln/tests bin/sh cddl/contrib/opensolaris/lib/libzfs/common
 cddl/contrib/opensolaris/lib/libzfs_core/common contrib/ipfilter/ma...
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 17 Jun 2017 00:14:57 -0000

Author: dim
Date: Sat Jun 17 00:14:54 2017
New Revision: 320042
URL: https://svnweb.freebsd.org/changeset/base/320042

Log:
  Merge ^/head r319801 through r320041.

Added:
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/arena_externs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/arena_externs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/arena_inlines_a.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/arena_inlines_a.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/arena_inlines_b.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/arena_inlines_b.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/arena_structs_a.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/arena_structs_a.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/arena_structs_b.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/arena_structs_b.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/arena_types.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/arena_types.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/atomic_c11.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/atomic_c11.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/atomic_gcc_atomic.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/atomic_gcc_atomic.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/atomic_gcc_sync.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/atomic_gcc_sync.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/background_thread_externs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/background_thread_externs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/background_thread_inlines.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/background_thread_inlines.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/background_thread_structs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/background_thread_structs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/base_externs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/base_externs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/base_inlines.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/base_inlines.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/base_structs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/base_structs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/base_types.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/base_types.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/bit_util.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/bit_util.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/extent_dss.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/extent_dss.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/extent_externs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/extent_externs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/extent_inlines.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/extent_inlines.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/extent_mmap.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/extent_mmap.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/extent_structs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/extent_structs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/extent_types.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/extent_types.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/hooks.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/hooks.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_externs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_externs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_includes.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_includes.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_b.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_b.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_preamble.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/jemalloc_preamble.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/large_externs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/large_externs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/malloc_io.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/malloc_io.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/mutex_pool.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/mutex_pool.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/mutex_prof.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/mutex_prof.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/prof_externs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/prof_externs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/prof_inlines_a.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/prof_inlines_a.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/prof_inlines_b.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/prof_inlines_b.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/prof_structs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/prof_structs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/prof_types.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/prof_types.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/rtree_tsd.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/rtree_tsd.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/stats_tsd.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/stats_tsd.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/sz.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/sz.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/tcache_externs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/tcache_externs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/tcache_inlines.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/tcache_inlines.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/tcache_structs.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/tcache_structs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/tcache_types.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/tcache_types.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/tsd_generic.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/tsd_generic.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/tsd_malloc_thread_cleanup.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/tsd_malloc_thread_cleanup.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/tsd_tls.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/tsd_tls.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/tsd_types.h
     - copied unchanged from r320041, head/contrib/jemalloc/include/jemalloc/internal/tsd_types.h
  projects/clang500-import/contrib/jemalloc/src/background_thread.c
     - copied unchanged from r320041, head/contrib/jemalloc/src/background_thread.c
  projects/clang500-import/contrib/jemalloc/src/extent_dss.c
     - copied unchanged from r320041, head/contrib/jemalloc/src/extent_dss.c
  projects/clang500-import/contrib/jemalloc/src/extent_mmap.c
     - copied unchanged from r320041, head/contrib/jemalloc/src/extent_mmap.c
  projects/clang500-import/contrib/jemalloc/src/hooks.c
     - copied unchanged from r320041, head/contrib/jemalloc/src/hooks.c
  projects/clang500-import/contrib/jemalloc/src/large.c
     - copied unchanged from r320041, head/contrib/jemalloc/src/large.c
  projects/clang500-import/contrib/jemalloc/src/malloc_io.c
     - copied unchanged from r320041, head/contrib/jemalloc/src/malloc_io.c
  projects/clang500-import/contrib/jemalloc/src/mutex_pool.c
     - copied unchanged from r320041, head/contrib/jemalloc/src/mutex_pool.c
  projects/clang500-import/contrib/jemalloc/src/sz.c
     - copied unchanged from r320041, head/contrib/jemalloc/src/sz.c
  projects/clang500-import/share/man/man4/dtrace_lockstat.4
     - copied unchanged from r320041, head/share/man/man4/dtrace_lockstat.4
  projects/clang500-import/sys/boot/i386/libi386/relocater_tramp.S
     - copied unchanged from r320041, head/sys/boot/i386/libi386/relocater_tramp.S
  projects/clang500-import/sys/boot/i386/loader/chain.c
     - copied unchanged from r320041, head/sys/boot/i386/loader/chain.c
  projects/clang500-import/sys/dev/mii/mii_fdt.c
     - copied unchanged from r320041, head/sys/dev/mii/mii_fdt.c
  projects/clang500-import/sys/dev/mii/mii_fdt.h
     - copied unchanged from r320041, head/sys/dev/mii/mii_fdt.h
  projects/clang500-import/sys/dev/mii/vscphy.c
     - copied unchanged from r320041, head/sys/dev/mii/vscphy.c
  projects/clang500-import/sys/dev/neta/
     - copied from r320041, head/sys/dev/neta/
  projects/clang500-import/sys/mips/conf/std.AR_MIPS_BASE
     - copied unchanged from r320041, head/sys/mips/conf/std.AR_MIPS_BASE
  projects/clang500-import/sys/modules/ffec/
     - copied from r320041, head/sys/modules/ffec/
  projects/clang500-import/usr.bin/du/tests/
     - copied from r320041, head/usr.bin/du/tests/
  projects/clang500-import/usr.bin/stat/tests/
     - copied from r320041, head/usr.bin/stat/tests/
  projects/clang500-import/usr.bin/xohtml/
     - copied from r320041, head/usr.bin/xohtml/
  projects/clang500-import/usr.bin/xolint/
     - copied from r320041, head/usr.bin/xolint/
  projects/clang500-import/usr.bin/xopo/
     - copied from r320041, head/usr.bin/xopo/
  projects/clang500-import/usr.sbin/chown/tests/chown_test.sh
     - copied unchanged from r320041, head/usr.sbin/chown/tests/chown_test.sh
Deleted:
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/arena.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/base.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/chunk.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/chunk_dss.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/chunk_mmap.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/extent.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/huge.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/mb.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/prof.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/quarantine.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/tcache.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/valgrind.h
  projects/clang500-import/contrib/jemalloc/src/atomic.c
  projects/clang500-import/contrib/jemalloc/src/chunk.c
  projects/clang500-import/contrib/jemalloc/src/chunk_dss.c
  projects/clang500-import/contrib/jemalloc/src/chunk_mmap.c
  projects/clang500-import/contrib/jemalloc/src/huge.c
  projects/clang500-import/contrib/jemalloc/src/mb.c
  projects/clang500-import/contrib/jemalloc/src/quarantine.c
  projects/clang500-import/contrib/jemalloc/src/util.c
  projects/clang500-import/usr.sbin/chown/tests/chown-f_test.sh
Modified:
  projects/clang500-import/Makefile
  projects/clang500-import/Makefile.inc1
  projects/clang500-import/ObsoleteFiles.inc
  projects/clang500-import/bin/df/df.c
  projects/clang500-import/bin/ln/ln.1
  projects/clang500-import/bin/ln/tests/ln_test.sh
  projects/clang500-import/bin/sh/trap.c
  projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
  projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c
  projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h
  projects/clang500-import/contrib/ipfilter/man/ipf.5
  projects/clang500-import/contrib/ipfilter/tools/ippool.c
  projects/clang500-import/contrib/jemalloc/COPYING
  projects/clang500-import/contrib/jemalloc/ChangeLog
  projects/clang500-import/contrib/jemalloc/FREEBSD-Xlist
  projects/clang500-import/contrib/jemalloc/FREEBSD-diffs
  projects/clang500-import/contrib/jemalloc/FREEBSD-upgrade
  projects/clang500-import/contrib/jemalloc/VERSION
  projects/clang500-import/contrib/jemalloc/doc/jemalloc.3
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/assert.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/atomic.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/bitmap.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/ckh.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/ctl.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/hash.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_defs.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/mutex.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/nstime.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/pages.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/ph.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/private_namespace.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/prng.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/public_namespace.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/ql.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/qr.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/rb.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/rtree.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/size_classes.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/smoothstep.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/spin.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/stats.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/ticker.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/tsd.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/util.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/internal/witness.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/jemalloc.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/jemalloc_FreeBSD.h
  projects/clang500-import/contrib/jemalloc/include/jemalloc/jemalloc_typedefs.h
  projects/clang500-import/contrib/jemalloc/src/arena.c
  projects/clang500-import/contrib/jemalloc/src/base.c
  projects/clang500-import/contrib/jemalloc/src/bitmap.c
  projects/clang500-import/contrib/jemalloc/src/ckh.c
  projects/clang500-import/contrib/jemalloc/src/ctl.c
  projects/clang500-import/contrib/jemalloc/src/extent.c
  projects/clang500-import/contrib/jemalloc/src/hash.c
  projects/clang500-import/contrib/jemalloc/src/jemalloc.c
  projects/clang500-import/contrib/jemalloc/src/mutex.c
  projects/clang500-import/contrib/jemalloc/src/nstime.c
  projects/clang500-import/contrib/jemalloc/src/pages.c
  projects/clang500-import/contrib/jemalloc/src/prng.c
  projects/clang500-import/contrib/jemalloc/src/prof.c
  projects/clang500-import/contrib/jemalloc/src/rtree.c
  projects/clang500-import/contrib/jemalloc/src/spin.c
  projects/clang500-import/contrib/jemalloc/src/stats.c
  projects/clang500-import/contrib/jemalloc/src/tcache.c
  projects/clang500-import/contrib/jemalloc/src/ticker.c
  projects/clang500-import/contrib/jemalloc/src/tsd.c
  projects/clang500-import/contrib/jemalloc/src/witness.c
  projects/clang500-import/contrib/libxo/doc/libxo-manual.html
  projects/clang500-import/contrib/libxo/libxo/libxo.c
  projects/clang500-import/contrib/libxo/tests/core/saved/test_01.E.out
  projects/clang500-import/contrib/libxo/tests/core/saved/test_01.H.out
  projects/clang500-import/contrib/libxo/tests/core/saved/test_01.HIPx.out
  projects/clang500-import/contrib/libxo/tests/core/saved/test_01.HP.out
  projects/clang500-import/contrib/libxo/tests/core/saved/test_01.J.out
  projects/clang500-import/contrib/libxo/tests/core/saved/test_01.JP.out
  projects/clang500-import/contrib/libxo/tests/core/saved/test_01.T.out
  projects/clang500-import/contrib/libxo/tests/core/saved/test_01.X.out
  projects/clang500-import/contrib/libxo/tests/core/saved/test_01.XP.out
  projects/clang500-import/contrib/libxo/tests/core/saved/test_02.J.out
  projects/clang500-import/contrib/libxo/tests/core/saved/test_02.JP.out
  projects/clang500-import/contrib/libxo/tests/core/test_01.c
  projects/clang500-import/contrib/libxo/xohtml/xohtml.css
  projects/clang500-import/contrib/libxo/xohtml/xohtml.sh.in
  projects/clang500-import/contrib/llvm/tools/lld/ELF/InputSection.cpp
  projects/clang500-import/contrib/tcp_wrappers/fakelog.c
  projects/clang500-import/contrib/tcp_wrappers/inetcf.c
  projects/clang500-import/contrib/tcp_wrappers/scaffold.c
  projects/clang500-import/contrib/tcp_wrappers/tcpdchk.c
  projects/clang500-import/contrib/tcp_wrappers/tcpdmatch.c
  projects/clang500-import/etc/mtree/BSD.tests.dist
  projects/clang500-import/etc/rc.d/sendmail
  projects/clang500-import/etc/rc.initdiskless
  projects/clang500-import/etc/rc.subr
  projects/clang500-import/include/malloc_np.h
  projects/clang500-import/lib/clang/libclang/Makefile
  projects/clang500-import/lib/clang/liblldb/Makefile
  projects/clang500-import/lib/libc/gen/getbsize.3
  projects/clang500-import/lib/libc/stdlib/jemalloc/Makefile.inc
  projects/clang500-import/lib/libc/sys/kqueue.2
  projects/clang500-import/lib/libc/sys/ptrace.2
  projects/clang500-import/lib/libc/sys/socket.2
  projects/clang500-import/lib/libc/sys/stat.2
  projects/clang500-import/lib/libcam/tests/libcam_test.c
  projects/clang500-import/sbin/ipfw/dummynet.c
  projects/clang500-import/share/man/man4/Makefile
  projects/clang500-import/share/man/man9/copy.9
  projects/clang500-import/share/misc/committers-src.dot
  projects/clang500-import/share/mk/local.sys.mk
  projects/clang500-import/share/mk/src.libnames.mk
  projects/clang500-import/share/mk/sys.mk
  projects/clang500-import/share/zoneinfo/Makefile
  projects/clang500-import/sys/amd64/amd64/trap.c
  projects/clang500-import/sys/amd64/cloudabi32/cloudabi32_sysvec.c
  projects/clang500-import/sys/amd64/cloudabi64/cloudabi64_sysvec.c
  projects/clang500-import/sys/amd64/ia32/ia32_syscall.c
  projects/clang500-import/sys/amd64/include/proc.h
  projects/clang500-import/sys/amd64/linux/linux_sysvec.c
  projects/clang500-import/sys/amd64/linux32/linux32_sysvec.c
  projects/clang500-import/sys/arm/arm/cpuinfo.c
  projects/clang500-import/sys/arm/arm/identcpu-v6.c
  projects/clang500-import/sys/arm/arm/mp_machdep.c
  projects/clang500-import/sys/arm/arm/pmap-v6.c
  projects/clang500-import/sys/arm/arm/syscall.c
  projects/clang500-import/sys/arm/cloudabi32/cloudabi32_sysvec.c
  projects/clang500-import/sys/arm/conf/ARMADA38X
  projects/clang500-import/sys/arm/include/cpuinfo.h
  projects/clang500-import/sys/arm/include/pmap-v6.h
  projects/clang500-import/sys/arm/mv/armada38x/armada38x.c
  projects/clang500-import/sys/arm/mv/armadaxp/armadaxp.c
  projects/clang500-import/sys/arm/mv/discovery/discovery.c
  projects/clang500-import/sys/arm/mv/files.mv
  projects/clang500-import/sys/arm/mv/kirkwood/kirkwood.c
  projects/clang500-import/sys/arm/mv/mpic.c
  projects/clang500-import/sys/arm/mv/mv_common.c
  projects/clang500-import/sys/arm/mv/mvreg.h
  projects/clang500-import/sys/arm/mv/mvvar.h
  projects/clang500-import/sys/arm/mv/mvwin.h
  projects/clang500-import/sys/arm/mv/orion/orion.c
  projects/clang500-import/sys/arm64/arm64/trap.c
  projects/clang500-import/sys/arm64/cloudabi64/cloudabi64_sysvec.c
  projects/clang500-import/sys/arm64/include/proc.h
  projects/clang500-import/sys/boot/efi/loader/main.c
  projects/clang500-import/sys/boot/fdt/dts/arm/armada-388-clearfog.dts
  projects/clang500-import/sys/boot/fdt/dts/arm/armada-38x.dtsi
  projects/clang500-import/sys/boot/forth/menu.rc
  projects/clang500-import/sys/boot/i386/libi386/Makefile
  projects/clang500-import/sys/boot/i386/libi386/libi386.h
  projects/clang500-import/sys/boot/i386/loader/Makefile
  projects/clang500-import/sys/boot/i386/loader/help.i386
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_deadlist.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_userhold.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  projects/clang500-import/sys/compat/ia32/ia32_util.h
  projects/clang500-import/sys/compat/linux/linux_file.c
  projects/clang500-import/sys/conf/files
  projects/clang500-import/sys/conf/options
  projects/clang500-import/sys/dev/bnxt/bnxt.h
  projects/clang500-import/sys/dev/bnxt/bnxt_hwrm.c
  projects/clang500-import/sys/dev/bnxt/bnxt_txrx.c
  projects/clang500-import/sys/dev/bnxt/if_bnxt.c
  projects/clang500-import/sys/dev/cxgbe/adapter.h
  projects/clang500-import/sys/dev/cxgbe/common/t4_hw.c
  projects/clang500-import/sys/dev/cxgbe/t4_netmap.c
  projects/clang500-import/sys/dev/cxgbe/t4_sge.c
  projects/clang500-import/sys/dev/etherswitch/e6000sw/e6000sw.c
  projects/clang500-import/sys/dev/ffec/if_ffec.c
  projects/clang500-import/sys/dev/hwpmc/hwpmc_armv7.c
  projects/clang500-import/sys/dev/hwpmc/hwpmc_mod.c
  projects/clang500-import/sys/dev/hwpmc/pmc_events.h
  projects/clang500-import/sys/dev/md/md.c
  projects/clang500-import/sys/dev/mii/miidevs
  projects/clang500-import/sys/dev/mii/miivar.h
  projects/clang500-import/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c
  projects/clang500-import/sys/dev/netmap/if_ixl_netmap.h
  projects/clang500-import/sys/dev/netmap/netmap.c
  projects/clang500-import/sys/dev/netmap/netmap_freebsd.c
  projects/clang500-import/sys/dev/netmap/netmap_generic.c
  projects/clang500-import/sys/dev/netmap/netmap_kern.h
  projects/clang500-import/sys/dev/netmap/netmap_mbq.h
  projects/clang500-import/sys/dev/netmap/netmap_mem2.c
  projects/clang500-import/sys/dev/netmap/netmap_mem2.h
  projects/clang500-import/sys/dev/netmap/netmap_monitor.c
  projects/clang500-import/sys/dev/netmap/netmap_pipe.c
  projects/clang500-import/sys/dev/netmap/netmap_pt.c
  projects/clang500-import/sys/dev/netmap/netmap_vale.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/bcm_osal.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/common_hsi.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_chain.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_cxt.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_cxt.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_dbg_fw_funcs.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_dbg_fw_funcs.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_dbg_values.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_dcbx.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_dcbx.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_dev.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_dev_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_fcoe_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_gtt_reg_addr.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_hsi_common.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_hsi_debug_tools.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_hsi_eth.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_hsi_fcoe.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_hsi_iscsi.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_hsi_iwarp.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_hsi_rdma.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_hsi_roce.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_hw.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_hw.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_init_fw_funcs.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_init_fw_funcs.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_init_ops.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_init_ops.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_init_values.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_int.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_int.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_int_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_iov_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_iro.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_iro_values.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_iscsi.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_iscsi_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_l2.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_l2.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_l2_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_ll2.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_ll2_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_mcp.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_mcp.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_mcp_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_ooo.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_proto_if.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_roce.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_roce_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_rt_defs.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_sp_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_sp_commands.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_sp_commands.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_spq.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_sriov.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_vf.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_vf_api.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/ecore_vfpf_if.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/eth_common.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/fcoe_common.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/iscsi_common.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/mcp_private.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/mcp_public.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/mfw_hsi.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/nvm_cfg.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/nvm_map.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/pcics_reg_driver.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/qlnx_def.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/qlnx_os.c
  projects/clang500-import/sys/dev/qlnx/qlnxe/qlnx_ver.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/rdma_common.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/reg_addr.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/spad_layout.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/storage_common.h
  projects/clang500-import/sys/dev/qlnx/qlnxe/tcp_common.h
  projects/clang500-import/sys/dev/vt/hw/vga/vt_vga.c
  projects/clang500-import/sys/fs/ext2fs/ext2_acl.c
  projects/clang500-import/sys/fs/ext2fs/ext2_extattr.c
  projects/clang500-import/sys/fs/ext2fs/ext2_vnops.c
  projects/clang500-import/sys/fs/msdosfs/denode.h
  projects/clang500-import/sys/fs/msdosfs/direntry.h
  projects/clang500-import/sys/fs/msdosfs/fat.h
  projects/clang500-import/sys/fs/nfs/nfsproto.h
  projects/clang500-import/sys/i386/cloudabi32/cloudabi32_sysvec.c
  projects/clang500-import/sys/i386/i386/trap.c
  projects/clang500-import/sys/i386/include/proc.h
  projects/clang500-import/sys/i386/linux/linux_sysvec.c
  projects/clang500-import/sys/kern/init_main.c
  projects/clang500-import/sys/kern/kern_descrip.c
  projects/clang500-import/sys/kern/kern_event.c
  projects/clang500-import/sys/kern/kern_fork.c
  projects/clang500-import/sys/kern/kern_sig.c
  projects/clang500-import/sys/kern/kern_thread.c
  projects/clang500-import/sys/kern/kern_uuid.c
  projects/clang500-import/sys/kern/subr_blist.c
  projects/clang500-import/sys/kern/subr_prf.c
  projects/clang500-import/sys/kern/subr_syscall.c
  projects/clang500-import/sys/kern/sys_process.c
  projects/clang500-import/sys/kern/uipc_debug.c
  projects/clang500-import/sys/kern/uipc_socket.c
  projects/clang500-import/sys/mips/conf/AP135
  projects/clang500-import/sys/mips/conf/AR71XX_BASE
  projects/clang500-import/sys/mips/conf/QCA953X_BASE
  projects/clang500-import/sys/mips/conf/std.AR724X
  projects/clang500-import/sys/mips/conf/std.AR91XX
  projects/clang500-import/sys/mips/conf/std.AR933X
  projects/clang500-import/sys/mips/conf/std.AR934X
  projects/clang500-import/sys/mips/conf/std.QCA955X
  projects/clang500-import/sys/mips/include/proc.h
  projects/clang500-import/sys/mips/mips/trap.c
  projects/clang500-import/sys/modules/Makefile
  projects/clang500-import/sys/net/iflib.c
  projects/clang500-import/sys/net/route.c
  projects/clang500-import/sys/net/route.h
  projects/clang500-import/sys/netgraph/ng_ksocket.c
  projects/clang500-import/sys/ofed/drivers/infiniband/core/mad.c
  projects/clang500-import/sys/powerpc/include/proc.h
  projects/clang500-import/sys/powerpc/mpc85xx/fsl_diu.c
  projects/clang500-import/sys/powerpc/mpc85xx/mpc85xx.c
  projects/clang500-import/sys/powerpc/mpc85xx/mpc85xx.h
  projects/clang500-import/sys/powerpc/powerpc/trap.c
  projects/clang500-import/sys/riscv/include/proc.h
  projects/clang500-import/sys/riscv/riscv/trap.c
  projects/clang500-import/sys/security/mac_bsdextended/mac_bsdextended.c
  projects/clang500-import/sys/sparc64/include/proc.h
  projects/clang500-import/sys/sparc64/sparc64/trap.c
  projects/clang500-import/sys/sys/blist.h
  projects/clang500-import/sys/sys/pmc.h
  projects/clang500-import/sys/sys/proc.h
  projects/clang500-import/sys/sys/ptrace.h
  projects/clang500-import/sys/sys/sysent.h
  projects/clang500-import/sys/sys/uuid.h
  projects/clang500-import/sys/vm/vnode_pager.c
  projects/clang500-import/sys/x86/acpica/acpi_wakeup.c
  projects/clang500-import/sys/x86/x86/intr_machdep.c
  projects/clang500-import/tools/regression/geom_gpt/gctl_test.t
  projects/clang500-import/tools/test/ptrace/scescx.c
  projects/clang500-import/usr.bin/diff/tests/diff_test.sh
  projects/clang500-import/usr.bin/du/Makefile
  projects/clang500-import/usr.bin/du/du.c
  projects/clang500-import/usr.bin/finger/finger.c
  projects/clang500-import/usr.bin/fstat/fstat.c
  projects/clang500-import/usr.bin/hexdump/display.c
  projects/clang500-import/usr.bin/stat/Makefile
  projects/clang500-import/usr.bin/stat/stat.1
  projects/clang500-import/usr.bin/top/machine.c
  projects/clang500-import/usr.bin/top/top.local.1
  projects/clang500-import/usr.bin/truss/syscall.h
  projects/clang500-import/usr.bin/truss/syscalls.c
  projects/clang500-import/usr.bin/yes/yes.c
  projects/clang500-import/usr.sbin/bhyve/rfb.c   (contents, props changed)
  projects/clang500-import/usr.sbin/bsdinstall/partedit/partedit_arm64.c
  projects/clang500-import/usr.sbin/bsdinstall/partedit/partedit_x86.c
  projects/clang500-import/usr.sbin/bsdinstall/scripts/auto
  projects/clang500-import/usr.sbin/bsdinstall/scripts/zfsboot
  projects/clang500-import/usr.sbin/chown/tests/Makefile
  projects/clang500-import/usr.sbin/freebsd-update/freebsd-update.8
  projects/clang500-import/usr.sbin/ifmcstat/ifmcstat.c
  projects/clang500-import/usr.sbin/ip6addrctl/ip6addrctl.c
  projects/clang500-import/usr.sbin/lpr/lpc/lpc.c
  projects/clang500-import/usr.sbin/makefs/mtree.c
  projects/clang500-import/usr.sbin/rpc.lockd/lockd.c
Directory Properties:
  projects/clang500-import/   (props changed)
  projects/clang500-import/cddl/   (props changed)
  projects/clang500-import/cddl/contrib/opensolaris/   (props changed)
  projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/   (props changed)
  projects/clang500-import/contrib/ipfilter/   (props changed)
  projects/clang500-import/contrib/libxo/   (props changed)
  projects/clang500-import/contrib/llvm/   (props changed)
  projects/clang500-import/contrib/llvm/tools/lld/   (props changed)
  projects/clang500-import/sys/cddl/contrib/opensolaris/   (props changed)

Modified: projects/clang500-import/Makefile
==============================================================================
--- projects/clang500-import/Makefile	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/Makefile	Sat Jun 17 00:14:54 2017	(r320042)
@@ -522,6 +522,8 @@ TARGET!=	uname -m
 .endif
 .if defined(MAKE_ALL_KERNELS)
 _THINNER=cat
+.elif defined(MAKE_LINT_KERNELS)
+_THINNER=grep 'LINT' || true
 .else
 _THINNER=xargs grep -L "^.NO_UNIVERSE" || true
 .endif

Modified: projects/clang500-import/Makefile.inc1
==============================================================================
--- projects/clang500-import/Makefile.inc1	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/Makefile.inc1	Sat Jun 17 00:14:54 2017	(r320042)
@@ -767,6 +767,17 @@ _worldtmp: .PHONY
 	fi
 .endif
 .endfor
+# 20170607 remove stale dependencies for utimens* wrappers removed in r319663
+.for f in futimens utimensat
+.if exists(${OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.o)
+	@if egrep -q '/${f}.c' \
+	    ${OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.o; then \
+		echo Removing stale dependencies for ${f} syscall wrappers; \
+		rm -f ${OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.* \
+		   ${OBJTREE}${.CURDIR}/world32/${.CURDIR}/lib/libc/.depend.${f}.*; \
+	fi
+.endif
+.endfor
 # 20170523 remove stale generated asm files for functions which are no longer
 # syscalls after r302092 (pipe) and r318736 (others)
 .for f in getdents lstat mknod pipe stat

Modified: projects/clang500-import/ObsoleteFiles.inc
==============================================================================
--- projects/clang500-import/ObsoleteFiles.inc	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/ObsoleteFiles.inc	Sat Jun 17 00:14:54 2017	(r320042)
@@ -151,6 +151,8 @@ OLD_DIRS+=usr/lib/clang/4.0.0/lib/freebsd
 OLD_DIRS+=usr/lib/clang/4.0.0/lib
 OLD_DIRS+=usr/lib/clang/4.0.0
 OLD_FILES+=usr/bin/llvm-pdbdump
+# 20170610: chown-f_test replaced by chown_test
+OLD_FILES+=usr/tests/usr.sbin/chown/chown-f_test
 # 20170609: drop obsolete manpage link (if_rtwn.ko -> rtwn.ko)
 OLD_FILES+=usr/share/man/man4/if_rtwn.4.gz
 # 20170531: removal of groff

Modified: projects/clang500-import/bin/df/df.c
==============================================================================
--- projects/clang500-import/bin/df/df.c	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/bin/df/df.c	Sat Jun 17 00:14:54 2017	(r320042)
@@ -490,7 +490,7 @@ prtstat(struct statfs *sfsp, struct maxwidths *mwp)
 		xo_emit("{T:/%-*s}", mwp->mntfrom, "Filesystem");
 		if (Tflag)
 			xo_emit("  {T:/%-*s}", mwp->fstype, "Type");
-		xo_emit(" {T:/%*s} {T:/%*s} {T:/%*s} Capacity",
+		xo_emit(" {T:/%*s} {T:/%*s} {T:/%*s} {T:Capacity}",
 			mwp->total, header,
 			mwp->used, "Used", mwp->avail, "Avail");
 		if (iflag) {

Modified: projects/clang500-import/bin/ln/ln.1
==============================================================================
--- projects/clang500-import/bin/ln/ln.1	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/bin/ln/ln.1	Sat Jun 17 00:14:54 2017	(r320042)
@@ -32,7 +32,7 @@
 .\"	@(#)ln.1	8.2 (Berkeley) 12/30/93
 .\" $FreeBSD$
 .\"
-.Dd November 2, 2012
+.Dd June 12, 2017
 .Dt LN 1
 .Os
 .Sh NAME
@@ -87,14 +87,18 @@ option should be used with either
 or
 .Fl i
 options.
-If none is specified,
+If neither
 .Fl f
+nor
+.Fl i
+is specified,
+.Fl f
 is implied.
 The
 .Fl F
 option is a no-op unless
 .Fl s
-option is specified.
+is specified.
 .It Fl L
 When creating a hard link to a symbolic link,
 create a hard link to the target of the symbolic link.

Modified: projects/clang500-import/bin/ln/tests/ln_test.sh
==============================================================================
--- projects/clang500-import/bin/ln/tests/ln_test.sh	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/bin/ln/tests/ln_test.sh	Sat Jun 17 00:14:54 2017	(r320042)
@@ -28,190 +28,217 @@
 
 set_umask()
 {
-        if ! umask 022; then
-                atf_fail "setting umask failed"
-        fi
+	if ! umask 022; then
+		atf_fail "setting umask failed"
+	fi
 }
 
 atf_test_case L_flag
 L_flag_head()
 {
-        atf_set "descr" "Verify that when creating a hard link to a " \
-                        "symbolic link, '-L' option creates a hard" \
-                        "link to the target of the symbolic link"
+	atf_set "descr" "Verify that when creating a hard link to a " \
+			"symbolic link, '-L' option creates a hard" \
+			"link to the target of the symbolic link"
 }
 
 L_flag_body()
 {
-        set_umask
-        atf_check touch A
-        atf_check ln -s A B
-        atf_check ln -L B C
-        stat_A=$(stat -f %i A)
-        stat_C=$(stat -f %i C)
-        atf_check_equal "$stat_A" "$stat_C"
-        atf_check -o inline:'B: symbolic link to A\n' file B
+	set_umask
+	atf_check touch A
+	atf_check ln -s A B
+	atf_check ln -L B C
+	stat_A=$(stat -f %i A)
+	stat_C=$(stat -f %i C)
+	atf_check_equal "$stat_A" "$stat_C"
+	atf_check -o inline:'Symbolic Link\n' stat -f %SHT B
+	atf_check -o inline:'A\n' readlink B
 }
 
 atf_test_case P_flag
 P_flag_head()
 {
-        atf_set "descr" "Verify that when creating a hard link to a " \
-                        "symbolic link, '-P' option creates a hard " \
-                        "link to the symbolic link itself"
+	atf_set "descr" "Verify that when creating a hard link to a " \
+			"symbolic link, '-P' option creates a hard " \
+			"link to the symbolic link itself"
 }
 
 P_flag_body()
 {
-        set_umask
-        atf_check touch A
-        atf_check ln -s A B
-        atf_check ln -P B C
-        stat_B=$(stat -f %i B)
-        stat_C=$(stat -f %i C)
-        atf_check_equal "$stat_B" "$stat_C"
+	set_umask
+	atf_check touch A
+	atf_check ln -s A B
+	atf_check ln -P B C
+	stat_B=$(stat -f %i B)
+	stat_C=$(stat -f %i C)
+	atf_check_equal "$stat_B" "$stat_C"
 }
 
 atf_test_case f_flag
 f_flag_head()
 {
-        atf_set "descr" "Verify that if the target file already exists, " \
-                        "'-f' option unlinks it so that link may occur"
+	atf_set "descr" "Verify that if the target file already exists, " \
+			"'-f' option unlinks it so that link may occur"
 }
 
 f_flag_body()
 {
-        set_umask
-        atf_check touch A B
-        atf_check ln -f A B
-        stat_A=$(stat -f %i A)
-        stat_B=$(stat -f %i B)
-        atf_check_equal "$stat_A" "$stat_B"
+	set_umask
+	atf_check touch A B
+	atf_check ln -f A B
+	stat_A=$(stat -f %i A)
+	stat_B=$(stat -f %i B)
+	atf_check_equal "$stat_A" "$stat_B"
 }
 
 atf_test_case target_exists_hard
 target_exists_hard_head()
 {
-        atf_set "descr" "Verify whether creating a hard link fails if the " \
-                        "target file already exists"
+	atf_set "descr" "Verify whether creating a hard link fails if the " \
+			"target file already exists"
 }
 
 target_exists_hard_body()
 {
-        atf_check touch A B
-        atf_check -s exit:1 -e inline:'ln: B: File exists\n' \
-                ln A B
+	set_umask
+	atf_check touch A B
+	atf_check -s exit:1 -e inline:'ln: B: File exists\n' \
+		ln A B
 }
 
 atf_test_case target_exists_symbolic
 target_exists_symbolic_head()
 {
-        atf_set "descr" "Verify whether creating a symbolic link fails if " \
-                        "the target file already exists"
+	atf_set "descr" "Verify whether creating a symbolic link fails if " \
+			"the target file already exists"
 }
 
 target_exists_symbolic_body()
 {
-        atf_check touch A B
-        atf_check -s exit:1 -e inline:'ln: B: File exists\n' \
-                ln -s A B
+	set_umask
+	atf_check touch A B
+	atf_check -s exit:1 -e inline:'ln: B: File exists\n' \
+		ln -s A B
 }
 
 atf_test_case shf_flag_dir
 shf_flag_dir_head() {
-        atf_set "descr" "Verify that if the target directory is a symbolic " \
-                        "link, '-shf' option prevents following the link"
+	atf_set "descr" "Verify that if the target directory is a symbolic " \
+			"link, '-shf' option prevents following the link"
 }
 
 shf_flag_dir_body()
 {
-        atf_check mkdir -m 0777 A B
-        atf_check ln -s A C
-        atf_check ln -shf B C
-        atf_check -o inline:'C: symbolic link to B\n' file C
+	atf_check mkdir -m 0777 A B
+	atf_check ln -s A C
+	atf_check ln -shf B C
+	atf_check -o inline:'Symbolic Link\n' stat -f %SHT C
+	atf_check -o inline:'B\n' readlink C
 }
 
 atf_test_case snf_flag_dir
 snf_flag_dir_head() {
-        atf_set "descr" "Verify that if the target directory is a symbolic " \
-                        "link, '-snf' option prevents following the link"
+	atf_set "descr" "Verify that if the target directory is a symbolic " \
+			"link, '-snf' option prevents following the link"
 }
 
 snf_flag_dir_body()
 {
-        atf_check mkdir -m 0777 A B
-        atf_check ln -s A C
-        atf_check ln -snf B C
-        atf_check -o inline:'C: symbolic link to B\n' file C
+	atf_check mkdir -m 0777 A B
+	atf_check ln -s A C
+	atf_check ln -snf B C
+	atf_check -o inline:'Symbolic Link\n' stat -f %SHT C
+	atf_check -o inline:'B\n' readlink C
 }
 
+atf_test_case sF_flag
+sF_flag_head()
+{
+	atf_set "descr" "Verify that if the target file already exists " \
+			"and is a directory, then '-sF' option removes " \
+			"it so that the link may occur"
+}
+
+sF_flag_body()
+{
+	atf_expect_fail "B isn't being unlinked (bug 219943)"
+	atf_check mkdir A B
+	atf_check ln -sF A B
+	atf_check -o inline:'Symbolic Link\n' stat -f %SHT B
+}
+
 atf_test_case sf_flag
 sf_flag_head()
 {
-        atf_set "descr" "Verify that if the target file already exists, " \
-                        "'-sf' option unlinks it and creates a symbolic link " \
-                        "to the source file"
+	atf_set "descr" "Verify that if the target file already exists, " \
+			"'-sf' option unlinks it and creates a symbolic link " \
+			"to the source file"
 }
 
 sf_flag_body()
 {
-        atf_check touch A B
-        atf_check ln -sf A B
-        atf_check -o inline:'B: symbolic link to A\n' file B
+	set_umask
+	atf_check touch A B
+	atf_check ln -sf A B
+	atf_check -o inline:'Symbolic Link\n' stat -f %SHT B
+	atf_check -o inline:'A\n' readlink B
 }
 
 atf_test_case s_flag
 s_flag_head()
 {
-        atf_set "descr" "Verify that '-s' option creates a symbolic link"
+	atf_set "descr" "Verify that '-s' option creates a symbolic link"
 }
 
 s_flag_body()
 {
-        set_umask
-        atf_check touch A
-        atf_check ln -s A B
-        atf_check -o inline:'B: symbolic link to A\n' file B
+	set_umask
+	atf_check touch A
+	atf_check ln -s A B
+	atf_check -o inline:'Symbolic Link\n' stat -f %SHT B
+	atf_check -o inline:'A\n' readlink B
 }
 
 atf_test_case s_flag_broken
 s_flag_broken_head()
 {
-        atf_set "descr" "Verify that if the source file does not exists, '-s' " \
-                        "option creates a broken symbolic link to the source file"
+	atf_set "descr" "Verify that if the source file does not exists, '-s' " \
+			"option creates a broken symbolic link to the source file"
 }
 
 s_flag_broken_body()
 {
-        atf_check ln -s A B
-        atf_check -o inline:'B: broken symbolic link to A\n' file B
+	atf_check ln -s A B
+	atf_check -o inline:'Symbolic Link\n' stat -f %SHT B
+	atf_check -o inline:'A\n' readlink B
 }
 
 atf_test_case sw_flag
 sw_flag_head()
 {
-        atf_set "descr" "Verify that '-sw' option produces a warning if the " \
-                        "source of a symbolic link does not currently exist"
+	atf_set "descr" "Verify that '-sw' option produces a warning if the " \
+			"source of a symbolic link does not currently exist"
 }
 
 sw_flag_body()
 {
-        atf_check -s exit:0 -e inline:'ln: warning: A: No such file or directory\n' \
-                ln -sw A B
-        atf_check -o inline:'B: broken symbolic link to A\n' file B
+	atf_check -s exit:0 -e inline:'ln: warning: A: No such file or directory\n' \
+		ln -sw A B
+	atf_check -o inline:'Symbolic Link\n' stat -f %SHT B
+	atf_check -o inline:'A\n' readlink B
 }
 
 atf_init_test_cases()
 {
-        atf_add_test_case L_flag
-        atf_add_test_case P_flag
-        atf_add_test_case f_flag
-        atf_add_test_case target_exists_hard
-        atf_add_test_case target_exists_symbolic
-        atf_add_test_case shf_flag_dir
-        atf_add_test_case snf_flag_dir
-        atf_add_test_case sf_flag
-        atf_add_test_case s_flag
-        atf_add_test_case s_flag_broken
-        atf_add_test_case sw_flag
+	atf_add_test_case L_flag
+	atf_add_test_case P_flag
+	atf_add_test_case f_flag
+	atf_add_test_case target_exists_hard
+	atf_add_test_case target_exists_symbolic
+	atf_add_test_case shf_flag_dir
+	atf_add_test_case snf_flag_dir
+	atf_add_test_case sF_flag
+	atf_add_test_case sf_flag
+	atf_add_test_case s_flag
+	atf_add_test_case s_flag_broken
+	atf_add_test_case sw_flag
 }

Modified: projects/clang500-import/bin/sh/trap.c
==============================================================================
--- projects/clang500-import/bin/sh/trap.c	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/bin/sh/trap.c	Sat Jun 17 00:14:54 2017	(r320042)
@@ -526,11 +526,13 @@ exitshell_savedstatus(void)
 			 */
 			evalskip = 0;
 			trap[0] = NULL;
+			FORCEINTON;
 			evalstring(p, 0);
 		}
 	}
 	if (!setjmp(loc2.loc)) {
 		handler = &loc2;		/* probably unnecessary */
+		FORCEINTON;
 		flushall();
 #if JOBS
 		setjobctl(0);

Modified: projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c	Sat Jun 17 00:14:54 2017	(r320042)
@@ -30,6 +30,7 @@
  * Copyright (c) 2014 Integros [integros.com]
  * Copyright 2016 Nexenta Systems, Inc.
  * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>
+ * Copyright 2017 RackTop Systems.
  */
 
 #include <ctype.h>
@@ -3675,8 +3676,7 @@ int
 zfs_promote(zfs_handle_t *zhp)
 {
 	libzfs_handle_t *hdl = zhp->zfs_hdl;
-	zfs_cmd_t zc = { 0 };
-	char parent[MAXPATHLEN];
+	char snapname[ZFS_MAX_DATASET_NAME_LEN];
 	int ret;
 	char errbuf[1024];
 
@@ -3689,31 +3689,25 @@ zfs_promote(zfs_handle_t *zhp)
 		return (zfs_error(hdl, EZFS_BADTYPE, errbuf));
 	}
 
-	(void) strlcpy(parent, zhp->zfs_dmustats.dds_origin, sizeof (parent));
-	if (parent[0] == '\0') {
+	if (zhp->zfs_dmustats.dds_origin[0] == '\0') {
 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
 		    "not a cloned filesystem"));
 		return (zfs_error(hdl, EZFS_BADTYPE, errbuf));
 	}
 
-	(void) strlcpy(zc.zc_value, zhp->zfs_dmustats.dds_origin,
-	    sizeof (zc.zc_value));
-	(void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name));
-	ret = zfs_ioctl(hdl, ZFS_IOC_PROMOTE, &zc);
+	ret = lzc_promote(zhp->zfs_name, snapname, sizeof (snapname));
 
 	if (ret != 0) {
-		int save_errno = errno;
-
-		switch (save_errno) {
+		switch (ret) {
 		case EEXIST:
 			/* There is a conflicting snapshot name. */
 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
 			    "conflicting snapshot '%s' from parent '%s'"),
-			    zc.zc_string, parent);
+			    snapname, zhp->zfs_dmustats.dds_origin);
 			return (zfs_error(hdl, EZFS_EXISTS, errbuf));
 
 		default:
-			return (zfs_standard_error(hdl, save_errno, errbuf));
+			return (zfs_standard_error(hdl, ret, errbuf));
 		}
 	}
 	return (ret);

Modified: projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c
==============================================================================
--- projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c	Sat Jun 17 00:14:54 2017	(r320042)
@@ -23,6 +23,7 @@
  * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
  * Copyright (c) 2013 Steven Hartland. All rights reserved.
  * Copyright (c) 2014 Integros [integros.com]
+ * Copyright 2017 RackTop Systems.
  */
 
 /*
@@ -244,6 +245,28 @@ lzc_clone(const char *fsname, const char *origin,
 	return (error);
 }
 
+int
+lzc_promote(const char *fsname, char *snapnamebuf, int snapnamelen)
+{
+	/*
+	 * The promote ioctl is still legacy, so we need to construct our
+	 * own zfs_cmd_t rather than using lzc_ioctl().
+	 */
+	zfs_cmd_t zc = { 0 };
+
+	ASSERT3S(g_refcount, >, 0);
+	VERIFY3S(g_fd, !=, -1);
+
+	(void) strlcpy(zc.zc_name, fsname, sizeof (zc.zc_name));
+	if (ioctl(g_fd, ZFS_IOC_PROMOTE, &zc) != 0) {
+		int error = errno;
+		if (error == EEXIST && snapnamebuf != NULL)
+			(void) strlcpy(snapnamebuf, zc.zc_string, snapnamelen);
+		return (error);
+	}
+	return (0);
+}
+
 /*
  * Creates snapshots.
  *
@@ -371,7 +394,7 @@ lzc_exists(const char *dataset)
 {
 	/*
 	 * The objset_stats ioctl is still legacy, so we need to construct our
-	 * own zfs_cmd_t rather than using zfsc_ioctl().
+	 * own zfs_cmd_t rather than using lzc_ioctl().
 	 */
 	zfs_cmd_t zc = { 0 };
 

Modified: projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h
==============================================================================
--- projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h	Sat Jun 17 00:14:54 2017	(r320042)
@@ -22,6 +22,7 @@
 /*
  * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
  * Copyright (c) 2013 by Martin Matuska <mm@FreeBSD.org>. All rights reserved.
+ * Copyright 2017 RackTop Systems.
  */
 
 #ifndef	_LIBZFS_CORE_H
@@ -49,6 +50,7 @@ enum lzc_dataset_type {
 int lzc_snapshot(nvlist_t *, nvlist_t *, nvlist_t **);
 int lzc_create(const char *, enum lzc_dataset_type, nvlist_t *);
 int lzc_clone(const char *, const char *, nvlist_t *);
+int lzc_promote(const char *, char *, int);
 int lzc_destroy_snaps(nvlist_t *, boolean_t, nvlist_t **);
 int lzc_bookmark(nvlist_t *, nvlist_t **);
 int lzc_get_bookmarks(const char *, nvlist_t *, nvlist_t **);

Modified: projects/clang500-import/contrib/ipfilter/man/ipf.5
==============================================================================
--- projects/clang500-import/contrib/ipfilter/man/ipf.5	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/contrib/ipfilter/man/ipf.5	Sat Jun 17 00:14:54 2017	(r320042)
@@ -1693,6 +1693,6 @@ environment.
 /dev/ipf
 /etc/ipf.conf
 .br
-/usr/share/examples/ipf  Directory with examples.
+/usr/share/examples/ipfilter  Directory with examples.
 .SH SEE ALSO
 ipf(8), ipfstat(8), ippool.conf(5), ippool(8)

Modified: projects/clang500-import/contrib/ipfilter/tools/ippool.c
==============================================================================
--- projects/clang500-import/contrib/ipfilter/tools/ippool.c	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/contrib/ipfilter/tools/ippool.c	Sat Jun 17 00:14:54 2017	(r320042)
@@ -99,7 +99,7 @@ main(argc, argv)
 
 	assigndefined(getenv("IPPOOL_PREDEFINED"));
 
-	switch (getopt(argc, argv, "aAf:FlnrRsv"))
+	switch (getopt(argc, argv, "aAf:FlrRs"))
 	{
 	case 'a' :
 		err = poolnodecommand(0, argc, argv);
@@ -116,9 +116,6 @@ main(argc, argv)
 	case 'l' :
 		err = poollist(argc, argv);
 		break;
-	case 'n' :
-		opts |= OPT_DONOTHING|OPT_DONTOPEN;
-		break;
 	case 'r' :
 		err = poolnodecommand(1, argc, argv);
 		break;
@@ -128,9 +125,6 @@ main(argc, argv)
 	case 's' :
 		err = poolstats(argc, argv);
 		break;
-	case 'v' :
-		opts |= OPT_VERBOSE;
-		break;
 	default :
 		exit(1);
 	}
@@ -361,8 +355,6 @@ loadpoolfile(argc, argv, infile)
 {
 	int c;
 
-	infile = optarg;
-
 	while ((c = getopt(argc, argv, "dnRuv")) != -1)
 		switch (c)
 		{
@@ -382,8 +374,14 @@ loadpoolfile(argc, argv, infile)
 		case 'v' :
 			opts |= OPT_VERBOSE;
 			break;
+		default :
+			usage(argv[0]);
+			break;		/* keep compiler happy */
 		}
 
+	if (argc - 1 - optind > 0)
+		usage(argv[0]);
+
 	if (opts & OPT_DEBUG)
 		fprintf(stderr, "loadpoolfile: opts = %#x\n", opts);
 
@@ -453,8 +451,14 @@ poolstats(argc, argv)
 		case 'v' :
 			opts |= OPT_VERBOSE;
 			break;
+		default :
+			usage(argv[0]);
+			break;		/* keep compiler happy */
 		}
 
+	if (argc - 1 - optind > 0)
+		usage(argv[0]);
+
 	if (opts & OPT_DEBUG)
 		fprintf(stderr, "poolstats: opts = %#x\n", opts);
 
@@ -559,7 +563,13 @@ poolflush(argc, argv)
 		case 'v' :
 			opts |= OPT_VERBOSE;
 			break;
+		default :
+			usage(argv[0]);
+			break;		/* keep compiler happy */
 		}
+
+	if (argc - 1 - optind > 0)
+		usage(argv[0]);
 
 	if (opts & OPT_DEBUG)
 		fprintf(stderr, "poolflush: opts = %#x\n", opts);

Modified: projects/clang500-import/contrib/jemalloc/COPYING
==============================================================================
--- projects/clang500-import/contrib/jemalloc/COPYING	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/contrib/jemalloc/COPYING	Sat Jun 17 00:14:54 2017	(r320042)
@@ -1,10 +1,10 @@
 Unless otherwise specified, files in the jemalloc source distribution are
 subject to the following license:
 --------------------------------------------------------------------------------
-Copyright (C) 2002-2016 Jason Evans <jasone@canonware.com>.
+Copyright (C) 2002-2017 Jason Evans <jasone@canonware.com>.
 All rights reserved.
 Copyright (C) 2007-2012 Mozilla Foundation.  All rights reserved.
-Copyright (C) 2009-2016 Facebook, Inc.  All rights reserved.
+Copyright (C) 2009-2017 Facebook, Inc.  All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:

Modified: projects/clang500-import/contrib/jemalloc/ChangeLog
==============================================================================
--- projects/clang500-import/contrib/jemalloc/ChangeLog	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/contrib/jemalloc/ChangeLog	Sat Jun 17 00:14:54 2017	(r320042)
@@ -4,6 +4,193 @@ brevity.  Much more detail can be found in the git rev
 
     https://github.com/jemalloc/jemalloc
 
+* 5.0.0 (June 13, 2017)
+
+  Unlike all previous jemalloc releases, this release does not use naturally
+  aligned "chunks" for virtual memory management, and instead uses page-aligned
+  "extents".  This change has few externally visible effects, but the internal
+  impacts are... extensive.  Many other internal changes combine to make this
+  the most cohesively designed version of jemalloc so far, with ample
+  opportunity for further enhancements.
+
+  Continuous integration is now an integral aspect of development thanks to the
+  efforts of @davidtgoldblatt, and the dev branch tends to remain reasonably
+  stable on the tested platforms (Linux, FreeBSD, macOS, and Windows).  As a
+  side effect the official release frequency may decrease over time.
+
+  New features:
+  - Implement optional per-CPU arena support; threads choose which arena to use
+    based on current CPU rather than on fixed thread-->arena associations.
+    (@interwq)
+  - Implement two-phase decay of unused dirty pages.  Pages transition from
+    dirty-->muzzy-->clean, where the first phase transition relies on
+    madvise(... MADV_FREE) semantics, and the second phase transition discards
+    pages such that they are replaced with demand-zeroed pages on next access.
+    (@jasone)
+  - Increase decay time resolution from seconds to milliseconds.  (@jasone)
+  - Implement opt-in per CPU background threads, and use them for asynchronous
+    decay-driven unused dirty page purging.  (@interwq)
+  - Add mutex profiling, which collects a variety of statistics useful for
+    diagnosing overhead/contention issues.  (@interwq)
+  - Add C++ new/delete operator bindings.  (@djwatson)
+  - Support manually created arena destruction, such that all data and metadata
+    are discarded.  Add MALLCTL_ARENAS_DESTROYED for accessing merged stats
+    associated with destroyed arenas.  (@jasone)
+  - Add MALLCTL_ARENAS_ALL as a fixed index for use in accessing
+    merged/destroyed arena statistics via mallctl.  (@jasone)
+  - Add opt.abort_conf to optionally abort if invalid configuration options are
+    detected during initialization.  (@interwq)
+  - Add opt.stats_print_opts, so that e.g. JSON output can be selected for the
+    stats dumped during exit if opt.stats_print is true.  (@jasone)
+  - Add --with-version=VERSION for use when embedding jemalloc into another
+    project's git repository.  (@jasone)
+  - Add --disable-thp to support cross compiling.  (@jasone)
+  - Add --with-lg-hugepage to support cross compiling.  (@jasone)
+  - Add mallctl interfaces (various authors):
+    + background_thread
+    + opt.abort_conf
+    + opt.retain
+    + opt.percpu_arena
+    + opt.background_thread
+    + opt.{dirty,muzzy}_decay_ms
+    + opt.stats_print_opts
+    + arena.<i>.initialized
+    + arena.<i>.destroy
+    + arena.<i>.{dirty,muzzy}_decay_ms
+    + arena.<i>.extent_hooks
+    + arenas.{dirty,muzzy}_decay_ms
+    + arenas.bin.<i>.slab_size
+    + arenas.nlextents
+    + arenas.lextent.<i>.size
+    + arenas.create
+    + stats.background_thread.{num_threads,num_runs,run_interval}
+    + stats.mutexes.{ctl,background_thread,prof,reset}.
+      {num_ops,num_spin_acq,num_wait,max_wait_time,total_wait_time,max_num_thds,
+      num_owner_switch}
+    + stats.arenas.<i>.{dirty,muzzy}_decay_ms
+    + stats.arenas.<i>.uptime
+    + stats.arenas.<i>.{pmuzzy,base,internal,resident}
+    + stats.arenas.<i>.{dirty,muzzy}_{npurge,nmadvise,purged}
+    + stats.arenas.<i>.bins.<j>.{nslabs,reslabs,curslabs}
+    + stats.arenas.<i>.bins.<j>.mutex.
+      {num_ops,num_spin_acq,num_wait,max_wait_time,total_wait_time,max_num_thds,
+      num_owner_switch}
+    + stats.arenas.<i>.lextents.<j>.{nmalloc,ndalloc,nrequests,curlextents}
+    + stats.arenas.i.mutexes.{large,extent_avail,extents_dirty,extents_muzzy,
+      extents_retained,decay_dirty,decay_muzzy,base,tcache_list}.
+      {num_ops,num_spin_acq,num_wait,max_wait_time,total_wait_time,max_num_thds,
+      num_owner_switch}
+
+  Portability improvements:
+  - Improve reentrant allocation support, such that deadlock is less likely if
+    e.g. a system library call in turn allocates memory.  (@davidtgoldblatt,
+    @interwq)
+  - Support static linking of jemalloc with glibc.  (@djwatson)
+
+  Optimizations and refactors:
+  - Organize virtual memory as "extents" of virtual memory pages, rather than as
+    naturally aligned "chunks", and store all metadata in arbitrarily distant
+    locations.  This reduces virtual memory external fragmentation, and will
+    interact better with huge pages (not yet explicitly supported).  (@jasone)
+  - Fold large and huge size classes together; only small and large size classes
+    remain.  (@jasone)
+  - Unify the allocation paths, and merge most fast-path branching decisions.
+    (@davidtgoldblatt, @interwq)
+  - Embed per thread automatic tcache into thread-specific data, which reduces
+    conditional branches and dereferences.  Also reorganize tcache to increase
+    fast-path data locality.  (@interwq)
+  - Rewrite atomics to closely model the C11 API, convert various
+    synchronization from mutex-based to atomic, and use the explicit memory
+    ordering control to resolve various hypothetical races without increasing
+    synchronization overhead.  (@davidtgoldblatt)
+  - Extensively optimize rtree via various methods:
+    + Add multiple layers of rtree lookup caching, since rtree lookups are now
+      part of fast-path deallocation.  (@interwq)
+    + Determine rtree layout at compile time.  (@jasone)
+    + Make the tree shallower for common configurations.  (@jasone)
+    + Embed the root node in the top-level rtree data structure, thus avoiding
+      one level of indirection.  (@jasone)
+    + Further specialize leaf elements as compared to internal node elements,
+      and directly embed extent metadata needed for fast-path deallocation.
+      (@jasone)
+    + Ignore leading always-zero address bits (architecture-specific).
+      (@jasone)
+  - Reorganize headers (ongoing work) to make them hermetic, and disentangle
+    various module dependencies.  (@davidtgoldblatt)
+  - Convert various internal data structures such as size class metadata from
+    boot-time-initialized to compile-time-initialized.  Propagate resulting data
+    structure simplifications, such as making arena metadata fixed-size.
+    (@jasone)
+  - Simplify size class lookups when constrained to size classes that are
+    multiples of the page size.  This speeds lookups, but the primary benefit is
+    complexity reduction in code that was the source of numerous regressions.
+    (@jasone)
+  - Lock individual extents when possible for localized extent operations,
+    rather than relying on a top-level arena lock.  (@davidtgoldblatt, @jasone)
+  - Use first fit layout policy instead of best fit, in order to improve
+    packing.  (@jasone)
+  - If munmap(2) is not in use, use an exponential series to grow each arena's
+    virtual memory, so that the number of disjoint virtual memory mappings
+    remains low.  (@jasone)
+  - Implement per arena base allocators, so that arenas never share any virtual
+    memory pages.  (@jasone)
+  - Automatically generate private symbol name mangling macros.  (@jasone)
+
+  Incompatible changes:
+  - Replace chunk hooks with an expanded/normalized set of extent hooks.
+    (@jasone)
+  - Remove ratio-based purging.  (@jasone)
+  - Remove --disable-tcache.  (@jasone)
+  - Remove --disable-tls.  (@jasone)
+  - Remove --enable-ivsalloc.  (@jasone)
+  - Remove --with-lg-size-class-group.  (@jasone)
+  - Remove --with-lg-tiny-min.  (@jasone)
+  - Remove --disable-cc-silence.  (@jasone)
+  - Remove --enable-code-coverage.  (@jasone)
+  - Remove --disable-munmap (replaced by opt.retain).  (@jasone)
+  - Remove Valgrind support.  (@jasone)
+  - Remove quarantine support.  (@jasone)
+  - Remove redzone support.  (@jasone)
+  - Remove mallctl interfaces (various authors):
+    + config.munmap
+    + config.tcache
+    + config.tls
+    + config.valgrind
+    + opt.lg_chunk
+    + opt.purge
+    + opt.lg_dirty_mult
+    + opt.decay_time
+    + opt.quarantine
+    + opt.redzone
+    + opt.thp
+    + arena.<i>.lg_dirty_mult
+    + arena.<i>.decay_time
+    + arena.<i>.chunk_hooks
+    + arenas.initialized
+    + arenas.lg_dirty_mult
+    + arenas.decay_time
+    + arenas.bin.<i>.run_size
+    + arenas.nlruns
+    + arenas.lrun.<i>.size
+    + arenas.nhchunks
+    + arenas.hchunk.<i>.size
+    + arenas.extend
+    + stats.cactive
+    + stats.arenas.<i>.lg_dirty_mult
+    + stats.arenas.<i>.decay_time
+    + stats.arenas.<i>.metadata.{mapped,allocated}
+    + stats.arenas.<i>.{npurge,nmadvise,purged}
+    + stats.arenas.<i>.huge.{allocated,nmalloc,ndalloc,nrequests}
+    + stats.arenas.<i>.bins.<j>.{nruns,reruns,curruns}
+    + stats.arenas.<i>.lruns.<j>.{nmalloc,ndalloc,nrequests,curruns}
+    + stats.arenas.<i>.hchunks.<j>.{nmalloc,ndalloc,nrequests,curhchunks}
+
+  Bug fixes:
+  - Improve interval-based profile dump triggering to dump only one profile when
+    a single allocation's size exceeds the interval.  (@jasone)
+  - Use prefixed function names (as controlled by --with-jemalloc-prefix) when
+    pruning backtrace frames in jeprof.  (@jasone)
+
 * 4.5.0 (February 28, 2017)
 
   This is the first release to benefit from much broader continuous integration
@@ -12,7 +199,7 @@ brevity.  Much more detail can be found in the git rev
   regressions fixed by this release.
 
   New features:
-  - Add --disable-thp and the opt.thp to provide opt-out mechanisms for
+  - Add --disable-thp and the opt.thp mallctl to provide opt-out mechanisms for
     transparent huge page integration.  (@jasone)
   - Update zone allocator integration to work with macOS 10.12.  (@glandium)
   - Restructure *CFLAGS configuration, so that CFLAGS behaves typically, and
@@ -25,7 +212,7 @@ brevity.  Much more detail can be found in the git rev
   - Handle race in per size class utilization computation.  This functionality
     was first released in 4.0.0.  (@interwq)
   - Fix lock order reversal during gdump.  (@jasone)
-  - Fix-refactor tcache synchronization.  This regression was first released in
+  - Fix/refactor tcache synchronization.  This regression was first released in
     4.0.0.  (@jasone)
   - Fix various JSON-formatted malloc_stats_print() bugs.  This functionality
     was first released in 4.3.0.  (@jasone)

Modified: projects/clang500-import/contrib/jemalloc/FREEBSD-Xlist
==============================================================================
--- projects/clang500-import/contrib/jemalloc/FREEBSD-Xlist	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/contrib/jemalloc/FREEBSD-Xlist	Sat Jun 17 00:14:54 2017	(r320042)
@@ -4,7 +4,7 @@ $FreeBSD$
 .git*
 .travis.yml
 FREEBSD-*
-INSTALL
+INSTALL.md
 Makefile*
 README
 autogen.sh
@@ -13,23 +13,24 @@ bin/
 build-aux/
 config.*
 configure*
-coverage.sh
 doc/*.in
 doc/*.xml
 doc/*.xsl
 doc/*.html
-include/jemalloc/internal/jemalloc_internal.h.in
+include/jemalloc/internal/atomic_msvc.h
 include/jemalloc/internal/jemalloc_internal_defs.h.in
+include/jemalloc/internal/jemalloc_preamble.h.in
 include/jemalloc/internal/private_namespace.sh
-include/jemalloc/internal/private_symbols.txt
-include/jemalloc/internal/private_unnamespace.h
-include/jemalloc/internal/private_unnamespace.sh
+include/jemalloc/internal/private_symbols_jet.awk
+include/jemalloc/internal/private_symbols.awk
+include/jemalloc/internal/private_symbols.sh
 include/jemalloc/internal/public_namespace.sh
 include/jemalloc/internal/public_symbols.txt
 include/jemalloc/internal/public_unnamespace.h
 include/jemalloc/internal/public_unnamespace.sh
 include/jemalloc/internal/size_classes.sh
 include/jemalloc/internal/smoothstep.sh
+include/jemalloc/internal/tsd_win.h
 include/jemalloc/jemalloc.h.in
 include/jemalloc/jemalloc.sh
 include/jemalloc/jemalloc_defs.h
@@ -48,8 +49,10 @@ include/jemalloc/jemalloc_typedefs.h.in
 include/msvc_compat/
 install-sh
 jemalloc.pc*
+m4/
 msvc/
+run_tests.sh
 scripts/
-src/valgrind.c
+src/jemalloc_cpp.cpp
 src/zone.c
 test/

Modified: projects/clang500-import/contrib/jemalloc/FREEBSD-diffs
==============================================================================
--- projects/clang500-import/contrib/jemalloc/FREEBSD-diffs	Sat Jun 17 00:09:34 2017	(r320041)
+++ projects/clang500-import/contrib/jemalloc/FREEBSD-diffs	Sat Jun 17 00:14:54 2017	(r320042)
@@ -1,21 +1,19 @@
 diff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in
-index c97ab0f..be8dda5 100644
+index 21e401ac..f977c5f5 100644
 --- a/doc/jemalloc.xml.in
 +++ b/doc/jemalloc.xml.in
-@@ -53,11 +53,23 @@
+@@ -53,11 +53,21 @@
      <para>This manual describes jemalloc @jemalloc_version@.  More information
      can be found at the <ulink
      url="http://jemalloc.net/">jemalloc website</ulink>.</para>
 +
 +    <para>The following configuration options are enabled in libc's built-in
 +    jemalloc: <option>--enable-fill</option>,
-+    <option>--enable-lazy-lock</option>, <option>--enable-munmap</option>,
-+    <option>--enable-stats</option>, <option>--enable-tcache</option>,
-+    <option>--enable-tls</option>, <option>--enable-utrace</option>, and
-+    <option>--enable-xmalloc</option>.  Additionally,
-+    <option>--enable-debug</option> is enabled in development versions of
-+    FreeBSD (controlled by the <constant>MALLOC_PRODUCTION</constant> make
-+    variable).</para>
++    <option>--enable-lazy-lock</option>, <option>--enable-stats</option>,
++    <option>--enable-utrace</option>, and <option>--enable-xmalloc</option>.
++    Additionally, <option>--enable-debug</option> is enabled in development
++    versions of FreeBSD (controlled by the
++    <constant>MALLOC_PRODUCTION</constant> make variable).</para>
 +
    </refsect1>
    <refsynopsisdiv>
@@ -27,7 +25,7 @@ index c97ab0f..be8dda5 100644
        <refsect2>
          <title>Standard API</title>
          <funcprototype>
-@@ -2989,4 +3001,18 @@ malloc_conf = "lg_chunk:24";]]></programlisting></para>
+@@ -3252,4 +3262,18 @@ malloc_conf = "narenas:1";]]></programlisting></para>
      <para>The <function>posix_memalign()</function> function conforms
      to IEEE Std 1003.1-2001 (<quote>POSIX.1</quote>).</para>
    </refsect1>
@@ -46,42 +44,42 @@ index c97ab0f..be8dda5 100644
 +    11.0.</para>
 +  </refsect1>
  </refentry>
-diff --git a/include/jemalloc/internal/arena.h b/include/jemalloc/internal/arena.h
-index 119e3a5..277989f 100644
---- a/include/jemalloc/internal/arena.h
-+++ b/include/jemalloc/internal/arena.h
-@@ -731,8 +731,13 @@ arena_miscelm_get_mutable(arena_chunk_t *chunk, size_t pageind)
- JEMALLOC_ALWAYS_INLINE const arena_chunk_map_misc_t *
- arena_miscelm_get_const(const arena_chunk_t *chunk, size_t pageind)
- {
-+#if 1 /* Work around gcc bug. */
-+	arena_chunk_t *mchunk = (arena_chunk_t *)chunk;
+diff --git a/include/jemalloc/internal/hooks.h b/include/jemalloc/internal/hooks.h
+index cd49afcb..85e2a991 100644
+--- a/include/jemalloc/internal/hooks.h
++++ b/include/jemalloc/internal/hooks.h
+@@ -6,13 +6,6 @@ extern JEMALLOC_EXPORT void (*hooks_libc_hook)();
  
-+	return (arena_miscelm_get_mutable(mchunk, pageind));
-+#else
- 	return (arena_miscelm_get_mutable((arena_chunk_t *)chunk, pageind));
-+#endif
- }
+ #define JEMALLOC_HOOK(fn, hook) ((void)(hook != NULL && (hook(), 0)), fn)
  
- JEMALLOC_ALWAYS_INLINE size_t
-@@ -791,8 +796,13 @@ arena_mapbitsp_get_mutable(arena_chunk_t *chunk, size_t pageind)
- JEMALLOC_ALWAYS_INLINE const size_t *
- arena_mapbitsp_get_const(const arena_chunk_t *chunk, size_t pageind)
- {
-+#if 1 /* Work around gcc bug. */
-+	arena_chunk_t *mchunk = (arena_chunk_t *)chunk;
+-#define open JEMALLOC_HOOK(open, hooks_libc_hook)
+-#define read JEMALLOC_HOOK(read, hooks_libc_hook)
+-#define write JEMALLOC_HOOK(write, hooks_libc_hook)
+-#define readlink JEMALLOC_HOOK(readlink, hooks_libc_hook)
+-#define close JEMALLOC_HOOK(close, hooks_libc_hook)
+-#define creat JEMALLOC_HOOK(creat, hooks_libc_hook)
+-#define secure_getenv JEMALLOC_HOOK(secure_getenv, hooks_libc_hook)
+ /* Note that this is undef'd and re-define'd in src/prof.c. */
+ #define _Unwind_Backtrace JEMALLOC_HOOK(_Unwind_Backtrace, hooks_libc_hook)
  
-+	return (arena_mapbitsp_get_mutable(mchunk, pageind));
-+#else
- 	return (arena_mapbitsp_get_mutable((arena_chunk_t *)chunk, pageind));
-+#endif
- }
+diff --git a/include/jemalloc/internal/jemalloc_internal_decls.h b/include/jemalloc/internal/jemalloc_internal_decls.h
+index 1efdb56b..12a7e5a8 100644
+--- a/include/jemalloc/internal/jemalloc_internal_decls.h
++++ b/include/jemalloc/internal/jemalloc_internal_decls.h
+@@ -1,6 +1,9 @@
+ #ifndef JEMALLOC_INTERNAL_DECLS_H

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@freebsd.org  Sat Jun 17 12:48:32 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id A38A0BFA513
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Sat, 17 Jun 2017 12:48:32 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 7F6AA6863B;
 Sat, 17 Jun 2017 12:48:32 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v5HCmV7Z052153;
 Sat, 17 Jun 2017 12:48:31 GMT (envelope-from dim@FreeBSD.org)
Received: (from dim@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v5HCmV9T052151;
 Sat, 17 Jun 2017 12:48:31 GMT (envelope-from dim@FreeBSD.org)
Message-Id: <201706171248.v5HCmV9T052151@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org
 using -f
From: Dimitry Andric <dim@FreeBSD.org>
Date: Sat, 17 Jun 2017 12:48:31 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r320053 - in projects/clang500-import/contrib/llvm:
 lib/CodeGen tools/lld/ELF
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 17 Jun 2017 12:48:32 -0000

Author: dim
Date: Sat Jun 17 12:48:31 2017
New Revision: 320053
URL: https://svnweb.freebsd.org/changeset/base/320053

Log:
  Repair a few mismerges in r320041 and r320042.

Modified:
  projects/clang500-import/contrib/llvm/lib/CodeGen/XRayInstrumentation.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/InputSection.cpp

Modified: projects/clang500-import/contrib/llvm/lib/CodeGen/XRayInstrumentation.cpp
==============================================================================
--- projects/clang500-import/contrib/llvm/lib/CodeGen/XRayInstrumentation.cpp	Sat Jun 17 11:29:59 2017	(r320052)
+++ projects/clang500-import/contrib/llvm/lib/CodeGen/XRayInstrumentation.cpp	Sat Jun 17 12:48:31 2017	(r320053)
@@ -142,9 +142,9 @@ bool XRayInstrumentation::runOnMachineFunction(Machine
       return false; // Invalid value for threshold.
 
     // Count the number of MachineInstr`s in MachineFunction
-    int64_t MICount = 0;
-    for (const auto& MBB : MF)
-      MICount += MBB.size();
+    int64_t MICount = 0;
+    for (const auto& MBB : MF)
+      MICount += MBB.size();
 
     // Check if we have a loop.
     // FIXME: Maybe make this smarter, and see whether the loops are dependent

Modified: projects/clang500-import/contrib/llvm/tools/lld/ELF/InputSection.cpp
==============================================================================
--- projects/clang500-import/contrib/llvm/tools/lld/ELF/InputSection.cpp	Sat Jun 17 11:29:59 2017	(r320052)
+++ projects/clang500-import/contrib/llvm/tools/lld/ELF/InputSection.cpp	Sat Jun 17 12:48:31 2017	(r320053)
@@ -467,7 +467,6 @@ static uint64_t getRelocTargetVA(uint32_t Type, int64_
   case R_GOTREL_FROM_END:
     return Body.getVA(A) - InX::Got->getVA() - InX::Got->getSize();
   case R_GOT_FROM_END:
-  case R_GOT_FROM_END:
   case R_RELAX_TLS_GD_TO_IE_END:
     return Body.getGotOffset() + A - InX::Got->getSize();
   case R_GOT_OFF:
@@ -476,7 +475,6 @@ static uint64_t getRelocTargetVA(uint32_t Type, int64_
   case R_RELAX_TLS_GD_TO_IE_PAGE_PC:
     return getAArch64Page(Body.getGotVA() + A) - getAArch64Page(P);
   case R_GOT_PC:
-  case R_GOT_PC:
   case R_RELAX_TLS_GD_TO_IE:
     return Body.getGotVA() + A - P;
   case R_HINT:
@@ -546,36 +544,6 @@ static uint64_t getRelocTargetVA(uint32_t Type, int64_
   case R_PLT_PC:
   case R_PPC_PLT_OPD:
     return Body.getPltVA() + A - P;
-  case R_PAGE_PC:
-  case R_PLT_PAGE_PC: {
-    uint64_t Dest;
-    if (Body.isUndefined() && !Body.isLocal() && Body.symbol()->isWeak())
-      Dest = getAArch64Page(A);
-    else
-      Dest = getAArch64Page(Body.getVA<ELFT>(A));
-    return Dest - getAArch64Page(P);
-  }
-  case R_PC: {
-    uint64_t Dest;
-    if (Body.isUndefined() && !Body.isLocal() && Body.symbol()->isWeak()) {
-      // On ARM and AArch64 a branch to an undefined weak resolves to the
-      // next instruction, otherwise the place.
-      if (Config->EMachine == EM_ARM)
-        Dest = getARMUndefinedRelativeWeakVA(Type, A, P);
-      else if (Config->EMachine == EM_AARCH64)
-        Dest = getAArch64UndefinedRelativeWeakVA(Type, A, P);
-      else
-        Dest = Body.getVA<ELFT>(A);
-    } else {
-      Dest = Body.getVA<ELFT>(A);
-    }
-    return Dest - P;
-  }
-  case R_PLT:
-    return Body.getPltVA<ELFT>() + A;
-  case R_PLT_PC:
-  case R_PPC_PLT_OPD:
-    return Body.getPltVA<ELFT>() + A - P;
   case R_PPC_OPD: {
     uint64_t SymVA = Body.getVA(A);
     // If we have an undefined weak symbol, we might get here with a symbol