diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/drivers/block/ll_rw_blk.c x/drivers/block/ll_rw_blk.c
--- x-ref/drivers/block/ll_rw_blk.c	2003-10-17 21:37:20.000000000 +0200
+++ x/drivers/block/ll_rw_blk.c	2003-10-17 21:38:14.000000000 +0200
@@ -1301,7 +1301,7 @@ void __submit_bh(int rw, struct buffer_h
 	/* fix race condition with wait_on_buffer() */
 	smp_mb(); /* spin_unlock may have inclusive semantics */
 	if (waitqueue_active(&bh->b_wait))
-		wake_up(&bh->b_wait);
+		run_task_queue(&tq_disk);
 
 	if (block_dump)
 		printk(KERN_DEBUG "%s: %s block %lu/%u on %s\n", current->comm, rw == WRITE ? "WRITE" : "READ", bh->b_rsector, count, kdevname(bh->b_rdev));
diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/mm/filemap.c x/mm/filemap.c
--- x-ref/mm/filemap.c	2003-10-17 21:37:18.000000000 +0200
+++ x/mm/filemap.c	2003-10-17 21:37:22.000000000 +0200
@@ -800,7 +800,7 @@ void wakeup_page_waiters(struct page * p
 
 	head = page_waitqueue(page);
 	if (waitqueue_active(head))
-		wake_up(head);
+		sync_page(page);
 }
 
 /* 
diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/mm/swapfile.c x/mm/swapfile.c
--- x-ref/mm/swapfile.c	2003-10-17 21:37:18.000000000 +0200
+++ x/mm/swapfile.c	2003-10-17 21:37:22.000000000 +0200
@@ -997,8 +997,10 @@ asmlinkage long sys_swapon(const char * 
 		goto bad_swap;
 	}
 
+	get_page(virt_to_page(swap_header));
 	lock_page(virt_to_page(swap_header));
 	rw_swap_page_nolock(READ, SWP_ENTRY(type,0), (char *) swap_header);
+	put_page(virt_to_page(swap_header));
 
 	if (!memcmp("SWAP-SPACE",swap_header->magic.magic,10))
 		swap_header_version = 1;