From 054b7d868ed9677655e6f48bd7aa266f0b482e7c Mon Sep 17 00:00:00 2001 From: Paul Fulghum Date: Sat, 12 May 2007 10:36:55 -0700 Subject: [PATCH] --- yaml --- r: 56313 b: refs/heads/master c: c5c34d4862e18ef07c1276d233507f540fb5a532 h: refs/heads/master i: 56311: 544f854fb434fde28f36b836cebafb3746e3a16c v: v3 --- [refs] | 2 +- trunk/drivers/char/tty_io.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index b1270eb65c00..43344811322e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e3bf460f3eb86cdbc76725a0dac1f191e796676c +refs/heads/master: c5c34d4862e18ef07c1276d233507f540fb5a532 diff --git a/trunk/drivers/char/tty_io.c b/trunk/drivers/char/tty_io.c index bc849957508d..75d2a46e106f 100644 --- a/trunk/drivers/char/tty_io.c +++ b/trunk/drivers/char/tty_io.c @@ -368,6 +368,29 @@ static void tty_buffer_free(struct tty_struct *tty, struct tty_buffer *b) } } +/** + * tty_buffer_flush - flush full tty buffers + * @tty: tty to flush + * + * flush all the buffers containing receive data + * + * Locking: none + */ + +static void tty_buffer_flush(struct tty_struct *tty) +{ + struct tty_buffer *thead; + unsigned long flags; + + spin_lock_irqsave(&tty->buf.lock, flags); + while((thead = tty->buf.head) != NULL) { + tty->buf.head = thead->next; + tty_buffer_free(tty, thead); + } + tty->buf.tail = NULL; + spin_unlock_irqrestore(&tty->buf.lock, flags); +} + /** * tty_buffer_find - find a free tty buffer * @tty: tty owning the buffer @@ -1248,6 +1271,7 @@ void tty_ldisc_flush(struct tty_struct *tty) ld->flush_buffer(tty); tty_ldisc_deref(ld); } + tty_buffer_flush(tty); } EXPORT_SYMBOL_GPL(tty_ldisc_flush); @@ -3350,6 +3374,15 @@ int tty_ioctl(struct inode * inode, struct file * file, case TIOCMBIC: case TIOCMBIS: return tty_tiocmset(tty, file, cmd, p); + case TCFLSH: + switch (arg) { + case TCIFLUSH: + case TCIOFLUSH: + /* flush tty buffer and allow ldisc to process ioctl */ + tty_buffer_flush(tty); + break; + } + break; } if (tty->driver->ioctl) { retval = (tty->driver->ioctl)(tty, file, cmd, arg);