diff options
| -rw-r--r-- | drivers/mtd/ubi/scan.c | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index e7b800b1d072..3c631863bf40 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
| @@ -45,14 +45,26 @@ | |||
| 45 | * many warnings and error messages. The idea is that we do not lose | 45 | * many warnings and error messages. The idea is that we do not lose |
| 46 | * important data in these case - we may lose only the data which was being | 46 | * important data in these case - we may lose only the data which was being |
| 47 | * written to the media just before the power cut happened, and the upper | 47 | * written to the media just before the power cut happened, and the upper |
| 48 | * layers are supposed to handle these situations. UBI puts these PEBs to | 48 | * layers (e.g., UBIFS) are supposed to handle these situations. UBI puts |
| 49 | * the head of the @erase list and they are scheduled for erasure. | 49 | * these PEBs to the head of the @erase list and they are scheduled for |
| 50 | * erasure. | ||
| 50 | * | 51 | * |
| 51 | * 2. Unexpected corruptions which are not caused by power cuts. During | 52 | * 2. Unexpected corruptions which are not caused by power cuts. During |
| 52 | * scanning, such PEBs are put to the @corr list and UBI preserves them. | 53 | * scanning, such PEBs are put to the @corr list and UBI preserves them. |
| 53 | * Obviously, this lessens the amount of available PEBs, and if at some | 54 | * Obviously, this lessens the amount of available PEBs, and if at some |
| 54 | * point UBI runs out of free PEBs, it switches to R/O mode. UBI also loudly | 55 | * point UBI runs out of free PEBs, it switches to R/O mode. UBI also loudly |
| 55 | * informs about such PEBs every time the MTD device is attached. | 56 | * informs about such PEBs every time the MTD device is attached. |
| 57 | * | ||
| 58 | * However, it is difficult to reliably distinguish between these types of | ||
| 59 | * corruptions and UBI's strategy is as follows. UBI assumes (2.) if the VID | ||
| 60 | * header is corrupted and the data area does not contain all 0xFFs, and there | ||
| 61 | * were not bit-flips or integrity errors while reading the data area. Otherwise | ||
| 62 | * UBI assumes (1.). The assumptions are: | ||
| 63 | * o if the data area contains only 0xFFs, there is no data, and it is safe | ||
| 64 | * to just erase this PEB. | ||
| 65 | * o if the data area has bit-flips and data integrity errors (ECC errors on | ||
| 66 | * NAND), it is probably a PEB which was being erased when power cut | ||
| 67 | * happened. | ||
| 56 | */ | 68 | */ |
| 57 | 69 | ||
| 58 | #include <linux/err.h> | 70 | #include <linux/err.h> |
| @@ -741,24 +753,24 @@ struct ubi_scan_leb *ubi_scan_get_free_peb(struct ubi_device *ubi, | |||
| 741 | } | 753 | } |
| 742 | 754 | ||
| 743 | /** | 755 | /** |
| 744 | * check_data_ff - make sure PEB contains only 0xFF data. | 756 | * check_corruption - check the data area of PEB. |
| 745 | * @ubi: UBI device description object | 757 | * @ubi: UBI device description object |
| 746 | * @vid_hrd: the (corrupted) VID header of this PEB | 758 | * @vid_hrd: the (corrupted) VID header of this PEB |
| 747 | * @pnum: the physical eraseblock number to check | 759 | * @pnum: the physical eraseblock number to check |
| 748 | * | 760 | * |
| 749 | * This is a helper function which is used to distinguish between VID header | 761 | * This is a helper function which is used to distinguish between VID header |
| 750 | * corruptions caused by power cuts and other reasons. If the PEB contains only | 762 | * corruptions caused by power cuts and other reasons. If the PEB contains only |
| 751 | * 0xFF bytes at the data area, the VID header is most probably corrupted | 763 | * 0xFF bytes in the data area, the VID header is most probably corrupted |
| 752 | * because of a power cut (%0 is returned in this case). Otherwise, it was | 764 | * because of a power cut (%0 is returned in this case). Otherwise, it was |
| 753 | * corrupted for some other reasons (%1 is returned in this case). A negative | 765 | * probably corrupted for some other reasons (%1 is returned in this case). A |
| 754 | * error code is returned if a read error occurred. | 766 | * negative error code is returned if a read error occurred. |
| 755 | * | 767 | * |
| 756 | * If the corruption reason was a power cut, UBI can safely erase this PEB. | 768 | * If the corruption reason was a power cut, UBI can safely erase this PEB. |
| 757 | * Otherwise, it should preserve it to avoid possibly destroying important | 769 | * Otherwise, it should preserve it to avoid possibly destroying important |
| 758 | * information. | 770 | * information. |
| 759 | */ | 771 | */ |
| 760 | static int check_data_ff(struct ubi_device *ubi, struct ubi_vid_hdr *vid_hdr, | 772 | static int check_corruption(struct ubi_device *ubi, struct ubi_vid_hdr *vid_hdr, |
| 761 | int pnum) | 773 | int pnum) |
| 762 | { | 774 | { |
| 763 | int err; | 775 | int err; |
| 764 | 776 | ||
| @@ -767,7 +779,18 @@ static int check_data_ff(struct ubi_device *ubi, struct ubi_vid_hdr *vid_hdr, | |||
| 767 | 779 | ||
| 768 | err = ubi_io_read(ubi, ubi->peb_buf1, pnum, ubi->leb_start, | 780 | err = ubi_io_read(ubi, ubi->peb_buf1, pnum, ubi->leb_start, |
| 769 | ubi->leb_size); | 781 | ubi->leb_size); |
| 770 | if (err && err != UBI_IO_BITFLIPS && err != -EBADMSG) | 782 | if (err == UBI_IO_BITFLIPS || err == -EBADMSG) { |
| 783 | /* | ||
| 784 | * Bit-flips or integrity errors while reading the data area. | ||
| 785 | * It is difficult to say for sure what type of corruption is | ||
| 786 | * this, but presumably a power cut happened while this PEB was | ||
| 787 | * erased, so it became unstable and corrupted, and should be | ||
| 788 | * erased. | ||
| 789 | */ | ||
| 790 | return 0; | ||
| 791 | } | ||
| 792 | |||
| 793 | if (err) | ||
| 771 | return err; | 794 | return err; |
| 772 | 795 | ||
| 773 | if (ubi_check_pattern(ubi->peb_buf1, 0xFF, ubi->leb_size)) { | 796 | if (ubi_check_pattern(ubi->peb_buf1, 0xFF, ubi->leb_size)) { |
| @@ -926,7 +949,7 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
| 926 | * that this a valid UBI PEB which has corresponding | 949 | * that this a valid UBI PEB which has corresponding |
| 927 | * LEB, but the headers are corrupted. However, it is | 950 | * LEB, but the headers are corrupted. However, it is |
| 928 | * impossible to distinguish it from a PEB which just | 951 | * impossible to distinguish it from a PEB which just |
| 929 | * contains garbage because a power cut during erase | 952 | * contains garbage because of a power cut during erase |
| 930 | * operation. So we just schedule this PEB for erasure. | 953 | * operation. So we just schedule this PEB for erasure. |
| 931 | */ | 954 | */ |
| 932 | err = 0; | 955 | err = 0; |
| @@ -935,7 +958,7 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
| 935 | * The EC was OK, but the VID header is corrupted. We | 958 | * The EC was OK, but the VID header is corrupted. We |
| 936 | * have to check what is in the data area. | 959 | * have to check what is in the data area. |
| 937 | */ | 960 | */ |
| 938 | err = check_data_ff(ubi, vidh, pnum); | 961 | err = check_corruption(ubi, vidh, pnum); |
| 939 | 962 | ||
| 940 | if (err < 0) | 963 | if (err < 0) |
| 941 | return err; | 964 | return err; |
