diff options
author | Boris Brezillon <boris.brezillon@bootlin.com> | 2018-02-12 16:03:10 -0500 |
---|---|---|
committer | Boris Brezillon <boris.brezillon@bootlin.com> | 2018-03-15 13:22:26 -0400 |
commit | 8f347c4232d5fc097599b711a3385722a6834005 (patch) | |
tree | 9910aa3bf6c0a44cfdba9c6122a922ee5b10fc9c | |
parent | 884cfd9023ce6afe8bcf181ec988d8516eb32bf0 (diff) |
mtd: Unconditionally update ->fail_addr and ->addr in part_erase()
->fail_addr and ->addr can be updated no matter the result of
parent->_erase(), we just need to remove the code doing the same thing
in mtd_erase_callback() to avoid adjusting those fields twice.
Note that this can be done because all MTD users have been converted to
not pass an erase_info->callback() and are thus only taking the
->addr_fail and ->addr fields into account after part_erase() has
returned.
While we're at it, get rid of the erase_info->mtd field which was only
needed to let mtd_erase_callback() get the partition device back.
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Reviewed-by: Richard Weinberger <richard@nod.at>
-rw-r--r-- | drivers/mtd/ftl.c | 1 | ||||
-rw-r--r-- | drivers/mtd/inftlmount.c | 3 | ||||
-rw-r--r-- | drivers/mtd/mtdblock.c | 1 | ||||
-rw-r--r-- | drivers/mtd/mtdchar.c | 1 | ||||
-rw-r--r-- | drivers/mtd/mtdconcat.c | 1 | ||||
-rw-r--r-- | drivers/mtd/mtdoops.c | 1 | ||||
-rw-r--r-- | drivers/mtd/mtdpart.c | 16 | ||||
-rw-r--r-- | drivers/mtd/mtdswap.c | 2 | ||||
-rw-r--r-- | drivers/mtd/nand/nand_base.c | 1 | ||||
-rw-r--r-- | drivers/mtd/nand/nand_bbt.c | 1 | ||||
-rw-r--r-- | drivers/mtd/nftlmount.c | 1 | ||||
-rw-r--r-- | drivers/mtd/rfd_ftl.c | 1 | ||||
-rw-r--r-- | drivers/mtd/sm_ftl.c | 1 | ||||
-rw-r--r-- | drivers/mtd/tests/mtd_test.c | 1 | ||||
-rw-r--r-- | drivers/mtd/tests/speedtest.c | 1 | ||||
-rw-r--r-- | drivers/mtd/ubi/io.c | 1 | ||||
-rw-r--r-- | fs/jffs2/erase.c | 1 | ||||
-rw-r--r-- | include/linux/mtd/mtd.h | 3 |
18 files changed, 6 insertions, 32 deletions
diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c index fcf9907e7987..0a6adfaec7b5 100644 --- a/drivers/mtd/ftl.c +++ b/drivers/mtd/ftl.c | |||
@@ -342,7 +342,6 @@ static int erase_xfer(partition_t *part, | |||
342 | if (!erase) | 342 | if (!erase) |
343 | return -ENOMEM; | 343 | return -ENOMEM; |
344 | 344 | ||
345 | erase->mtd = part->mbd.mtd; | ||
346 | erase->addr = xfer->Offset; | 345 | erase->addr = xfer->Offset; |
347 | erase->len = 1 << part->header.EraseUnitSize; | 346 | erase->len = 1 << part->header.EraseUnitSize; |
348 | 347 | ||
diff --git a/drivers/mtd/inftlmount.c b/drivers/mtd/inftlmount.c index 0f47be4834d8..aab4f68bd36f 100644 --- a/drivers/mtd/inftlmount.c +++ b/drivers/mtd/inftlmount.c | |||
@@ -208,8 +208,6 @@ static int find_boot_record(struct INFTLrecord *inftl) | |||
208 | if (ip->Reserved0 != ip->firstUnit) { | 208 | if (ip->Reserved0 != ip->firstUnit) { |
209 | struct erase_info *instr = &inftl->instr; | 209 | struct erase_info *instr = &inftl->instr; |
210 | 210 | ||
211 | instr->mtd = inftl->mbd.mtd; | ||
212 | |||
213 | /* | 211 | /* |
214 | * Most likely this is using the | 212 | * Most likely this is using the |
215 | * undocumented qiuck mount feature. | 213 | * undocumented qiuck mount feature. |
@@ -385,7 +383,6 @@ int INFTL_formatblock(struct INFTLrecord *inftl, int block) | |||
385 | _first_? */ | 383 | _first_? */ |
386 | 384 | ||
387 | /* Use async erase interface, test return code */ | 385 | /* Use async erase interface, test return code */ |
388 | instr->mtd = inftl->mbd.mtd; | ||
389 | instr->addr = block * inftl->EraseSize; | 386 | instr->addr = block * inftl->EraseSize; |
390 | instr->len = inftl->mbd.mtd->erasesize; | 387 | instr->len = inftl->mbd.mtd->erasesize; |
391 | /* Erase one physical eraseblock at a time, even though the NAND api | 388 | /* Erase one physical eraseblock at a time, even though the NAND api |
diff --git a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c index 7b2b7f651181..a5b1933c0490 100644 --- a/drivers/mtd/mtdblock.c +++ b/drivers/mtd/mtdblock.c | |||
@@ -65,7 +65,6 @@ static int erase_write (struct mtd_info *mtd, unsigned long pos, | |||
65 | /* | 65 | /* |
66 | * First, let's erase the flash block. | 66 | * First, let's erase the flash block. |
67 | */ | 67 | */ |
68 | erase.mtd = mtd; | ||
69 | erase.addr = pos; | 68 | erase.addr = pos; |
70 | erase.len = len; | 69 | erase.len = len; |
71 | 70 | ||
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index 2beb22dd6bbb..c06b33f80e75 100644 --- a/drivers/mtd/mtdchar.c +++ b/drivers/mtd/mtdchar.c | |||
@@ -726,7 +726,6 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg) | |||
726 | erase->addr = einfo32.start; | 726 | erase->addr = einfo32.start; |
727 | erase->len = einfo32.length; | 727 | erase->len = einfo32.length; |
728 | } | 728 | } |
729 | erase->mtd = mtd; | ||
730 | 729 | ||
731 | ret = mtd_erase(mtd, erase); | 730 | ret = mtd_erase(mtd, erase); |
732 | kfree(erase); | 731 | kfree(erase); |
diff --git a/drivers/mtd/mtdconcat.c b/drivers/mtd/mtdconcat.c index caa09bf6e572..93c47e56d9d8 100644 --- a/drivers/mtd/mtdconcat.c +++ b/drivers/mtd/mtdconcat.c | |||
@@ -427,7 +427,6 @@ static int concat_erase(struct mtd_info *mtd, struct erase_info *instr) | |||
427 | erase->len = length; | 427 | erase->len = length; |
428 | 428 | ||
429 | length -= erase->len; | 429 | length -= erase->len; |
430 | erase->mtd = subdev; | ||
431 | if ((err = mtd_erase(subdev, erase))) { | 430 | if ((err = mtd_erase(subdev, erase))) { |
432 | /* sanity check: should never happen since | 431 | /* sanity check: should never happen since |
433 | * block alignment has been checked above */ | 432 | * block alignment has been checked above */ |
diff --git a/drivers/mtd/mtdoops.c b/drivers/mtd/mtdoops.c index 028ded59297b..9f25111fd559 100644 --- a/drivers/mtd/mtdoops.c +++ b/drivers/mtd/mtdoops.c | |||
@@ -94,7 +94,6 @@ static int mtdoops_erase_block(struct mtdoops_context *cxt, int offset) | |||
94 | int ret; | 94 | int ret; |
95 | int page; | 95 | int page; |
96 | 96 | ||
97 | erase.mtd = mtd; | ||
98 | erase.addr = offset; | 97 | erase.addr = offset; |
99 | erase.len = mtd->erasesize; | 98 | erase.len = mtd->erasesize; |
100 | 99 | ||
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index ae1206633d9d..1c07a6f0dfe5 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c | |||
@@ -205,23 +205,15 @@ static int part_erase(struct mtd_info *mtd, struct erase_info *instr) | |||
205 | 205 | ||
206 | instr->addr += part->offset; | 206 | instr->addr += part->offset; |
207 | ret = part->parent->_erase(part->parent, instr); | 207 | ret = part->parent->_erase(part->parent, instr); |
208 | if (ret) { | 208 | if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) |
209 | if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) | 209 | instr->fail_addr -= part->offset; |
210 | instr->fail_addr -= part->offset; | 210 | instr->addr -= part->offset; |
211 | instr->addr -= part->offset; | 211 | |
212 | } | ||
213 | return ret; | 212 | return ret; |
214 | } | 213 | } |
215 | 214 | ||
216 | void mtd_erase_callback(struct erase_info *instr) | 215 | void mtd_erase_callback(struct erase_info *instr) |
217 | { | 216 | { |
218 | if (instr->mtd->_erase == part_erase) { | ||
219 | struct mtd_part *part = mtd_to_part(instr->mtd); | ||
220 | |||
221 | if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) | ||
222 | instr->fail_addr -= part->offset; | ||
223 | instr->addr -= part->offset; | ||
224 | } | ||
225 | } | 217 | } |
226 | EXPORT_SYMBOL_GPL(mtd_erase_callback); | 218 | EXPORT_SYMBOL_GPL(mtd_erase_callback); |
227 | 219 | ||
diff --git a/drivers/mtd/mtdswap.c b/drivers/mtd/mtdswap.c index d390324d102e..7161f8a17f62 100644 --- a/drivers/mtd/mtdswap.c +++ b/drivers/mtd/mtdswap.c | |||
@@ -549,8 +549,6 @@ static int mtdswap_erase_block(struct mtdswap_dev *d, struct swap_eb *eb) | |||
549 | 549 | ||
550 | retry: | 550 | retry: |
551 | memset(&erase, 0, sizeof(struct erase_info)); | 551 | memset(&erase, 0, sizeof(struct erase_info)); |
552 | |||
553 | erase.mtd = mtd; | ||
554 | erase.addr = mtdswap_eb_offset(d, eb); | 552 | erase.addr = mtdswap_eb_offset(d, eb); |
555 | erase.len = mtd->erasesize; | 553 | erase.len = mtd->erasesize; |
556 | 554 | ||
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index e70ca16a5118..16c8bc06975d 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -527,7 +527,6 @@ static int nand_block_markbad_lowlevel(struct mtd_info *mtd, loff_t ofs) | |||
527 | 527 | ||
528 | /* Attempt erase before marking OOB */ | 528 | /* Attempt erase before marking OOB */ |
529 | memset(&einfo, 0, sizeof(einfo)); | 529 | memset(&einfo, 0, sizeof(einfo)); |
530 | einfo.mtd = mtd; | ||
531 | einfo.addr = ofs; | 530 | einfo.addr = ofs; |
532 | einfo.len = 1ULL << chip->phys_erase_shift; | 531 | einfo.len = 1ULL << chip->phys_erase_shift; |
533 | nand_erase_nand(mtd, &einfo, 0); | 532 | nand_erase_nand(mtd, &einfo, 0); |
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c index 36092850be2c..d9f4ceff2568 100644 --- a/drivers/mtd/nand/nand_bbt.c +++ b/drivers/mtd/nand/nand_bbt.c | |||
@@ -852,7 +852,6 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf, | |||
852 | } | 852 | } |
853 | 853 | ||
854 | memset(&einfo, 0, sizeof(einfo)); | 854 | memset(&einfo, 0, sizeof(einfo)); |
855 | einfo.mtd = mtd; | ||
856 | einfo.addr = to; | 855 | einfo.addr = to; |
857 | einfo.len = 1 << this->bbt_erase_shift; | 856 | einfo.len = 1 << this->bbt_erase_shift; |
858 | res = nand_erase_nand(mtd, &einfo, 1); | 857 | res = nand_erase_nand(mtd, &einfo, 1); |
diff --git a/drivers/mtd/nftlmount.c b/drivers/mtd/nftlmount.c index 07e122449759..d8f6dba01c87 100644 --- a/drivers/mtd/nftlmount.c +++ b/drivers/mtd/nftlmount.c | |||
@@ -328,7 +328,6 @@ int NFTL_formatblock(struct NFTLrecord *nftl, int block) | |||
328 | memset(instr, 0, sizeof(struct erase_info)); | 328 | memset(instr, 0, sizeof(struct erase_info)); |
329 | 329 | ||
330 | /* XXX: use async erase interface, XXX: test return code */ | 330 | /* XXX: use async erase interface, XXX: test return code */ |
331 | instr->mtd = nftl->mbd.mtd; | ||
332 | instr->addr = block * nftl->EraseSize; | 331 | instr->addr = block * nftl->EraseSize; |
333 | instr->len = nftl->EraseSize; | 332 | instr->len = nftl->EraseSize; |
334 | if (mtd_erase(mtd, instr)) { | 333 | if (mtd_erase(mtd, instr)) { |
diff --git a/drivers/mtd/rfd_ftl.c b/drivers/mtd/rfd_ftl.c index 4e0b55cd08e2..df27f24ce0fa 100644 --- a/drivers/mtd/rfd_ftl.c +++ b/drivers/mtd/rfd_ftl.c | |||
@@ -275,7 +275,6 @@ static int erase_block(struct partition *part, int block) | |||
275 | if (!erase) | 275 | if (!erase) |
276 | return -ENOMEM; | 276 | return -ENOMEM; |
277 | 277 | ||
278 | erase->mtd = part->mbd.mtd; | ||
279 | erase->addr = part->blocks[block].offset; | 278 | erase->addr = part->blocks[block].offset; |
280 | erase->len = part->block_size; | 279 | erase->len = part->block_size; |
281 | 280 | ||
diff --git a/drivers/mtd/sm_ftl.c b/drivers/mtd/sm_ftl.c index c11156f9d96f..72740ede9f05 100644 --- a/drivers/mtd/sm_ftl.c +++ b/drivers/mtd/sm_ftl.c | |||
@@ -460,7 +460,6 @@ static int sm_erase_block(struct sm_ftl *ftl, int zone_num, uint16_t block, | |||
460 | struct mtd_info *mtd = ftl->trans->mtd; | 460 | struct mtd_info *mtd = ftl->trans->mtd; |
461 | struct erase_info erase; | 461 | struct erase_info erase; |
462 | 462 | ||
463 | erase.mtd = mtd; | ||
464 | erase.addr = sm_mkoffset(ftl, zone_num, block, 0); | 463 | erase.addr = sm_mkoffset(ftl, zone_num, block, 0); |
465 | erase.len = ftl->block_size; | 464 | erase.len = ftl->block_size; |
466 | 465 | ||
diff --git a/drivers/mtd/tests/mtd_test.c b/drivers/mtd/tests/mtd_test.c index 0ac625e8f798..c84250beffdc 100644 --- a/drivers/mtd/tests/mtd_test.c +++ b/drivers/mtd/tests/mtd_test.c | |||
@@ -14,7 +14,6 @@ int mtdtest_erase_eraseblock(struct mtd_info *mtd, unsigned int ebnum) | |||
14 | loff_t addr = (loff_t)ebnum * mtd->erasesize; | 14 | loff_t addr = (loff_t)ebnum * mtd->erasesize; |
15 | 15 | ||
16 | memset(&ei, 0, sizeof(struct erase_info)); | 16 | memset(&ei, 0, sizeof(struct erase_info)); |
17 | ei.mtd = mtd; | ||
18 | ei.addr = addr; | 17 | ei.addr = addr; |
19 | ei.len = mtd->erasesize; | 18 | ei.len = mtd->erasesize; |
20 | 19 | ||
diff --git a/drivers/mtd/tests/speedtest.c b/drivers/mtd/tests/speedtest.c index f8e5dc11f943..20edb3b49c77 100644 --- a/drivers/mtd/tests/speedtest.c +++ b/drivers/mtd/tests/speedtest.c | |||
@@ -59,7 +59,6 @@ static int multiblock_erase(int ebnum, int blocks) | |||
59 | loff_t addr = (loff_t)ebnum * mtd->erasesize; | 59 | loff_t addr = (loff_t)ebnum * mtd->erasesize; |
60 | 60 | ||
61 | memset(&ei, 0, sizeof(struct erase_info)); | 61 | memset(&ei, 0, sizeof(struct erase_info)); |
62 | ei.mtd = mtd; | ||
63 | ei.addr = addr; | 62 | ei.addr = addr; |
64 | ei.len = mtd->erasesize * blocks; | 63 | ei.len = mtd->erasesize * blocks; |
65 | 64 | ||
diff --git a/drivers/mtd/ubi/io.c b/drivers/mtd/ubi/io.c index 8843d26837b2..0e3a76a9e2f8 100644 --- a/drivers/mtd/ubi/io.c +++ b/drivers/mtd/ubi/io.c | |||
@@ -333,7 +333,6 @@ static int do_sync_erase(struct ubi_device *ubi, int pnum) | |||
333 | retry: | 333 | retry: |
334 | memset(&ei, 0, sizeof(struct erase_info)); | 334 | memset(&ei, 0, sizeof(struct erase_info)); |
335 | 335 | ||
336 | ei.mtd = ubi->mtd; | ||
337 | ei.addr = (loff_t)pnum * ubi->peb_size; | 336 | ei.addr = (loff_t)pnum * ubi->peb_size; |
338 | ei.len = ubi->peb_size; | 337 | ei.len = ubi->peb_size; |
339 | 338 | ||
diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c index 09bb6c00b869..83b8f06b4a64 100644 --- a/fs/jffs2/erase.c +++ b/fs/jffs2/erase.c | |||
@@ -59,7 +59,6 @@ static void jffs2_erase_block(struct jffs2_sb_info *c, | |||
59 | 59 | ||
60 | memset(instr, 0, sizeof(*instr)); | 60 | memset(instr, 0, sizeof(*instr)); |
61 | 61 | ||
62 | instr->mtd = c->mtd; | ||
63 | instr->addr = jeb->offset; | 62 | instr->addr = jeb->offset; |
64 | instr->len = c->sector_size; | 63 | instr->len = c->sector_size; |
65 | 64 | ||
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 5018437d7999..4cbb7f555244 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
@@ -38,13 +38,14 @@ | |||
38 | 38 | ||
39 | #define MTD_FAIL_ADDR_UNKNOWN -1LL | 39 | #define MTD_FAIL_ADDR_UNKNOWN -1LL |
40 | 40 | ||
41 | struct mtd_info; | ||
42 | |||
41 | /* | 43 | /* |
42 | * If the erase fails, fail_addr might indicate exactly which block failed. If | 44 | * If the erase fails, fail_addr might indicate exactly which block failed. If |
43 | * fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level | 45 | * fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level |
44 | * or was not specific to any particular block. | 46 | * or was not specific to any particular block. |
45 | */ | 47 | */ |
46 | struct erase_info { | 48 | struct erase_info { |
47 | struct mtd_info *mtd; | ||
48 | uint64_t addr; | 49 | uint64_t addr; |
49 | uint64_t len; | 50 | uint64_t len; |
50 | uint64_t fail_addr; | 51 | uint64_t fail_addr; |