Subject: Re: kern/36669: NetBSD 4.0_BETA2 crashes with "panic: lockmgr: locking against myself"
To: None <gnats-bugs@netbsd.org, netbsd-bugs@netbsd.org, tron@zhadum.org.uk>
From: Antti Kantee <pooka@cs.hut.fi>
List: netbsd-bugs
Date: 07/22/2007 02:35:01
Had a discussion about this with David Holland and finally he suggested
avoiding links to procfs itself. This shouldn't hurt any real uses
and makes the panics go away once again. As a bonus, it's a totally
procfs-contained approach.
Index: procfs_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/miscfs/procfs/procfs_vnops.c,v
retrieving revision 1.157
diff -p -u -p -r1.157 procfs_vnops.c
--- procfs_vnops.c 24 May 2007 00:37:41 -0000 1.157
+++ procfs_vnops.c 21 Jul 2007 23:30:03 -0000
@@ -584,6 +584,18 @@ procfs_dir(pfstype t, struct lwp *caller
return (NULL);
}
+ /*
+ * XXX: this horrible kludge avoids locking panics when
+ * attempting to lookup links that point to within procfs
+ */
+ if (vp != NULL && vp->v_tag == VT_PROCFS) {
+ if (bpp) {
+ *--bp = '/';
+ *bpp = bp;
+ }
+ return vp;
+ }
+
if (rvp == NULL)
rvp = rootvnode;
mutex_exit(&target->p_mutex); /* XXXSMP */
@@ -1590,11 +1602,20 @@ procfs_readlink(v)
}
bp = path + MAXPATHLEN;
*--bp = '\0';
- vp = curproc->p_cwdi->cwdi_rdir; /* XXXSMP */
- if (vp == NULL)
- vp = rootvnode;
- error = getcwd_common(vxp, vp, &bp, path,
- MAXPATHLEN / 2, 0, curlwp);
+
+ /*
+ * XXX: kludge to avoid locking against ourselves
+ * in getcwd()
+ */
+ if (vxp->v_tag == VT_PROCFS) {
+ *--bp = '/';
+ } else {
+ vp = curproc->p_cwdi->cwdi_rdir; /* XXXSMP */
+ if (vp == NULL)
+ vp = rootvnode;
+ error = getcwd_common(vxp, vp, &bp, path,
+ MAXPATHLEN / 2, 0, curlwp);
+ }
FILE_UNUSE(fp, curlwp);
if (error)
break;
--
Antti Kantee <pooka@iki.fi> Of course he runs NetBSD
http://www.iki.fi/pooka/ http://www.NetBSD.org/
"la qualité la plus indispensable du cuisinier est l'exactitude"