misc/151111: vnodes leakage during zfs unmount
Gleb Smirnoff
glebius at FreeBSD.org
Mon Oct 18 12:30:14 UTC 2010
The following reply was made to PR kern/151111; it has been noted by GNATS.
From: Gleb Smirnoff <glebius at FreeBSD.org>
To: "Oleg A. Mamontov" <oleg at mamontov.net>
Cc: kib at FreeBSD.org, pjd at FreeBSD.org, freebsd-gnats-submit at 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.
More information about the freebsd-fs
mailing list