Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 Aug 2017 00:59:48 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r322127 - in projects/pnfs-planb-server-stable11/sys/fs: nfs nfsserver
Message-ID:  <201708070059.v770xmQx002362@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Mon Aug  7 00:59:47 2017
New Revision: 322127
URL: https://svnweb.freebsd.org/changeset/base/322127

Log:
  Add some code for Flex Files layout. No semantic change.

Modified:
  projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h
  projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsproto.h
  projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.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	Sun Aug  6 22:14:54 2017	(r322126)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfs_var.h	Mon Aug  7 00:59:47 2017	(r322127)
@@ -686,7 +686,8 @@ 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_dsgetdevandfh(struct vnode *, NFSPROC_T *, int *, fhandle_t *,
+    char *);
 int nfsrv_updatemdsattr(struct vnode *, struct nfsvattr *, NFSPROC_T *);
 int nfsrv_dssetacl(struct vnode *, struct acl *, struct ucred *, NFSPROC_T *);
 

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsproto.h
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsproto.h	Sun Aug  6 22:14:54 2017	(r322126)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfs/nfsproto.h	Mon Aug  7 00:59:47 2017	(r322127)
@@ -658,6 +658,12 @@
 #define	NFSFLAYUTIL_COMMIT_THRU_MDS	0x2
 #define	NFSFLAYUTIL_STRIPE_MASK		0xffffffc0
 
+/* Flags for Flex File Layout. */
+#define	NFSFLEXFLAG_NO_LAYOUTCOMMIT	0x00000001
+#define	NFSFLEXFLAG_NOIO_MDS		0x00000002
+#define	NFSFLEXFLAG_NO_READIO		0x00000004
+#define	NFSFLEXFLAG_WRITE_ONEMIRROR	0x00000008
+
 #if defined(_KERNEL) || defined(KERNEL)
 /* Conversion macros */
 #define	vtonfsv2_mode(t,m) 						\

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Sun Aug  6 22:14:54 2017	(r322126)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Mon Aug  7 00:59:47 2017	(r322127)
@@ -4478,7 +4478,8 @@ nfsrv_getattrdsrpc(fhandle_t *fhp, struct ucred *cred,
  * Get the device id and file handle for a DS file.
  */
 int
-nfsrv_dsgetdevandfh(struct vnode *vp, NFSPROC_T *p, fhandle_t *fhp, char *devid)
+nfsrv_dsgetdevandfh(struct vnode *vp, NFSPROC_T *p, int *mirrorcntp,
+    fhandle_t *fhp, char *devid)
 {
 	int buflen, error;
 	char *buf;
@@ -4487,6 +4488,7 @@ nfsrv_dsgetdevandfh(struct vnode *vp, NFSPROC_T *p, fh
 	buf = malloc(buflen, M_TEMP, M_WAITOK);
 	error = nfsrv_dsgetsockmnt(vp, 0, buf, buflen, p, NULL, NULL, fhp,
 	    devid, NULL);
+	*mirrorcntp = 1;
 	free(buf, M_TEMP);
 	return (error);
 }

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c	Sun Aug  6 22:14:54 2017	(r322126)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdstate.c	Mon Aug  7 00:59:47 2017	(r322127)
@@ -195,6 +195,10 @@ static void nfsrv_freealldevids(void);
 static int nfsrv_findlayout(struct nfsrv_descript *nd, fhandle_t *fhp,
     int laytype, NFSPROC_T *, struct nfslayout **lypp);
 static int nfsrv_fndclid(nfsquad_t *clidvec, nfsquad_t clid, int clidcnt);
+static struct nfslayout *nfsrv_filelayout(struct nfsrv_descript *nd, int iomode,
+    fhandle_t *fhp, fhandle_t *dsfhp, char *devid);
+static struct nfslayout *nfsrv_flexlayout(struct nfsrv_descript *nd, int iomode,
+    int mirrorcnt, fhandle_t *fhp, fhandle_t *dsfhp, char *devid);
 
 /*
  * Scan the client list for a match and either return the current one,
@@ -6208,13 +6212,11 @@ nfsrv_layoutget(struct nfsrv_descript *nd, vnode_t vp,
     uint64_t minlen, nfsv4stateid_t *stateidp, int maxcnt, int *retonclose,
     int *layoutlenp, char *layp, struct ucred *cred, NFSPROC_T *p)
 {
-	uint32_t *tl;
 	struct nfslayouthash *lhyp;
 	struct nfslayout *lyp;
-	char devid[NFSX_V4DEVICEID];
-	fhandle_t fh, dsfh;
-	uint64_t pattern_offset;
-	int error;
+	char *devid;
+	fhandle_t fh, *dsfhp;
+	int error, mirrorcnt;
 
 	if (layouttype != NFSLAYOUT_NFSV4_1_FILES)
 		return (NFSERR_UNKNLAYOUTTYPE);
@@ -6283,19 +6285,55 @@ nfsrv_layoutget(struct nfsrv_descript *nd, vnode_t vp,
 	NFSUNLOCKLAYOUT(lhyp);
 
 	/* Find the device id and file handle. */
-	error = nfsrv_dsgetdevandfh(vp, p, &dsfh, devid);
+	dsfhp = malloc(sizeof(fhandle_t) * nfsrv_maxpnfsmirror, M_TEMP,
+	    M_WAITOK);
+	devid = malloc(NFSX_V4DEVICEID * nfsrv_maxpnfsmirror, M_TEMP, M_WAITOK);
+	error = nfsrv_dsgetdevandfh(vp, p, &mirrorcnt, dsfhp, devid);
 	NFSD_DEBUG(4, "layoutget devandfh=%d\n", error);
+	if (error == 0) {
+		if (layouttype == NFSLAYOUT_NFSV4_1_FILES)
+			lyp = nfsrv_filelayout(nd, *iomode, &fh, dsfhp, devid);
+		else
+			lyp = nfsrv_flexlayout(nd, *iomode, mirrorcnt, &fh,
+			    dsfhp, devid);
+	}
+	free(dsfhp, M_TEMP);
+	free(devid, M_TEMP);
 	if (error != 0)
 		return (error);
 
+	/*
+	 * Now, add this layout to the list.
+	 */
+	error = nfsrv_addlayout(nd, &lyp, stateidp, layp, layoutlenp, p);
+	NFSD_DEBUG(4, "layoutget addl=%d\n", error);
+	/*
+	 * The lyp will be set to NULL by nfsrv_addlayout() if it
+	 * linked the new structure into the lists.
+	 */
+	free(lyp, M_NFSDSTATE);
+	return (error);
+}
+
+/*
+ * Generate a File Layout.
+ */
+static struct nfslayout *
+nfsrv_filelayout(struct nfsrv_descript *nd, int iomode, fhandle_t *fhp,
+    fhandle_t *dsfhp, char *devid)
+{
+	uint32_t *tl;
+	struct nfslayout *lyp;
+	uint64_t pattern_offset;
+
 	lyp = malloc(sizeof(struct nfslayout) + NFSX_V4FILELAYOUT, M_NFSDSTATE,
 	    M_WAITOK | M_ZERO);
-	lyp->lay_type = layouttype;
-	if (*iomode == NFSLAYOUTIOMODE_RW)
+	lyp->lay_type = NFSLAYOUT_NFSV4_1_FILES;
+	if (iomode == NFSLAYOUTIOMODE_RW)
 		lyp->lay_rw = 1;
 	else
 		lyp->lay_read = 1;
-	NFSBCOPY(&fh, &lyp->lay_fh, sizeof(fh));
+	NFSBCOPY(fhp, &lyp->lay_fh, sizeof(*fhp));
 	lyp->lay_clientid.qval = nd->nd_clientid.qval;
 
 	/* Fill in the xdr for the files layout. */
@@ -6316,20 +6354,60 @@ nfsrv_layoutget(struct nfsrv_descript *nd, vnode_t vp,
 	txdr_hyper(pattern_offset, tl); tl += 2;	/* Pattern offset. */
 	*tl++ = txdr_unsigned(1);			/* 1 file handle. */
 	*tl++ = txdr_unsigned(NFSX_V4PNFSFH);
-	NFSBCOPY(&dsfh, tl, sizeof(dsfh));
+	NFSBCOPY(dsfhp, tl, sizeof(*dsfhp));
 	lyp->lay_layoutlen = NFSX_V4FILELAYOUT;
+	return (lyp);
+}
 
-	/*
-	 * Now, add this layout to the list.
-	 */
-	error = nfsrv_addlayout(nd, &lyp, stateidp, layp, layoutlenp, p);
-	NFSD_DEBUG(4, "layoutget addl=%d\n", error);
-	/*
-	 * The lyp will be set to NULL by nfsrv_addlayout() if it
-	 * linked the new structure into the lists.
-	 */
-	free(lyp, M_NFSDSTATE);
-	return (error);
+/*
+ * Generate a Flex File Layout.
+ */
+static struct nfslayout *
+nfsrv_flexlayout(struct nfsrv_descript *nd, int iomode, int mirrorcnt,
+    fhandle_t *fhp, fhandle_t *dsfhp, char *devid)
+{
+	uint32_t *tl;
+	struct nfslayout *lyp;
+	uint64_t lenval;
+	int i;
+
+	lyp = malloc(sizeof(struct nfslayout) + NFSX_V4FLEXLAYOUT(mirrorcnt),
+	    M_NFSDSTATE, M_WAITOK | M_ZERO);
+	lyp->lay_type = NFSLAYOUT_FLEXFILE;
+	if (iomode == NFSLAYOUTIOMODE_RW)
+		lyp->lay_rw = 1;
+	else
+		lyp->lay_read = 1;
+	NFSBCOPY(fhp, &lyp->lay_fh, sizeof(*fhp));
+	lyp->lay_clientid.qval = nd->nd_clientid.qval;
+
+	/* Fill in the xdr for the files layout. */
+	tl = (uint32_t *)lyp->lay_xdr;
+	lenval = 0;
+	txdr_hyper(lenval, tl); tl += 2;		/* Stripe unit. */
+	*tl++ = txdr_unsigned(mirrorcnt);		/* # of mirrors. */
+	for (i = 0; i < mirrorcnt; i++) {
+		*tl++ = txdr_unsigned(1);		/* One stripe. */
+		NFSBCOPY(devid, tl, NFSX_V4DEVICEID);	/* Device ID. */
+		tl += (NFSX_V4DEVICEID / NFSX_UNSIGNED);
+		devid += NFSX_V4DEVICEID;
+		*tl++ = txdr_unsigned(1);		/* Efficiency. */
+		*tl++ = 0xffffffff;			/* Proxy Stateid. */
+		*tl++ = 0x55555555;
+		*tl++ = 0x55555555;
+		*tl++ = 0x55555555;
+		*tl++ = txdr_unsigned(1);		/* 1 file handle. */
+		*tl++ = txdr_unsigned(NFSX_V4PNFSFH);
+		NFSBCOPY(dsfhp, tl, sizeof(*dsfhp));
+		tl += (NFSM_RNDUP(NFSX_V4PNFSFH) / NFSX_UNSIGNED);
+		dsfhp++;
+		*tl++ = 0;				/* Nil Owner. */
+		*tl++ = 0;				/* Nil Owner_group. */
+	}
+	*tl++ = txdr_unsigned(NFSFLEXFLAG_NOIO_MDS);	/* ff_flags. */
+	*tl = txdr_unsigned(60);		/* Status interval hint. */
+	lyp->lay_layoutlen = NFSX_V4FLEXLAYOUT(mirrorcnt);
+	return (lyp);
 }
 
 /*



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