vt_ioctl: move vt_setactivate out of vt_ioctl
authorJiri Slaby <jslaby@suse.cz>
Mon, 15 Jun 2020 07:49:05 +0000 (09:49 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Jun 2020 15:08:34 +0000 (17:08 +0200)
It's too long to be inlined.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20200615074910.19267-33-jslaby@suse.cz
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/vt/vt_ioctl.c

index 978c33a..e8bcfcd 100644 (file)
@@ -633,6 +633,44 @@ static int vt_io_ioctl(struct vc_data *vc, unsigned int cmd, void __user *up,
        return 0;
 }
 
+static int vt_setactivate(struct vt_setactivate __user *sa)
+{
+       struct vt_setactivate vsa;
+       struct vc_data *nvc;
+       int ret;
+
+       if (copy_from_user(&vsa, sa, sizeof(vsa)))
+               return -EFAULT;
+       if (vsa.console == 0 || vsa.console > MAX_NR_CONSOLES)
+               return -ENXIO;
+
+       vsa.console = array_index_nospec(vsa.console, MAX_NR_CONSOLES + 1);
+       vsa.console--;
+       console_lock();
+       ret = vc_allocate(vsa.console);
+       if (ret) {
+               console_unlock();
+               return ret;
+       }
+
+       /*
+        * 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));
+       console_unlock();
+
+       /* Commence switch and lock */
+       /* Review set_console locks */
+       set_console(vsa.console);
+
+       return 0;
+}
+
 /* deallocate a single console, if possible (leave 0) */
 static int vt_disallocate(unsigned int vc_num)
 {
@@ -797,44 +835,10 @@ int vt_ioctl(struct tty_struct *tty,
                break;
 
        case VT_SETACTIVATE:
-       {
-               struct vt_setactivate vsa;
-               struct vc_data *nvc;
-
                if (!perm)
                        return -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)
-                       return -ENXIO;
-
-               vsa.console = array_index_nospec(vsa.console,
-                                                MAX_NR_CONSOLES + 1);
-               vsa.console--;
-               console_lock();
-               ret = vc_allocate(vsa.console);
-               if (ret) {
-                       console_unlock();
-                       return ret;
-               }
-
-               /* 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));
-               console_unlock();
-
-               /* Commence switch and lock */
-               /* Review set_console locks */
-               set_console(vsa.console);
-               break;
-       }
+               return vt_setactivate(up);
 
        /*
         * wait until the specified VT has been activated