On Wed, Jul 04, 2018 at 05:48:21PM +0200, Alexander Bluhm wrote:
> On Mon, Jun 04, 2018 at 08:53:49PM +0200, Alexander Bluhm wrote:
> > userret: returning with the following locks held:
> > exclusive rrwlock inode r = 0 (0xffffff023d492b48) locked @
> > /usr/src/sys/ufs/uf
> > s/ufs_vnops.c:1559
> > #0 witness_lock+0x254
> > #1 _rw_enter+0x29b
> > #2 _rrw_enter+0x3e
> > #3 VOP_LOCK+0x3d
> > #4 vn_lock+0x34
> > #5 vget+0xf7
> > #6 cache_lookup+0x217
> > #7 ufs_lookup+0x112
> > #8 VOP_LOOKUP+0x4f
> > #9 vfs_lookup+0x27e
> > #10 namei+0x226
> > #11 vn_open+0xcf
> > #12 doopenat+0x1af
> > #13 syscall+0x32a
> > #14 Xsyscall_untramp+0xc0
> > panic: witness_warn
>
> We are leaking a vnode in namei(). The mount check was copied from
> NetBSD in 2003. Later in 2006 they added a vput(). As we have not
> locked the directory vnode, call vrele() there.
>
> ok?
>
> bluhm
>
> Index: kern/vfs_lookup.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/kern/vfs_lookup.c,v
> retrieving revision 1.69
> diff -u -p -r1.69 vfs_lookup.c
> --- kern/vfs_lookup.c 2 May 2018 02:24:56 -0000 1.69
> +++ kern/vfs_lookup.c 4 Jul 2018 10:44:48 -0000
> @@ -203,6 +203,8 @@ fail:
> if (!dp->v_mount) {
> /* Give up if the directory is no longer mounted */
> pool_put(&namei_pool, cnp->cn_pnbuf);
> + vrele(dp);
> + ndp->ni_vp = NULL;
> return (ENOENT);
> }
> cnp->cn_nameptr = cnp->cn_pnbuf;
>
Makes sense to me. ok krw@ fwiw.
.... Ken