panic: lockmgr: locking against myself
Matthew Dillon
dillon at apollo.backplane.com
Sun Apr 26 10:16:55 PDT 2009
:It solves the problem with panic and makes kdesu actually work as well,
:but it breaks other things like sh and ssh (and probably more :):
Ow. Ok, I see what I did. I guess I'm not supposed to
NULL-out s_ttyvp there :-)
I'll just use a ref instead so the vrele inside the VOP_CLOSE
doesn't trigger the reclaim. The original use of vhold/vdrop was
because the reference count was being used to figure out when to
disassociate the tty. I fixed the use of v_opencount and the code
uses that now, so we should be able to safely use vref/vrele instead
of vhold/vdrop.
I'm going to hold off the release by one day and get this committed,
please test it today and Monday.
-Matt
diff --git a/sys/kern/tty_tty.c b/sys/kern/tty_tty.c
index ce27467..9b73517 100644
--- a/sys/kern/tty_tty.c
+++ b/sys/kern/tty_tty.c
@@ -135,22 +135,22 @@ retry:
/*
* Avoid a nasty race if we block while getting the lock.
*/
- vhold(ttyvp);
+ vref(ttyvp);
error = vn_lock(ttyvp, LK_EXCLUSIVE | LK_RETRY);
if (error) {
- vdrop(ttyvp);
+ vrele(ttyvp);
goto retry;
}
if (ttyvp != cttyvp(p) || (ttyvp->v_flag & VCTTYISOPEN) == 0) {
kprintf("Warning: cttyclose: race avoided\n");
vn_unlock(ttyvp);
- vdrop(ttyvp);
+ vrele(ttyvp);
goto retry;
}
vclrflags(ttyvp, VCTTYISOPEN);
error = VOP_CLOSE(ttyvp, FREAD|FWRITE);
vn_unlock(ttyvp);
- vdrop(ttyvp);
+ vrele(ttyvp);
} else {
error = 0;
}
More information about the Bugs
mailing list