diff -urN wt13-preempt/drivers/ieee1394/csr.c wt13-preempt-fix/drivers/ieee1394/csr.c
--- wt13-preempt/drivers/ieee1394/csr.c	Wed Apr 23 10:52:22 2003
+++ wt13-preempt-fix/drivers/ieee1394/csr.c	Wed Apr 23 10:54:38 2003
@@ -19,6 +19,7 @@
 
 #include <linux/string.h>
 #include <linux/module.h> /* needed for MODULE_PARM */
+#include <linux/sched.h>
 
 #include "ieee1394_types.h"
 #include "hosts.h"
diff -urN wt13-preempt/include/linux/sched.h wt13-preempt-fix/include/linux/sched.h
--- wt13-preempt/include/linux/sched.h	Wed Apr 23 10:52:22 2003
+++ wt13-preempt-fix/include/linux/sched.h	Wed Apr 23 10:54:38 2003
@@ -352,6 +352,7 @@
 	struct task_struct *next_task, *prev_task;
 	struct mm_struct *active_mm;
 	struct local_page local_page;
+	unsigned long flags;
 
 /* task state */
 	struct linux_binfmt *binfmt;
diff -urN wt13-preempt/kernel/sched.c wt13-preempt-fix/kernel/sched.c
--- wt13-preempt/kernel/sched.c	Wed Apr 23 10:52:22 2003
+++ wt13-preempt-fix/kernel/sched.c	Wed Apr 23 10:53:52 2003
@@ -1400,6 +1400,13 @@
 	sched_data->curr = current;
 	sched_data->last_schedule = get_cycles();
 	clear_bit(task_cpu(current), &wait_init_idle);
+#ifdef CONFIG_PREEMPT
+	/*
+	 * fix up the preempt_count for non-CPU0 idle threads
+	 */
+	if (current->processor)
+		current->preempt_count = 0;
+#endif
 }
 
 extern void init_timervecs (void);