diff --git a/arch/um/drivers/chan.h b/arch/um/drivers/chan.h index d3974a91aa4..02b5a76e98d 100644 --- a/arch/um/drivers/chan.h +++ b/arch/um/drivers/chan.h @@ -40,7 +40,7 @@ extern void deactivate_chan(struct chan *chan, int irq); extern void reactivate_chan(struct chan *chan, int irq); extern void chan_enable_winch(struct chan *chan, struct tty_struct *tty); extern int enable_chan(struct line *line); -extern void close_chan(struct list_head *chans, int delay_free_irq); +extern void close_chan(struct line *line); extern int chan_window_size(struct line *line, unsigned short *rows_out, unsigned short *cols_out); diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c index 4744b5840fa..ca4c7ebfd0a 100644 --- a/arch/um/drivers/chan_kern.c +++ b/arch/um/drivers/chan_kern.c @@ -185,7 +185,7 @@ int enable_chan(struct line *line) return 0; out_close: - close_chan(&line->chan_list, 0); + close_chan(line); return err; } @@ -246,7 +246,7 @@ static void close_one_chan(struct chan *chan, int delay_free_irq) chan->fd = -1; } -void close_chan(struct list_head *chans, int delay_free_irq) +void close_chan(struct line *line) { struct chan *chan; @@ -255,8 +255,8 @@ void close_chan(struct list_head *chans, int delay_free_irq) * state. Then, the first one opened will have the original state, * so it must be the last closed. */ - list_for_each_entry_reverse(chan, chans, list) { - close_one_chan(chan, delay_free_irq); + list_for_each_entry_reverse(chan, &line->chan_list, list) { + close_one_chan(chan, 0); } } @@ -587,10 +587,12 @@ void chan_interrupt(struct line *line, struct tty_struct *tty, int irq) if (chan->primary) { if (tty != NULL) tty_hangup(tty); - close_chan(&line->chan_list, 1); - return; + if (line->chan_out != chan) + close_one_chan(line->chan_out, 1); } - else close_one_chan(chan, 1); + close_one_chan(chan, 1); + if (chan->primary) + return; } out: if (tty) diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c index 9299b8a2d17..4a3c853689a 100644 --- a/arch/um/drivers/line.c +++ b/arch/um/drivers/line.c @@ -465,7 +465,7 @@ void close_lines(struct line *lines, int nlines) int i; for(i = 0; i < nlines; i++) - close_chan(&lines[i].chan_list, 0); + close_chan(&lines[i]); } int setup_one_line(struct line *lines, int n, char *init,