--- 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. */
