|
@@ -1039,10 +1039,22 @@ int vt_waitactive(int vt)
|
|
|
|
|
|
add_wait_queue(&vt_activate_queue, &wait);
|
|
|
for (;;) {
|
|
|
- set_current_state(TASK_INTERRUPTIBLE);
|
|
|
retval = 0;
|
|
|
- if (vt == fg_console)
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Synchronize with redraw_screen(). By acquiring the console
|
|
|
+ * semaphore we make sure that the console switch is completed
|
|
|
+ * before we return. If we didn't wait for the semaphore, we
|
|
|
+ * could return at a point where fg_console has already been
|
|
|
+ * updated, but the console switch hasn't been completed.
|
|
|
+ */
|
|
|
+ acquire_console_sem();
|
|
|
+ set_current_state(TASK_INTERRUPTIBLE);
|
|
|
+ if (vt == fg_console) {
|
|
|
+ release_console_sem();
|
|
|
break;
|
|
|
+ }
|
|
|
+ release_console_sem();
|
|
|
retval = -EINTR;
|
|
|
if (signal_pending(current))
|
|
|
break;
|