From 9ee4f026a1a053c522f93982793d0e29d7db6a1f Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 18 Oct 2004 08:56:50 -0700 Subject: [PATCH] [PATCH] invalidate page race fix invalidate_inode_pages() and invalidate_inode_pages2() can mark pages not uptodate while read() is trying to read from them. This is interpreted as an I/O error. Fix that by teaching the invalidate code to leave the page alone if someone else has a ref on it. Signed-off-by: Jens Axboe Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- mm/truncate.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/mm/truncate.c b/mm/truncate.c index 0ab3a157e985f..7cd2ed501bb2f 100644 --- a/mm/truncate.c +++ b/mm/truncate.c @@ -79,6 +79,12 @@ invalidate_complete_page(struct address_space *mapping, struct page *page) spin_unlock_irq(&mapping->tree_lock); return 0; } + + BUG_ON(PagePrivate(page)); + if (page_count(page) != 2) { + spin_unlock_irq(&mapping->tree_lock); + return 0; + } __remove_from_page_cache(page); spin_unlock_irq(&mapping->tree_lock); ClearPageUptodate(page); @@ -269,7 +275,11 @@ void invalidate_inode_pages2(struct address_space *mapping) clear_page_dirty(page); ClearPageUptodate(page); } else { - invalidate_complete_page(mapping, page); + if (!invalidate_complete_page(mapping, + page)) { + clear_page_dirty(page); + ClearPageUptodate(page); + } } } unlock_page(page); -- 2.53.0