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);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to