mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 06:14:39 +01:00
mm: do not ignore mapping_gfp_mask in page cache allocation paths
page_cache_read, do_generic_file_read, __generic_file_splice_read and __ntfs_grab_cache_pages currently ignore mapping_gfp_mask when calling add_to_page_cache_lru which might cause recursion into fs down in the direct reclaim path if the mapping really relies on GFP_NOFS semantic. This doesn't seem to be the case now because page_cache_read (page fault path) doesn't seem to suffer from the reclaim recursion issues and do_generic_file_read and __generic_file_splice_read also shouldn't be called under fs locks which would deadlock in the reclaim path. Anyway it is better to obey mapping gfp mask and prevent from later breakage. [[email protected]: coding-style fixes] Signed-off-by: Michal Hocko <[email protected]> Cc: Dave Chinner <[email protected]> Cc: Neil Brown <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: Al Viro <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Tetsuo Handa <[email protected]> Cc: Anton Altaparmakov <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
1 parent
0f96ae2928
commit
6afdb859b7
3 files changed
+7
-5
No files matched your search
+2
-1
@@ -525,7 +525,8 @@ static inline int __ntfs_grab_cache_pages(struct address_space *mapping,
|
||||
}
|
||||
}
|
||||
err = add_to_page_cache_lru(*cached_page, mapping,
|
||||
index, GFP_KERNEL);
|
||||
index,
|
||||
GFP_KERNEL & mapping_gfp_mask(mapping));
|
||||
if (unlikely(err)) {
|
||||
if (err == -EEXIST)
|
||||
continue;
|
||||
|
||||
+1
-1
@@ -359,7 +359,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
|
||||
break;
|
||||
|
||||
error = add_to_page_cache_lru(page, mapping, index,
|
||||
GFP_KERNEL);
|
||||
GFP_KERNEL & mapping_gfp_mask(mapping));
|
||||
if (unlikely(error)) {
|
||||
page_cache_release(page);
|
||||
if (error == -EEXIST)
|
||||
|
||||
+4
-3
@@ -1664,8 +1664,8 @@ no_cached_page:
|
||||
error = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
error = add_to_page_cache_lru(page, mapping,
|
||||
index, GFP_KERNEL);
|
||||
error = add_to_page_cache_lru(page, mapping, index,
|
||||
GFP_KERNEL & mapping_gfp_mask(mapping));
|
||||
if (error) {
|
||||
page_cache_release(page);
|
||||
if (error == -EEXIST) {
|
||||
@@ -1766,7 +1766,8 @@ static int page_cache_read(struct file *file, pgoff_t offset)
|
||||
if (!page)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = add_to_page_cache_lru(page, mapping, offset, GFP_KERNEL);
|
||||
ret = add_to_page_cache_lru(page, mapping, offset,
|
||||
GFP_KERNEL & mapping_gfp_mask(mapping));
|
||||
if (ret == 0)
|
||||
ret = mapping->a_ops->readpage(file, page);
|
||||
else if (ret == -EEXIST)
|
||||
|
||||
Reference in new issue
Block a user