[PATCH] tty flush flip buffer on ldisc input queue flush

2007-05-07 Thread Paul Fulghum
Flush the tty flip buffer when the line discipline
input queue is flushed, including the user call
tcflush(TCIFLUSH/TCIOFLUSH). This prevents unexpected
stale data after a user application calls tcflush().

Cc: Alan Cox <[EMAIL PROTECTED]>
Cc: Antonino Ingargiola <[EMAIL PROTECTED]>
Signed-off-by: Paul Fulghum <[EMAIL PROTECTED]>

--- a/drivers/char/tty_io.c 2007-05-04 05:46:55.0 -0500
+++ b/drivers/char/tty_io.c 2007-05-05 03:23:46.0 -0500
@@ -365,6 +365,29 @@ static void tty_buffer_free(struct tty_s
 }
 
 /**
+ * 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(>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(>buf.lock, flags);
+}
+
+/**
  * tty_buffer_find -   find a free tty buffer
  * @tty: tty owning the buffer
  * @size: characters wanted
@@ -1240,6 +1263,7 @@ void tty_ldisc_flush(struct tty_struct *
ld->flush_buffer(tty);
tty_ldisc_deref(ld);
}
+   tty_buffer_flush(tty);
 }
 
 EXPORT_SYMBOL_GPL(tty_ldisc_flush);
@@ -3336,6 +3360,15 @@ int tty_ioctl(struct inode * inode, stru
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);



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] tty flush flip buffer on ldisc input queue flush

2007-05-07 Thread Paul Fulghum
Flush the tty flip buffer when the line discipline
input queue is flushed, including the user call
tcflush(TCIFLUSH/TCIOFLUSH). This prevents unexpected
stale data after a user application calls tcflush().

Cc: Alan Cox [EMAIL PROTECTED]
Cc: Antonino Ingargiola [EMAIL PROTECTED]
Signed-off-by: Paul Fulghum [EMAIL PROTECTED]

--- a/drivers/char/tty_io.c 2007-05-04 05:46:55.0 -0500
+++ b/drivers/char/tty_io.c 2007-05-05 03:23:46.0 -0500
@@ -365,6 +365,29 @@ static void tty_buffer_free(struct tty_s
 }
 
 /**
+ * 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
  * @size: characters wanted
@@ -1240,6 +1263,7 @@ void tty_ldisc_flush(struct tty_struct *
ld-flush_buffer(tty);
tty_ldisc_deref(ld);
}
+   tty_buffer_flush(tty);
 }
 
 EXPORT_SYMBOL_GPL(tty_ldisc_flush);
@@ -3336,6 +3360,15 @@ int tty_ioctl(struct inode * inode, stru
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);



-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/