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