summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@bootlin.com>2018-02-12 16:03:10 -0500
committerBoris Brezillon <boris.brezillon@bootlin.com>2018-03-15 13:22:26 -0400
commit8f347c4232d5fc097599b711a3385722a6834005 (patch)
tree9910aa3bf6c0a44cfdba9c6122a922ee5b10fc9c
parent884cfd9023ce6afe8bcf181ec988d8516eb32bf0 (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.c1
-rw-r--r--drivers/mtd/inftlmount.c3
-rw-r--r--drivers/mtd/mtdblock.c1
-rw-r--r--drivers/mtd/mtdchar.c1
-rw-r--r--drivers/mtd/mtdconcat.c1
-rw-r--r--drivers/mtd/mtdoops.c1
-rw-r--r--drivers/mtd/mtdpart.c16
-rw-r--r--drivers/mtd/mtdswap.c2
-rw-r--r--drivers/mtd/nand/nand_base.c1
-rw-r--r--drivers/mtd/nand/nand_bbt.c1
-rw-r--r--drivers/mtd/nftlmount.c1
-rw-r--r--drivers/mtd/rfd_ftl.c1
-rw-r--r--drivers/mtd/sm_ftl.c1
-rw-r--r--drivers/mtd/tests/mtd_test.c1
-rw-r--r--drivers/mtd/tests/speedtest.c1
-rw-r--r--drivers/mtd/ubi/io.c1
-rw-r--r--fs/jffs2/erase.c1
-rw-r--r--include/linux/mtd/mtd.h3
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
216void mtd_erase_callback(struct erase_info *instr) 215void 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}
226EXPORT_SYMBOL_GPL(mtd_erase_callback); 218EXPORT_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
550retry: 550retry:
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)
333retry: 333retry:
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
41struct 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 */
46struct erase_info { 48struct 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;