diff options
author | Peter Wemm <peter@FreeBSD.org> | 1996-07-26 13:47:38 +0000 |
---|---|---|
committer | Peter Wemm <peter@FreeBSD.org> | 1996-07-26 13:47:38 +0000 |
commit | 446fe15067f6a2f1c54b9c8612e02d729126949b (patch) | |
tree | bb02c50bf5eba2d6a6f4849e08c48c9334c4f1a0 | |
parent | 1cc933d27526112f99bf09679ae8a2b81e6863e2 (diff) | |
download | src-446fe15067f6a2f1c54b9c8612e02d729126949b.tar.gz src-446fe15067f6a2f1c54b9c8612e02d729126949b.zip |
Apply a bandaid to a problem elsewhere in the driver, when the process is
blocked in a write() while waiting for the output to drain, sleep only
for tp->t_timeout, not forever. This only seems to happen when there is
either a modem lockup holding the hardware flow control down, or due to
some problem in the driver with processes attempting to write after the
modem has hung up (eg: elm, tf).
Notes
Notes:
svn path=/head/; revision=17290
-rw-r--r-- | sys/dev/si/si.c | 7 | ||||
-rw-r--r-- | sys/i386/isa/si.c | 7 |
2 files changed, 10 insertions, 4 deletions
diff --git a/sys/dev/si/si.c b/sys/dev/si/si.c index 71dcd53e55b6..650864f1eec0 100644 --- a/sys/dev/si/si.c +++ b/sys/dev/si/si.c @@ -30,7 +30,7 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL THE AUTHORS BE LIABLE. * - * $Id: si.c,v 1.46 1996/06/21 21:35:01 peter Exp $ + * $Id: si.c,v 1.47 1996/06/30 04:56:05 peter Exp $ */ #ifndef lint @@ -1059,8 +1059,11 @@ siwrite(dev, uio, flag) pp->sp_state |= SS_WAITWRITE; DPRINT((pp, DBG_WRITE, "in siwrite, wait for SS_BLOCKWRITE to clear\n")); if (error = ttysleep(tp, (caddr_t)pp, TTOPRI|PCATCH, - "siwrite", 0)) + "siwrite", tp->t_timeout)) { + if (error == ETIMEDOUT) + error = EIO; goto out; + } } error = (*linesw[tp->t_line].l_write)(tp, uio, flag); diff --git a/sys/i386/isa/si.c b/sys/i386/isa/si.c index 71dcd53e55b6..650864f1eec0 100644 --- a/sys/i386/isa/si.c +++ b/sys/i386/isa/si.c @@ -30,7 +30,7 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL THE AUTHORS BE LIABLE. * - * $Id: si.c,v 1.46 1996/06/21 21:35:01 peter Exp $ + * $Id: si.c,v 1.47 1996/06/30 04:56:05 peter Exp $ */ #ifndef lint @@ -1059,8 +1059,11 @@ siwrite(dev, uio, flag) pp->sp_state |= SS_WAITWRITE; DPRINT((pp, DBG_WRITE, "in siwrite, wait for SS_BLOCKWRITE to clear\n")); if (error = ttysleep(tp, (caddr_t)pp, TTOPRI|PCATCH, - "siwrite", 0)) + "siwrite", tp->t_timeout)) { + if (error == ETIMEDOUT) + error = EIO; goto out; + } } error = (*linesw[tp->t_line].l_write)(tp, uio, flag); |