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>