mm/rmap.c | 9 +++++++++ 1 files changed, 9 insertions(+) diff -puN mm/rmap.c~page_referenced-move-dirty mm/rmap.c --- bk-linux/mm/rmap.c~page_referenced-move-dirty 2004-11-08 15:08:24.483320552 +0300 +++ bk-linux-nikita/mm/rmap.c 2004-11-08 15:08:24.486320096 +0300 @@ -297,15 +297,24 @@ static int page_referenced_one(struct pa pte = page_check_address(page, mm, address); if (!IS_ERR(pte)) { + int dirty; + if (ptep_clear_flush_young(vma, address, pte)) referenced++; if (mm != current->mm && has_swap_token(mm)) referenced++; + /* + * transfer dirtiness from pte to the page, while we are here + */ + dirty = ptep_test_and_clear_dirty(pte); + (*mapcount)--; pte_unmap(pte); spin_unlock(&mm->page_table_lock); + if (dirty) + set_page_dirty(page); } out: return referenced; _