svn commit: r319812 - projects/pnfs-planb-server-stable11/sys/fs/nfs
Rick Macklem
rmacklem at FreeBSD.org
Sat Jun 10 23:32:25 UTC 2017
Author: rmacklem
Date: Sat Jun 10 23:32:23 2017
New Revision: 319812
URL: https://svnweb.freebsd.org/changeset/base/319812
Log:
Update some of the files with the pNFS server changes.
Modified:
projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs.h
projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_commonport.c
projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_commonsubs.c
projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h
Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs.h
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs.h Sat Jun 10 23:26:25 2017 (r319811)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs.h Sat Jun 10 23:32:23 2017 (r319812)
@@ -96,6 +96,7 @@
#define NFSSESSIONHASHSIZE 20 /* Size of server session hash table */
#endif
#define NFSSTATEHASHSIZE 10 /* Size of server stateid hash table */
+#define NFSLAYOUTHASHSIZE 100 /* Size of server layout hash table */
#ifndef NFSCLDELEGHIGHWATER
#define NFSCLDELEGHIGHWATER 10000 /* limit for client delegations */
#endif
@@ -169,13 +170,28 @@ struct nfsd_addsock_args {
/*
* nfsd argument for new krpc.
+ * (New version supports pNFS, indicated by NFSSVC_NEWSTRUCT flag.)
*/
struct nfsd_nfsd_args {
const char *principal; /* GSS-API service principal name */
int minthreads; /* minimum service thread count */
int maxthreads; /* maximum service thread count */
+ int version; /* Allow multiple variants */
+ char *addr; /* pNFS DS addresses */
+ int addrlen; /* Length of addrs */
+ char *dnshost; /* DNS names for DS addresses */
+ int dnshostlen; /* Length of DNS names */
+ char *dspath; /* DS Mount path on MDS */
+ int dspathlen; /* Length of DS Mount path on MDS */
};
+/* Old version. */
+struct nfsd_nfsd_oargs {
+ const char *principal; /* GSS-API service principal name */
+ int minthreads; /* minimum service thread count */
+ int maxthreads; /* maximum service thread count */
+};
+
/*
* Arguments for use by the callback daemon.
*/
@@ -582,8 +598,8 @@ struct nfsrv_descript {
NFSSOCKADDR_T nd_nam2; /* return socket addr */
caddr_t nd_dpos; /* Current dissect pos */
caddr_t nd_bpos; /* Current build pos */
+ u_int64_t nd_flag; /* nd_flag */
u_int16_t nd_procnum; /* RPC # */
- u_int32_t nd_flag; /* nd_flag */
u_int32_t nd_repstat; /* Reply status */
int *nd_errp; /* Pointer to ret status */
u_int32_t nd_retxid; /* Reply xid */
@@ -602,6 +618,8 @@ struct nfsrv_descript {
uint32_t nd_slotid; /* Slotid for this RPC */
SVCXPRT *nd_xprt; /* Server RPC handle */
uint32_t *nd_sequence; /* Sequence Op. ptr */
+ nfsv4stateid_t nd_curstateid; /* Current StateID */
+ nfsv4stateid_t nd_savedcurstateid; /* Saved Current StateID */
};
#define nd_princlen nd_gssnamelen
@@ -638,6 +656,9 @@ struct nfsrv_descript {
#define ND_CACHETHIS 0x08000000
#define ND_LASTOP 0x10000000
#define ND_LOOPBADSESS 0x20000000
+#define ND_DSSERVER 0x40000000
+#define ND_CURSTATEID 0x80000000
+#define ND_SAVEDCURSTATEID 0x100000000
/*
* ND_GSS should be the "or" of all GSS type authentications.
Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_commonport.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_commonport.c Sat Jun 10 23:26:25 2017 (r319811)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_commonport.c Sat Jun 10 23:32:23 2017 (r319812)
@@ -64,6 +64,8 @@ int nfscl_debuglevel = 0;
char nfsv4_callbackaddr[INET6_ADDRSTRLEN];
struct callout newnfsd_callout;
int nfsrv_lughashsize = 100;
+struct mtx nfsrv_dslock_mtx;
+struct nfsdevicehead nfsrv_devidhead;
void (*nfsd_call_servertimer)(void) = NULL;
void (*ncl_call_invalcaches)(struct vnode *) = NULL;
@@ -693,6 +695,8 @@ nfscommon_modevent(module_t mod, int type, void *data)
mtx_init(&nfs_req_mutex, "nfs_req_mutex", NULL, MTX_DEF);
mtx_init(&nfsrv_nfsuserdsock.nr_mtx, "nfsuserd", NULL,
MTX_DEF);
+ mtx_init(&nfsrv_dslock_mtx, "nfs4ds", NULL, MTX_DEF);
+ TAILQ_INIT(&nfsrv_devidhead);
callout_init(&newnfsd_callout, 1);
newnfs_init();
nfsd_call_nfscommon = nfssvc_nfscommon;
@@ -719,6 +723,7 @@ nfscommon_modevent(module_t mod, int type, void *data)
mtx_destroy(&nfs_slock_mutex);
mtx_destroy(&nfs_req_mutex);
mtx_destroy(&nfsrv_nfsuserdsock.nr_mtx);
+ mtx_destroy(&nfsrv_dslock_mtx);
loaded = 0;
break;
default:
Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_commonsubs.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_commonsubs.c Sat Jun 10 23:26:25 2017 (r319811)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_commonsubs.c Sat Jun 10 23:32:23 2017 (r319812)
@@ -71,6 +71,8 @@ int nfsd_enable_stringtouid = 0;
NFSNAMEIDMUTEX;
NFSSOCKMUTEX;
extern int nfsrv_lughashsize;
+extern struct mtx nfsrv_dslock_mtx;
+extern struct nfsdevicehead nfsrv_devidhead;
/*
* This array of structures indicates, for V4:
@@ -1789,6 +1791,40 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
}
attrsum += cnt;
break;
+ case NFSATTRBIT_FSLAYOUTTYPE:
+ case NFSATTRBIT_LAYOUTTYPE:
+ NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
+ attrsum += NFSX_UNSIGNED;
+ i = fxdr_unsigned(int, *tl);
+ if (i > 0) {
+ NFSM_DISSECT(tl, u_int32_t *, i *
+ NFSX_UNSIGNED);
+ attrsum += i * NFSX_UNSIGNED;
+ for (j = 0; j < i; j++) {
+ k = fxdr_unsigned(int, *tl++);
+ if (compare && !(*retcmpp) &&
+ k != NFSLAYOUT_NFSV4_1_FILES)
+ *retcmpp = NFSERR_NOTSAME;
+ }
+ }
+ NFSDDSLOCK();
+ if (TAILQ_EMPTY(&nfsrv_devidhead)) {
+ if (compare && !(*retcmpp) && i > 0)
+ *retcmpp = NFSERR_NOTSAME;
+ } else {
+ if (compare && !(*retcmpp) && i != 1)
+ *retcmpp = NFSERR_NOTSAME;
+ }
+ NFSDDSUNLOCK();
+ break;
+ case NFSATTRBIT_LAYOUTALIGNMENT:
+ case NFSATTRBIT_LAYOUTBLKSIZE:
+ NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
+ attrsum += NFSX_UNSIGNED;
+ i = fxdr_unsigned(int, *tl);
+ if (compare && !(*retcmpp) && i != NFS_SRVMAXIO)
+ *retcmpp = NFSERR_NOTSAME;
+ break;
default:
printf("EEK! nfsv4_loadattr unknown attr=%d\n",
bitpos);
@@ -2534,6 +2570,30 @@ nfsv4_fillattr(struct nfsrv_descript *nd, struct mount
NFSCLRNOTSETABLE_ATTRBIT(&attrbits);
NFSCLRBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESSSET);
retnum += nfsrv_putattrbit(nd, &attrbits);
+ break;
+ case NFSATTRBIT_FSLAYOUTTYPE:
+ case NFSATTRBIT_LAYOUTTYPE:
+ NFSDDSLOCK();
+ if (TAILQ_EMPTY(&nfsrv_devidhead))
+ siz = 1;
+ else
+ siz = 2;
+ NFSDDSUNLOCK();
+ if (siz == 2) {
+ NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+ *tl++ = txdr_unsigned(1); /* One entry. */
+ *tl = txdr_unsigned(NFSLAYOUT_NFSV4_1_FILES);
+ } else {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = 0;
+ }
+ retnum += siz * NFSX_UNSIGNED;
+ break;
+ case NFSATTRBIT_LAYOUTALIGNMENT:
+ case NFSATTRBIT_LAYOUTBLKSIZE:
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = txdr_unsigned(NFS_SRVMAXIO);
+ retnum += NFSX_UNSIGNED;
break;
default:
printf("EEK! Bad V4 attribute bitpos=%d\n", bitpos);
Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h Sat Jun 10 23:26:25 2017 (r319811)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h Sat Jun 10 23:32:23 2017 (r319812)
@@ -61,6 +61,7 @@ union nethostaddr;
struct nfsstate;
struct nfslock;
struct nfsclient;
+struct nfslayout;
struct nfsdsession;
struct nfslockconflict;
struct nfsd_idargs;
@@ -108,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 *);
@@ -127,7 +128,7 @@ int nfsrv_checksetattr(vnode_t, struct nfsrv_descript
nfsv4stateid_t *, struct nfsvattr *, nfsattrbit_t *, struct nfsexstuff *,
NFSPROC_T *);
int nfsrv_checkgetattr(struct nfsrv_descript *, vnode_t,
- struct nfsvattr *, nfsattrbit_t *, struct ucred *, NFSPROC_T *);
+ struct nfsvattr *, nfsattrbit_t *, NFSPROC_T *);
int nfsrv_nfsuserdport(u_short, NFSPROC_T *);
void nfsrv_nfsuserddelport(void);
void nfsrv_throwawayallstate(NFSPROC_T *);
@@ -136,6 +137,19 @@ int nfsrv_checksequence(struct nfsrv_descript *, uint3
int nfsrv_checkreclaimcomplete(struct nfsrv_descript *);
void nfsrv_cache_session(uint8_t *, uint32_t, int, struct mbuf **);
void nfsrv_freeallbackchannel_xprts(void);
+int nfsrv_layoutcommit(struct nfsrv_descript *, vnode_t, int, int, uint64_t,
+ uint64_t, uint64_t, int, struct timespec *, int, nfsv4stateid_t *,
+ int, char *, int *, uint64_t *, struct ucred *, NFSPROC_T *);
+int nfsrv_layoutget(struct nfsrv_descript *, vnode_t, struct nfsexstuff *,
+ int, int *, uint64_t *, uint64_t *, uint64_t, nfsv4stateid_t *, int, int *,
+ int *, char *, struct ucred *, NFSPROC_T *);
+int nfsrv_layoutreturn(struct nfsrv_descript *, vnode_t, int, int, uint64_t,
+ uint64_t, int, int, nfsv4stateid_t *, int, char *, int *, struct ucred *,
+ NFSPROC_T *);
+int nfsrv_getdevinfo(char *, int, uint32_t *, uint32_t *, int *, char **);
+void nfsrv_freealllayoutsanddevids(void);
+void nfsrv_createdevids(struct nfsd_nfsd_args *, NFSPROC_T *);
+int nfsrv_checkdsattr(struct nfsrv_descript *, vnode_t, NFSPROC_T *);
/* nfs_nfsdserv.c */
int nfsrvd_access(struct nfsrv_descript *, int,
@@ -234,8 +248,18 @@ int nfsrvd_destroysession(struct nfsrv_descript *, int
vnode_t, NFSPROC_T *, struct nfsexstuff *);
int nfsrvd_freestateid(struct nfsrv_descript *, int,
vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_getdevinfo(struct nfsrv_descript *, int,
+ vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_layoutcommit(struct nfsrv_descript *, int,
+ vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_layoutget(struct nfsrv_descript *, int,
+ vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_layoutreturn(struct nfsrv_descript *, int,
+ vnode_t, NFSPROC_T *, struct nfsexstuff *);
int nfsrvd_notsupp(struct nfsrv_descript *, int,
vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_notsuppvp(struct nfsrv_descript *, int,
+ vnode_t, NFSPROC_T *, struct nfsexstuff *);
/* nfs_nfsdsocket.c */
void nfsrvd_rephead(struct nfsrv_descript *);
@@ -598,8 +622,8 @@ int ncl_flush(vnode_t, int, NFSPROC_T *, int, int);
void ncl_invalcaches(vnode_t);
/* nfs_nfsdport.c */
-int nfsvno_getattr(vnode_t, struct nfsvattr *, struct ucred *,
- NFSPROC_T *, int);
+int nfsvno_getattr(vnode_t, struct nfsvattr *, struct nfsrv_descript *,
+ NFSPROC_T *, int, nfsattrbit_t *);
int nfsvno_setattr(vnode_t, struct nfsvattr *, struct ucred *,
NFSPROC_T *, struct nfsexstuff *);
int nfsvno_getfh(vnode_t, fhandle_t *, NFSPROC_T *);
@@ -613,7 +637,7 @@ int nfsvno_readlink(vnode_t, struct ucred *, NFSPROC_T
mbuf_t *, int *);
int nfsvno_read(vnode_t, off_t, int, struct ucred *, NFSPROC_T *,
mbuf_t *, mbuf_t *);
-int nfsvno_write(vnode_t, off_t, int, int, int, mbuf_t,
+int nfsvno_write(vnode_t, off_t, int, int, int *, mbuf_t,
char *, struct ucred *, NFSPROC_T *);
int nfsvno_createsub(struct nfsrv_descript *, struct nameidata *,
vnode_t *, struct nfsvattr *, int *, int32_t *, NFSDEV_T, NFSPROC_T *,
@@ -642,7 +666,7 @@ void nfsvno_open(struct nfsrv_descript *, struct namei
nfsv4stateid_t *, struct nfsstate *, int *, struct nfsvattr *, int32_t *,
int, NFSACL_T *, nfsattrbit_t *, struct ucred *, NFSPROC_T *,
struct nfsexstuff *, vnode_t *);
-int nfsvno_updfilerev(vnode_t, struct nfsvattr *, struct ucred *,
+int nfsvno_updfilerev(vnode_t, struct nfsvattr *, struct nfsrv_descript *,
NFSPROC_T *);
int nfsvno_fillattr(struct nfsrv_descript *, struct mount *, vnode_t,
struct nfsvattr *, fhandle_t *, int, nfsattrbit_t *,
@@ -662,6 +686,9 @@ int nfsvno_testexp(struct nfsrv_descript *, struct nfs
uint32_t nfsrv_hashfh(fhandle_t *);
uint32_t nfsrv_hashsessionid(uint8_t *);
void nfsrv_backupstable(void);
+int nfsrv_dsgetdevandfh(struct vnode *, NFSPROC_T *, fhandle_t *, char *);
+int nfsrv_updatemdsattr(struct vnode *, struct nfsvattr *, NFSPROC_T *);
+int nfsrv_dssetacl(struct vnode *, struct acl *, struct ucred *, NFSPROC_T *);
/* nfs_commonkrpc.c */
int newnfs_nmcancelreqs(struct nfsmount *);
More information about the svn-src-projects
mailing list