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(¤t->sigmask_lock, flags); recalc_sigpending(current); spin_unlock_irqrestore(¤t->sigmask_lock, flags);