In vcount(), when getting rid of unused aliases, don't vgone one which

has VXLOCK set - it's already being vgoned, most likely by one of our
callers. If we call vgone, we can end up sleeping against ourself
with VXLOCK set - we'll start the race for root.

Pointed out by Love <lha@stacken.kth.se> on tech-kern. Analysis from
Artur Grabowski <art@openbsd.org> via Love.

Should resolve PR kern/13077
This commit is contained in:
wrstuden 2001-06-26 15:51:06 +00:00
parent 90d0e67408
commit 716d3ae08f
1 changed files with 3 additions and 2 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: vfs_subr.c,v 1.150 2001/06/05 04:42:05 thorpej Exp $ */ /* $NetBSD: vfs_subr.c,v 1.151 2001/06/26 15:51:06 wrstuden Exp $ */
/*- /*-
* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@ -1785,7 +1785,8 @@ loop:
/* /*
* Alias, but not in use, so flush it out. * Alias, but not in use, so flush it out.
*/ */
if (vq->v_usecount == 0 && vq != vp) { if (vq->v_usecount == 0 && vq != vp &&
(vq->v_flag & VXLOCK) == 0) {
simple_unlock(&spechash_slock); simple_unlock(&spechash_slock);
vgone(vq); vgone(vq);
goto loop; goto loop;