[PATCH] uml: Remove unneeded structure field
[safe/jmp/linux-2.6] / arch / um / drivers / chan_kern.c
index 244e54a..59c9b3f 100644 (file)
 #include "line.h"
 #include "os.h"
 
-#ifdef CONFIG_NOCONFIG_CHAN
+/* XXX: could well be moved to somewhere else, if needed. */
+static int my_printf(const char * fmt, ...)
+       __attribute__ ((format (printf, 1, 2)));
+
+static int my_printf(const char * fmt, ...)
+{
+       /* Yes, can be called on atomic context.*/
+       char *buf = kmalloc(4096, GFP_ATOMIC);
+       va_list args;
+       int r;
+
+       if (!buf) {
+               /* We print directly fmt.
+                * Yes, yes, yes, feel free to complain. */
+               r = strlen(fmt);
+       } else {
+               va_start(args, fmt);
+               r = vsprintf(buf, fmt, args);
+               va_end(args);
+               fmt = buf;
+       }
 
-/* The printk's here are wrong because we are complaining that there is no
- * output device, but printk is printing to that output device.  The user will
- * never see the error.  printf would be better, except it can't run on a
- * kernel stack because it will overflow it.
- * Use printk for now since that will avoid crashing.
- */
+       if (r)
+               r = os_write_file(1, fmt, r);
+       return r;
+
+}
+
+#ifdef CONFIG_NOCONFIG_CHAN
+/* Despite its name, there's no added trailing newline. */
+static int my_puts(const char * buf)
+{
+       return os_write_file(1, buf, strlen(buf));
+}
 
 static void *not_configged_init(char *str, int device, struct chan_opts *opts)
 {
-       printk(KERN_ERR "Using a channel type which is configured out of "
+       my_puts("Using a channel type which is configured out of "
               "UML\n");
-       return(NULL);
+       return NULL;
 }
 
 static int not_configged_open(int input, int output, int primary, void *data,
                              char **dev_out)
 {
-       printk(KERN_ERR "Using a channel type which is configured out of "
+       my_puts("Using a channel type which is configured out of "
               "UML\n");
-       return(-ENODEV);
+       return -ENODEV;
 }
 
 static void not_configged_close(int fd, void *data)
 {
-       printk(KERN_ERR "Using a channel type which is configured out of "
+       my_puts("Using a channel type which is configured out of "
               "UML\n");
 }
 
 static int not_configged_read(int fd, char *c_out, void *data)
 {
-       printk(KERN_ERR "Using a channel type which is configured out of "
+       my_puts("Using a channel type which is configured out of "
               "UML\n");
-       return(-EIO);
+       return -EIO;
 }
 
 static int not_configged_write(int fd, const char *buf, int len, void *data)
 {
-       printk(KERN_ERR "Using a channel type which is configured out of "
+       my_puts("Using a channel type which is configured out of "
               "UML\n");
-       return(-EIO);
+       return -EIO;
 }
 
-static int not_configged_console_write(int fd, const char *buf, int len,
-                                      void *data)
+static int not_configged_console_write(int fd, const char *buf, int len)
 {
-       printk(KERN_ERR "Using a channel type which is configured out of "
+       my_puts("Using a channel type which is configured out of "
               "UML\n");
-       return(-EIO);
+       return -EIO;
 }
 
 static int not_configged_window_size(int fd, void *data, unsigned short *rows,
                                     unsigned short *cols)
 {
-       printk(KERN_ERR "Using a channel type which is configured out of "
+       my_puts("Using a channel type which is configured out of "
               "UML\n");
-       return(-ENODEV);
+       return -ENODEV;
 }
 
 static void not_configged_free(void *data)
 {
-       printf(KERN_ERR "Using a channel type which is configured out of "
+       my_puts("Using a channel type which is configured out of "
               "UML\n");
 }
 
@@ -110,17 +135,17 @@ int generic_read(int fd, char *c_out, void *unused)
        n = os_read_file(fd, c_out, sizeof(*c_out));
 
        if(n == -EAGAIN)
-               return(0);
+               return 0;
        else if(n == 0)
-               return(-EIO);
-       return(n);
+               return -EIO;
+       return n;
 }
 
 /* XXX Trivial wrapper around os_write_file */
 
 int generic_write(int fd, const char *buf, int n, void *unused)
 {
-       return(os_write_file(fd, buf, n));
+       return os_write_file(fd, buf, n);
 }
 
 int generic_window_size(int fd, void *unused, unsigned short *rows_out,
@@ -131,14 +156,14 @@ int generic_window_size(int fd, void *unused, unsigned short *rows_out,
 
        ret = os_window_size(fd, &rows, &cols);
        if(ret < 0)
-               return(ret);
+               return ret;
 
        ret = ((*rows_out != rows) || (*cols_out != cols));
 
        *rows_out = rows;
        *cols_out = cols;
 
-       return(ret);
+       return ret;
 }
 
 void generic_free(void *data)
@@ -161,25 +186,29 @@ static void tty_receive_char(struct tty_struct *tty, char ch)
                }
        }
 
-       if((tty->flip.flag_buf_ptr == NULL) || 
+       if((tty->flip.flag_buf_ptr == NULL) ||
           (tty->flip.char_buf_ptr == NULL))
                return;
        tty_insert_flip_char(tty, ch, TTY_NORMAL);
 }
 
-static int open_one_chan(struct chan *chan, int input, int output, int primary)
+static int open_one_chan(struct chan *chan)
 {
        int fd;
 
-       if(chan->opened) return(0);
-       if(chan->ops->open == NULL) fd = 0;
-       else fd = (*chan->ops->open)(input, output, primary, chan->data,
-                                    &chan->dev);
-       if(fd < 0) return(fd);
+       if(chan->opened)
+               return 0;
+
+       if(chan->ops->open == NULL)
+               fd = 0;
+       else fd = (*chan->ops->open)(chan->input, chan->output, chan->primary,
+                                    chan->data, &chan->dev);
+       if(fd < 0)
+               return fd;
        chan->fd = fd;
 
        chan->opened = 1;
-       return(0);
+       return 0;
 }
 
 int open_chan(struct list_head *chans)
@@ -190,11 +219,11 @@ int open_chan(struct list_head *chans)
 
        list_for_each(ele, chans){
                chan = list_entry(ele, struct chan, list);
-               ret = open_one_chan(chan, chan->input, chan->output,
-                                   chan->primary);
-               if(chan->primary) err = ret;
+               ret = open_one_chan(chan);
+               if(chan->primary)
+                       err = ret;
        }
-       return(err);
+       return err;
 }
 
 void chan_enable_winch(struct list_head *chans, struct tty_struct *tty)
@@ -242,7 +271,7 @@ void close_chan(struct list_head *chans)
        }
 }
 
-int write_chan(struct list_head *chans, const char *buf, int len, 
+int write_chan(struct list_head *chans, const char *buf, int len,
               int write_irq)
 {
        struct list_head *ele;
@@ -260,7 +289,7 @@ int write_chan(struct list_head *chans, const char *buf, int len,
                                reactivate_fd(chan->fd, write_irq);
                }
        }
-       return(ret);
+       return ret;
 }
 
 int console_write_chan(struct list_head *chans, const char *buf, int len)
@@ -273,19 +302,20 @@ int console_write_chan(struct list_head *chans, const char *buf, int len)
                chan = list_entry(ele, struct chan, list);
                if(!chan->output || (chan->ops->console_write == NULL))
                        continue;
-               n = chan->ops->console_write(chan->fd, buf, len, chan->data);
+               n = chan->ops->console_write(chan->fd, buf, len);
                if(chan->primary) ret = n;
        }
-       return(ret);
+       return ret;
 }
 
-int console_open_chan(struct line *line, struct console *co, struct chan_opts *opts)
+int console_open_chan(struct line *line, struct console *co,
+                     struct chan_opts *opts)
 {
        if (!list_empty(&line->chan_list))
                return 0;
 
        if (0 != parse_chan_pair(line->init_str, &line->chan_list,
-                                line->init_pri, co->index, opts))
+                                co->index, opts))
                return -1;
        if (0 != open_chan(&line->chan_list))
                return -1;
@@ -302,12 +332,13 @@ int chan_window_size(struct list_head *chans, unsigned short *rows_out,
        list_for_each(ele, chans){
                chan = list_entry(ele, struct chan, list);
                if(chan->primary){
-                       if(chan->ops->window_size == NULL) return(0);
-                       return(chan->ops->window_size(chan->fd, chan->data,
-                                                     rows_out, cols_out));
+                       if(chan->ops->window_size == NULL)
+                               return 0;
+                       return chan->ops->window_size(chan->fd, chan->data,
+                                                     rows_out, cols_out);
                }
        }
-       return(0);
+       return 0;
 }
 
 void free_one_chan(struct chan *chan)
@@ -338,23 +369,23 @@ static int one_chan_config_string(struct chan *chan, char *str, int size,
 
        if(chan == NULL){
                CONFIG_CHUNK(str, size, n, "none", 1);
-               return(n);
+               return n;
        }
 
        CONFIG_CHUNK(str, size, n, chan->ops->type, 0);
 
        if(chan->dev == NULL){
                CONFIG_CHUNK(str, size, n, "", 1);
-               return(n);
+               return n;
        }
 
        CONFIG_CHUNK(str, size, n, ":", 0);
        CONFIG_CHUNK(str, size, n, chan->dev, 0);
 
-       return(n);
+       return n;
 }
 
-static int chan_pair_config_string(struct chan *in, struct chan *out, 
+static int chan_pair_config_string(struct chan *in, struct chan *out,
                                   char *str, int size, char **error_out)
 {
        int n;
@@ -365,7 +396,7 @@ static int chan_pair_config_string(struct chan *in, struct chan *out,
 
        if(in == out){
                CONFIG_CHUNK(str, size, n, "", 1);
-               return(n);
+               return n;
        }
 
        CONFIG_CHUNK(str, size, n, ",", 1);
@@ -374,10 +405,10 @@ static int chan_pair_config_string(struct chan *in, struct chan *out,
        size -= n;
        CONFIG_CHUNK(str, size, n, "", 1);
 
-       return(n);
+       return n;
 }
 
-int chan_config_string(struct list_head *chans, char *str, int size, 
+int chan_config_string(struct list_head *chans, char *str, int size,
                       char **error_out)
 {
        struct list_head *ele;
@@ -393,7 +424,7 @@ int chan_config_string(struct list_head *chans, char *str, int size,
                        out = chan;
        }
 
-       return(chan_pair_config_string(in, out, str, size, error_out));
+       return chan_pair_config_string(in, out, str, size, error_out);
 }
 
 struct chan_type {
@@ -437,8 +468,7 @@ struct chan_type chan_table[] = {
 #endif
 };
 
-static struct chan *parse_chan(char *str, int pri, int device, 
-                              struct chan_opts *opts)
+static struct chan *parse_chan(char *str, int device, struct chan_opts *opts)
 {
        struct chan_type *entry;
        struct chan_ops *ops;
@@ -457,29 +487,31 @@ static struct chan *parse_chan(char *str, int pri, int device,
                }
        }
        if(ops == NULL){
-               printk(KERN_ERR "parse_chan couldn't parse \"%s\"\n", 
+               my_printf("parse_chan couldn't parse \"%s\"\n",
                       str);
-               return(NULL);
+               return NULL;
        }
-       if(ops->init == NULL) return(NULL); 
+       if(ops->init == NULL)
+               return NULL;
        data = (*ops->init)(str, device, opts);
-       if(data == NULL) return(NULL);
+       if(data == NULL)
+               return NULL;
 
        chan = kmalloc(sizeof(*chan), GFP_ATOMIC);
-       if(chan == NULL) return(NULL);
+       if(chan == NULL)
+               return NULL;
        *chan = ((struct chan) { .list          = LIST_HEAD_INIT(chan->list),
                                 .primary       = 1,
                                 .input         = 0,
                                 .output        = 0,
                                 .opened        = 0,
                                 .fd            = -1,
-                                .pri           = pri,
                                 .ops           = ops,
                                 .data          = data });
-       return(chan);
+       return chan;
 }
 
-int parse_chan_pair(char *str, struct list_head *chans, int pri, int device,
+int parse_chan_pair(char *str, struct list_head *chans, int device,
                    struct chan_opts *opts)
 {
        struct chan *new, *chan;
@@ -487,7 +519,6 @@ int parse_chan_pair(char *str, struct list_head *chans, int pri, int device,
 
        if(!list_empty(chans)){
                chan = list_entry(chans->next, struct chan, list);
-               if(chan->pri >= pri) return(0);
                free_chan(chans);
                INIT_LIST_HEAD(chans);
        }
@@ -497,24 +528,30 @@ int parse_chan_pair(char *str, struct list_head *chans, int pri, int device,
                in = str;
                *out = '\0';
                out++;
-               new = parse_chan(in, pri, device, opts);
-               if(new == NULL) return(-1);
+               new = parse_chan(in, device, opts);
+               if(new == NULL)
+                       return -1;
+
                new->input = 1;
                list_add(&new->list, chans);
 
-               new = parse_chan(out, pri, device, opts);
-               if(new == NULL) return(-1);
+               new = parse_chan(out, device, opts);
+               if(new == NULL)
+                       return -1;
+
                list_add(&new->list, chans);
                new->output = 1;
        }
        else {
-               new = parse_chan(str, pri, device, opts);
-               if(new == NULL) return(-1);
+               new = parse_chan(str, device, opts);
+               if(new == NULL)
+                       return -1;
+
                list_add(&new->list, chans);
                new->input = 1;
                new->output = 1;
        }
-       return(0);
+       return 0;
 }
 
 int chan_out_fd(struct list_head *chans)
@@ -525,9 +562,9 @@ int chan_out_fd(struct list_head *chans)
        list_for_each(ele, chans){
                chan = list_entry(ele, struct chan, list);
                if(chan->primary && chan->output)
-                       return(chan->fd);
+                       return chan->fd;
        }
-       return(-1);
+       return -1;
 }
 
 void chan_interrupt(struct list_head *chans, struct work_struct *task,
@@ -542,7 +579,7 @@ void chan_interrupt(struct list_head *chans, struct work_struct *task,
                chan = list_entry(ele, struct chan, list);
                if(!chan->input || (chan->ops->read == NULL)) continue;
                do {
-                       if((tty != NULL) && 
+                       if((tty != NULL) &&
                           (tty->flip.count >= TTY_FLIPBUF_SIZE)){
                                schedule_work(task);
                                goto out;