Messages in this thread Patch in this message | | | Date | Thu, 13 Dec 2007 13:50:41 +0900 | From | Hisashi Hifumi <> | Subject | [PATCH] fix invalidate_inode_pages2_range not to clear ret |
| |
Hi.
DIO invalidates page cache through invalidate_inode_pages2_range(). invalidate_inode_pages2_range() sets ret=-EIO when invalidate_complete_page2() fails, but this ret is cleared if do_launder_page() succeed on a page of next index. In this case, dio is carried out even if invalidate_complete_page2() fails on some pages. This can cause inconsistency between memory and blocks on HDD because the page cache still exists.
Following patch fixes this issue.
Thanks.
Signed-off-by :Hisashi Hifumi <hifumi.hisashi@oss.ntt.co.jp>
diff -Nrup linux-2.6.24-rc5.org/mm/truncate.c linux-2.6.24-rc5/mm/truncate.c --- linux-2.6.24-rc5.org/mm/truncate.c 2007-12-12 16:32:45.000000000 +0900 +++ linux-2.6.24-rc5/mm/truncate.c 2007-12-13 11:45:29.000000000 +0900 @@ -392,6 +392,7 @@ int invalidate_inode_pages2_range(struct pgoff_t next; int i; int ret = 0; + int ret2 = 0; int did_range_unmap = 0; int wrapped = 0;
@@ -441,13 +442,13 @@ int invalidate_inode_pages2_range(struct BUG_ON(page_mapped(page)); ret = do_launder_page(mapping, page); if (ret == 0 && !invalidate_complete_page2(mapping, page)) - ret = -EIO; + ret2 = -EIO; unlock_page(page); } pagevec_release(&pvec); cond_resched(); } - return ret; + return !ret ? ret2 : ret; } EXPORT_SYMBOL_GPL(invalidate_inode_pages2_range);
| |