|
@@ -1005,9 +1005,19 @@ grow_dev_page(struct block_device *bdev, sector_t block,
|
|
|
struct buffer_head *bh;
|
|
|
sector_t end_block;
|
|
|
int ret = 0; /* Will call free_more_memory() */
|
|
|
+ gfp_t gfp_mask;
|
|
|
|
|
|
- page = find_or_create_page(inode->i_mapping, index,
|
|
|
- (mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS)|__GFP_MOVABLE);
|
|
|
+ gfp_mask = mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS;
|
|
|
+ gfp_mask |= __GFP_MOVABLE;
|
|
|
+ /*
|
|
|
+ * XXX: __getblk_slow() can not really deal with failure and
|
|
|
+ * will endlessly loop on improvised global reclaim. Prefer
|
|
|
+ * looping in the allocator rather than here, at least that
|
|
|
+ * code knows what it's doing.
|
|
|
+ */
|
|
|
+ gfp_mask |= __GFP_NOFAIL;
|
|
|
+
|
|
|
+ page = find_or_create_page(inode->i_mapping, index, gfp_mask);
|
|
|
if (!page)
|
|
|
return ret;
|
|
|
|