um: switch close_chan() to struct line
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 10 Sep 2011 12:39:18 +0000 (08:39 -0400)
committerRichard Weinberger <richard@nod.at>
Sat, 24 Mar 2012 23:29:54 +0000 (00:29 +0100)
... 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>
arch/um/drivers/chan.h
arch/um/drivers/chan_kern.c
arch/um/drivers/line.c

index d3974a91aa480d9e55bc76757774032b97d395a3..02b5a76e98d9da2038442b03d47c700338af634c 100644 (file)
@@ -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);
index 4744b5840fa97874f1bb7280778142b316eb5977..ca4c7ebfd0aa592141021d779f1d49feac0f33a2 100644 (file)
@@ -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)
index 9299b8a2d1717cd43bdffa37377f4b459dfcd929..4a3c853689a3e3867d3a611b5b5e439017ca23f0 100644 (file)
@@ -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,