Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 Jul 2018 19:26:31 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r335871 - head/usr.sbin/nfsd
Message-ID:  <201807021926.w62JQVHD008950@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Mon Jul  2 19:26:31 2018
New Revision: 335871
URL: https://svnweb.freebsd.org/changeset/base/335871

Log:
  Add an optional feature to the pNFS server.
  
  Without this patch, the pNFS server distributes the data storage files across
  all of the specified DSs.
  A tester noted that it would be nice if a system administrator could control
  which DSs are used to store the file data for a given exported MDS file system.
  This patch adds an optional suffix for each entry in the "-p" option argument
  that specifies "store file data for this MDS file system" in this DS.
  The patch should only affect sites using the pNFS server (specified via the
  "-p" command line option for nfsd.
  The interface between the nfsd and the kernel has changed with this patch,
  so anyone using the "-p" option needs to rebuild their nfsd from sources
  with this patch applied to them.
  
  Discussed with:	james.rose@framestore.com

Modified:
  head/usr.sbin/nfsd/nfsd.c

Modified: head/usr.sbin/nfsd/nfsd.c
==============================================================================
--- head/usr.sbin/nfsd/nfsd.c	Mon Jul  2 19:21:33 2018	(r335870)
+++ head/usr.sbin/nfsd/nfsd.c	Mon Jul  2 19:26:31 2018	(r335871)
@@ -1180,9 +1180,11 @@ static void
 parse_dsserver(const char *optionarg, struct nfsd_nfsd_args *nfsdargp)
 {
 	char *ad, *cp, *cp2, *dsaddr, *dshost, *dspath, *dsvol, nfsprt[9];
+	char *mdspath, *mdsp;
 	int ecode;
 	u_int adsiz, dsaddrcnt, dshostcnt, dspathcnt, hostsiz, pathsiz;
-	size_t dsaddrsiz, dshostsiz, dspathsiz, nfsprtsiz;
+	u_int mdspathcnt;
+	size_t dsaddrsiz, dshostsiz, dspathsiz, nfsprtsiz, mdspathsiz;
 	struct addrinfo hints, *ai_tcp;
 	struct sockaddr_in sin;
 
@@ -1206,6 +1208,11 @@ parse_dsserver(const char *optionarg, struct nfsd_nfsd
 	dsaddr = malloc(dsaddrsiz);
 	if (dsaddr == NULL)
 		errx(1, "Out of memory");
+	mdspathsiz = 1024;
+	mdspathcnt = 0;
+	mdspath = malloc(mdspathsiz);
+	if (mdspath == NULL)
+		errx(1, "Out of memory");
 
 	/* Put the NFS port# in "." form. */
 	snprintf(nfsprt, 9, ".%d.%d", 2049 >> 8, 2049 & 0xff);
@@ -1227,6 +1234,14 @@ parse_dsserver(const char *optionarg, struct nfsd_nfsd
 			usage();
 		*dsvol++ = '\0';
 
+		/* Optional path for MDS file system to be stored on DS. */
+		mdsp = strchr(dsvol, '#');
+		if (mdsp != NULL) {
+			if (*(mdsp + 1) == '\0' || mdsp <= dsvol)
+				usage();
+			*mdsp++ = '\0';
+		}
+
 		/* Append this pathname to dspath. */
 		pathsiz = strlen(dsvol);
 		if (dspathcnt + pathsiz + 1 > dspathsiz) {
@@ -1238,6 +1253,23 @@ parse_dsserver(const char *optionarg, struct nfsd_nfsd
 		strcpy(&dspath[dspathcnt], dsvol);
 		dspathcnt += pathsiz + 1;
 
+		/* Append this pathname to mdspath. */
+		if (mdsp != NULL)
+			pathsiz = strlen(mdsp);
+		else
+			pathsiz = 0;
+		if (mdspathcnt + pathsiz + 1 > mdspathsiz) {
+			mdspathsiz *= 2;
+			mdspath = realloc(mdspath, mdspathsiz);
+			if (mdspath == NULL)
+				errx(1, "Out of memory");
+		}
+		if (mdsp != NULL)
+			strcpy(&mdspath[mdspathcnt], mdsp);
+		else
+			mdspath[mdspathcnt] = '\0';
+		mdspathcnt += pathsiz + 1;
+
 		if (ai_tcp != NULL)
 			freeaddrinfo(ai_tcp);
 
@@ -1290,6 +1322,8 @@ parse_dsserver(const char *optionarg, struct nfsd_nfsd
 	nfsdargp->dnshostlen = dshostcnt;
 	nfsdargp->dspath = dspath;
 	nfsdargp->dspathlen = dspathcnt;
+	nfsdargp->mdspath = mdspath;
+	nfsdargp->mdspathlen = mdspathcnt;
 	freeaddrinfo(ai_tcp);
 }
 



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