svn commit: r270183 - head/usr.sbin/mountd

Bryan Drewery bdrewery at FreeBSD.org
Tue Aug 19 21:04:32 UTC 2014


Author: bdrewery
Date: Tue Aug 19 21:04:31 2014
New Revision: 270183
URL: http://svnweb.freebsd.org/changeset/base/270183

Log:
  Avoid showing stale errors when nmount(2) fails.
  
  Sometimes nmount(2) will fail without setting errmsg. The previous (ignored)
  error would then be shown as the reason for the failed call if the next
  nmount(2) also fails without [ENOENT,ENOTSUP].
  
  An example is when there is a tmpfs mounted with -o size. vfs_filteropt() adds
  'size' as an error in errmsg due to 'size' not being in tmpfs_updateopts. Then
  tmpfs_mount returns [ENOTSUP] from nmount(2), which is then ignored. The next
  call may race with an unmount causing an invalid [EINVAL] that then does log an
  error, with the tmpfs errmsg.
  
  The race itself is a separate issue to fix as it is expected to have an
  [ENOENT] returned instead.
  
  In this example the mount being shown is actually nullfs, not tmpfs that the
  error is from.
  
    mountd[740]: can't delete exports for /poudriere/data/.m/exp-head-commit-test-devel/04/.npkg: Invalid argument mount option <size> is unknown
  
  It should only show:
  
    mountd[740]: can't delete exports for /poudriere/data/.m/exp-head-commit-test-devel/04/.npkg: Invalid argument
  
  MFC after:	2 weeks

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

Modified: head/usr.sbin/mountd/mountd.c
==============================================================================
--- head/usr.sbin/mountd/mountd.c	Tue Aug 19 20:53:28 2014	(r270182)
+++ head/usr.sbin/mountd/mountd.c	Tue Aug 19 21:04:31 2014	(r270183)
@@ -1744,6 +1744,7 @@ get_exportlist(void)
 		iov[3].iov_len = strlen(fsp->f_mntonname) + 1;
 		iov[5].iov_base = fsp->f_mntfromname;
 		iov[5].iov_len = strlen(fsp->f_mntfromname) + 1;
+		errmsg[0] = '\0';
 
 		if (nmount(iov, iovlen, fsp->f_flags) < 0 &&
 		    errno != ENOENT && errno != ENOTSUP) {
@@ -2501,6 +2502,7 @@ do_mount(struct exportlist *ep, struct g
 			iov[3].iov_len = strlen(fsb->f_mntonname) + 1;
 			iov[5].iov_base = fsb->f_mntfromname; /* "from" */
 			iov[5].iov_len = strlen(fsb->f_mntfromname) + 1;
+			errmsg[0] = '\0';
 	
 			while (nmount(iov, iovlen, fsb->f_flags) < 0) {
 				if (cp)


More information about the svn-src-all mailing list