From owner-svn-src-projects@freebsd.org Sun Jun 11 00:17:09 2017 Return-Path: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 +#include /* * 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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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, ¬runc, 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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 #include -#include #include +#include +#include +#include + #include #include #include @@ -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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 + * 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#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 + * 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 +__FBSDID("$FreeBSD$"); + +#include "opt_platform.h" + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#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 #include +#ifdef MULTIDELAY +#include /* For arm_set_delay */ +#endif + #include #include #include @@ -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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* 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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 " 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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 " 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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 +#include #include #include #include +#include +#include #include #include #include @@ -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 ] \n"); exit(1); } From owner-svn-src-projects@freebsd.org Fri Jun 16 21:40:46 2017 Return-Path: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 +#include #include #include #include +#include +#include #include #include #include @@ -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 ] \n"); exit(1); } From owner-svn-src-projects@freebsd.org Fri Jun 16 22:05:31 2017 Return-Path: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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( - 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 #include #include #include @@ -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(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 +#include #include _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(__f_->target(typeid(_Tp))); } template @@ -980,7 +980,7 @@ function<_Rp(_A0)>::target() { if (__f_ == 0) return (_Tp*)0; - return (_Tp*)__f_->target(typeid(_Tp)); + return (_Tp*) const_cast(__f_->target(typeid(_Tp))); } template @@ -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(__f_->target(typeid(_Tp))); } template @@ -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(__f_->target(typeid(_Tp))); } template 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 void cref(const _Tp&&) = delete; #endif #if _LIBCPP_STD_VER > 11 -template -struct __is_transparent -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template static char __test(typename _Up::is_transparent* = 0); -public: - static const bool value = sizeof(__test<_Tp1>(0)) == 1; -}; +template +struct __is_transparent : false_type {}; + +template +struct __is_transparent<_Tp, _Up, + typename __void_t::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 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(__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(__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(__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(__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(__f_->target(typeid(_Tp))); } template @@ -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 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 >(__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 + const T* __do_widen_p(ios_base& __iob, T* __atoms) const + { + locale __loc = __iob.getloc(); + use_facet >(__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 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 string @@ -411,9 +450,16 @@ __num_get<_CharT>::__stage2_float_prep(ios_base& __iob template 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(__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(__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 (publ // pointer_traits +template +struct __has_element_type : false_type {}; + template -struct __has_element_type -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template 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::type> : true_type {}; template ::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 +struct __has_difference_type : false_type {}; + template -struct __has_difference_type -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template 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::type> : true_type {}; template ::value> struct __pointer_traits_difference_type @@ -998,17 +990,12 @@ struct __rebind_pointer { // allocator_traits -struct __has_pointer_type_imp -{ - template static __two __test(...); - template static char __test(typename _Up::pointer* = 0); -}; +template +struct __has_pointer_type : false_type {}; template -struct __has_pointer_type - : public integral_constant(0)) == 1> -{ -}; +struct __has_pointer_type<_Tp, + typename __void_t::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 +struct __has_const_pointer : false_type {}; + template -struct __has_const_pointer -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template 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::type> : true_type {}; template ::value> struct __const_pointer @@ -1060,16 +1043,12 @@ struct __const_pointer<_Tp, _Ptr, _Alloc, false> #endif }; +template +struct __has_void_pointer : false_type {}; + template -struct __has_void_pointer -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template 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::type> : true_type {}; template ::value> struct __void_pointer @@ -1087,16 +1066,12 @@ struct __void_pointer<_Ptr, _Alloc, false> #endif }; +template +struct __has_const_void_pointer : false_type {}; + template -struct __has_const_void_pointer -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template 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::type> : true_type {}; template ::value> struct __const_void_pointer @@ -1130,16 +1105,12 @@ __to_raw_pointer(_Pointer __p) _NOEXCEPT return _VSTD::__to_raw_pointer(__p.operator->()); } +template +struct __has_size_type : false_type {}; + template -struct __has_size_type -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template 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::type> : true_type {}; template ::value> struct __size_type @@ -1153,16 +1124,13 @@ struct __size_type<_Alloc, _DiffType, true> typedef typename _Alloc::size_type type; }; +template +struct __has_propagate_on_container_copy_assignment : false_type {}; + template -struct __has_propagate_on_container_copy_assignment -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template 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::type> + : true_type {}; template ::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 +struct __has_propagate_on_container_move_assignment : false_type {}; + template -struct __has_propagate_on_container_move_assignment -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template 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::type> + : true_type {}; template ::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 +struct __has_propagate_on_container_swap : false_type {}; + template -struct __has_propagate_on_container_swap -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template 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::type> + : true_type {}; template ::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 +struct __has_is_always_equal : false_type {}; + template -struct __has_is_always_equal -{ -private: - struct __two {char __lx; char __lxx;}; - template static __two __test(...); - template 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::type> + : true_type {}; template ::value> struct __is_always_equal @@ -1884,7 +1843,7 @@ class _LIBCPP_TEMPLATE_VIS allocator (publi return static_cast(_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 (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 (publi void construct(pointer __p, _A0& __a0) { - ::new((void*)__p) _Tp(__a0); + ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0); } template _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 @@ -1924,28 +1883,28 @@ class _LIBCPP_TEMPLATE_VIS allocator (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 _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 _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 _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 _LIBCPP_INLINE_VISIBILITY _Dp* __get_deleter() const _NOEXCEPT - {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);} + {return static_cast<_Dp*>(__cntrl_ + ? const_cast(__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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 + * Copyright 2017 RackTop Systems. */ #include @@ -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 . 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 . +Copyright (C) 2002-2017 Jason Evans . 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..initialized + + arena..destroy + + arena..{dirty,muzzy}_decay_ms + + arena..extent_hooks + + arenas.{dirty,muzzy}_decay_ms + + arenas.bin..slab_size + + arenas.nlextents + + arenas.lextent..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..{dirty,muzzy}_decay_ms + + stats.arenas..uptime + + stats.arenas..{pmuzzy,base,internal,resident} + + stats.arenas..{dirty,muzzy}_{npurge,nmadvise,purged} + + stats.arenas..bins..{nslabs,reslabs,curslabs} + + stats.arenas..bins..mutex. + {num_ops,num_spin_acq,num_wait,max_wait_time,total_wait_time,max_num_thds, + num_owner_switch} + + stats.arenas..lextents..{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..lg_dirty_mult + + arena..decay_time + + arena..chunk_hooks + + arenas.initialized + + arenas.lg_dirty_mult + + arenas.decay_time + + arenas.bin..run_size + + arenas.nlruns + + arenas.lrun..size + + arenas.nhchunks + + arenas.hchunk..size + + arenas.extend + + stats.cactive + + stats.arenas..lg_dirty_mult + + stats.arenas..decay_time + + stats.arenas..metadata.{mapped,allocated} + + stats.arenas..{npurge,nmadvise,purged} + + stats.arenas..huge.{allocated,nmalloc,ndalloc,nrequests} + + stats.arenas..bins..{nruns,reruns,curruns} + + stats.arenas..lruns..{nmalloc,ndalloc,nrequests,curruns} + + stats.arenas..hchunks..{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 @@ This manual describes jemalloc @jemalloc_version@. More information can be found at the jemalloc website. + + The following configuration options are enabled in libc's built-in + jemalloc: , -+ , , -+ , , -+ , , and -+ . Additionally, -+ is enabled in development versions of -+ FreeBSD (controlled by the MALLOC_PRODUCTION make -+ variable). ++ , , ++ , and . ++ Additionally, is enabled in development ++ versions of FreeBSD (controlled by the ++ MALLOC_PRODUCTION make variable). + @@ -27,7 +25,7 @@ index c97ab0f..be8dda5 100644 Standard API -@@ -2989,4 +3001,18 @@ malloc_conf = "lg_chunk:24";]]> +@@ -3252,4 +3262,18 @@ malloc_conf = "narenas:1";]]> The posix_memalign() function conforms to IEEE Std 1003.1-2001 (POSIX.1). @@ -46,42 +44,42 @@ index c97ab0f..be8dda5 100644 + 11.0. + -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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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(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(A); - } else { - Dest = Body.getVA(A); - } - return Dest - P; - } - case R_PLT: - return Body.getPltVA() + A; - case R_PLT_PC: - case R_PPC_PLT_OPD: - return Body.getPltVA() + 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