summaryrefslogtreecommitdiffstats
path: root/mm/memory.c
diff options
context:
space:
mode:
authorSteve French <sfrench@us.ibm.com>2006-02-01 12:16:53 -0800
committerSteve French <sfrench@us.ibm.com>2006-02-01 12:16:53 -0800
commite6da74e1f20ea7822e52a9e4fbd3d25bd907e471 (patch)
treed9b3bc7e654fb788d1cf3a1759b1b3c74cc56a04 /mm/memory.c
parent1877c9ea66a29563987f22d0a86c66f438a87ce2 (diff)
parent3c3b809e256c417847f1a96b2f9d9f66c7fcb02c (diff)
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'mm/memory.c')
-rw-r--r--mm/memory.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/mm/memory.c b/mm/memory.c
index 7a11ddd5060..2bee1f21aa8 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1871,6 +1871,7 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
goto out;
entry = pte_to_swp_entry(orig_pte);
+again:
page = lookup_swap_cache(entry);
if (!page) {
swapin_readahead(entry, address, vma);
@@ -1894,6 +1895,12 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
mark_page_accessed(page);
lock_page(page);
+ if (!PageSwapCache(page)) {
+ /* Page migration has occured */
+ unlock_page(page);
+ page_cache_release(page);
+ goto again;
+ }
/*
* Back out if somebody else already faulted in this pte.