alpha: belated ERESTART_RESTARTBLOCK race fix
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 18 Sep 2010 12:38:47 +0000 (08:38 -0400)
committerMatt Turner <mattst88@gmail.com>
Sun, 19 Sep 2010 03:08:27 +0000 (23:08 -0400)
same thing as had been done on other targets back in 2003 -
move setting ->restart_block.fn into {rt_,}sigreturn().

Tested-by: Michael Cree <mcree@orcon.net.nz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Matt Turner <mattst88@gmail.com>
arch/alpha/kernel/signal.c

index 0932dbb1ef8eff444943645e15b0802b1d4cf5d5..e5b1b3c79ff3f8172d686554666a753c6e4d6a26 100644 (file)
@@ -239,6 +239,8 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
        unsigned long usp;
        long i, err = __get_user(regs->pc, &sc->sc_pc);
 
+       current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
        sw->r26 = (unsigned long) ret_from_sys_call;
 
        err |= __get_user(regs->r0, sc->sc_regs+0);
@@ -591,7 +593,6 @@ syscall_restart(unsigned long r0, unsigned long r19,
                regs->pc -= 4;
                break;
        case ERESTART_RESTARTBLOCK:
-               current_thread_info()->restart_block.fn = do_no_restart_syscall;
                regs->r0 = EINTR;
                break;
        }