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

Bryan Drewery bdrewery at FreeBSD.org
Tue Aug 19 21:24:46 UTC 2014


On 8/19/2014 4:04 PM, Bryan Drewery wrote:
> 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.

The actual race causing the EINVAL is here with a proposed patch:

http://lists.freebsd.org/pipermail/freebsd-fs/2013-August/018008.html

I have not spent time analyzing/testing it yet.

>   
>   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)
> 


-- 
Regards,
Bryan Drewery

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freebsd.org/pipermail/svn-src-head/attachments/20140819/6ddd1db1/attachment-0001.sig>


More information about the svn-src-head mailing list