diff options
Diffstat (limited to 'drivers/mtd/ubi/scan.c')
| -rw-r--r-- | drivers/mtd/ubi/scan.c | 27 |
1 files changed, 17 insertions, 10 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); |
