struct kbd_struct kbd_table[MAX_NR_CONSOLES];
 static struct kbd_struct *kbd = kbd_table;
 
-int spawnpid, spawnsig;
+struct vt_spawn_console vt_spawn_con = {
+       .lock = SPIN_LOCK_UNLOCKED,
+       .pid  = NULL,
+       .sig  = 0,
+};
 
 /*
  * Variables exported for vt.c
 
 static void fn_spawn_con(struct vc_data *vc, struct pt_regs *regs)
 {
-       if (spawnpid)
-               if (kill_proc(spawnpid, spawnsig, 1))
-                       spawnpid = 0;
+       spin_lock(&vt_spawn_con.lock);
+       if (vt_spawn_con.pid)
+               if (kill_pid(vt_spawn_con.pid, vt_spawn_con.sig, 1)) {
+                       put_pid(vt_spawn_con.pid);
+                       vt_spawn_con.pid = NULL;
+               }
+       spin_unlock(&vt_spawn_con.lock);
 }
 
 static void fn_SAK(struct vc_data *vc, struct pt_regs *regs)
 
         */
        case KDSIGACCEPT:
        {
-               extern int spawnpid, spawnsig;
                if (!perm || !capable(CAP_KILL))
                  return -EPERM;
                if (!valid_signal(arg) || arg < 1 || arg == SIGKILL)
                  return -EINVAL;
-               spawnpid = current->pid;
-               spawnsig = arg;
+
+               spin_lock_irq(&vt_spawn_con.lock);
+               put_pid(vt_spawn_con.pid);
+               vt_spawn_con.pid = get_pid(task_pid(current));
+               vt_spawn_con.sig = arg;
+               spin_unlock_irq(&vt_spawn_con.lock);
                return 0;
        }
 
 
 extern char con_buf[CON_BUF_SIZE];
 extern struct semaphore con_buf_sem;
 
+struct vt_spawn_console {
+       spinlock_t lock;
+       struct pid *pid;
+       int sig;
+};
+extern struct vt_spawn_console vt_spawn_con;
+
 #endif /* _VT_KERN_H */