Subject: kern/5239: mount_null causes kernel panic
To: None <gnats-bugs@gnats.netbsd.org>
From: MINOURA Makoto <minoura@kw.netlaputa.ne.jp>
List: netbsd-bugs
Date: 04/01/1998 07:56:29
>Number: 5239
>Category: kern
>Synopsis: mount_null causes kernel panic
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: kern-bug-people (Kernel Bug People)
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Tue Mar 31 15:05:00 1998
>Last-Modified:
>Originator: MINOURA Makoto
>Organization:
MINOURA, Makoto <minoura@kw.netlaputa.ne.jp> or <minoura@kyogoku.com>
Nakahara-ku Kawasaki-Shi, JAPAN
>Release: Mar. 30
>Environment:
System: NetBSD daisy 1.3E NetBSD 1.3E (DAISY) #45: Tue Mar 31 06:36:37 JST 1998 root@daisy:/usr/src/sys/arch/i386/compile/DAISY i386
>Description:
mount_null always causes kernel panic.
In null_node_create() of null_subr.c, null_node_alloc() is called,
which returns already locked vnode.
If takelock argument is true, null_node_create attempts to lock the
returned vnode again.
>How-To-Repeat:
mount -t null /foo /bar
>Fix:
*** null_subr.c.bak Thu Mar 12 21:13:15 1998
--- null_subr.c Tue Mar 31 06:27:37 1998
***************
*** 250,255 ****
--- 250,256 ----
int takelock;
{
struct vnode *aliasvp;
+ int locked = 0;
if ((aliasvp = null_node_find(mp, lowervp)) != NULL) {
/*
***************
*** 279,284 ****
--- 280,286 ----
/*
* aliasvp is already VREF'd by getnewvnode()
*/
+ locked = 1;
}
vrele(lowervp);
***************
*** 298,305 ****
/* lower node was locked: mark it as locked and take
upper layer lock */
VTONULL(aliasvp)->null_flags |= NULL_LLOCK;
! if (takelock)
! vn_lock(aliasvp, LK_EXCLUSIVE | LK_RETRY);
*newvpp = aliasvp;
return (0);
--- 300,311 ----
/* lower node was locked: mark it as locked and take
upper layer lock */
VTONULL(aliasvp)->null_flags |= NULL_LLOCK;
! if (takelock) {
! if (!locked)
! vn_lock(aliasvp, LK_EXCLUSIVE | LK_RETRY);
! /* else
! printf ("null_node_create: already locked\n");*/
! }
*newvpp = aliasvp;
return (0);
>Audit-Trail:
>Unformatted: