diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/mtd/ubi/io.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'drivers/mtd/ubi/io.c')
-rw-r--r-- | drivers/mtd/ubi/io.c | 326 |
1 files changed, 185 insertions, 141 deletions
diff --git a/drivers/mtd/ubi/io.c b/drivers/mtd/ubi/io.c index 332f992f13d9..8c1b1c7bc4a7 100644 --- a/drivers/mtd/ubi/io.c +++ b/drivers/mtd/ubi/io.c | |||
@@ -91,7 +91,7 @@ | |||
91 | #include <linux/slab.h> | 91 | #include <linux/slab.h> |
92 | #include "ubi.h" | 92 | #include "ubi.h" |
93 | 93 | ||
94 | #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID | 94 | #ifdef CONFIG_MTD_UBI_DEBUG |
95 | static int paranoid_check_not_bad(const struct ubi_device *ubi, int pnum); | 95 | static int paranoid_check_not_bad(const struct ubi_device *ubi, int pnum); |
96 | static int paranoid_check_peb_ec_hdr(const struct ubi_device *ubi, int pnum); | 96 | static int paranoid_check_peb_ec_hdr(const struct ubi_device *ubi, int pnum); |
97 | static int paranoid_check_ec_hdr(const struct ubi_device *ubi, int pnum, | 97 | static int paranoid_check_ec_hdr(const struct ubi_device *ubi, int pnum, |
@@ -146,6 +146,28 @@ int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset, | |||
146 | if (err) | 146 | if (err) |
147 | return err; | 147 | return err; |
148 | 148 | ||
149 | /* | ||
150 | * Deliberately corrupt the buffer to improve robustness. Indeed, if we | ||
151 | * do not do this, the following may happen: | ||
152 | * 1. The buffer contains data from previous operation, e.g., read from | ||
153 | * another PEB previously. The data looks like expected, e.g., if we | ||
154 | * just do not read anything and return - the caller would not | ||
155 | * notice this. E.g., if we are reading a VID header, the buffer may | ||
156 | * contain a valid VID header from another PEB. | ||
157 | * 2. The driver is buggy and returns us success or -EBADMSG or | ||
158 | * -EUCLEAN, but it does not actually put any data to the buffer. | ||
159 | * | ||
160 | * This may confuse UBI or upper layers - they may think the buffer | ||
161 | * contains valid data while in fact it is just old data. This is | ||
162 | * especially possible because UBI (and UBIFS) relies on CRC, and | ||
163 | * treats data as correct even in case of ECC errors if the CRC is | ||
164 | * correct. | ||
165 | * | ||
166 | * Try to prevent this situation by changing the first byte of the | ||
167 | * buffer. | ||
168 | */ | ||
169 | *((uint8_t *)buf) ^= 0xFF; | ||
170 | |||
149 | addr = (loff_t)pnum * ubi->peb_size + offset; | 171 | addr = (loff_t)pnum * ubi->peb_size + offset; |
150 | retry: | 172 | retry: |
151 | err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf); | 173 | err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf); |
@@ -166,9 +188,9 @@ retry: | |||
166 | return UBI_IO_BITFLIPS; | 188 | return UBI_IO_BITFLIPS; |
167 | } | 189 | } |
168 | 190 | ||
169 | if (read != len && retries++ < UBI_IO_RETRIES) { | 191 | if (retries++ < UBI_IO_RETRIES) { |
170 | dbg_io("error %d%s while reading %d bytes from PEB %d:%d," | 192 | dbg_io("error %d%s while reading %d bytes from PEB " |
171 | " read only %zd bytes, retry", | 193 | "%d:%d, read only %zd bytes, retry", |
172 | err, errstr, len, pnum, offset, read); | 194 | err, errstr, len, pnum, offset, read); |
173 | yield(); | 195 | yield(); |
174 | goto retry; | 196 | goto retry; |
@@ -322,6 +344,12 @@ static int do_sync_erase(struct ubi_device *ubi, int pnum) | |||
322 | wait_queue_head_t wq; | 344 | wait_queue_head_t wq; |
323 | 345 | ||
324 | dbg_io("erase PEB %d", pnum); | 346 | dbg_io("erase PEB %d", pnum); |
347 | ubi_assert(pnum >= 0 && pnum < ubi->peb_count); | ||
348 | |||
349 | if (ubi->ro_mode) { | ||
350 | ubi_err("read-only mode"); | ||
351 | return -EROFS; | ||
352 | } | ||
325 | 353 | ||
326 | retry: | 354 | retry: |
327 | init_waitqueue_head(&wq); | 355 | init_waitqueue_head(&wq); |
@@ -368,7 +396,7 @@ retry: | |||
368 | if (err) | 396 | if (err) |
369 | return err; | 397 | return err; |
370 | 398 | ||
371 | if (ubi_dbg_is_erase_failure() && !err) { | 399 | if (ubi_dbg_is_erase_failure()) { |
372 | dbg_err("cannot erase PEB %d (emulated)", pnum); | 400 | dbg_err("cannot erase PEB %d (emulated)", pnum); |
373 | return -EIO; | 401 | return -EIO; |
374 | } | 402 | } |
@@ -376,25 +404,6 @@ retry: | |||
376 | return 0; | 404 | return 0; |
377 | } | 405 | } |
378 | 406 | ||
379 | /** | ||
380 | * check_pattern - check if buffer contains only a certain byte pattern. | ||
381 | * @buf: buffer to check | ||
382 | * @patt: the pattern to check | ||
383 | * @size: buffer size in bytes | ||
384 | * | ||
385 | * This function returns %1 in there are only @patt bytes in @buf, and %0 if | ||
386 | * something else was also found. | ||
387 | */ | ||
388 | static int check_pattern(const void *buf, uint8_t patt, int size) | ||
389 | { | ||
390 | int i; | ||
391 | |||
392 | for (i = 0; i < size; i++) | ||
393 | if (((const uint8_t *)buf)[i] != patt) | ||
394 | return 0; | ||
395 | return 1; | ||
396 | } | ||
397 | |||
398 | /* Patterns to write to a physical eraseblock when torturing it */ | 407 | /* Patterns to write to a physical eraseblock when torturing it */ |
399 | static uint8_t patterns[] = {0xa5, 0x5a, 0x0}; | 408 | static uint8_t patterns[] = {0xa5, 0x5a, 0x0}; |
400 | 409 | ||
@@ -426,7 +435,7 @@ static int torture_peb(struct ubi_device *ubi, int pnum) | |||
426 | if (err) | 435 | if (err) |
427 | goto out; | 436 | goto out; |
428 | 437 | ||
429 | err = check_pattern(ubi->peb_buf1, 0xFF, ubi->peb_size); | 438 | err = ubi_check_pattern(ubi->peb_buf1, 0xFF, ubi->peb_size); |
430 | if (err == 0) { | 439 | if (err == 0) { |
431 | ubi_err("erased PEB %d, but a non-0xFF byte found", | 440 | ubi_err("erased PEB %d, but a non-0xFF byte found", |
432 | pnum); | 441 | pnum); |
@@ -445,7 +454,8 @@ static int torture_peb(struct ubi_device *ubi, int pnum) | |||
445 | if (err) | 454 | if (err) |
446 | goto out; | 455 | goto out; |
447 | 456 | ||
448 | err = check_pattern(ubi->peb_buf1, patterns[i], ubi->peb_size); | 457 | err = ubi_check_pattern(ubi->peb_buf1, patterns[i], |
458 | ubi->peb_size); | ||
449 | if (err == 0) { | 459 | if (err == 0) { |
450 | ubi_err("pattern %x checking failed for PEB %d", | 460 | ubi_err("pattern %x checking failed for PEB %d", |
451 | patterns[i], pnum); | 461 | patterns[i], pnum); |
@@ -455,7 +465,7 @@ static int torture_peb(struct ubi_device *ubi, int pnum) | |||
455 | } | 465 | } |
456 | 466 | ||
457 | err = patt_count; | 467 | err = patt_count; |
458 | ubi_msg("PEB %d passed torture test, do not mark it a bad", pnum); | 468 | ubi_msg("PEB %d passed torture test, do not mark it as bad", pnum); |
459 | 469 | ||
460 | out: | 470 | out: |
461 | mutex_unlock(&ubi->buf_mutex); | 471 | mutex_unlock(&ubi->buf_mutex); |
@@ -498,12 +508,26 @@ static int nor_erase_prepare(struct ubi_device *ubi, int pnum) | |||
498 | size_t written; | 508 | size_t written; |
499 | loff_t addr; | 509 | loff_t addr; |
500 | uint32_t data = 0; | 510 | uint32_t data = 0; |
511 | /* | ||
512 | * Note, we cannot generally define VID header buffers on stack, | ||
513 | * because of the way we deal with these buffers (see the header | ||
514 | * comment in this file). But we know this is a NOR-specific piece of | ||
515 | * code, so we can do this. But yes, this is error-prone and we should | ||
516 | * (pre-)allocate VID header buffer instead. | ||
517 | */ | ||
501 | struct ubi_vid_hdr vid_hdr; | 518 | struct ubi_vid_hdr vid_hdr; |
502 | 519 | ||
503 | addr = (loff_t)pnum * ubi->peb_size + ubi->vid_hdr_aloffset; | 520 | /* |
521 | * It is important to first invalidate the EC header, and then the VID | ||
522 | * header. Otherwise a power cut may lead to valid EC header and | ||
523 | * invalid VID header, in which case UBI will treat this PEB as | ||
524 | * corrupted and will try to preserve it, and print scary warnings (see | ||
525 | * the header comment in scan.c for more information). | ||
526 | */ | ||
527 | addr = (loff_t)pnum * ubi->peb_size; | ||
504 | err = ubi->mtd->write(ubi->mtd, addr, 4, &written, (void *)&data); | 528 | err = ubi->mtd->write(ubi->mtd, addr, 4, &written, (void *)&data); |
505 | if (!err) { | 529 | if (!err) { |
506 | addr -= ubi->vid_hdr_aloffset; | 530 | addr += ubi->vid_hdr_aloffset; |
507 | err = ubi->mtd->write(ubi->mtd, addr, 4, &written, | 531 | err = ubi->mtd->write(ubi->mtd, addr, 4, &written, |
508 | (void *)&data); | 532 | (void *)&data); |
509 | if (!err) | 533 | if (!err) |
@@ -512,18 +536,26 @@ static int nor_erase_prepare(struct ubi_device *ubi, int pnum) | |||
512 | 536 | ||
513 | /* | 537 | /* |
514 | * We failed to write to the media. This was observed with Spansion | 538 | * We failed to write to the media. This was observed with Spansion |
515 | * S29GL512N NOR flash. Most probably the eraseblock erasure was | 539 | * S29GL512N NOR flash. Most probably the previously eraseblock erasure |
516 | * interrupted at a very inappropriate moment, so it became unwritable. | 540 | * was interrupted at a very inappropriate moment, so it became |
517 | * In this case we probably anyway have garbage in this PEB. | 541 | * unwritable. In this case we probably anyway have garbage in this |
542 | * PEB. | ||
518 | */ | 543 | */ |
519 | err1 = ubi_io_read_vid_hdr(ubi, pnum, &vid_hdr, 0); | 544 | err1 = ubi_io_read_vid_hdr(ubi, pnum, &vid_hdr, 0); |
520 | if (err1 == UBI_IO_BAD_HDR_READ || err1 == UBI_IO_BAD_HDR) | 545 | if (err1 == UBI_IO_BAD_HDR_EBADMSG || err1 == UBI_IO_BAD_HDR || |
521 | /* | 546 | err1 == UBI_IO_FF) { |
522 | * The VID header is corrupted, so we can safely erase this | 547 | struct ubi_ec_hdr ec_hdr; |
523 | * PEB and not afraid that it will be treated as a valid PEB in | 548 | |
524 | * case of an unclean reboot. | 549 | err1 = ubi_io_read_ec_hdr(ubi, pnum, &ec_hdr, 0); |
525 | */ | 550 | if (err1 == UBI_IO_BAD_HDR_EBADMSG || err1 == UBI_IO_BAD_HDR || |
526 | return 0; | 551 | err1 == UBI_IO_FF) |
552 | /* | ||
553 | * Both VID and EC headers are corrupted, so we can | ||
554 | * safely erase this PEB and not afraid that it will be | ||
555 | * treated as a valid PEB in case of an unclean reboot. | ||
556 | */ | ||
557 | return 0; | ||
558 | } | ||
527 | 559 | ||
528 | /* | 560 | /* |
529 | * The PEB contains a valid VID header, but we cannot invalidate it. | 561 | * The PEB contains a valid VID header, but we cannot invalidate it. |
@@ -712,55 +744,57 @@ bad: | |||
712 | * and corrected by the flash driver; this is harmless but may indicate that | 744 | * and corrected by the flash driver; this is harmless but may indicate that |
713 | * this eraseblock may become bad soon (but may be not); | 745 | * this eraseblock may become bad soon (but may be not); |
714 | * o %UBI_IO_BAD_HDR if the erase counter header is corrupted (a CRC error); | 746 | * o %UBI_IO_BAD_HDR if the erase counter header is corrupted (a CRC error); |
715 | * o %UBI_IO_PEB_EMPTY if the physical eraseblock is empty; | 747 | * o %UBI_IO_BAD_HDR_EBADMSG is the same as %UBI_IO_BAD_HDR, but there also was |
748 | * a data integrity error (uncorrectable ECC error in case of NAND); | ||
749 | * o %UBI_IO_FF if only 0xFF bytes were read (the PEB is supposedly empty) | ||
716 | * o a negative error code in case of failure. | 750 | * o a negative error code in case of failure. |
717 | */ | 751 | */ |
718 | int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum, | 752 | int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum, |
719 | struct ubi_ec_hdr *ec_hdr, int verbose) | 753 | struct ubi_ec_hdr *ec_hdr, int verbose) |
720 | { | 754 | { |
721 | int err, read_err = 0; | 755 | int err, read_err; |
722 | uint32_t crc, magic, hdr_crc; | 756 | uint32_t crc, magic, hdr_crc; |
723 | 757 | ||
724 | dbg_io("read EC header from PEB %d", pnum); | 758 | dbg_io("read EC header from PEB %d", pnum); |
725 | ubi_assert(pnum >= 0 && pnum < ubi->peb_count); | 759 | ubi_assert(pnum >= 0 && pnum < ubi->peb_count); |
726 | 760 | ||
727 | err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE); | 761 | read_err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE); |
728 | if (err) { | 762 | if (read_err) { |
729 | if (err != UBI_IO_BITFLIPS && err != -EBADMSG) | 763 | if (read_err != UBI_IO_BITFLIPS && read_err != -EBADMSG) |
730 | return err; | 764 | return read_err; |
731 | 765 | ||
732 | /* | 766 | /* |
733 | * We read all the data, but either a correctable bit-flip | 767 | * We read all the data, but either a correctable bit-flip |
734 | * occurred, or MTD reported about some data integrity error, | 768 | * occurred, or MTD reported a data integrity error |
735 | * like an ECC error in case of NAND. The former is harmless, | 769 | * (uncorrectable ECC error in case of NAND). The former is |
736 | * the later may mean that the read data is corrupted. But we | 770 | * harmless, the later may mean that the read data is |
737 | * have a CRC check-sum and we will detect this. If the EC | 771 | * corrupted. But we have a CRC check-sum and we will detect |
738 | * header is still OK, we just report this as there was a | 772 | * this. If the EC header is still OK, we just report this as |
739 | * bit-flip. | 773 | * there was a bit-flip, to force scrubbing. |
740 | */ | 774 | */ |
741 | if (err == -EBADMSG) | ||
742 | read_err = UBI_IO_BAD_HDR_READ; | ||
743 | } | 775 | } |
744 | 776 | ||
745 | magic = be32_to_cpu(ec_hdr->magic); | 777 | magic = be32_to_cpu(ec_hdr->magic); |
746 | if (magic != UBI_EC_HDR_MAGIC) { | 778 | if (magic != UBI_EC_HDR_MAGIC) { |
747 | if (read_err) | 779 | if (read_err == -EBADMSG) |
748 | return read_err; | 780 | return UBI_IO_BAD_HDR_EBADMSG; |
749 | 781 | ||
750 | /* | 782 | /* |
751 | * The magic field is wrong. Let's check if we have read all | 783 | * The magic field is wrong. Let's check if we have read all |
752 | * 0xFF. If yes, this physical eraseblock is assumed to be | 784 | * 0xFF. If yes, this physical eraseblock is assumed to be |
753 | * empty. | 785 | * empty. |
754 | */ | 786 | */ |
755 | if (check_pattern(ec_hdr, 0xFF, UBI_EC_HDR_SIZE)) { | 787 | if (ubi_check_pattern(ec_hdr, 0xFF, UBI_EC_HDR_SIZE)) { |
756 | /* The physical eraseblock is supposedly empty */ | 788 | /* The physical eraseblock is supposedly empty */ |
757 | if (verbose) | 789 | if (verbose) |
758 | ubi_warn("no EC header found at PEB %d, " | 790 | ubi_warn("no EC header found at PEB %d, " |
759 | "only 0xFF bytes", pnum); | 791 | "only 0xFF bytes", pnum); |
760 | else if (UBI_IO_DEBUG) | 792 | dbg_bld("no EC header found at PEB %d, " |
761 | dbg_msg("no EC header found at PEB %d, " | 793 | "only 0xFF bytes", pnum); |
762 | "only 0xFF bytes", pnum); | 794 | if (!read_err) |
763 | return UBI_IO_PEB_EMPTY; | 795 | return UBI_IO_FF; |
796 | else | ||
797 | return UBI_IO_FF_BITFLIPS; | ||
764 | } | 798 | } |
765 | 799 | ||
766 | /* | 800 | /* |
@@ -771,9 +805,9 @@ int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum, | |||
771 | ubi_warn("bad magic number at PEB %d: %08x instead of " | 805 | ubi_warn("bad magic number at PEB %d: %08x instead of " |
772 | "%08x", pnum, magic, UBI_EC_HDR_MAGIC); | 806 | "%08x", pnum, magic, UBI_EC_HDR_MAGIC); |
773 | ubi_dbg_dump_ec_hdr(ec_hdr); | 807 | ubi_dbg_dump_ec_hdr(ec_hdr); |
774 | } else if (UBI_IO_DEBUG) | 808 | } |
775 | dbg_msg("bad magic number at PEB %d: %08x instead of " | 809 | dbg_bld("bad magic number at PEB %d: %08x instead of " |
776 | "%08x", pnum, magic, UBI_EC_HDR_MAGIC); | 810 | "%08x", pnum, magic, UBI_EC_HDR_MAGIC); |
777 | return UBI_IO_BAD_HDR; | 811 | return UBI_IO_BAD_HDR; |
778 | } | 812 | } |
779 | 813 | ||
@@ -785,10 +819,14 @@ int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum, | |||
785 | ubi_warn("bad EC header CRC at PEB %d, calculated " | 819 | ubi_warn("bad EC header CRC at PEB %d, calculated " |
786 | "%#08x, read %#08x", pnum, crc, hdr_crc); | 820 | "%#08x, read %#08x", pnum, crc, hdr_crc); |
787 | ubi_dbg_dump_ec_hdr(ec_hdr); | 821 | ubi_dbg_dump_ec_hdr(ec_hdr); |
788 | } else if (UBI_IO_DEBUG) | 822 | } |
789 | dbg_msg("bad EC header CRC at PEB %d, calculated " | 823 | dbg_bld("bad EC header CRC at PEB %d, calculated " |
790 | "%#08x, read %#08x", pnum, crc, hdr_crc); | 824 | "%#08x, read %#08x", pnum, crc, hdr_crc); |
791 | return read_err ?: UBI_IO_BAD_HDR; | 825 | |
826 | if (!read_err) | ||
827 | return UBI_IO_BAD_HDR; | ||
828 | else | ||
829 | return UBI_IO_BAD_HDR_EBADMSG; | ||
792 | } | 830 | } |
793 | 831 | ||
794 | /* And of course validate what has just been read from the media */ | 832 | /* And of course validate what has just been read from the media */ |
@@ -975,22 +1013,16 @@ bad: | |||
975 | * | 1013 | * |
976 | * This function reads the volume identifier header from physical eraseblock | 1014 | * This function reads the volume identifier header from physical eraseblock |
977 | * @pnum and stores it in @vid_hdr. It also checks CRC checksum of the read | 1015 | * @pnum and stores it in @vid_hdr. It also checks CRC checksum of the read |
978 | * volume identifier header. The following codes may be returned: | 1016 | * volume identifier header. The error codes are the same as in |
1017 | * 'ubi_io_read_ec_hdr()'. | ||
979 | * | 1018 | * |
980 | * o %0 if the CRC checksum is correct and the header was successfully read; | 1019 | * Note, the implementation of this function is also very similar to |
981 | * o %UBI_IO_BITFLIPS if the CRC is correct, but bit-flips were detected | 1020 | * 'ubi_io_read_ec_hdr()', so refer commentaries in 'ubi_io_read_ec_hdr()'. |
982 | * and corrected by the flash driver; this is harmless but may indicate that | ||
983 | * this eraseblock may become bad soon; | ||
984 | * o %UBI_IO_BAD_HDR if the volume identifier header is corrupted (a CRC | ||
985 | * error detected); | ||
986 | * o %UBI_IO_PEB_FREE if the physical eraseblock is free (i.e., there is no VID | ||
987 | * header there); | ||
988 | * o a negative error code in case of failure. | ||
989 | */ | 1021 | */ |
990 | int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum, | 1022 | int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum, |
991 | struct ubi_vid_hdr *vid_hdr, int verbose) | 1023 | struct ubi_vid_hdr *vid_hdr, int verbose) |
992 | { | 1024 | { |
993 | int err, read_err = 0; | 1025 | int err, read_err; |
994 | uint32_t crc, magic, hdr_crc; | 1026 | uint32_t crc, magic, hdr_crc; |
995 | void *p; | 1027 | void *p; |
996 | 1028 | ||
@@ -998,55 +1030,35 @@ int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum, | |||
998 | ubi_assert(pnum >= 0 && pnum < ubi->peb_count); | 1030 | ubi_assert(pnum >= 0 && pnum < ubi->peb_count); |
999 | 1031 | ||
1000 | p = (char *)vid_hdr - ubi->vid_hdr_shift; | 1032 | p = (char *)vid_hdr - ubi->vid_hdr_shift; |
1001 | err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset, | 1033 | read_err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset, |
1002 | ubi->vid_hdr_alsize); | 1034 | ubi->vid_hdr_alsize); |
1003 | if (err) { | 1035 | if (read_err && read_err != UBI_IO_BITFLIPS && read_err != -EBADMSG) |
1004 | if (err != UBI_IO_BITFLIPS && err != -EBADMSG) | 1036 | return read_err; |
1005 | return err; | ||
1006 | |||
1007 | /* | ||
1008 | * We read all the data, but either a correctable bit-flip | ||
1009 | * occurred, or MTD reported about some data integrity error, | ||
1010 | * like an ECC error in case of NAND. The former is harmless, | ||
1011 | * the later may mean the read data is corrupted. But we have a | ||
1012 | * CRC check-sum and we will identify this. If the VID header is | ||
1013 | * still OK, we just report this as there was a bit-flip. | ||
1014 | */ | ||
1015 | if (err == -EBADMSG) | ||
1016 | read_err = UBI_IO_BAD_HDR_READ; | ||
1017 | } | ||
1018 | 1037 | ||
1019 | magic = be32_to_cpu(vid_hdr->magic); | 1038 | magic = be32_to_cpu(vid_hdr->magic); |
1020 | if (magic != UBI_VID_HDR_MAGIC) { | 1039 | if (magic != UBI_VID_HDR_MAGIC) { |
1021 | if (read_err) | 1040 | if (read_err == -EBADMSG) |
1022 | return read_err; | 1041 | return UBI_IO_BAD_HDR_EBADMSG; |
1023 | 1042 | ||
1024 | /* | 1043 | if (ubi_check_pattern(vid_hdr, 0xFF, UBI_VID_HDR_SIZE)) { |
1025 | * If we have read all 0xFF bytes, the VID header probably does | ||
1026 | * not exist and the physical eraseblock is assumed to be free. | ||
1027 | */ | ||
1028 | if (check_pattern(vid_hdr, 0xFF, UBI_VID_HDR_SIZE)) { | ||
1029 | /* The physical eraseblock is supposedly free */ | ||
1030 | if (verbose) | 1044 | if (verbose) |
1031 | ubi_warn("no VID header found at PEB %d, " | 1045 | ubi_warn("no VID header found at PEB %d, " |
1032 | "only 0xFF bytes", pnum); | 1046 | "only 0xFF bytes", pnum); |
1033 | else if (UBI_IO_DEBUG) | 1047 | dbg_bld("no VID header found at PEB %d, " |
1034 | dbg_msg("no VID header found at PEB %d, " | 1048 | "only 0xFF bytes", pnum); |
1035 | "only 0xFF bytes", pnum); | 1049 | if (!read_err) |
1036 | return UBI_IO_PEB_FREE; | 1050 | return UBI_IO_FF; |
1051 | else | ||
1052 | return UBI_IO_FF_BITFLIPS; | ||
1037 | } | 1053 | } |
1038 | 1054 | ||
1039 | /* | ||
1040 | * This is not a valid VID header, and these are not 0xFF | ||
1041 | * bytes. Report that the header is corrupted. | ||
1042 | */ | ||
1043 | if (verbose) { | 1055 | if (verbose) { |
1044 | ubi_warn("bad magic number at PEB %d: %08x instead of " | 1056 | ubi_warn("bad magic number at PEB %d: %08x instead of " |
1045 | "%08x", pnum, magic, UBI_VID_HDR_MAGIC); | 1057 | "%08x", pnum, magic, UBI_VID_HDR_MAGIC); |
1046 | ubi_dbg_dump_vid_hdr(vid_hdr); | 1058 | ubi_dbg_dump_vid_hdr(vid_hdr); |
1047 | } else if (UBI_IO_DEBUG) | 1059 | } |
1048 | dbg_msg("bad magic number at PEB %d: %08x instead of " | 1060 | dbg_bld("bad magic number at PEB %d: %08x instead of " |
1049 | "%08x", pnum, magic, UBI_VID_HDR_MAGIC); | 1061 | "%08x", pnum, magic, UBI_VID_HDR_MAGIC); |
1050 | return UBI_IO_BAD_HDR; | 1062 | return UBI_IO_BAD_HDR; |
1051 | } | 1063 | } |
1052 | 1064 | ||
@@ -1058,23 +1070,21 @@ int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum, | |||
1058 | ubi_warn("bad CRC at PEB %d, calculated %#08x, " | 1070 | ubi_warn("bad CRC at PEB %d, calculated %#08x, " |
1059 | "read %#08x", pnum, crc, hdr_crc); | 1071 | "read %#08x", pnum, crc, hdr_crc); |
1060 | ubi_dbg_dump_vid_hdr(vid_hdr); | 1072 | ubi_dbg_dump_vid_hdr(vid_hdr); |
1061 | } else if (UBI_IO_DEBUG) | 1073 | } |
1062 | dbg_msg("bad CRC at PEB %d, calculated %#08x, " | 1074 | dbg_bld("bad CRC at PEB %d, calculated %#08x, " |
1063 | "read %#08x", pnum, crc, hdr_crc); | 1075 | "read %#08x", pnum, crc, hdr_crc); |
1064 | return read_err ?: UBI_IO_BAD_HDR; | 1076 | if (!read_err) |
1077 | return UBI_IO_BAD_HDR; | ||
1078 | else | ||
1079 | return UBI_IO_BAD_HDR_EBADMSG; | ||
1065 | } | 1080 | } |
1066 | 1081 | ||
1067 | /* Validate the VID header that we have just read */ | ||
1068 | err = validate_vid_hdr(ubi, vid_hdr); | 1082 | err = validate_vid_hdr(ubi, vid_hdr); |
1069 | if (err) { | 1083 | if (err) { |
1070 | ubi_err("validation failed for PEB %d", pnum); | 1084 | ubi_err("validation failed for PEB %d", pnum); |
1071 | return -EINVAL; | 1085 | return -EINVAL; |
1072 | } | 1086 | } |
1073 | 1087 | ||
1074 | /* | ||
1075 | * If there was a read error (%-EBADMSG), but the header CRC is still | ||
1076 | * OK, report about a bit-flip to force scrubbing on this PEB. | ||
1077 | */ | ||
1078 | return read_err ? UBI_IO_BITFLIPS : 0; | 1088 | return read_err ? UBI_IO_BITFLIPS : 0; |
1079 | } | 1089 | } |
1080 | 1090 | ||
@@ -1122,7 +1132,7 @@ int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum, | |||
1122 | return err; | 1132 | return err; |
1123 | } | 1133 | } |
1124 | 1134 | ||
1125 | #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID | 1135 | #ifdef CONFIG_MTD_UBI_DEBUG |
1126 | 1136 | ||
1127 | /** | 1137 | /** |
1128 | * paranoid_check_not_bad - ensure that a physical eraseblock is not bad. | 1138 | * paranoid_check_not_bad - ensure that a physical eraseblock is not bad. |
@@ -1136,6 +1146,9 @@ static int paranoid_check_not_bad(const struct ubi_device *ubi, int pnum) | |||
1136 | { | 1146 | { |
1137 | int err; | 1147 | int err; |
1138 | 1148 | ||
1149 | if (!(ubi_chk_flags & UBI_CHK_IO)) | ||
1150 | return 0; | ||
1151 | |||
1139 | err = ubi_io_is_bad(ubi, pnum); | 1152 | err = ubi_io_is_bad(ubi, pnum); |
1140 | if (!err) | 1153 | if (!err) |
1141 | return err; | 1154 | return err; |
@@ -1160,6 +1173,9 @@ static int paranoid_check_ec_hdr(const struct ubi_device *ubi, int pnum, | |||
1160 | int err; | 1173 | int err; |
1161 | uint32_t magic; | 1174 | uint32_t magic; |
1162 | 1175 | ||
1176 | if (!(ubi_chk_flags & UBI_CHK_IO)) | ||
1177 | return 0; | ||
1178 | |||
1163 | magic = be32_to_cpu(ec_hdr->magic); | 1179 | magic = be32_to_cpu(ec_hdr->magic); |
1164 | if (magic != UBI_EC_HDR_MAGIC) { | 1180 | if (magic != UBI_EC_HDR_MAGIC) { |
1165 | ubi_err("bad magic %#08x, must be %#08x", | 1181 | ubi_err("bad magic %#08x, must be %#08x", |
@@ -1195,6 +1211,9 @@ static int paranoid_check_peb_ec_hdr(const struct ubi_device *ubi, int pnum) | |||
1195 | uint32_t crc, hdr_crc; | 1211 | uint32_t crc, hdr_crc; |
1196 | struct ubi_ec_hdr *ec_hdr; | 1212 | struct ubi_ec_hdr *ec_hdr; |
1197 | 1213 | ||
1214 | if (!(ubi_chk_flags & UBI_CHK_IO)) | ||
1215 | return 0; | ||
1216 | |||
1198 | ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_NOFS); | 1217 | ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_NOFS); |
1199 | if (!ec_hdr) | 1218 | if (!ec_hdr) |
1200 | return -ENOMEM; | 1219 | return -ENOMEM; |
@@ -1236,6 +1255,9 @@ static int paranoid_check_vid_hdr(const struct ubi_device *ubi, int pnum, | |||
1236 | int err; | 1255 | int err; |
1237 | uint32_t magic; | 1256 | uint32_t magic; |
1238 | 1257 | ||
1258 | if (!(ubi_chk_flags & UBI_CHK_IO)) | ||
1259 | return 0; | ||
1260 | |||
1239 | magic = be32_to_cpu(vid_hdr->magic); | 1261 | magic = be32_to_cpu(vid_hdr->magic); |
1240 | if (magic != UBI_VID_HDR_MAGIC) { | 1262 | if (magic != UBI_VID_HDR_MAGIC) { |
1241 | ubi_err("bad VID header magic %#08x at PEB %d, must be %#08x", | 1263 | ubi_err("bad VID header magic %#08x at PEB %d, must be %#08x", |
@@ -1274,6 +1296,9 @@ static int paranoid_check_peb_vid_hdr(const struct ubi_device *ubi, int pnum) | |||
1274 | struct ubi_vid_hdr *vid_hdr; | 1296 | struct ubi_vid_hdr *vid_hdr; |
1275 | void *p; | 1297 | void *p; |
1276 | 1298 | ||
1299 | if (!(ubi_chk_flags & UBI_CHK_IO)) | ||
1300 | return 0; | ||
1301 | |||
1277 | vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS); | 1302 | vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS); |
1278 | if (!vid_hdr) | 1303 | if (!vid_hdr) |
1279 | return -ENOMEM; | 1304 | return -ENOMEM; |
@@ -1319,15 +1344,26 @@ int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum, | |||
1319 | int offset, int len) | 1344 | int offset, int len) |
1320 | { | 1345 | { |
1321 | int err, i; | 1346 | int err, i; |
1347 | size_t read; | ||
1348 | void *buf1; | ||
1349 | loff_t addr = (loff_t)pnum * ubi->peb_size + offset; | ||
1322 | 1350 | ||
1323 | mutex_lock(&ubi->dbg_buf_mutex); | 1351 | if (!(ubi_chk_flags & UBI_CHK_IO)) |
1324 | err = ubi_io_read(ubi, ubi->dbg_peb_buf, pnum, offset, len); | 1352 | return 0; |
1325 | if (err) | 1353 | |
1326 | goto out_unlock; | 1354 | buf1 = __vmalloc(len, GFP_NOFS, PAGE_KERNEL); |
1355 | if (!buf1) { | ||
1356 | ubi_err("cannot allocate memory to check writes"); | ||
1357 | return 0; | ||
1358 | } | ||
1359 | |||
1360 | err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf1); | ||
1361 | if (err && err != -EUCLEAN) | ||
1362 | goto out_free; | ||
1327 | 1363 | ||
1328 | for (i = 0; i < len; i++) { | 1364 | for (i = 0; i < len; i++) { |
1329 | uint8_t c = ((uint8_t *)buf)[i]; | 1365 | uint8_t c = ((uint8_t *)buf)[i]; |
1330 | uint8_t c1 = ((uint8_t *)ubi->dbg_peb_buf)[i]; | 1366 | uint8_t c1 = ((uint8_t *)buf1)[i]; |
1331 | int dump_len; | 1367 | int dump_len; |
1332 | 1368 | ||
1333 | if (c == c1) | 1369 | if (c == c1) |
@@ -1344,17 +1380,17 @@ int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum, | |||
1344 | ubi_msg("hex dump of the read buffer from %d to %d", | 1380 | ubi_msg("hex dump of the read buffer from %d to %d", |
1345 | i, i + dump_len); | 1381 | i, i + dump_len); |
1346 | print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1, | 1382 | print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1, |
1347 | ubi->dbg_peb_buf + i, dump_len, 1); | 1383 | buf1 + i, dump_len, 1); |
1348 | ubi_dbg_dump_stack(); | 1384 | ubi_dbg_dump_stack(); |
1349 | err = -EINVAL; | 1385 | err = -EINVAL; |
1350 | goto out_unlock; | 1386 | goto out_free; |
1351 | } | 1387 | } |
1352 | mutex_unlock(&ubi->dbg_buf_mutex); | ||
1353 | 1388 | ||
1389 | vfree(buf1); | ||
1354 | return 0; | 1390 | return 0; |
1355 | 1391 | ||
1356 | out_unlock: | 1392 | out_free: |
1357 | mutex_unlock(&ubi->dbg_buf_mutex); | 1393 | vfree(buf1); |
1358 | return err; | 1394 | return err; |
1359 | } | 1395 | } |
1360 | 1396 | ||
@@ -1373,36 +1409,44 @@ int ubi_dbg_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len) | |||
1373 | { | 1409 | { |
1374 | size_t read; | 1410 | size_t read; |
1375 | int err; | 1411 | int err; |
1412 | void *buf; | ||
1376 | loff_t addr = (loff_t)pnum * ubi->peb_size + offset; | 1413 | loff_t addr = (loff_t)pnum * ubi->peb_size + offset; |
1377 | 1414 | ||
1378 | mutex_lock(&ubi->dbg_buf_mutex); | 1415 | if (!(ubi_chk_flags & UBI_CHK_IO)) |
1379 | err = ubi->mtd->read(ubi->mtd, addr, len, &read, ubi->dbg_peb_buf); | 1416 | return 0; |
1417 | |||
1418 | buf = __vmalloc(len, GFP_NOFS, PAGE_KERNEL); | ||
1419 | if (!buf) { | ||
1420 | ubi_err("cannot allocate memory to check for 0xFFs"); | ||
1421 | return 0; | ||
1422 | } | ||
1423 | |||
1424 | err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf); | ||
1380 | if (err && err != -EUCLEAN) { | 1425 | if (err && err != -EUCLEAN) { |
1381 | ubi_err("error %d while reading %d bytes from PEB %d:%d, " | 1426 | ubi_err("error %d while reading %d bytes from PEB %d:%d, " |
1382 | "read %zd bytes", err, len, pnum, offset, read); | 1427 | "read %zd bytes", err, len, pnum, offset, read); |
1383 | goto error; | 1428 | goto error; |
1384 | } | 1429 | } |
1385 | 1430 | ||
1386 | err = check_pattern(ubi->dbg_peb_buf, 0xFF, len); | 1431 | err = ubi_check_pattern(buf, 0xFF, len); |
1387 | if (err == 0) { | 1432 | if (err == 0) { |
1388 | ubi_err("flash region at PEB %d:%d, length %d does not " | 1433 | ubi_err("flash region at PEB %d:%d, length %d does not " |
1389 | "contain all 0xFF bytes", pnum, offset, len); | 1434 | "contain all 0xFF bytes", pnum, offset, len); |
1390 | goto fail; | 1435 | goto fail; |
1391 | } | 1436 | } |
1392 | mutex_unlock(&ubi->dbg_buf_mutex); | ||
1393 | 1437 | ||
1438 | vfree(buf); | ||
1394 | return 0; | 1439 | return 0; |
1395 | 1440 | ||
1396 | fail: | 1441 | fail: |
1397 | ubi_err("paranoid check failed for PEB %d", pnum); | 1442 | ubi_err("paranoid check failed for PEB %d", pnum); |
1398 | ubi_msg("hex dump of the %d-%d region", offset, offset + len); | 1443 | ubi_msg("hex dump of the %d-%d region", offset, offset + len); |
1399 | print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1, | 1444 | print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1, buf, len, 1); |
1400 | ubi->dbg_peb_buf, len, 1); | ||
1401 | err = -EINVAL; | 1445 | err = -EINVAL; |
1402 | error: | 1446 | error: |
1403 | ubi_dbg_dump_stack(); | 1447 | ubi_dbg_dump_stack(); |
1404 | mutex_unlock(&ubi->dbg_buf_mutex); | 1448 | vfree(buf); |
1405 | return err; | 1449 | return err; |
1406 | } | 1450 | } |
1407 | 1451 | ||
1408 | #endif /* CONFIG_MTD_UBI_DEBUG_PARANOID */ | 1452 | #endif /* CONFIG_MTD_UBI_DEBUG */ |