Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+6 -32
-1
drivers/mtd/ftl.c
··· 342 342 if (!erase) 343 343 return -ENOMEM; 344 344 345 - erase->mtd = part->mbd.mtd; 346 345 erase->addr = xfer->Offset; 347 346 erase->len = 1 << part->header.EraseUnitSize; 348 347
-3
drivers/mtd/inftlmount.c
··· 208 208 if (ip->Reserved0 != ip->firstUnit) { 209 209 struct erase_info *instr = &inftl->instr; 210 210 211 - instr->mtd = inftl->mbd.mtd; 212 - 213 211 /* 214 212 * Most likely this is using the 215 213 * undocumented qiuck mount feature. ··· 383 385 _first_? */ 384 386 385 387 /* Use async erase interface, test return code */ 386 - instr->mtd = inftl->mbd.mtd; 387 388 instr->addr = block * inftl->EraseSize; 388 389 instr->len = inftl->mbd.mtd->erasesize; 389 390 /* Erase one physical eraseblock at a time, even though the NAND api
-1
drivers/mtd/mtdblock.c
··· 65 65 /* 66 66 * First, let's erase the flash block. 67 67 */ 68 - erase.mtd = mtd; 69 68 erase.addr = pos; 70 69 erase.len = len; 71 70
-1
drivers/mtd/mtdchar.c
··· 726 726 erase->addr = einfo32.start; 727 727 erase->len = einfo32.length; 728 728 } 729 - erase->mtd = mtd; 730 729 731 730 ret = mtd_erase(mtd, erase); 732 731 kfree(erase);
-1
drivers/mtd/mtdconcat.c
··· 427 427 erase->len = length; 428 428 429 429 length -= erase->len; 430 - erase->mtd = subdev; 431 430 if ((err = mtd_erase(subdev, erase))) { 432 431 /* sanity check: should never happen since 433 432 * block alignment has been checked above */
-1
drivers/mtd/mtdoops.c
··· 94 94 int ret; 95 95 int page; 96 96 97 - erase.mtd = mtd; 98 97 erase.addr = offset; 99 98 erase.len = mtd->erasesize; 100 99
+4 -12
drivers/mtd/mtdpart.c
··· 205 205 206 206 instr->addr += part->offset; 207 207 ret = part->parent->_erase(part->parent, instr); 208 - if (ret) { 209 - if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) 210 - instr->fail_addr -= part->offset; 211 - instr->addr -= part->offset; 212 - } 208 + if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) 209 + instr->fail_addr -= part->offset; 210 + instr->addr -= part->offset; 211 + 213 212 return ret; 214 213 } 215 214 216 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 218 EXPORT_SYMBOL_GPL(mtd_erase_callback); 227 219
-2
drivers/mtd/mtdswap.c
··· 549 549 550 550 retry: 551 551 memset(&erase, 0, sizeof(struct erase_info)); 552 - 553 - erase.mtd = mtd; 554 552 erase.addr = mtdswap_eb_offset(d, eb); 555 553 erase.len = mtd->erasesize; 556 554
-1
drivers/mtd/nand/nand_base.c
··· 527 527 528 528 /* Attempt erase before marking OOB */ 529 529 memset(&einfo, 0, sizeof(einfo)); 530 - einfo.mtd = mtd; 531 530 einfo.addr = ofs; 532 531 einfo.len = 1ULL << chip->phys_erase_shift; 533 532 nand_erase_nand(mtd, &einfo, 0);
-1
drivers/mtd/nand/nand_bbt.c
··· 852 852 } 853 853 854 854 memset(&einfo, 0, sizeof(einfo)); 855 - einfo.mtd = mtd; 856 855 einfo.addr = to; 857 856 einfo.len = 1 << this->bbt_erase_shift; 858 857 res = nand_erase_nand(mtd, &einfo, 1);
-1
drivers/mtd/nftlmount.c
··· 328 328 memset(instr, 0, sizeof(struct erase_info)); 329 329 330 330 /* XXX: use async erase interface, XXX: test return code */ 331 - instr->mtd = nftl->mbd.mtd; 332 331 instr->addr = block * nftl->EraseSize; 333 332 instr->len = nftl->EraseSize; 334 333 if (mtd_erase(mtd, instr)) {
-1
drivers/mtd/rfd_ftl.c
··· 275 275 if (!erase) 276 276 return -ENOMEM; 277 277 278 - erase->mtd = part->mbd.mtd; 279 278 erase->addr = part->blocks[block].offset; 280 279 erase->len = part->block_size; 281 280
-1
drivers/mtd/sm_ftl.c
··· 460 460 struct mtd_info *mtd = ftl->trans->mtd; 461 461 struct erase_info erase; 462 462 463 - erase.mtd = mtd; 464 463 erase.addr = sm_mkoffset(ftl, zone_num, block, 0); 465 464 erase.len = ftl->block_size; 466 465
-1
drivers/mtd/tests/mtd_test.c
··· 14 14 loff_t addr = (loff_t)ebnum * mtd->erasesize; 15 15 16 16 memset(&ei, 0, sizeof(struct erase_info)); 17 - ei.mtd = mtd; 18 17 ei.addr = addr; 19 18 ei.len = mtd->erasesize; 20 19
-1
drivers/mtd/tests/speedtest.c
··· 59 59 loff_t addr = (loff_t)ebnum * mtd->erasesize; 60 60 61 61 memset(&ei, 0, sizeof(struct erase_info)); 62 - ei.mtd = mtd; 63 62 ei.addr = addr; 64 63 ei.len = mtd->erasesize * blocks; 65 64
-1
drivers/mtd/ubi/io.c
··· 333 333 retry: 334 334 memset(&ei, 0, sizeof(struct erase_info)); 335 335 336 - ei.mtd = ubi->mtd; 337 336 ei.addr = (loff_t)pnum * ubi->peb_size; 338 337 ei.len = ubi->peb_size; 339 338
-1
fs/jffs2/erase.c
··· 59 59 60 60 memset(instr, 0, sizeof(*instr)); 61 61 62 - instr->mtd = c->mtd; 63 62 instr->addr = jeb->offset; 64 63 instr->len = c->sector_size; 65 64
+2 -1
include/linux/mtd/mtd.h
··· 38 38 39 39 #define MTD_FAIL_ADDR_UNKNOWN -1LL 40 40 41 + struct mtd_info; 42 + 41 43 /* 42 44 * If the erase fails, fail_addr might indicate exactly which block failed. If 43 45 * fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level 44 46 * or was not specific to any particular block. 45 47 */ 46 48 struct erase_info { 47 - struct mtd_info *mtd; 48 49 uint64_t addr; 49 50 uint64_t len; 50 51 uint64_t fail_addr;