From: Andrew Morton Cc: Arjan van de Ven Cc: Alan Cox Signed-off-by: Andrew Morton --- drivers/char/tty_io.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff -puN drivers/char/tty_io.c~tty-make-termios_sem-a-mutex-fix drivers/char/tty_io.c --- a/drivers/char/tty_io.c~tty-make-termios_sem-a-mutex-fix +++ a/drivers/char/tty_io.c @@ -2750,9 +2750,9 @@ static int tiocgwinsz(struct tty_struct { int err; - down(&tty->termios_sem); + mutex_lock(&tty->termios_mutex); err = copy_to_user(arg, &tty->winsize, sizeof(*arg)); - up(&tty->termios_sem); + mutex_unlock(&tty->termios_mutex); return err ? -EFAULT: 0; } @@ -2782,14 +2782,15 @@ static int tiocswinsz(struct tty_struct if (copy_from_user(&tmp_ws, arg, sizeof(*arg))) return -EFAULT; - down(&tty->termios_sem); + mutex_lock(&tty->termios_mutex); if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg))) goto done; #ifdef CONFIG_VT if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) { - if (vc_lock_resize(tty->driver_data, tmp_ws.ws_col, tmp_ws.ws_row)) { - up(&tty->termios_sem); + if (vc_lock_resize(tty->driver_data, tmp_ws.ws_col, + tmp_ws.ws_row)) { + mutex_unlock(&tty->termios_mutex); return -ENXIO; } } @@ -2801,7 +2802,7 @@ static int tiocswinsz(struct tty_struct tty->winsize = tmp_ws; real_tty->winsize = tmp_ws; done: - up(&tty->termios_sem); + mutex_unlock(&tty->termios_mutex); return 0; } _