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