]> err.no Git - linux-2.6/commitdiff
sparc64: Fix accidental syscall restart on child return from clone/fork/vfork.
authorDavid S. Miller <davem@davemloft.net>
Sun, 27 Apr 2008 21:54:02 +0000 (14:54 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 27 Apr 2008 22:09:15 +0000 (15:09 -0700)
This fixes a regression added by
238468b2ac76020c192a7402c92df5097916bf4a ("[SPARC64]: Use trap type
stored in pt_regs to handle syscall restart.")

Because we now encode the "returning from syscall" status in the
pt_regs area, we have to be mindful to zap it out in the child
of a fork.

During a parallel kernel build I saw an accidental -EINTR return
from vfork() in 'make' because of this bug.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/kernel/process.c

index 500ac6d483a0cec74f7c8ab51940167813267127..0560137491578b25b7aba3d1ce321d46ce0e8209 100644 (file)
@@ -591,6 +591,12 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
        if (clone_flags & CLONE_SETTLS)
                t->kregs->u_regs[UREG_G7] = regs->u_regs[UREG_I3];
 
+       /* We do not want to accidently trigger system call restart
+        * handling in the new thread.  Therefore, clear out the trap
+        * type, which will make pt_regs_regs_is_syscall() return false.
+        */
+       pt_regs_clear_trap_type(t->kregs);
+
        return 0;
 }