--- ./lib/rwsem-spinlock.c.orig 2005-04-20 11:14:28.666913001 -0700 +++ ./lib/rwsem-spinlock.c 2005-04-20 11:15:46.267550985 -0700 @@ -135,12 +135,12 @@ rwsemtrace(sem,"Entering __down_read"); - spin_lock(&sem->wait_lock); + spin_lock_irq(&sem->wait_lock); if (sem->activity>=0 && list_empty(&sem->wait_list)) { /* granted */ sem->activity++; - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); goto out; } @@ -179,7 +179,7 @@ int ret = 0; rwsemtrace(sem,"Entering __down_read_trylock"); - spin_lock(&sem->wait_lock); + spin_lock_irq(&sem->wait_lock); if (sem->activity>=0 && list_empty(&sem->wait_list)) { /* granted */ @@ -187,7 +187,7 @@ ret = 1; } - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); rwsemtrace(sem,"Leaving __down_read_trylock"); return ret; @@ -204,12 +204,12 @@ rwsemtrace(sem,"Entering __down_write"); - spin_lock(&sem->wait_lock); + spin_lock_irq(&sem->wait_lock); if (sem->activity==0 && list_empty(&sem->wait_list)) { /* granted */ sem->activity = -1; - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); goto out; } @@ -224,7 +224,7 @@ list_add_tail(&waiter.list,&sem->wait_list); /* we don't need to touch the semaphore struct anymore */ - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); /* wait to be given the lock */ for (;;) { @@ -248,7 +248,7 @@ int ret = 0; rwsemtrace(sem,"Entering __down_write_trylock"); - spin_lock(&sem->wait_lock); + spin_lock_irq(&sem->wait_lock); if (sem->activity==0 && list_empty(&sem->wait_list)) { /* granted */ @@ -256,7 +256,7 @@ ret = 1; } - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); rwsemtrace(sem,"Leaving __down_write_trylock"); return ret; @@ -269,12 +269,12 @@ { rwsemtrace(sem,"Entering __up_read"); - spin_lock(&sem->wait_lock); + spin_lock_irq(&sem->wait_lock); if (--sem->activity==0 && !list_empty(&sem->wait_list)) sem = __rwsem_wake_one_writer(sem); - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); rwsemtrace(sem,"Leaving __up_read"); } @@ -286,13 +286,13 @@ { rwsemtrace(sem,"Entering __up_write"); - spin_lock(&sem->wait_lock); + spin_lock_irq(&sem->wait_lock); sem->activity = 0; if (!list_empty(&sem->wait_list)) sem = __rwsem_do_wake(sem, 1); - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); rwsemtrace(sem,"Leaving __up_write"); } @@ -305,13 +305,13 @@ { rwsemtrace(sem,"Entering __downgrade_write"); - spin_lock(&sem->wait_lock); + spin_lock_irq(&sem->wait_lock); sem->activity = 1; if (!list_empty(&sem->wait_list)) sem = __rwsem_do_wake(sem,0); - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); rwsemtrace(sem,"Leaving __downgrade_write"); } --- ./lib/rwsem.c.orig 2005-04-20 11:14:37.641945944 -0700 +++ ./lib/rwsem.c 2005-04-20 11:16:34.074398812 -0700 @@ -141,7 +141,7 @@ set_task_state(tsk,TASK_UNINTERRUPTIBLE); /* set up my own style of waitqueue */ - spin_lock(&sem->wait_lock); + spin_lock_irq(&sem->wait_lock); waiter->task = tsk; get_task_struct(tsk); @@ -156,7 +156,7 @@ if (!(count & RWSEM_ACTIVE_MASK)) sem = __rwsem_do_wake(sem, 0); - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); /* wait to be given the lock */ for (;;) { @@ -211,13 +211,13 @@ { rwsemtrace(sem,"Entering rwsem_wake"); - spin_lock(&sem->wait_lock); + spin_lock_irq(&sem->wait_lock); /* do nothing if list empty */ if (!list_empty(&sem->wait_list)) sem = __rwsem_do_wake(sem, 0); - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); rwsemtrace(sem,"Leaving rwsem_wake"); @@ -233,13 +233,13 @@ { rwsemtrace(sem,"Entering rwsem_downgrade_wake"); - spin_lock(&sem->wait_lock); + spin_lock_irq(&sem->wait_lock); /* do nothing if list empty */ if (!list_empty(&sem->wait_list)) sem = __rwsem_do_wake(sem, 1); - spin_unlock(&sem->wait_lock); + spin_unlock_irq(&sem->wait_lock); rwsemtrace(sem,"Leaving rwsem_downgrade_wake"); return sem;