Date: Mon, 12 Aug 2013 16:50:06 +0200 From: Andreas Longwitz <longwitz@incore.de> To: freebsd-fs@freebsd.org Subject: mountd: can't delete exports for ... Invalid argument Message-ID: <5208F61E.50400@incore.de>
next in thread | raw e-mail | index | archive | help
I have a lot of messages like
mountd[2596]: can't delete exports for
/home/poudriere/data/build/j8sp64-PT2/01/new_packages: Invalid argument
in /var/log/messages on my server running poudriere and NFS (same server
as described in PR kern/180060). The poudriere software does a lot of
mount/umounts on zfs and nullfs file systems. After every successfull
mount the mount program sends SIGHUP to mountd. mountd starts calling
getmntinfo() to get a list of all mounts in the system (ca. 50 on my
system) and continues with nmount("update, export, export.ex_flags =
MNT_DELEXPORT") for every mountpoint in the system. If poudriere has
just unmounted a filesystem in the time gap between getmntinfo() and
nmount() then mountd prints the error message complaining about Invalid
argument.
In the described situation the kernel returns on the nmount() with
EINVAL in vfs_mount.c, because the concerned vnode is not the root of
the filesystem any more:
/*
* Get vnode to be covered
*/
NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_SYSSPACE,
fspath, td);
if ((error = namei(&nd)) != 0)
return (error);
NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
if (fsflags & MNT_UPDATE) {
if ((vp->v_vflag & VV_ROOT) == 0) {
vput(vp);
return (EINVAL);
}
With the following patch mountd ignores the kernel returncode and I see
no "can't delete exports" messages anymore.
--- vfs_mount.c.1st 2013-04-03 20:01:16.000000000 +0200
+++ vfs_mount.c 2013-08-12 14:57:06.000000000 +0200
@@ -900,7 +900,11 @@
if (fsflags & MNT_UPDATE) {
if ((vp->v_vflag & VV_ROOT) == 0) {
vput(vp);
- return (EINVAL);
+ if ((vfs_copyopt(fsdata, "export", &export,
sizeof(export)) == 0)
+ && (export.ex_flags & MNT_DELEXPORT))
+ return (ENOENT);
+ else
+ return (EINVAL);
}
mp = vp->v_mount;
MNT_ILOCK(mp);
Maybe the kernel can return ENOENT instead of EINVAL all the time, but I
am not quite sure.
--
Andreas Longwitz
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5208F61E.50400>
