diff -urNp x-ref/net/sunrpc/sched.c x/net/sunrpc/sched.c
--- x-ref/net/sunrpc/sched.c	2003-03-13 06:05:52.000000000 +0100
+++ x/net/sunrpc/sched.c	2003-03-13 06:06:42.000000000 +0100
@@ -297,10 +297,12 @@ rpc_schedule_run(struct rpc_task *task)
  */
 void rpciod_wake_up(void)
 {
+	lock_kernel();
 	if(rpciod_pid==0)
 		printk(KERN_ERR "rpciod: wot no daemon?\n");
 	if (waitqueue_active(&rpciod_idle))
 		wake_up(&rpciod_idle);
+        unlock_kernel();
 }
 
 /*
@@ -985,7 +987,9 @@ rpciod(void *ptr)
 	/*
 	 * Let our maker know we're running ...
 	 */
+	lock_kernel();
 	rpciod_pid = current->pid;
+	unlock_kernel();
 	up(&rpciod_running);
 
 	daemonize();
@@ -1024,8 +1028,10 @@ rpciod(void *ptr)
 		rpciod_killall();
 	}
 
+	lock_kernel();
 	rpciod_pid = 0;
 	wake_up(assassin);
+	unlock_kernel();
 
 	dprintk("RPC: rpciod exiting\n");
 	MOD_DEC_USE_COUNT;
@@ -1064,8 +1070,12 @@ rpciod_up(void)
 	down(&rpciod_sema);
 	dprintk("rpciod_up: pid %d, users %d\n", rpciod_pid, rpciod_users);
 	rpciod_users++;
-	if (rpciod_pid)
+	lock_kernel();
+	if (rpciod_pid) {
+		unlock_kernel();
 		goto out;
+	}
+	unlock_kernel();
 	/*
 	 * If there's no pid, we should be the first user.
 	 */
@@ -1117,6 +1127,7 @@ rpciod_down(void)
 	/*
 	 * Display a message if we're going to wait longer.
 	 */
+	lock_kernel();
 	while (rpciod_pid) {
 		dprintk("rpciod_down: waiting for pid %d to exit\n", rpciod_pid);
 		if (signalled()) {
@@ -1125,6 +1136,7 @@ rpciod_down(void)
 		}
 		interruptible_sleep_on(&rpciod_killer);
 	}
+	unlock_kernel();
 	spin_lock_irqsave(&current->sigmask_lock, flags);
 	recalc_sigpending(current);
 	spin_unlock_irqrestore(&current->sigmask_lock, flags);