--- linux-2.4/lib/rwsem.c.orig 2004-06-16 12:26:52.000000000 +1000 +++ linux-2.4/lib/rwsem.c 2004-06-16 12:33:28.000000000 +1000 @@ -61,10 +61,10 @@ static inline struct rw_semaphore *__rws list_del(&waiter->list); tsk = waiter->task; - mb(); + task_lock(tsk); /* task_lock is an implicit memory barrier */ waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + task_unlock(tsk); goto out; /* grant an infinite number of read locks to the readers at the front of the queue @@ -93,10 +93,10 @@ static inline struct rw_semaphore *__rws waiter = list_entry(next,struct rwsem_waiter,list); next = waiter->list.next; tsk = waiter->task; - mb(); + task_lock(tsk); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + task_unlock(tsk); } sem->wait_list.next = next; @@ -128,7 +128,6 @@ static inline struct rw_semaphore *rwsem /* set up my own style of waitqueue */ spin_lock(&sem->wait_lock); waiter->task = tsk; - get_task_struct(tsk); list_add_tail(&waiter->list,&sem->wait_list); --- linux-2.4/lib/rwsem-spinlock.c.orig 2004-06-16 12:33:40.000000000 +1000 +++ linux-2.4/lib/rwsem-spinlock.c 2004-06-16 12:34:39.000000000 +1000 @@ -66,10 +66,10 @@ static inline struct rw_semaphore *__rws sem->activity = -1; list_del(&waiter->list); tsk = waiter->task; - mb(); + task_lock(tsk); /* implicit memory barrier */ waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + task_unlock(tsk); goto out; } @@ -78,10 +78,10 @@ static inline struct rw_semaphore *__rws do { list_del(&waiter->list); tsk = waiter->task; - mb(); + task_lock(tsk); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + task_unlock(tsk); woken++; if (list_empty(&sem->wait_list)) break; @@ -108,10 +108,10 @@ static inline struct rw_semaphore *__rws list_del(&waiter->list); tsk = waiter->task; - mb(); + task_lock(tsk); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + task_unlock(tsk); return sem; } @@ -140,7 +140,6 @@ void __down_read(struct rw_semaphore *se /* set up my own style of waitqueue */ waiter.task = tsk; waiter.flags = RWSEM_WAITING_FOR_READ; - get_task_struct(tsk); list_add_tail(&waiter.list,&sem->wait_list); @@ -209,7 +208,6 @@ void __down_write(struct rw_semaphore *s /* set up my own style of waitqueue */ waiter.task = tsk; waiter.flags = RWSEM_WAITING_FOR_WRITE; - get_task_struct(tsk); list_add_tail(&waiter.list,&sem->wait_list);