diff options
| author | Steve French <sfrench@us.ibm.com> | 2006-03-20 16:58:09 +0000 | 
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2006-03-20 16:58:09 +0000 | 
| commit | fd4a0b92db6a57cba8d03efbe1cebf91f9124ce0 (patch) | |
| tree | 5886a08bfa1132058b06074f4666a36dc5ddd2a1 /drivers/serial/serial_core.c | |
| parent | 88274815f7477dc7550439413ab87c5ce4c5a623 (diff) | |
| parent | 7705a8792b0fc82fd7d4dd923724606bbfd9fb20 (diff) | |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'drivers/serial/serial_core.c')
| -rw-r--r-- | drivers/serial/serial_core.c | 32 | 
1 files changed, 29 insertions, 3 deletions
| diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index 95fb4939c67..cc1faa31d12 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c @@ -71,6 +71,11 @@ static void uart_change_pm(struct uart_state *state, int pm_state);  void uart_write_wakeup(struct uart_port *port)  {  	struct uart_info *info = port->info; +	/* +	 * This means you called this function _after_ the port was +	 * closed.  No cookie for you. +	 */ +	BUG_ON(!info);  	tasklet_schedule(&info->tlet);  } @@ -471,14 +476,26 @@ static void uart_flush_chars(struct tty_struct *tty)  }  static int -uart_write(struct tty_struct *tty, const unsigned char * buf, int count) +uart_write(struct tty_struct *tty, const unsigned char *buf, int count)  {  	struct uart_state *state = tty->driver_data; -	struct uart_port *port = state->port; -	struct circ_buf *circ = &state->info->xmit; +	struct uart_port *port; +	struct circ_buf *circ;  	unsigned long flags;  	int c, ret = 0; +	/* +	 * This means you called this function _after_ the port was +	 * closed.  No cookie for you. +	 */ +	if (!state || !state->info) { +		WARN_ON(1); +		return -EL3HLT; +	} + +	port = state->port; +	circ = &state->info->xmit; +  	if (!circ->buf)  		return 0; @@ -521,6 +538,15 @@ static void uart_flush_buffer(struct tty_struct *tty)  	struct uart_port *port = state->port;  	unsigned long flags; +	/* +	 * This means you called this function _after_ the port was +	 * closed.  No cookie for you. +	 */ +	if (!state || !state->info) { +		WARN_ON(1); +		return; +	} +  	DPRINTK("uart_flush_buffer(%d) called\n", tty->index);  	spin_lock_irqsave(&port->lock, flags); | 
