We need to initialize the console only on the first open. This is
usually what is done in the ->install hook. vt used to do this in
->open. Now we move it to ->install and use newly added helper for
install: tty_port_install. It ensures tty->port to be set properly.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Jiri Slaby 2012-06-04 13:35:33 +02:00 коммит произвёл Greg Kroah-Hartman
Родитель 695586ca20
Коммит bc1e99d93f
1 изменённых файлов: 36 добавлений и 24 удалений

Просмотреть файл

@ -2792,41 +2792,52 @@ static void con_flush_chars(struct tty_struct *tty)
/*
* Allocate the console screen memory.
*/
static int con_open(struct tty_struct *tty, struct file *filp)
static int con_install(struct tty_driver *driver, struct tty_struct *tty)
{
unsigned int currcons = tty->index;
int ret = 0;
struct vc_data *vc;
int ret;
console_lock();
if (tty->driver_data == NULL) {
ret = vc_allocate(currcons);
if (ret == 0) {
struct vc_data *vc = vc_cons[currcons].d;
ret = vc_allocate(currcons);
if (ret)
goto unlock;
/* Still being freed */
if (vc->port.tty) {
console_unlock();
return -ERESTARTSYS;
}
tty->driver_data = vc;
vc->port.tty = tty;
vc = vc_cons[currcons].d;
if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
tty->winsize.ws_row = vc_cons[currcons].d->vc_rows;
tty->winsize.ws_col = vc_cons[currcons].d->vc_cols;
}
if (vc->vc_utf)
tty->termios->c_iflag |= IUTF8;
else
tty->termios->c_iflag &= ~IUTF8;
console_unlock();
return ret;
}
/* Still being freed */
if (vc->port.tty) {
ret = -ERESTARTSYS;
goto unlock;
}
ret = tty_port_install(&vc->port, driver, tty);
if (ret)
goto unlock;
tty->driver_data = vc;
vc->port.tty = tty;
if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
tty->winsize.ws_row = vc_cons[currcons].d->vc_rows;
tty->winsize.ws_col = vc_cons[currcons].d->vc_cols;
}
if (vc->vc_utf)
tty->termios->c_iflag |= IUTF8;
else
tty->termios->c_iflag &= ~IUTF8;
unlock:
console_unlock();
return ret;
}
static int con_open(struct tty_struct *tty, struct file *filp)
{
/* everything done in install */
return 0;
}
static void con_close(struct tty_struct *tty, struct file *filp)
{
/* Nothing to do - we defer to shutdown */
@ -2947,6 +2958,7 @@ static int __init con_init(void)
console_initcall(con_init);
static const struct tty_operations con_ops = {
.install = con_install,
.open = con_open,
.close = con_close,
.write = con_write,