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; }