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