aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/ubi/scan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd/ubi/scan.c')
-rw-r--r--drivers/mtd/ubi/scan.c27
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);