Commit 2287a51b authored by Linus Torvalds's avatar Linus Torvalds

vt_kdsetmode: extend console locking

As per the long-suffering comment.
Reported-by: default avatarMinh Yuan <yuanmingbuaa@gmail.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jirislaby@kernel.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 3a2b2eb5
...@@ -246,6 +246,8 @@ int vt_waitactive(int n) ...@@ -246,6 +246,8 @@ int vt_waitactive(int n)
* *
* XXX It should at least call into the driver, fbdev's definitely need to * XXX It should at least call into the driver, fbdev's definitely need to
* restore their engine state. --BenH * restore their engine state. --BenH
*
* Called with the console lock held.
*/ */
static int vt_kdsetmode(struct vc_data *vc, unsigned long mode) static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)
{ {
...@@ -262,7 +264,6 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode) ...@@ -262,7 +264,6 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)
return -EINVAL; return -EINVAL;
} }
/* FIXME: this needs the console lock extending */
if (vc->vc_mode == mode) if (vc->vc_mode == mode)
return 0; return 0;
...@@ -271,12 +272,10 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode) ...@@ -271,12 +272,10 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)
return 0; return 0;
/* explicitly blank/unblank the screen if switching modes */ /* explicitly blank/unblank the screen if switching modes */
console_lock();
if (mode == KD_TEXT) if (mode == KD_TEXT)
do_unblank_screen(1); do_unblank_screen(1);
else else
do_blank_screen(1); do_blank_screen(1);
console_unlock();
return 0; return 0;
} }
...@@ -378,7 +377,10 @@ static int vt_k_ioctl(struct tty_struct *tty, unsigned int cmd, ...@@ -378,7 +377,10 @@ static int vt_k_ioctl(struct tty_struct *tty, unsigned int cmd,
if (!perm) if (!perm)
return -EPERM; return -EPERM;
return vt_kdsetmode(vc, arg); console_lock();
ret = vt_kdsetmode(vc, arg);
console_unlock();
return ret;
case KDGETMODE: case KDGETMODE:
return put_user(vc->vc_mode, (int __user *)arg); return put_user(vc->vc_mode, (int __user *)arg);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment