summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2011-09-10 14:39:18 +0200
committerRichard Weinberger <richard@nod.at>2012-03-25 00:29:54 +0100
commit10c890c0a303070652f5374ea31a0b29350d14d9 (patch)
tree34077d8fb7d8d81d761f2c28021310ce821f4ceb
parentum: race fix: initialize delayed_work *before* registering IRQ (diff)
downloadlinux-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>
-rw-r--r--arch/um/drivers/chan.h2
-rw-r--r--arch/um/drivers/chan_kern.c16
-rw-r--r--arch/um/drivers/line.c2
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,