Date: Mon, 18 Oct 2010 12:30:14 GMT From: Gleb Smirnoff <glebius@FreeBSD.org> To: freebsd-fs@FreeBSD.org Subject: Re: misc/151111: vnodes leakage during zfs unmount Message-ID: <201010181230.o9ICUEAi016474@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/151111; it has been noted by GNATS.
From: Gleb Smirnoff <glebius@FreeBSD.org>
To: "Oleg A. Mamontov" <oleg@mamontov.net>
Cc: kib@FreeBSD.org, pjd@FreeBSD.org, freebsd-gnats-submit@FreeBSD.org
Subject: Re: misc/151111: vnodes leakage during zfs unmount
Date: Mon, 18 Oct 2010 16:11:55 +0400
On Thu, Sep 30, 2010 at 11:56:18AM +0000, Oleg A. Mamontov wrote:
O> for i in `jot 1000`; do zfs mount tank; printf '%4d ' $i; sysctl vfs.numvnodes; zfs umount tank; done
O> ########################
O> 1 vfs.numvnodes: 708
O> 2 vfs.numvnodes: 709
O> 3 vfs.numvnodes: 710
O> 4 vfs.numvnodes: 711
O> 5 vfs.numvnodes: 712
O>
O> ..
O>
O> 995 vfs.numvnodes: 1702
O> 996 vfs.numvnodes: 1703
O> 997 vfs.numvnodes: 1704
O> 998 vfs.numvnodes: 1705
O> 999 vfs.numvnodes: 1706
O> 1000 vfs.numvnodes: 1707
Here is my lame investigation of the problem. In the zfs_domount() function
we've got the following code:
/* Grab extra reference. */
VERIFY(VFS_ROOT(vfsp, LK_EXCLUSIVE, &vp) == 0);
VOP_UNLOCK(vp, 0);
I suppose this code is expected to put an extra reference on the
vfsp->mnt_vnodecovered vnode. Do I mistake here? If I don't then this is
the source of leak.
Debugging shows that zfs_zget(), called subsequently from zfs_root(),
does not find an existing znode/vnode and allocates a new one, see at the
end of zfs_zget() function. This vnode gots a reference and is forgotten.
Sorry, if I am being mistaken :)
--
Totus tuus, Glebius.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201010181230.o9ICUEAi016474>
