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>
This commit is contained in:
parent
7928b2cbe5
commit
e6e620f0e1
|
@ -971,10 +971,14 @@ EXPORT_SYMBOL_GPL(__put_mtd_device);
|
||||||
*/
|
*/
|
||||||
int mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
|
int mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
|
||||||
{
|
{
|
||||||
|
if (!mtd->erasesize || !mtd->_erase)
|
||||||
|
return -ENOTSUPP;
|
||||||
|
|
||||||
if (instr->addr >= mtd->size || instr->len > mtd->size - instr->addr)
|
if (instr->addr >= mtd->size || instr->len > mtd->size - instr->addr)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (!(mtd->flags & MTD_WRITEABLE))
|
if (!(mtd->flags & MTD_WRITEABLE))
|
||||||
return -EROFS;
|
return -EROFS;
|
||||||
|
|
||||||
instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
|
instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
|
||||||
if (!instr->len) {
|
if (!instr->len) {
|
||||||
instr->state = MTD_ERASE_DONE;
|
instr->state = MTD_ERASE_DONE;
|
||||||
|
|
Loading…
Reference in New Issue