Only in linux-2.4.0-test10.kio.01/drivers/char: raw.c.~1~ Only in linux-2.4.0-test10.kio.01/fs: buffer.c.~1~ Only in linux-2.4.0-test10.kio.01/fs: iobuf.c.~1~ Only in linux-2.4.0-test10.kio.01/include/linux: iobuf.h.~1~ diff -ru linux-2.4.0-test10.kio.01/mm/memory.c linux-2.4.0-test10.kio.02/mm/memory.c --- linux-2.4.0-test10.kio.01/mm/memory.c Thu Nov 2 11:59:11 2000 +++ linux-2.4.0-test10.kio.02/mm/memory.c Thu Nov 2 12:39:16 2000 @@ -384,7 +384,7 @@ /* * Do a quick page-table lookup for a single page. */ -static struct page * follow_page(unsigned long address) +static struct page * follow_page(unsigned long address, int write) { pgd_t *pgd; pmd_t *pmd; @@ -394,7 +394,8 @@ if (pmd) { pte_t * pte = pte_offset(pmd, address); if (pte && pte_present(*pte)) - return pte_page(*pte); + if (!write || pte_write(*pte)) + return pte_page(*pte); } return NULL; @@ -474,11 +475,14 @@ if (handle_mm_fault(current->mm, vma, ptr, datain) <= 0) goto out_unlock; spin_lock(&mm->page_table_lock); - map = follow_page(ptr); + map = follow_page(ptr, datain); if (!map) { + /* If handle_mm_fault did not complete the + operation, or if we hit the swapout race + before taking the page_table_lock, just try + again on this page. */ spin_unlock(&mm->page_table_lock); - dprintk (KERN_ERR "Missing page in map_user_kiobuf\n"); - goto out_unlock; + continue; } map = get_page_map(map); if (map) Only in linux-2.4.0-test10.kio.01/mm: memory.c.~1~