diff options
-rw-r--r-- | drivers/mtd/nand/nandsim.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c index 205df0f771fe..a7574807dc46 100644 --- a/drivers/mtd/nand/nandsim.c +++ b/drivers/mtd/nand/nandsim.c | |||
@@ -1272,7 +1272,13 @@ static int prog_page(struct nandsim *ns, int num) | |||
1272 | mypage = NS_GET_PAGE(ns); | 1272 | mypage = NS_GET_PAGE(ns); |
1273 | if (mypage->byte == NULL) { | 1273 | if (mypage->byte == NULL) { |
1274 | NS_DBG("prog_page: allocating page %d\n", ns->regs.row); | 1274 | NS_DBG("prog_page: allocating page %d\n", ns->regs.row); |
1275 | mypage->byte = kmalloc(ns->geom.pgszoob, GFP_KERNEL); | 1275 | /* |
1276 | * We allocate memory with GFP_NOFS because a flash FS may | ||
1277 | * utilize this. If it is holding an FS lock, then gets here, | ||
1278 | * then kmalloc runs writeback which goes to the FS again | ||
1279 | * and deadlocks. This was seen in practice. | ||
1280 | */ | ||
1281 | mypage->byte = kmalloc(ns->geom.pgszoob, GFP_NOFS); | ||
1276 | if (mypage->byte == NULL) { | 1282 | if (mypage->byte == NULL) { |
1277 | NS_ERR("prog_page: error allocating memory for page %d\n", ns->regs.row); | 1283 | NS_ERR("prog_page: error allocating memory for page %d\n", ns->regs.row); |
1278 | return -1; | 1284 | return -1; |