Subject: Re: kern/37576: Reader / writer lock error
To: None <gnats-bugs@NetBSD.org>
From: Patrick Welche <prlw1@newn.cam.ac.uk>
List: netbsd-bugs
Date: 12/21/2007 13:05:24
On Thu, Dec 20, 2007 at 07:20:03PM +0000, Antti Kantee wrote:
> The following reply was made to PR kern/37576; it has been noted by GNATS.
> 
> From: Antti Kantee <pooka@cs.hut.fi>
> To: prlw1@cam.ac.uk
> Cc: gnats-bugs@netbsd.org
> Subject: Re: kern/37576: Reader / writer lock error
> Date: Thu, 20 Dec 2007 21:15:07 +0200
> 
>  On Thu Dec 20 2007 at 18:20:00 +0000, prlw1@cam.ac.uk wrote:
>  > mount -t cd9660 /dev/cd1a /cdrom
>  > 
>  > gives the panic:
>  > 
>  > Reader / writer lock error: lockdebug_alloc: already initialized
>  > 
>  > lock address : 0x00000000d0c95f04 type     :     sleep/adaptive
>  > shared holds :                  0 exclusive:                  0
>  > shares wanted:                  0 exclusive:                  0
>  > current cpu  :                  0 last held:                  0
>  > current lwp  : 0x00000000cd40a8c0 last held: 000000000000000000
>  > last locked  : 000000000000000000 unlocked : 000000000000000000
>  > initialized  : 0x00000000c03b5d00
>  > owner/count  : 000000000000000000 flags    : 000000000000000000
>  
>  Hmm.  I started looking at cd9660_vfsops.c and I could've *sworn* that
>  cd9660_vget_internal() had the call to genfs_node_init() twice one after
>  another.  But when I edited the extra call away, I got no cvs diff and
>  I can't seem to find anything in cvs indicating it ever would have been
>  there twice.  I'm probably just going bananas, but check that your copy
>  doesn't contain two calls.

You are absolutely right:

% cvs diff -u cd9660_vfsops.c
Index: cd9660_vfsops.c
===================================================================
RCS file: /cvsroot/src/sys/fs/cd9660/cd9660_vfsops.c,v
retrieving revision 1.52
diff -u -r1.52 cd9660_vfsops.c
--- cd9660_vfsops.c     8 Dec 2007 19:29:42 -0000       1.52
+++ cd9660_vfsops.c     21 Dec 2007 13:03:24 -0000
@@ -735,6 +735,8 @@
        ip->i_devvp = imp->im_devvp;
        genfs_node_init(vp, &cd9660_genfsops);
 
+       genfs_node_init(vp, &cd9660_genfsops);
+
        /*
         * Put it onto its hash chain and lock it so that other requests for
         * this inode will block if they arrive while we are sleeping waiting


It was patch + cvs update - thank you!

Patrick