|
@@ -2112,7 +2112,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
{
|
|
|
struct page *old_page, *new_page;
|
|
|
pte_t entry;
|
|
|
- int reuse = 0, ret = 0;
|
|
|
+ int ret = 0;
|
|
|
int page_mkwrite = 0;
|
|
|
struct page *dirty_page = NULL;
|
|
|
|
|
@@ -2149,14 +2149,16 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
}
|
|
|
page_cache_release(old_page);
|
|
|
}
|
|
|
- reuse = reuse_swap_page(old_page);
|
|
|
- if (reuse)
|
|
|
+ if (reuse_swap_page(old_page)) {
|
|
|
/*
|
|
|
* The page is all ours. Move it to our anon_vma so
|
|
|
* the rmap code will not search our parent or siblings.
|
|
|
* Protected against the rmap code by the page lock.
|
|
|
*/
|
|
|
page_move_anon_rmap(old_page, vma, address);
|
|
|
+ unlock_page(old_page);
|
|
|
+ goto reuse;
|
|
|
+ }
|
|
|
unlock_page(old_page);
|
|
|
} else if (unlikely((vma->vm_flags & (VM_WRITE|VM_SHARED)) ==
|
|
|
(VM_WRITE|VM_SHARED))) {
|
|
@@ -2220,10 +2222,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
}
|
|
|
dirty_page = old_page;
|
|
|
get_page(dirty_page);
|
|
|
- reuse = 1;
|
|
|
- }
|
|
|
|
|
|
- if (reuse) {
|
|
|
reuse:
|
|
|
flush_cache_page(vma, address, pte_pfn(orig_pte));
|
|
|
entry = pte_mkyoung(orig_pte);
|