]> git.hungrycats.org Git - linux/commitdiff
[SPARC]: Port over x86 signal bugfix in cset 1.1431.
authorDavid S. Miller <davem@nuts.ninka.net>
Thu, 13 Nov 2003 08:26:25 +0000 (00:26 -0800)
committerLinus Torvalds <torvalds@home.osdl.org>
Thu, 13 Nov 2003 08:26:25 +0000 (00:26 -0800)
arch/sparc/kernel/signal.c
arch/sparc64/kernel/signal.c
arch/sparc64/kernel/signal32.c

index 97dfa4f464c0eead0ab3d706242bd957d548905a..74fe483af5b79d8c91446785a4fc783c50b385f1 100644 (file)
@@ -1035,8 +1035,6 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
 {
        switch(regs->u_regs[UREG_I0]) {
        case ERESTART_RESTARTBLOCK:
-               current_thread_info()->restart_block.fn = do_no_restart_syscall;
-               /* fallthrough */
        case ERESTARTNOHAND:
        no_system_call_restart:
                regs->u_regs[UREG_I0] = EINTR;
@@ -1086,6 +1084,13 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
                struct k_sigaction *ka;
                
                ka = &current->sighand->action[signr-1];
+
+               /* Always make any pending restarted system
+                * calls return -EINTR.
+                */
+               current_thread_info()->restart_block.fn =
+                       do_no_restart_syscall;
+
                if (cookie.restart_syscall)
                        syscall_restart(cookie.orig_i0, regs, &ka->sa);
                handle_signal(signr, ka, &info, oldset, regs, svr4_signal);
index 8c1acc4811042156b15cf033914eb23931d6d5b8..5a4142d9b888faa4a403383399bf8ce0ff885a51 100644 (file)
@@ -579,8 +579,6 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
 {
        switch (regs->u_regs[UREG_I0]) {
        case ERESTART_RESTARTBLOCK:
-               current_thread_info()->restart_block.fn = do_no_restart_syscall;
-               /* fallthrough */
        case ERESTARTNOHAND:
        no_system_call_restart:
                regs->u_regs[UREG_I0] = EINTR;
@@ -628,6 +626,13 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
                struct k_sigaction *ka;
 
                ka = &current->sighand->action[signr-1];
+
+               /* Always make any pending restarted system
+                * calls return -EINTR.
+                */
+               current_thread_info()->restart_block.fn =
+                       do_no_restart_syscall;
+
                if (cookie.restart_syscall)
                        syscall_restart(orig_i0, regs, &ka->sa);
                handle_signal(signr, ka, &info, oldset, regs);
index 9d1099fd9591216283d6b2311cc65058529f6f26..b0cac6c0fad3338e9fa028a1d4412b8b9b54b009 100644 (file)
@@ -1221,8 +1221,6 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs
 {
        switch (regs->u_regs[UREG_I0]) {
        case ERESTART_RESTARTBLOCK:
-               current_thread_info()->restart_block.fn = do_no_restart_syscall;
-               /* fallthrough */
        case ERESTARTNOHAND:
        no_system_call_restart:
                regs->u_regs[UREG_I0] = EINTR;
@@ -1259,6 +1257,13 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
                struct k_sigaction *ka;
 
                ka = &current->sighand->action[signr-1];
+
+               /* Always make any pending restarted system
+                * calls return -EINTR.
+                */
+               current_thread_info()->restart_block.fn =
+                       do_no_restart_syscall;
+
                if (cookie.restart_syscall)
                        syscall_restart32(orig_i0, regs, &ka->sa);
                handle_signal32(signr, ka, &info, oldset, regs, svr4_signal);