diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/vt.c | 13 | ||||
-rw-r--r-- | drivers/char/vt_ioctl.c | 15 |
2 files changed, 22 insertions, 6 deletions
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index edb7002a3216..0d56f8fc105c 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
@@ -750,13 +750,15 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ | |||
750 | return 0; | 750 | return 0; |
751 | } | 751 | } |
752 | 752 | ||
753 | static inline int resize_screen(struct vc_data *vc, int width, int height) | 753 | static inline int resize_screen(struct vc_data *vc, int width, int height, |
754 | int user) | ||
754 | { | 755 | { |
755 | /* Resizes the resolution of the display adapater */ | 756 | /* Resizes the resolution of the display adapater */ |
756 | int err = 0; | 757 | int err = 0; |
757 | 758 | ||
758 | if (vc->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize) | 759 | if (vc->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize) |
759 | err = vc->vc_sw->con_resize(vc, width, height); | 760 | err = vc->vc_sw->con_resize(vc, width, height, user); |
761 | |||
760 | return err; | 762 | return err; |
761 | } | 763 | } |
762 | 764 | ||
@@ -772,7 +774,7 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
772 | unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0; | 774 | unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0; |
773 | unsigned int old_cols, old_rows, old_row_size, old_screen_size; | 775 | unsigned int old_cols, old_rows, old_row_size, old_screen_size; |
774 | unsigned int new_cols, new_rows, new_row_size, new_screen_size; | 776 | unsigned int new_cols, new_rows, new_row_size, new_screen_size; |
775 | unsigned int end; | 777 | unsigned int end, user; |
776 | unsigned short *newscreen; | 778 | unsigned short *newscreen; |
777 | 779 | ||
778 | WARN_CONSOLE_UNLOCKED(); | 780 | WARN_CONSOLE_UNLOCKED(); |
@@ -780,6 +782,9 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
780 | if (!vc) | 782 | if (!vc) |
781 | return -ENXIO; | 783 | return -ENXIO; |
782 | 784 | ||
785 | user = vc->vc_resize_user; | ||
786 | vc->vc_resize_user = 0; | ||
787 | |||
783 | if (cols > VC_RESIZE_MAXCOL || lines > VC_RESIZE_MAXROW) | 788 | if (cols > VC_RESIZE_MAXCOL || lines > VC_RESIZE_MAXROW) |
784 | return -EINVAL; | 789 | return -EINVAL; |
785 | 790 | ||
@@ -800,7 +805,7 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
800 | old_row_size = vc->vc_size_row; | 805 | old_row_size = vc->vc_size_row; |
801 | old_screen_size = vc->vc_screenbuf_size; | 806 | old_screen_size = vc->vc_screenbuf_size; |
802 | 807 | ||
803 | err = resize_screen(vc, new_cols, new_rows); | 808 | err = resize_screen(vc, new_cols, new_rows, user); |
804 | if (err) { | 809 | if (err) { |
805 | kfree(newscreen); | 810 | kfree(newscreen); |
806 | return err; | 811 | return err; |
diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c index 7a61a2a9aafe..f69a8258095c 100644 --- a/drivers/char/vt_ioctl.c +++ b/drivers/char/vt_ioctl.c | |||
@@ -847,14 +847,24 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, | |||
847 | case VT_RESIZE: | 847 | case VT_RESIZE: |
848 | { | 848 | { |
849 | struct vt_sizes __user *vtsizes = up; | 849 | struct vt_sizes __user *vtsizes = up; |
850 | struct vc_data *vc; | ||
851 | |||
850 | ushort ll,cc; | 852 | ushort ll,cc; |
851 | if (!perm) | 853 | if (!perm) |
852 | return -EPERM; | 854 | return -EPERM; |
853 | if (get_user(ll, &vtsizes->v_rows) || | 855 | if (get_user(ll, &vtsizes->v_rows) || |
854 | get_user(cc, &vtsizes->v_cols)) | 856 | get_user(cc, &vtsizes->v_cols)) |
855 | return -EFAULT; | 857 | return -EFAULT; |
856 | for (i = 0; i < MAX_NR_CONSOLES; i++) | 858 | |
857 | vc_lock_resize(vc_cons[i].d, cc, ll); | 859 | for (i = 0; i < MAX_NR_CONSOLES; i++) { |
860 | vc = vc_cons[i].d; | ||
861 | |||
862 | if (vc) { | ||
863 | vc->vc_resize_user = 1; | ||
864 | vc_lock_resize(vc_cons[i].d, cc, ll); | ||
865 | } | ||
866 | } | ||
867 | |||
858 | return 0; | 868 | return 0; |
859 | } | 869 | } |
860 | 870 | ||
@@ -900,6 +910,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, | |||
900 | vc_cons[i].d->vc_scan_lines = vlin; | 910 | vc_cons[i].d->vc_scan_lines = vlin; |
901 | if (clin) | 911 | if (clin) |
902 | vc_cons[i].d->vc_font.height = clin; | 912 | vc_cons[i].d->vc_font.height = clin; |
913 | vc_cons[i].d->vc_resize_user = 1; | ||
903 | vc_resize(vc_cons[i].d, cc, ll); | 914 | vc_resize(vc_cons[i].d, cc, ll); |
904 | release_console_sem(); | 915 | release_console_sem(); |
905 | } | 916 | } |