aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@free-electrons.com>2018-01-22 04:38:01 -0500
committerBoris Brezillon <boris.brezillon@bootlin.com>2018-02-12 05:46:38 -0500
commite6e620f0e15e3bc4b3bc3078c9f3285830f2fd3c (patch)
treeb63ce60f107da8fff9435e8795d085e2eddb3111
parent7928b2cbe55b2a410a0f5c1f154610059c57b1b2 (diff)
mtd: Make sure the device supports erase operations in mtd_erase()
Some devices do not implement ->_erase() or have an invalid ->erasesize value. In this case, mtd_erase() should return -ENOTSUPP. Note that the test is not done on the MTD_NO_ERASE flag because this flag means 'erasing a block before writing to it is unnecessary', not 'the erase operation is not supported'. Actually, some drivers are setting the MTD_NO_ERASE flag but still implementing the ->_erase() hook and setting a valid ->erasesize value. Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Reviewed-by: Miquel Raynal <miquel.raynal@free-electrons.com> Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
-rw-r--r--drivers/mtd/mtdcore.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 28553c840d32..56cb037a1052 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -971,10 +971,14 @@ EXPORT_SYMBOL_GPL(__put_mtd_device);
971 */ 971 */
972int mtd_erase(struct mtd_info *mtd, struct erase_info *instr) 972int mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
973{ 973{
974 if (!mtd->erasesize || !mtd->_erase)
975 return -ENOTSUPP;
976
974 if (instr->addr >= mtd->size || instr->len > mtd->size - instr->addr) 977 if (instr->addr >= mtd->size || instr->len > mtd->size - instr->addr)
975 return -EINVAL; 978 return -EINVAL;
976 if (!(mtd->flags & MTD_WRITEABLE)) 979 if (!(mtd->flags & MTD_WRITEABLE))
977 return -EROFS; 980 return -EROFS;
981
978 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN; 982 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
979 if (!instr->len) { 983 if (!instr->len) {
980 instr->state = MTD_ERASE_DONE; 984 instr->state = MTD_ERASE_DONE;