diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2011-09-10 14:39:18 +0200 |
---|---|---|
committer | Richard Weinberger <richard@nod.at> | 2012-03-25 00:29:54 +0100 |
commit | 10c890c0a303070652f5374ea31a0b29350d14d9 (patch) | |
tree | 34077d8fb7d8d81d761f2c28021310ce821f4ceb | |
parent | um: race fix: initialize delayed_work *before* registering IRQ (diff) | |
download | linux-10c890c0a303070652f5374ea31a0b29350d14d9.tar.xz linux-10c890c0a303070652f5374ea31a0b29350d14d9.zip |
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 '')
-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 d3974a91aa48..02b5a76e98d9 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 4744b5840fa9..ca4c7ebfd0aa 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 9299b8a2d171..4a3c853689a3 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, |