diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2011-09-10 08:39:18 -0400 |
---|---|---|
committer | Richard Weinberger <richard@nod.at> | 2012-03-25 00:29:54 +0100 |
commit | 10c890c0a303070652f5374ea31a0b29350d14d9 (patch) | |
tree | 34077d8fb7d8d81d761f2c28021310ce821f4ceb /arch/um | |
parent | 0fcd719934cd3521ae4a977f454e75e2be60b7ff (diff) |
um: switch close_chan() to struct line
... and switch chan_interrupt() to directly calling close_one_chan(),
so we can lose delay_free_irq argument of close_chan() as well.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'arch/um')
-rw-r--r-- | arch/um/drivers/chan.h | 2 | ||||
-rw-r--r-- | arch/um/drivers/chan_kern.c | 16 | ||||
-rw-r--r-- | arch/um/drivers/line.c | 2 |
3 files changed, 11 insertions, 9 deletions
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, |