VT_WAITACTIVE: Avoid returning EINTR when not necessary
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Sun, 7 Oct 2007 23:02:55 +0000 (16:02 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Sun, 7 Oct 2007 23:02:55 +0000 (16:02 -0700)
We should generally prefer to return ERESTARTNOHAND rather than EINTR,
so that processes with unhandled signals that get ignored don't return
EINTR.

This can help with X startup issues:

    Fatal server error:
    xf86OpenConsole: VT_WAITACTIVE failed: Interrupted system call

although the real fix is having the X server always retry EINTR
regardless (since EINTR does happen for signals that have handlers
installed). Keithp has a patch for that.

Regardless, ERESTARTNOHAND is the correct thing to use.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/char/vt_ioctl.c

index c799b7f7bbb35d4cba1dd4643a61677d05cd5836..7a61a2a9aafe3879dc8a0e443fd7d1379e7e493e 100644 (file)
@@ -1032,7 +1032,7 @@ static DECLARE_WAIT_QUEUE_HEAD(vt_activate_queue);
 
 /*
  * Sleeps until a vt is activated, or the task is interrupted. Returns
- * 0 if activation, -EINTR if interrupted.
+ * 0 if activation, -EINTR if interrupted by a signal handler.
  */
 int vt_waitactive(int vt)
 {
@@ -1057,7 +1057,7 @@ int vt_waitactive(int vt)
                        break;
                }
                release_console_sem();
-               retval = -EINTR;
+               retval = -ERESTARTNOHAND;
                if (signal_pending(current))
                        break;
                schedule();