vt: add an activate and lock
X and other graphical interfaces need to be able to flip to a console and lock it into graphics mode without races. Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
@@ -972,6 +972,41 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VT_SETACTIVATE:
|
||||||
|
{
|
||||||
|
struct vt_setactivate vsa;
|
||||||
|
|
||||||
|
if (!perm)
|
||||||
|
goto eperm;
|
||||||
|
|
||||||
|
if (copy_from_user(&vsa, (struct vt_setactivate __user *)arg,
|
||||||
|
sizeof(struct vt_setactivate)))
|
||||||
|
return -EFAULT;
|
||||||
|
if (vsa.console == 0 || vsa.console > MAX_NR_CONSOLES)
|
||||||
|
ret = -ENXIO;
|
||||||
|
else {
|
||||||
|
vsa.console--;
|
||||||
|
acquire_console_sem();
|
||||||
|
ret = vc_allocate(vsa.console);
|
||||||
|
if (ret == 0) {
|
||||||
|
struct vc_data *nvc;
|
||||||
|
/* This is safe providing we don't drop the
|
||||||
|
console sem between vc_allocate and
|
||||||
|
finishing referencing nvc */
|
||||||
|
nvc = vc_cons[vsa.console].d;
|
||||||
|
nvc->vt_mode = vsa.mode;
|
||||||
|
nvc->vt_mode.frsig = 0;
|
||||||
|
put_pid(nvc->vt_pid);
|
||||||
|
nvc->vt_pid = get_pid(task_pid(current));
|
||||||
|
}
|
||||||
|
release_console_sem();
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
|
/* Commence switch and lock */
|
||||||
|
set_console(arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* wait until the specified VT has been activated
|
* wait until the specified VT has been activated
|
||||||
*/
|
*/
|
||||||
@@ -1342,7 +1377,8 @@ void vc_SAK(struct work_struct *work)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Performs the back end of a vt switch
|
* Performs the back end of a vt switch. Called under the console
|
||||||
|
* semaphore.
|
||||||
*/
|
*/
|
||||||
static void complete_change_console(struct vc_data *vc)
|
static void complete_change_console(struct vc_data *vc)
|
||||||
{
|
{
|
||||||
|
@@ -77,4 +77,11 @@ struct vt_event {
|
|||||||
|
|
||||||
#define VT_WAITEVENT 0x560E /* Wait for an event */
|
#define VT_WAITEVENT 0x560E /* Wait for an event */
|
||||||
|
|
||||||
|
struct vt_setactivate {
|
||||||
|
unsigned int console;
|
||||||
|
struct vt_mode mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define VT_SETACTIVATE 0x560F /* Activate and set the mode of a console */
|
||||||
|
|
||||||
#endif /* _LINUX_VT_H */
|
#endif /* _LINUX_VT_H */
|
||||||
|
Reference in New Issue
Block a user