--- vm-2.4.7/drivers/block/ll_rw_blk.c.2 Fri Aug 3 19:06:46 2001 +++ vm-2.4.7/drivers/block/ll_rw_blk.c Fri Aug 3 19:32:46 2001 @@ -1037,9 +1037,16 @@ * water mark. instead start I/O on the queued stuff. */ if (atomic_read(&queued_sectors) >= high_queued_sectors) { - run_task_queue(&tq_disk); - wait_event(blk_buffers_wait, - atomic_read(&queued_sectors) < low_queued_sectors); + DECLARE_WAITQUEUE(wait, current); + + add_wait_queue(&blk_buffers_wait, &wait); + do { + run_task_queue(&tq_disk); + set_current_state(TASK_UNINTERRUPTIBLE); + if (atomic_read(&queued_sectors) >= low_queued_sectors) + schedule(); + } while (atomic_read(&queued_sectors) >= low_queued_sectors); + remove_wait_queue(&blk_buffers_wait, &wait); } /* Only one thread can actually submit the I/O. */