diff options
| -rw-r--r-- | drivers/mtd/ubi/scan.c | 27 | ||||
| -rw-r--r-- | drivers/mtd/ubi/scan.h | 19 |
2 files changed, 31 insertions, 15 deletions
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index c45900744107..a20f278d0c6c 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
| @@ -72,16 +72,19 @@ static int add_to_list(struct ubi_scan_info *si, int pnum, int ec, | |||
| 72 | { | 72 | { |
| 73 | struct ubi_scan_leb *seb; | 73 | struct ubi_scan_leb *seb; |
| 74 | 74 | ||
| 75 | if (list == &si->free) | 75 | if (list == &si->free) { |
| 76 | dbg_bld("add to free: PEB %d, EC %d", pnum, ec); | 76 | dbg_bld("add to free: PEB %d, EC %d", pnum, ec); |
| 77 | else if (list == &si->erase) | 77 | si->free_peb_count += 1; |
| 78 | } else if (list == &si->erase) { | ||
| 78 | dbg_bld("add to erase: PEB %d, EC %d", pnum, ec); | 79 | dbg_bld("add to erase: PEB %d, EC %d", pnum, ec); |
| 79 | else if (list == &si->corr) { | 80 | si->erase_peb_count += 1; |
| 81 | } else if (list == &si->corr) { | ||
| 80 | dbg_bld("add to corrupted: PEB %d, EC %d", pnum, ec); | 82 | dbg_bld("add to corrupted: PEB %d, EC %d", pnum, ec); |
| 81 | si->corr_count += 1; | 83 | si->corr_peb_count += 1; |
| 82 | } else if (list == &si->alien) | 84 | } else if (list == &si->alien) { |
| 83 | dbg_bld("add to alien: PEB %d, EC %d", pnum, ec); | 85 | dbg_bld("add to alien: PEB %d, EC %d", pnum, ec); |
| 84 | else | 86 | si->alien_peb_count += 1; |
| 87 | } else | ||
| 85 | BUG(); | 88 | BUG(); |
| 86 | 89 | ||
| 87 | seb = kmalloc(sizeof(struct ubi_scan_leb), GFP_KERNEL); | 90 | seb = kmalloc(sizeof(struct ubi_scan_leb), GFP_KERNEL); |
| @@ -517,6 +520,7 @@ int ubi_scan_add_used(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
| 517 | sv->leb_count += 1; | 520 | sv->leb_count += 1; |
| 518 | rb_link_node(&seb->u.rb, parent, p); | 521 | rb_link_node(&seb->u.rb, parent, p); |
| 519 | rb_insert_color(&seb->u.rb, &sv->root); | 522 | rb_insert_color(&seb->u.rb, &sv->root); |
| 523 | si->used_peb_count += 1; | ||
| 520 | return 0; | 524 | return 0; |
| 521 | } | 525 | } |
| 522 | 526 | ||
| @@ -751,7 +755,7 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
| 751 | * corrupted. Set %bitflips flag in order to make this PEB be | 755 | * corrupted. Set %bitflips flag in order to make this PEB be |
| 752 | * moved and EC be re-created. | 756 | * moved and EC be re-created. |
| 753 | */ | 757 | */ |
| 754 | ec_corr = 1; | 758 | ec_corr = err; |
| 755 | ec = UBI_SCAN_UNKNOWN_EC; | 759 | ec = UBI_SCAN_UNKNOWN_EC; |
| 756 | bitflips = 1; | 760 | bitflips = 1; |
| 757 | } | 761 | } |
| @@ -816,6 +820,9 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
| 816 | else if (err == UBI_IO_BAD_HDR_READ || err == UBI_IO_BAD_HDR || | 820 | else if (err == UBI_IO_BAD_HDR_READ || err == UBI_IO_BAD_HDR || |
| 817 | (err == UBI_IO_PEB_FREE && ec_corr)) { | 821 | (err == UBI_IO_PEB_FREE && ec_corr)) { |
| 818 | /* VID header is corrupted */ | 822 | /* VID header is corrupted */ |
| 823 | if (err == UBI_IO_BAD_HDR_READ || | ||
| 824 | ec_corr == UBI_IO_BAD_HDR_READ) | ||
| 825 | si->read_err_count += 1; | ||
| 819 | err = add_to_list(si, pnum, ec, &si->corr); | 826 | err = add_to_list(si, pnum, ec, &si->corr); |
| 820 | if (err) | 827 | if (err) |
| 821 | return err; | 828 | return err; |
| @@ -855,7 +862,6 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
| 855 | err = add_to_list(si, pnum, ec, &si->alien); | 862 | err = add_to_list(si, pnum, ec, &si->alien); |
| 856 | if (err) | 863 | if (err) |
| 857 | return err; | 864 | return err; |
| 858 | si->alien_peb_count += 1; | ||
| 859 | return 0; | 865 | return 0; |
| 860 | 866 | ||
| 861 | case UBI_COMPAT_REJECT: | 867 | case UBI_COMPAT_REJECT: |
| @@ -943,8 +949,9 @@ struct ubi_scan_info *ubi_scan(struct ubi_device *ubi) | |||
| 943 | * unclean reboots. However, many of them may indicate some problems | 949 | * unclean reboots. However, many of them may indicate some problems |
| 944 | * with the flash HW or driver. Print a warning in this case. | 950 | * with the flash HW or driver. Print a warning in this case. |
| 945 | */ | 951 | */ |
| 946 | if (si->corr_count >= 8 || si->corr_count >= ubi->peb_count / 4) { | 952 | if (si->corr_peb_count >= 8 || |
| 947 | ubi_warn("%d PEBs are corrupted", si->corr_count); | 953 | si->corr_peb_count >= ubi->peb_count / 4) { |
| 954 | ubi_warn("%d PEBs are corrupted", si->corr_peb_count); | ||
| 948 | printk(KERN_WARNING "corrupted PEBs are:"); | 955 | printk(KERN_WARNING "corrupted PEBs are:"); |
| 949 | list_for_each_entry(seb, &si->corr, u.list) | 956 | list_for_each_entry(seb, &si->corr, u.list) |
| 950 | printk(KERN_CONT " %d", seb->pnum); | 957 | printk(KERN_CONT " %d", seb->pnum); |
diff --git a/drivers/mtd/ubi/scan.h b/drivers/mtd/ubi/scan.h index ff179ad7ca55..2576a8d1532b 100644 --- a/drivers/mtd/ubi/scan.h +++ b/drivers/mtd/ubi/scan.h | |||
| @@ -91,10 +91,16 @@ struct ubi_scan_volume { | |||
| 91 | * @erase: list of physical eraseblocks which have to be erased | 91 | * @erase: list of physical eraseblocks which have to be erased |
| 92 | * @alien: list of physical eraseblocks which should not be used by UBI (e.g., | 92 | * @alien: list of physical eraseblocks which should not be used by UBI (e.g., |
| 93 | * those belonging to "preserve"-compatible internal volumes) | 93 | * those belonging to "preserve"-compatible internal volumes) |
| 94 | * @used_peb_count: count of used PEBs | ||
| 95 | * @corr_peb_count: count of PEBs in the @corr list | ||
| 96 | * @read_err_count: count of PEBs read with error (%UBI_IO_BAD_HDR_READ was | ||
| 97 | * returned) | ||
| 98 | * @free_peb_count: count of PEBs in the @free list | ||
| 99 | * @erase_peb_count: count of PEBs in the @erase list | ||
| 100 | * @alien_peb_count: count of PEBs in the @alien list | ||
| 94 | * @bad_peb_count: count of bad physical eraseblocks | 101 | * @bad_peb_count: count of bad physical eraseblocks |
| 95 | * @vols_found: number of volumes found during scanning | 102 | * @vols_found: number of volumes found during scanning |
| 96 | * @highest_vol_id: highest volume ID | 103 | * @highest_vol_id: highest volume ID |
| 97 | * @alien_peb_count: count of physical eraseblocks in the @alien list | ||
| 98 | * @is_empty: flag indicating whether the MTD device is empty or not | 104 | * @is_empty: flag indicating whether the MTD device is empty or not |
| 99 | * @min_ec: lowest erase counter value | 105 | * @min_ec: lowest erase counter value |
| 100 | * @max_ec: highest erase counter value | 106 | * @max_ec: highest erase counter value |
| @@ -102,7 +108,6 @@ struct ubi_scan_volume { | |||
| 102 | * @mean_ec: mean erase counter value | 108 | * @mean_ec: mean erase counter value |
| 103 | * @ec_sum: a temporary variable used when calculating @mean_ec | 109 | * @ec_sum: a temporary variable used when calculating @mean_ec |
| 104 | * @ec_count: a temporary variable used when calculating @mean_ec | 110 | * @ec_count: a temporary variable used when calculating @mean_ec |
| 105 | * @corr_count: count of corrupted PEBs | ||
| 106 | * | 111 | * |
| 107 | * This data structure contains the result of scanning and may be used by other | 112 | * This data structure contains the result of scanning and may be used by other |
| 108 | * UBI sub-systems to build final UBI data structures, further error-recovery | 113 | * UBI sub-systems to build final UBI data structures, further error-recovery |
| @@ -114,10 +119,15 @@ struct ubi_scan_info { | |||
| 114 | struct list_head free; | 119 | struct list_head free; |
| 115 | struct list_head erase; | 120 | struct list_head erase; |
| 116 | struct list_head alien; | 121 | struct list_head alien; |
| 122 | int used_peb_count; | ||
| 123 | int corr_peb_count; | ||
| 124 | int read_err_count; | ||
| 125 | int free_peb_count; | ||
| 126 | int erase_peb_count; | ||
| 127 | int alien_peb_count; | ||
| 117 | int bad_peb_count; | 128 | int bad_peb_count; |
| 118 | int vols_found; | 129 | int vols_found; |
| 119 | int highest_vol_id; | 130 | int highest_vol_id; |
| 120 | int alien_peb_count; | ||
| 121 | int is_empty; | 131 | int is_empty; |
| 122 | int min_ec; | 132 | int min_ec; |
| 123 | int max_ec; | 133 | int max_ec; |
| @@ -125,7 +135,6 @@ struct ubi_scan_info { | |||
| 125 | int mean_ec; | 135 | int mean_ec; |
| 126 | uint64_t ec_sum; | 136 | uint64_t ec_sum; |
| 127 | int ec_count; | 137 | int ec_count; |
| 128 | int corr_count; | ||
| 129 | }; | 138 | }; |
| 130 | 139 | ||
| 131 | struct ubi_device; | 140 | struct ubi_device; |
| @@ -135,7 +144,7 @@ struct ubi_vid_hdr; | |||
| 135 | * ubi_scan_move_to_list - move a PEB from the volume tree to a list. | 144 | * ubi_scan_move_to_list - move a PEB from the volume tree to a list. |
| 136 | * | 145 | * |
| 137 | * @sv: volume scanning information | 146 | * @sv: volume scanning information |
| 138 | * @seb: scanning eraseblock infprmation | 147 | * @seb: scanning eraseblock information |
| 139 | * @list: the list to move to | 148 | * @list: the list to move to |
| 140 | */ | 149 | */ |
| 141 | static inline void ubi_scan_move_to_list(struct ubi_scan_volume *sv, | 150 | static inline void ubi_scan_move_to_list(struct ubi_scan_volume *sv, |
