svn commit: r335789 - projects/pnfs-planb-server/sys/fs/nfsserver

Rick Macklem rmacklem at FreeBSD.org
Fri Jun 29 01:06:49 UTC 2018


Author: rmacklem
Date: Fri Jun 29 01:06:47 2018
New Revision: 335789
URL: https://svnweb.freebsd.org/changeset/base/335789

Log:
  Fix a bug that was introduced by the recent addition of the "#<mds-path"
  optional suffix and the fact that I didn't realize that
  TAILQ_FOREACH_FROM() will start at the beginning of the list if the first
  argument == NULL when it is called.

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 28 22:24:16 2018	(r335788)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Fri Jun 29 01:06:47 2018	(r335789)
@@ -3881,8 +3881,8 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 	i = dsdir[0] = ds->nfsdev_nextdir;
 	ds->nfsdev_nextdir = (ds->nfsdev_nextdir + 1) % nfsrv_dsdirsize;
 	dvp[0] = ds->nfsdev_dsdir[i];
-	if (nfsrv_maxpnfsmirror > 1) {
-		mds = TAILQ_NEXT(ds, nfsdev_list);
+	mds = TAILQ_NEXT(ds, nfsdev_list);
+	if (nfsrv_maxpnfsmirror > 1 && mds != NULL) {
 		TAILQ_FOREACH_FROM(mds, &nfsrv_devidhead, nfsdev_list) {
 			if (mds->nfsdev_nmp != NULL &&
 			    (mds->nfsdev_mdsisset == 0 ||
@@ -3906,7 +3906,8 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 	if (mirrorcnt > 1)
 		tdsc = dsc = malloc(sizeof(*dsc) * (mirrorcnt - 1), M_TEMP,
 		    M_WAITOK | M_ZERO);
-	tpf = pf = malloc(sizeof(*pf) * mirrorcnt, M_TEMP, M_WAITOK | M_ZERO);
+	tpf = pf = malloc(sizeof(*pf) * nfsrv_maxpnfsmirror, M_TEMP, M_WAITOK |
+	    M_ZERO);
 
 	error = nfsvno_getfh(vp, &fh, p);
 	if (error == 0)
@@ -4014,11 +4015,27 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 	NFSFREECRED(tcred);
 	if (error == 0) {
 		ASSERT_VOP_ELOCKED(vp, "nfsrv_pnfscreate vp");
+
+		NFSD_DEBUG(4, "nfsrv_pnfscreate: mirrorcnt=%d maxmirror=%d\n",
+		    mirrorcnt, nfsrv_maxpnfsmirror);
+		/*
+		 * For all mirrors that couldn't be created, fill in the
+		 * *pf structure, but with an IP address == 0.0.0.0.
+		 */
+		tpf = pf + mirrorcnt;
+		for (i = mirrorcnt; i < nfsrv_maxpnfsmirror; i++, tpf++) {
+			*tpf = *pf;
+			tpf->dsf_sin.sin_family = AF_INET;
+			tpf->dsf_sin.sin_len = sizeof(struct sockaddr_in);
+			tpf->dsf_sin.sin_addr.s_addr = 0;
+			tpf->dsf_sin.sin_port = 0;
+		}
+
 		error = vn_start_write(vp, &mp, V_WAIT);
 		if (error == 0) {
 			error = vn_extattr_set(vp, IO_NODELOCKED,
 			    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
-			    sizeof(*pf) * mirrorcnt, (char *)pf, p);
+			    sizeof(*pf) * nfsrv_maxpnfsmirror, (char *)pf, p);
 			if (error == 0)
 				error = vn_extattr_set(vp, IO_NODELOCKED,
 				    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsattr",


More information about the svn-src-projects mailing list