

Merge signal race fixes from i386 to x86-64.

Fix a bug in system call restart, noted by John Blackwood.



 arch/x86_64/ia32/ia32_signal.c |    3 +++
 arch/x86_64/kernel/signal.c    |   12 ++++++------
 2 files changed, 9 insertions(+), 6 deletions(-)

diff -puN arch/x86_64/ia32/ia32_signal.c~x86_64-07 arch/x86_64/ia32/ia32_signal.c
--- 25/arch/x86_64/ia32/ia32_signal.c~x86_64-07	2003-12-23 23:56:33.000000000 -0800
+++ 25-akpm/arch/x86_64/ia32/ia32_signal.c	2003-12-23 23:56:33.000000000 -0800
@@ -173,6 +173,9 @@ ia32_restore_sigcontext(struct pt_regs *
 {
 	unsigned int err = 0;
 	
+	/* Always make any pending restarted system calls return -EINTR */
+	current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
 #if DEBUG_SIG
 	printk("SIG restore_sigcontext: sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
 		sc, sc->err, sc->eip, sc->cs, sc->eflags);
diff -puN arch/x86_64/kernel/signal.c~x86_64-07 arch/x86_64/kernel/signal.c
--- 25/arch/x86_64/kernel/signal.c~x86_64-07	2003-12-23 23:56:33.000000000 -0800
+++ 25-akpm/arch/x86_64/kernel/signal.c	2003-12-23 23:56:33.000000000 -0800
@@ -93,6 +93,8 @@ restore_sigcontext(struct pt_regs *regs,
 {
 	unsigned int err = 0;
 
+	/* Always make any pending restarted system calls return -EINTR */
+	current_thread_info()->restart_block.fn = do_no_restart_syscall;
 
 #define COPY(x)		err |= __get_user(regs->x, &sc->x)
 
@@ -355,8 +357,6 @@ handle_signal(unsigned long sig, siginfo
 		/* If so, check system call restarting.. */
 		switch (regs->rax) {
 		        case -ERESTART_RESTARTBLOCK:
-				current_thread_info()->restart_block.fn = do_no_restart_syscall;
-				/* FALL THROUGH */
 			case -ERESTARTNOHAND:
 				regs->rax = -EINTR;
 				break;
@@ -371,10 +371,6 @@ handle_signal(unsigned long sig, siginfo
 				regs->rax = regs->orig_rax;
 				regs->rip -= 2;
 		}
-		if (regs->rax == (unsigned long)-ERESTART_RESTARTBLOCK){
-			regs->rax = __NR_restart_syscall;
- 			regs->rip -= 2;
- 		}		
 	}
 
 #ifdef CONFIG_IA32_EMULATION
@@ -453,6 +449,10 @@ int do_signal(struct pt_regs *regs, sigs
 			regs->rax = regs->orig_rax;
 			regs->rip -= 2;
 		}
+		if (regs->rax == (unsigned long)-ERESTART_RESTARTBLOCK) {
+			regs->rax = __NR_restart_syscall;
+			regs->rip -= 2;
+		}
 	}
 	return 0;
 }

_
