diff options
| -rw-r--r-- | mm/filemap.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index f3555fb806d..2f55a1e2baf 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -741,7 +741,14 @@ repeat:  		page = __page_cache_alloc(gfp_mask);  		if (!page)  			return NULL; -		err = add_to_page_cache_lru(page, mapping, index, gfp_mask); +		/* +		 * We want a regular kernel memory (not highmem or DMA etc) +		 * allocation for the radix tree nodes, but we need to honour +		 * the context-specific requirements the caller has asked for. +		 * GFP_RECLAIM_MASK collects those requirements. +		 */ +		err = add_to_page_cache_lru(page, mapping, index, +			(gfp_mask & GFP_RECLAIM_MASK));  		if (unlikely(err)) {  			page_cache_release(page);  			page = NULL; @@ -950,7 +957,7 @@ grab_cache_page_nowait(struct address_space *mapping, pgoff_t index)  		return NULL;  	}  	page = __page_cache_alloc(mapping_gfp_mask(mapping) & ~__GFP_FS); -	if (page && add_to_page_cache_lru(page, mapping, index, GFP_KERNEL)) { +	if (page && add_to_page_cache_lru(page, mapping, index, GFP_NOFS)) {  		page_cache_release(page);  		page = NULL;  	}  |