[PATCH] zap_pte_range should not mark non-uptodate pages dirty

From: Dave Kleikamp
Date: Thu Oct 21 2004 - 16:33:39 EST


zap_pte_range should not mark non-uptodate pages dirty

Doing O_DIRECT writes to an mmapped file caused pages in the page cache to
be marked dirty but not uptodate. This led to a bug in mpage_writepage.

Signed-off-by: Dave Kleikamp <shaggy@xxxxxxxxxxxxxx>
Signed-off-by: Andrea Arcangeli <andrea@xxxxxxxxxx>

diff -urp linux-2.6.9/mm/memory.c linux/mm/memory.c
--- linux-2.6.9/mm/memory.c 2004-10-21 10:49:26.598031488 -0500
+++ linux/mm/memory.c 2004-10-21 16:01:44.902376232 -0500
@@ -414,7 +414,15 @@ static void zap_pte_range(struct mmu_gat
&& linear_page_index(details->nonlinear_vma,
address+offset) != page->index)
set_pte(ptep, pgoff_to_pte(page->index));
- if (pte_dirty(pte))
+ /*
+ * PG_uptodate can be cleared by
+ * invalidate_inode_pages2, so we must not try to write
+ * not uptodate pages. Otherwise we risk invalidating
+ * underlying O_DIRECT writes, and secondly because
+ * pdflush would BUG(). Coherency of mmaps against
+ * O_DIRECT still cannot be guaranteed though.
+ */
+ if (pte_dirty(pte) && PageUptodate(page))
set_page_dirty(page);
if (pte_young(pte) && !PageAnon(page))
mark_page_accessed(page);


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/