uml: handle errors on opening host side of consoles
If the host side of a console can't be opened, this will now produce visible error messages. enable_chan now returns a status and this is passed up to con_open and ssl_open, which will complain if anything went wrong. The default host device for the serial line driver is now a pts device rather than a pty device since lots of hosts have LEGACY_PTYS disabled. This had always been failing on such hosts, but silently. Signed-off-by: Jeff Dike <jdike@linux.intel.com> Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
75886f21e3
commit
d14ad81f80
@@ -189,7 +189,7 @@ CONFIG_XTERM_CHAN=y
|
|||||||
# CONFIG_NOCONFIG_CHAN is not set
|
# CONFIG_NOCONFIG_CHAN is not set
|
||||||
CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
|
CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
|
||||||
CONFIG_CON_CHAN="xterm"
|
CONFIG_CON_CHAN="xterm"
|
||||||
CONFIG_SSL_CHAN="pty"
|
CONFIG_SSL_CHAN="pts"
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
CONFIG_LEGACY_PTYS=y
|
CONFIG_LEGACY_PTYS=y
|
||||||
CONFIG_LEGACY_PTY_COUNT=256
|
CONFIG_LEGACY_PTY_COUNT=256
|
||||||
|
@@ -203,22 +203,37 @@ void chan_enable_winch(struct list_head *chans, struct tty_struct *tty)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void enable_chan(struct line *line)
|
int enable_chan(struct line *line)
|
||||||
{
|
{
|
||||||
struct list_head *ele;
|
struct list_head *ele;
|
||||||
struct chan *chan;
|
struct chan *chan;
|
||||||
|
int err;
|
||||||
|
|
||||||
list_for_each(ele, &line->chan_list){
|
list_for_each(ele, &line->chan_list){
|
||||||
chan = list_entry(ele, struct chan, list);
|
chan = list_entry(ele, struct chan, list);
|
||||||
if(open_one_chan(chan))
|
err = open_one_chan(chan);
|
||||||
|
if (err) {
|
||||||
|
if (chan->primary)
|
||||||
|
goto out_close;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if(chan->enabled)
|
if(chan->enabled)
|
||||||
continue;
|
continue;
|
||||||
line_setup_irq(chan->fd, chan->input, chan->output, line,
|
err = line_setup_irq(chan->fd, chan->input, chan->output, line,
|
||||||
chan);
|
chan);
|
||||||
|
if (err)
|
||||||
|
goto out_close;
|
||||||
|
|
||||||
chan->enabled = 1;
|
chan->enabled = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
out_close:
|
||||||
|
close_chan(&line->chan_list, 0);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Items are added in IRQ context, when free_irq can't be called, and
|
/* Items are added in IRQ context, when free_irq can't be called, and
|
||||||
|
@@ -454,7 +454,10 @@ int line_open(struct line *lines, struct tty_struct *tty)
|
|||||||
tty->driver_data = line;
|
tty->driver_data = line;
|
||||||
line->tty = tty;
|
line->tty = tty;
|
||||||
|
|
||||||
enable_chan(line);
|
err = enable_chan(line);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
INIT_DELAYED_WORK(&line->task, line_timer_cb);
|
INIT_DELAYED_WORK(&line->task, line_timer_cb);
|
||||||
|
|
||||||
if(!line->sigio){
|
if(!line->sigio){
|
||||||
|
@@ -97,7 +97,13 @@ static int ssl_remove(int n, char **error_out)
|
|||||||
|
|
||||||
static int ssl_open(struct tty_struct *tty, struct file *filp)
|
static int ssl_open(struct tty_struct *tty, struct file *filp)
|
||||||
{
|
{
|
||||||
return line_open(serial_lines, tty);
|
int err = line_open(serial_lines, tty);
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
printk(KERN_ERR "Failed to open serial line %d, err = %d\n",
|
||||||
|
tty->index, err);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@@ -99,7 +99,12 @@ static int con_remove(int n, char **error_out)
|
|||||||
|
|
||||||
static int con_open(struct tty_struct *tty, struct file *filp)
|
static int con_open(struct tty_struct *tty, struct file *filp)
|
||||||
{
|
{
|
||||||
return line_open(vts, tty);
|
int err = line_open(vts, tty);
|
||||||
|
if (err)
|
||||||
|
printk(KERN_ERR "Failed to open console %d, err = %d\n",
|
||||||
|
tty->index, err);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set in an initcall, checked in an exitcall */
|
/* Set in an initcall, checked in an exitcall */
|
||||||
|
@@ -40,7 +40,7 @@ extern int console_open_chan(struct line *line, struct console *co);
|
|||||||
extern void deactivate_chan(struct list_head *chans, int irq);
|
extern void deactivate_chan(struct list_head *chans, int irq);
|
||||||
extern void reactivate_chan(struct list_head *chans, int irq);
|
extern void reactivate_chan(struct list_head *chans, int irq);
|
||||||
extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty);
|
extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty);
|
||||||
extern void enable_chan(struct line *line);
|
extern int enable_chan(struct line *line);
|
||||||
extern void close_chan(struct list_head *chans, int delay_free_irq);
|
extern void close_chan(struct list_head *chans, int delay_free_irq);
|
||||||
extern int chan_window_size(struct list_head *chans,
|
extern int chan_window_size(struct list_head *chans,
|
||||||
unsigned short *rows_out,
|
unsigned short *rows_out,
|
||||||
|
Reference in New Issue
Block a user