}
                        }
                        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;
 
                                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)
 
                        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) {
                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)