Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Feb 2015 01:46:44 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r279224 - in stable/10: sys/kern usr.sbin/mountd
Message-ID:  <201502240146.t1O1kiBv078162@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Tue Feb 24 01:46:43 2015
New Revision: 279224
URL: https://svnweb.freebsd.org/changeset/base/279224

Log:
  MFC r278523:
  In mountd, silence a race with the parallel unmount.

Modified:
  stable/10/sys/kern/vfs_mount.c
  stable/10/usr.sbin/mountd/mountd.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/kern/vfs_mount.c
==============================================================================
--- stable/10/sys/kern/vfs_mount.c	Tue Feb 24 01:00:46 2015	(r279223)
+++ stable/10/sys/kern/vfs_mount.c	Tue Feb 24 01:46:43 2015	(r279224)
@@ -888,12 +888,18 @@ vfs_domount_update(
 
 	ASSERT_VOP_ELOCKED(vp, __func__);
 	KASSERT((fsflags & MNT_UPDATE) != 0, ("MNT_UPDATE should be here"));
+	mp = vp->v_mount;
 
 	if ((vp->v_vflag & VV_ROOT) == 0) {
+		if (vfs_copyopt(*optlist, "export", &export, sizeof(export))
+		    == 0)
+			error = EXDEV;
+		else
+			error = EINVAL;
 		vput(vp);
-		return (EINVAL);
+		return (error);
 	}
-	mp = vp->v_mount;
+
 	/*
 	 * We only allow the filesystem to be reloaded if it
 	 * is currently mounted read-only.

Modified: stable/10/usr.sbin/mountd/mountd.c
==============================================================================
--- stable/10/usr.sbin/mountd/mountd.c	Tue Feb 24 01:00:46 2015	(r279223)
+++ stable/10/usr.sbin/mountd/mountd.c	Tue Feb 24 01:46:43 2015	(r279224)
@@ -1747,8 +1747,12 @@ get_exportlist(void)
 		iov[5].iov_len = strlen(fsp->f_mntfromname) + 1;
 		errmsg[0] = '\0';
 
+		/*
+		 * EXDEV is returned when path exists but is not a
+		 * mount point.  May happens if raced with unmount.
+		 */
 		if (nmount(iov, iovlen, fsp->f_flags) < 0 &&
-		    errno != ENOENT && errno != ENOTSUP) {
+		    errno != ENOENT && errno != ENOTSUP && errno != EXDEV) {
 			syslog(LOG_ERR,
 			    "can't delete exports for %s: %m %s",
 			    fsp->f_mntonname, errmsg);



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