diff -ruN linux-2.4.20/arch/alpha/kernel/entry.S linux-2.4.20b/arch/alpha/kernel/entry.S
--- linux-2.4.20/arch/alpha/kernel/entry.S	Sat Aug  3 02:39:42 2002
+++ linux-2.4.20b/arch/alpha/kernel/entry.S	Tue Mar 18 00:12:52 2003
@@ -231,12 +231,12 @@
 .end	kernel_clone
 
 /*
- * kernel_thread(fn, arg, clone_flags)
+ * arch_kernel_thread(fn, arg, clone_flags)
  */
 .align 3
 .globl	kernel_thread
 .ent	kernel_thread
-kernel_thread:
+arch_kernel_thread:
 	ldgp	$29,0($27)	/* we can be called from a module */
 	.frame $30, 4*8, $26
 	subq	$30,4*8,$30
diff -ruN linux-2.4.20/arch/arm/kernel/process.c linux-2.4.20b/arch/arm/kernel/process.c
--- linux-2.4.20/arch/arm/kernel/process.c	Sat Aug  3 02:39:42 2002
+++ linux-2.4.20b/arch/arm/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -366,7 +366,7 @@
  * a system call from a "real" process, but the process memory space will
  * not be free'd until both the parent and the child have exited.
  */
-pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
+pid_t arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
 {
 	pid_t __ret;
 
diff -ruN linux-2.4.20/arch/cris/kernel/entry.S linux-2.4.20b/arch/cris/kernel/entry.S
--- linux-2.4.20/arch/cris/kernel/entry.S	Sat Aug  3 02:39:42 2002
+++ linux-2.4.20b/arch/cris/kernel/entry.S	Tue Mar 18 00:12:52 2003
@@ -736,12 +736,12 @@
  * the grosser the code, at least with the gcc version in cris-dist-1.13.
  */
 
-/* int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) */
+/* int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) */
 /*                   r10                r11         r12  */
 
 	.text
-	.global kernel_thread
-kernel_thread:
+	.global arch_kernel_thread
+arch_kernel_thread:
 
 	/* Save ARG for later.  */
 	move.d $r11, $r13
diff -ruN linux-2.4.20/arch/i386/kernel/process.c linux-2.4.20b/arch/i386/kernel/process.c
--- linux-2.4.20/arch/i386/kernel/process.c	Sat Aug  3 02:39:42 2002
+++ linux-2.4.20b/arch/i386/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -485,7 +485,7 @@
 /*
  * Create a kernel thread
  */
-int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
 	long retval, d0;
 
@@ -508,6 +508,7 @@
 		 "r" (arg), "r" (fn),
 		 "b" (flags | CLONE_VM)
 		: "memory");
+
 	return retval;
 }
 
diff -ruN linux-2.4.20/arch/ia64/kernel/process.c linux-2.4.20b/arch/ia64/kernel/process.c
--- linux-2.4.20/arch/ia64/kernel/process.c	Fri Nov 29 00:53:09 2002
+++ linux-2.4.20b/arch/ia64/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -224,7 +224,7 @@
  *	|                     | <-- sp (lowest addr)
  *	+---------------------+
  *
- * Note: if we get called through kernel_thread() then the memory
+ * Note: if we get called through arch_kernel_thread() then the memory
  * above "(highest addr)" is valid kernel stack memory that needs to
  * be copied as well.
  *
@@ -479,7 +479,7 @@
 }
 
 pid_t
-kernel_thread (int (*fn)(void *), void *arg, unsigned long flags)
+arch_kernel_thread (int (*fn)(void *), void *arg, unsigned long flags)
 {
 	struct task_struct *parent = current;
 	int result, tid;
diff -ruN linux-2.4.20/arch/m68k/kernel/process.c linux-2.4.20b/arch/m68k/kernel/process.c
--- linux-2.4.20/arch/m68k/kernel/process.c	Sat Aug  3 02:39:43 2002
+++ linux-2.4.20b/arch/m68k/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -124,7 +124,7 @@
 /*
  * Create a kernel thread
  */
-int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
 	int pid;
 	mm_segment_t fs;
diff -ruN linux-2.4.20/arch/mips/kernel/process.c linux-2.4.20b/arch/mips/kernel/process.c
--- linux-2.4.20/arch/mips/kernel/process.c	Fri Nov 29 00:53:10 2002
+++ linux-2.4.20b/arch/mips/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -152,7 +152,7 @@
 /*
  * Create a kernel thread
  */
-int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
 	long retval;
 
diff -ruN linux-2.4.20/arch/mips64/kernel/process.c linux-2.4.20b/arch/mips64/kernel/process.c
--- linux-2.4.20/arch/mips64/kernel/process.c	Fri Nov 29 00:53:10 2002
+++ linux-2.4.20b/arch/mips64/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -151,7 +151,7 @@
 /*
  * Create a kernel thread
  */
-int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
+int arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
 {
 	int retval;
 
diff -ruN linux-2.4.20/arch/parisc/kernel/process.c linux-2.4.20b/arch/parisc/kernel/process.c
--- linux-2.4.20/arch/parisc/kernel/process.c	Fri Nov 29 00:53:10 2002
+++ linux-2.4.20b/arch/parisc/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -163,7 +163,7 @@
  */
 
 extern pid_t __kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
-pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
+pid_t arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
 {
 
 	/*
diff -ruN linux-2.4.20/arch/ppc/kernel/misc.S linux-2.4.20b/arch/ppc/kernel/misc.S
--- linux-2.4.20/arch/ppc/kernel/misc.S	Fri Nov 29 00:53:11 2002
+++ linux-2.4.20b/arch/ppc/kernel/misc.S	Tue Mar 18 00:12:52 2003
@@ -898,9 +898,9 @@
 
 /*
  * Create a kernel thread
- *   kernel_thread(fn, arg, flags)
+ *   arch_kernel_thread(fn, arg, flags)
  */
-_GLOBAL(kernel_thread)
+_GLOBAL(arch_kernel_thread)
 	mr	r6,r3		/* function */
 	ori	r3,r5,CLONE_VM	/* flags */
 	li	r0,__NR_clone
diff -ruN linux-2.4.20/arch/ppc64/kernel/misc.S linux-2.4.20b/arch/ppc64/kernel/misc.S
--- linux-2.4.20/arch/ppc64/kernel/misc.S	Fri Nov 29 00:53:11 2002
+++ linux-2.4.20b/arch/ppc64/kernel/misc.S	Tue Mar 18 00:12:52 2003
@@ -493,9 +493,9 @@
 
 /*
  * Create a kernel thread
- *   kernel_thread(fn, arg, flags)
+ *   arch_kernel_thread(fn, arg, flags)
  */
-_GLOBAL(kernel_thread)
+_GLOBAL(arch_kernel_thread)
 	mr	r6,r3		/* function */
 	ori	r3,r5,CLONE_VM	/* flags */
 	li	r0,__NR_clone
diff -ruN linux-2.4.20/arch/s390/kernel/process.c linux-2.4.20b/arch/s390/kernel/process.c
--- linux-2.4.20/arch/s390/kernel/process.c	Sat Aug  3 02:39:43 2002
+++ linux-2.4.20b/arch/s390/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -105,7 +105,7 @@
 		show_trace((unsigned long *) regs->gprs[15]);
 }
 
-int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
         int clone_arg = flags | CLONE_VM;
         int retval;
diff -ruN linux-2.4.20/arch/s390x/kernel/process.c linux-2.4.20b/arch/s390x/kernel/process.c
--- linux-2.4.20/arch/s390x/kernel/process.c	Fri Nov 29 00:53:11 2002
+++ linux-2.4.20b/arch/s390x/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -102,7 +102,7 @@
 		show_trace((unsigned long *) regs->gprs[15]);
 }
 
-int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
         int clone_arg = flags | CLONE_VM;
         int retval;
diff -ruN linux-2.4.20/arch/sh/kernel/process.c linux-2.4.20b/arch/sh/kernel/process.c
--- linux-2.4.20/arch/sh/kernel/process.c	Mon Oct 15 22:36:48 2001
+++ linux-2.4.20b/arch/sh/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -118,7 +118,7 @@
  * This is the mechanism for creating a new kernel thread.
  *
  */
-int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {	/* Don't use this in BL=1(cli).  Or else, CPU resets! */
 	register unsigned long __sc0 __asm__ ("r0");
 	register unsigned long __sc3 __asm__ ("r3") = __NR_clone;
diff -ruN linux-2.4.20/arch/sparc/kernel/process.c linux-2.4.20b/arch/sparc/kernel/process.c
--- linux-2.4.20/arch/sparc/kernel/process.c	Sat Aug  3 02:39:43 2002
+++ linux-2.4.20b/arch/sparc/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -676,7 +676,7 @@
  * a system call from a "real" process, but the process memory space will
  * not be free'd until both the parent and the child have exited.
  */
-pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+pid_t arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
 	long retval;
 
diff -ruN linux-2.4.20/arch/sparc64/kernel/process.c linux-2.4.20b/arch/sparc64/kernel/process.c
--- linux-2.4.20/arch/sparc64/kernel/process.c	Fri Nov 29 00:53:12 2002
+++ linux-2.4.20b/arch/sparc64/kernel/process.c	Tue Mar 18 00:12:52 2003
@@ -673,7 +673,7 @@
  * a system call from a "real" process, but the process memory space will
  * not be free'd until both the parent and the child have exited.
  */
-pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+pid_t arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
 	long retval;
 
diff -ruN linux-2.4.20/fs/exec.c linux-2.4.20b/fs/exec.c
--- linux-2.4.20/fs/exec.c	Fri Nov 29 00:53:15 2002
+++ linux-2.4.20b/fs/exec.c	Tue Mar 18 00:12:52 2003
@@ -572,8 +572,10 @@
 
 	current->sas_ss_sp = current->sas_ss_size = 0;
 
-	if (current->euid == current->uid && current->egid == current->gid)
+	if (current->euid == current->uid && current->egid == current->gid) {
 		current->mm->dumpable = 1;
+		current->task_dumpable = 1;
+	}
 	name = bprm->filename;
 	for (i=0; (ch = *(name++)) != '\0';) {
 		if (ch == '/')
@@ -965,7 +967,7 @@
 	binfmt = current->binfmt;
 	if (!binfmt || !binfmt->core_dump)
 		goto fail;
-	if (!current->mm->dumpable)
+	if (!is_dumpable(current))
 		goto fail;
 	current->mm->dumpable = 0;
 	if (current->rlim[RLIMIT_CORE].rlim_cur < binfmt->min_coredump)
diff -ruN linux-2.4.20/include/asm-alpha/processor.h linux-2.4.20b/include/asm-alpha/processor.h
--- linux-2.4.20/include/asm-alpha/processor.h	Fri Oct  5 21:11:05 2001
+++ linux-2.4.20b/include/asm-alpha/processor.h	Tue Mar 18 00:12:52 2003
@@ -119,7 +119,7 @@
 extern void release_thread(struct task_struct *);
 
 /* Create a kernel thread without removing it from tasklists.  */
-extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
+extern long arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
 
 #define copy_segments(tsk, mm)		do { } while (0)
 #define release_segments(mm)		do { } while (0)
diff -ruN linux-2.4.20/include/asm-arm/processor.h linux-2.4.20b/include/asm-arm/processor.h
--- linux-2.4.20/include/asm-arm/processor.h	Sat Aug  3 02:39:45 2002
+++ linux-2.4.20b/include/asm-arm/processor.h	Tue Mar 18 00:12:52 2003
@@ -117,7 +117,7 @@
 /*
  * Create a new kernel thread
  */
-extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
+extern int arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
 
 #endif
 
diff -ruN linux-2.4.20/include/asm-cris/processor.h linux-2.4.20b/include/asm-cris/processor.h
--- linux-2.4.20/include/asm-cris/processor.h	Sat Aug  3 02:39:45 2002
+++ linux-2.4.20b/include/asm-cris/processor.h	Tue Mar 18 00:12:52 2003
@@ -81,7 +81,7 @@
 #define INIT_THREAD  { \
    0, 0, 0x20 }  /* ccr = int enable, nothing else */
 
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 /* give the thread a program location
  * set user-mode (The 'U' flag (User mode flag) is CCR/DCCR bit 8) 
diff -ruN linux-2.4.20/include/asm-i386/processor.h linux-2.4.20b/include/asm-i386/processor.h
--- linux-2.4.20/include/asm-i386/processor.h	Sat Aug  3 02:39:45 2002
+++ linux-2.4.20b/include/asm-i386/processor.h	Tue Mar 18 00:12:53 2003
@@ -433,7 +433,7 @@
 /*
  * create a kernel thread without removing it from tasklists
  */
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 /* Copy and release all segment info associated with a VM */
 extern void copy_segments(struct task_struct *p, struct mm_struct * mm);
diff -ruN linux-2.4.20/include/asm-ia64/processor.h linux-2.4.20b/include/asm-ia64/processor.h
--- linux-2.4.20/include/asm-ia64/processor.h	Fri Nov 29 00:53:15 2002
+++ linux-2.4.20b/include/asm-ia64/processor.h	Tue Mar 18 00:12:53 2003
@@ -373,7 +373,7 @@
  * do_basic_setup() and the timing is such that free_initmem() has
  * been called already.
  */
-extern int kernel_thread (int (*fn)(void *), void *arg, unsigned long flags);
+extern int arch_kernel_thread (int (*fn)(void *), void *arg, unsigned long flags);
 
 /* Copy and release all segment info associated with a VM */
 #define copy_segments(tsk, mm)			do { } while (0)
diff -ruN linux-2.4.20/include/asm-m68k/processor.h linux-2.4.20b/include/asm-m68k/processor.h
--- linux-2.4.20/include/asm-m68k/processor.h	Fri Oct  5 21:11:05 2001
+++ linux-2.4.20b/include/asm-m68k/processor.h	Tue Mar 18 00:12:53 2003
@@ -105,7 +105,7 @@
 {
 }
 
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 #define copy_segments(tsk, mm)		do { } while (0)
 #define release_segments(mm)		do { } while (0)
diff -ruN linux-2.4.20/include/asm-mips/processor.h linux-2.4.20b/include/asm-mips/processor.h
--- linux-2.4.20/include/asm-mips/processor.h	Fri Nov 29 00:53:15 2002
+++ linux-2.4.20b/include/asm-mips/processor.h	Tue Mar 18 00:12:53 2003
@@ -188,7 +188,7 @@
 /* Free all resources held by a thread. */
 #define release_thread(thread) do { } while(0)
 
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 /* Copy and release all segment info associated with a VM */
 #define copy_segments(p, mm) do { } while(0)
diff -ruN linux-2.4.20/include/asm-mips64/processor.h linux-2.4.20b/include/asm-mips64/processor.h
--- linux-2.4.20/include/asm-mips64/processor.h	Fri Nov 29 00:53:15 2002
+++ linux-2.4.20b/include/asm-mips64/processor.h	Tue Mar 18 00:12:53 2003
@@ -231,7 +231,7 @@
 /* Free all resources held by a thread. */
 #define release_thread(thread) do { } while(0)
 
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 /* Copy and release all segment info associated with a VM */
 #define copy_segments(p, mm) do { } while(0)
diff -ruN linux-2.4.20/include/asm-parisc/processor.h linux-2.4.20b/include/asm-parisc/processor.h
--- linux-2.4.20/include/asm-parisc/processor.h	Fri Nov 29 00:53:15 2002
+++ linux-2.4.20b/include/asm-parisc/processor.h	Tue Mar 18 00:12:53 2003
@@ -289,7 +289,7 @@
 
 /* Free all resources held by a thread. */
 extern void release_thread(struct task_struct *);
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 extern void map_hpux_gateway_page(struct task_struct *tsk, struct mm_struct *mm);
 
diff -ruN linux-2.4.20/include/asm-ppc/processor.h linux-2.4.20b/include/asm-ppc/processor.h
--- linux-2.4.20/include/asm-ppc/processor.h	Fri Nov 29 00:53:15 2002
+++ linux-2.4.20b/include/asm-ppc/processor.h	Tue Mar 18 00:12:53 2003
@@ -626,7 +626,7 @@
 /*
  * Create a new kernel thread.
  */
-extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
+extern long arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
 
 /*
  * Bus types
diff -ruN linux-2.4.20/include/asm-ppc64/processor.h linux-2.4.20b/include/asm-ppc64/processor.h
--- linux-2.4.20/include/asm-ppc64/processor.h	Fri Nov 29 00:53:15 2002
+++ linux-2.4.20b/include/asm-ppc64/processor.h	Tue Mar 18 00:12:53 2003
@@ -609,7 +609,7 @@
 /*
  * Create a new kernel thread.
  */
-extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
+extern long arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
 
 /*
  * Bus types
diff -ruN linux-2.4.20/include/asm-s390/processor.h linux-2.4.20b/include/asm-s390/processor.h
--- linux-2.4.20/include/asm-s390/processor.h	Sat Aug  3 02:39:45 2002
+++ linux-2.4.20b/include/asm-s390/processor.h	Tue Mar 18 00:12:53 2003
@@ -113,7 +113,7 @@
 
 /* Free all resources held by a thread. */
 extern void release_thread(struct task_struct *);
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 /* Copy and release all segment info associated with a VM */
 #define copy_segments(nr, mm)           do { } while (0)
diff -ruN linux-2.4.20/include/asm-s390x/processor.h linux-2.4.20b/include/asm-s390x/processor.h
--- linux-2.4.20/include/asm-s390x/processor.h	Fri Nov 29 00:53:15 2002
+++ linux-2.4.20b/include/asm-s390x/processor.h	Tue Mar 18 00:12:54 2003
@@ -128,7 +128,7 @@
 
 /* Free all resources held by a thread. */
 extern void release_thread(struct task_struct *);
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 /* Copy and release all segment info associated with a VM */
 #define copy_segments(nr, mm)           do { } while (0)
diff -ruN linux-2.4.20/include/asm-sh/processor.h linux-2.4.20b/include/asm-sh/processor.h
--- linux-2.4.20/include/asm-sh/processor.h	Fri Oct  5 21:11:05 2001
+++ linux-2.4.20b/include/asm-sh/processor.h	Tue Mar 18 00:12:54 2003
@@ -137,7 +137,7 @@
 /*
  * create a kernel thread without removing it from tasklists
  */
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 /*
  * Bus types
diff -ruN linux-2.4.20/include/asm-sparc/processor.h linux-2.4.20b/include/asm-sparc/processor.h
--- linux-2.4.20/include/asm-sparc/processor.h	Thu Oct 11 08:42:47 2001
+++ linux-2.4.20b/include/asm-sparc/processor.h	Tue Mar 18 00:12:54 2003
@@ -146,7 +146,7 @@
 
 /* Free all resources held by a thread. */
 #define release_thread(tsk)		do { } while(0)
-extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern pid_t arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 
 #define copy_segments(tsk, mm)		do { } while (0)
diff -ruN linux-2.4.20/include/asm-sparc64/processor.h linux-2.4.20b/include/asm-sparc64/processor.h
--- linux-2.4.20/include/asm-sparc64/processor.h	Sat Aug  3 02:39:45 2002
+++ linux-2.4.20b/include/asm-sparc64/processor.h	Tue Mar 18 00:12:54 2003
@@ -270,7 +270,7 @@
 /* Free all resources held by a thread. */
 #define release_thread(tsk)		do { } while(0)
 
-extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+extern pid_t arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 #define copy_segments(tsk, mm)		do { } while (0)
 #define release_segments(mm)		do { } while (0)
diff -ruN linux-2.4.20/include/linux/sched.h linux-2.4.20b/include/linux/sched.h
--- linux-2.4.20/include/linux/sched.h	Fri Nov 29 00:53:15 2002
+++ linux-2.4.20b/include/linux/sched.h	Tue Mar 18 00:33:36 2003
@@ -339,6 +339,7 @@
 	/* ??? */
 	unsigned long personality;
 	int did_exec:1;
+	unsigned task_dumpable:1;
 	pid_t pid;
 	pid_t pgrp;
 	pid_t tty_old_pgrp;
@@ -448,6 +449,8 @@
 #define PT_TRACESYSGOOD	0x00000008
 #define PT_PTRACE_CAP	0x00000010	/* ptracer can follow suid-exec */
 
+#define is_dumpable(tsk)	((tsk)->task_dumpable && (tsk)->mm->dumpable)
+
 /*
  * Limit the stack by to some sane default: root can always
  * increase this limit if needed..  8MB seems reasonable.
@@ -802,6 +805,8 @@
 extern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
 extern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait));
 extern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
+
+extern long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
 #define __wait_event(wq, condition) 					\
 do {									\
diff -ruN linux-2.4.20/kernel/fork.c linux-2.4.20b/kernel/fork.c
--- linux-2.4.20/kernel/fork.c	Fri Nov 29 00:53:15 2002
+++ linux-2.4.20b/kernel/fork.c	Tue Mar 18 00:12:54 2003
@@ -27,6 +27,7 @@
 #include <asm/pgalloc.h>
 #include <asm/uaccess.h>
 #include <asm/mmu_context.h>
+#include <asm/processor.h>
 
 /* The idle threads do not count.. */
 int nr_threads;
@@ -563,6 +564,31 @@
 	if (!(clone_flags & CLONE_PTRACE))
 		p->ptrace = 0;
 	p->flags = new_flags;
+}
+
+long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+{
+	struct task_struct *task = current;
+	unsigned old_task_dumpable;
+	long ret;
+
+	/* lock out any potential ptracer */
+	task_lock(task);
+	if (task->ptrace) {
+		task_unlock(task);
+		return -EPERM;
+	}
+
+	old_task_dumpable = task->task_dumpable;
+	task->task_dumpable = 0;
+	task_unlock(task);
+
+	ret = arch_kernel_thread(fn, arg, flags);
+
+	/* never reached in child process, only in parent */
+	current->task_dumpable = old_task_dumpable;
+
+	return ret;
 }
 
 /*
diff -ruN linux-2.4.20/kernel/ptrace.c linux-2.4.20b/kernel/ptrace.c
--- linux-2.4.20/kernel/ptrace.c	Sat Aug  3 02:39:46 2002
+++ linux-2.4.20b/kernel/ptrace.c	Tue Mar 18 00:12:54 2003
@@ -21,6 +21,10 @@
  */
 int ptrace_check_attach(struct task_struct *child, int kill)
 {
+	mb();
+	if (!is_dumpable(child))
+		return -EPERM;
+
 	if (!(child->ptrace & PT_PTRACED))
 		return -ESRCH;
 
@@ -70,7 +74,7 @@
  	    (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE))
 		goto bad;
 	rmb();
-	if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE))
+	if (!is_dumpable(task) && !capable(CAP_SYS_PTRACE))
 		goto bad;
 	/* the same process cannot be attached many times */
 	if (task->ptrace & PT_PTRACED)
@@ -136,6 +140,8 @@
 	/* Worry about races with exit() */
 	task_lock(tsk);
 	mm = tsk->mm;
+	if (!is_dumpable(tsk) || (&init_mm == mm))
+		mm = NULL;
 	if (mm)
 		atomic_inc(&mm->mm_users);
 	task_unlock(tsk);
diff -ruN linux-2.4.20/kernel/sys.c linux-2.4.20b/kernel/sys.c
--- linux-2.4.20/kernel/sys.c	Sat Aug  3 02:39:46 2002
+++ linux-2.4.20b/kernel/sys.c	Tue Mar 18 00:12:54 2003
@@ -1219,7 +1219,7 @@
 			error = put_user(current->pdeath_signal, (int *)arg2);
 			break;
 		case PR_GET_DUMPABLE:
-			if (current->mm->dumpable)
+			if (is_dumpable(current))
 				error = 1;
 			break;
 		case PR_SET_DUMPABLE:
@@ -1227,7 +1227,8 @@
 				error = -EINVAL;
 				break;
 			}
-			current->mm->dumpable = arg2;
+			if (is_dumpable(current))
+				current->mm->dumpable = arg2;
 			break;
 	        case PR_SET_UNALIGN:
 #ifdef SET_UNALIGN_CTL
