From owner-freebsd-bugs  Tue Sep  5 10:12:41 2000
Delivered-To: freebsd-bugs@freebsd.org
Received: from segfault.kiev.ua (segfault.kiev.ua [193.193.193.4])
	by hub.freebsd.org (Postfix) with ESMTP id 536AA37B42C
	for <freebsd-bugs@freebsd.org>; Tue,  5 Sep 2000 10:12:36 -0700 (PDT)
Received: from nn.kiev.ua (nn.kiev.ua [193.193.193.203])
	by segfault.kiev.ua (8) with ESMTP id UEV47650
	for <freebsd-bugs@freebsd.org>; Tue, 5 Sep 2000 20:12:30 +0300 (EEST)
	(envelope-from netch@nn.kiev.ua)
Received: (from netch@localhost)
	by nn.kiev.ua (8.11.0/8.11.0) id e85H9C804397
	for freebsd-bugs@freebsd.org; Tue, 5 Sep 2000 20:09:12 +0300 (EEST)
	(envelope-from netch)
Date: Tue, 5 Sep 2000 20:09:12 +0300
From: Valentin Nechayev <netch@segfault.kiev.ua>
To: freebsd-bugs@freebsd.org
Subject: src/sys/isa/sio.c
Message-ID: <20000905200912.A4144@nn.kiev.ua>
Reply-To: netch@segfault.kiev.ua
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
X-Mailer: Mutt 0.95.3i
X-42: On
Sender: owner-freebsd-bugs@FreeBSD.ORG
Precedence: bulk
X-Loop: FreeBSD.org

It seems to me that in some cases, sioopen() does not restore spl.
Also, comhardclose() and testing com->wopeners may require spltty (but I'm
not sure). The patch in question follows.
Original version is
`FreeBSD: src/sys/isa/sio.c,v 1.304 2000/08/15 21:03:28 peter Exp'

--- sio.c.orig	Wed Aug 16 23:08:21 2000
+++ sio.c	Tue Sep  5 19:37:21 2000
@@ -1380,8 +1380,10 @@
 open_top:
 	while (com->state & CS_DTR_OFF) {
 		error = tsleep(&com->dtr_wait, TTIPRI | PCATCH, "siodtr", 0);
-		if (com_addr(unit) == NULL)
+		if (com_addr(unit) == NULL) {
+			splx(s);
 			return (ENXIO);
+		}
 		if (error != 0 || com->gone)
 			goto out;
 	}
@@ -1403,8 +1405,10 @@
 				}
 				error =	tsleep(&com->active_out,
 					       TTIPRI | PCATCH, "siobi", 0);
-				if (com_addr(unit) == NULL)
-					return (ENXIO);
+				if (com_addr(unit) == NULL) {
+					error = ENXIO;
+					goto out;
+				}
 				if (error != 0 || com->gone)
 					goto out;
 				goto open_top;
@@ -1511,8 +1515,10 @@
 	    && !(tp->t_cflag & CLOCAL) && !(flag & O_NONBLOCK)) {
 		++com->wopeners;
 		error = tsleep(TSA_CARR_ON(tp), TTIPRI | PCATCH, "siodcd", 0);
-		if (com_addr(unit) == NULL)
-			return (ENXIO);
+		if (com_addr(unit) == NULL) {
+			error = ENXIO;
+			goto out;
+		}
 		--com->wopeners;
 		if (error != 0 || com->gone)
 			goto out;
@@ -1524,9 +1530,9 @@
 		com->active_out = TRUE;
 	siosettimeout();
 out:
-	splx(s);
 	if (!(tp->t_state & TS_ISOPEN) && com->wopeners == 0)
 		comhardclose(com);
+	splx(s);
 	return (error);
 }
 

/netch


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message