--- 2.3.42aa3-alpha/drivers/block/ll_rw_blk.c.~1~ Wed Feb 9 03:27:39 2000 +++ 2.3.42aa3-alpha/drivers/block/ll_rw_blk.c Wed Feb 9 18:42:26 2000 @@ -309,7 +309,8 @@ add_wait_queue(&wait_for_request, &wait); for (;;) { - current->state = TASK_UNINTERRUPTIBLE; + /* FIFO wake-one wakeup will make starvtion even better */ + __set_current_state(TASK_UNINTERRUPTIBLE|TASK_EXCLUSIVE); spin_lock_irqsave(&io_request_lock,flags); req = get_request(n, dev); spin_unlock_irqrestore(&io_request_lock,flags); --- 2.3.42aa3-alpha/fs/buffer.c.~1~ Tue Feb 8 19:43:13 2000 +++ 2.3.42aa3-alpha/fs/buffer.c Wed Feb 9 17:51:46 2000 @@ -148,9 +148,9 @@ atomic_inc(&bh->b_count); add_wait_queue(&bh->b_wait, &wait); repeat: - run_task_queue(&tq_disk); set_task_state(tsk, TASK_UNINTERRUPTIBLE); if (buffer_locked(bh)) { + run_task_queue(&tq_disk); schedule(); goto repeat; } --- 2.3.42aa3-alpha/mm/filemap.c.~1~ Sun Jan 30 15:43:40 2000 +++ 2.3.42aa3-alpha/mm/filemap.c Wed Feb 9 18:40:11 2000 @@ -579,10 +579,10 @@ add_wait_queue(&page->wait, &wait); do { - run_task_queue(&tq_disk); set_task_state(tsk, TASK_UNINTERRUPTIBLE); if (!PageLocked(page)) break; + run_task_queue(&tq_disk); schedule(); } while (PageLocked(page)); tsk->state = TASK_RUNNING; @@ -624,13 +624,13 @@ struct task_struct *tsk = current; DECLARE_WAITQUEUE(wait, tsk); - run_task_queue(&tq_disk); - __set_task_state(tsk, TASK_UNINTERRUPTIBLE); add_wait_queue(&page->wait, &wait); - if (PageLocked(page)) + if (PageLocked(page)) { + run_task_queue(&tq_disk); schedule(); + } __set_task_state(tsk, TASK_RUNNING); remove_wait_queue(&page->wait, &wait); @@ -674,13 +674,13 @@ struct task_struct *tsk = current; DECLARE_WAITQUEUE(wait, tsk); - run_task_queue(&tq_disk); - __set_task_state(tsk, TASK_UNINTERRUPTIBLE); add_wait_queue(&page->wait, &wait); - if (PageLocked(page)) + if (PageLocked(page)) { + run_task_queue(&tq_disk); schedule(); + } __set_task_state(tsk, TASK_RUNNING); remove_wait_queue(&page->wait, &wait);