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

Reply via email to