diff -ur v2.4.3/mm/memory.c work-2.4.3/mm/memory.c
--- v2.4.3/mm/memory.c	Thu Apr  5 11:53:46 2001
+++ work-2.4.3/mm/memory.c	Thu Apr  5 16:27:08 2001
@@ -859,9 +859,12 @@
 		 * the swap cache, grab a reference and start using it.
 		 * Can not do lock_page, holding page_table_lock.
 		 */
-		if (!PageSwapCache(old_page) || TryLockPage(old_page))
+		if (!PageSwapCache(old_page))
 			break;
-		if (is_page_shared(old_page)) {
+		if (TryLockPage(old_page))
+			break;
+		/* Recheck swapcachedness: this is a triggerable smp race. */
+		if (!PageSwapCache(old_page) || is_page_shared(old_page)) {
 			UnlockPage(old_page);
 			break;
 		}
