mm: make read_cache_page synchronous
Ensure pages are uptodate after returning from read_cache_page, which allows us to cut out most of the filesystem-internal PageUptodate calls. I didn't have a great look down the call chains, but this appears to fixes 7 possible use-before uptodate in hfs, 2 in hfsplus, 1 in jfs, a few in ecryptfs, 1 in jffs2, and a possible cleared data overwritten with readpage in block2mtd. All depending on whether the filler is async and/or can return with a !uptodate page. Signed-off-by: Nick Piggin <npiggin@suse.de> Cc: Hugh Dickins <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
714b8171af
commit
6fe6900e1e
@ -2532,14 +2532,7 @@ int ntfs_attr_set(ntfs_inode *ni, const s64 ofs, const s64 cnt, const u8 val)
|
||||
page = read_mapping_page(mapping, idx, NULL);
|
||||
if (IS_ERR(page)) {
|
||||
ntfs_error(vol->sb, "Failed to read first partial "
|
||||
"page (sync error, index 0x%lx).", idx);
|
||||
return PTR_ERR(page);
|
||||
}
|
||||
wait_on_page_locked(page);
|
||||
if (unlikely(!PageUptodate(page))) {
|
||||
ntfs_error(vol->sb, "Failed to read first partial page "
|
||||
"(async error, index 0x%lx).", idx);
|
||||
page_cache_release(page);
|
||||
"page (error, index 0x%lx).", idx);
|
||||
return PTR_ERR(page);
|
||||
}
|
||||
/*
|
||||
@ -2602,14 +2595,7 @@ int ntfs_attr_set(ntfs_inode *ni, const s64 ofs, const s64 cnt, const u8 val)
|
||||
page = read_mapping_page(mapping, idx, NULL);
|
||||
if (IS_ERR(page)) {
|
||||
ntfs_error(vol->sb, "Failed to read last partial page "
|
||||
"(sync error, index 0x%lx).", idx);
|
||||
return PTR_ERR(page);
|
||||
}
|
||||
wait_on_page_locked(page);
|
||||
if (unlikely(!PageUptodate(page))) {
|
||||
ntfs_error(vol->sb, "Failed to read last partial page "
|
||||
"(async error, index 0x%lx).", idx);
|
||||
page_cache_release(page);
|
||||
"(error, index 0x%lx).", idx);
|
||||
return PTR_ERR(page);
|
||||
}
|
||||
kaddr = kmap_atomic(page, KM_USER0);
|
||||
|
Reference in New Issue
Block a user