]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/char/vt_ioctl.c
hwmon: Fix a potential race condition on unload
[linux-2.6-omap-h63xx.git] / drivers / char / vt_ioctl.c
index 1fa2da8f4fbe02596ac3df45819b25fe4b62bc24..c6f6f42097391b20f434a669ae6b0f263fda63ee 100644 (file)
@@ -1039,17 +1039,29 @@ 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;
                schedule();
        }
        remove_wait_queue(&vt_activate_queue, &wait);
-       current->state = TASK_RUNNING;
+       __set_current_state(TASK_RUNNING);
        return retval;
 }