aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/ubi
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2009-07-19 07:33:14 -0400
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2009-08-14 13:01:36 -0400
commit4a406856ea6830d8b8dba6a27d9f9331c5f4c13a (patch)
tree9bca90ac072a68eb762f985d62c512c55ba6dadc /drivers/mtd/ubi
parent5b289b562f6d236108569a880cb38cc03d17a50d (diff)
UBI: print a warning if too many PEBs are corrupted
There was a bug report recently where UBI prints: UBI error: ubi_attach_mtd_dev: failed to attach by scanning, error -22 error messages and refuses to attach a PEB. It turned out to be a buggy flash driver which returned garbage to almost every UBI read. This patch makes UBI print a better message in such cases. Namely, if UBI finds 8 or more corrupted PEBs, it prints a warning and lists the corrupted PEBs. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'drivers/mtd/ubi')
-rw-r--r--drivers/mtd/ubi/scan.c18
-rw-r--r--drivers/mtd/ubi/scan.h2
2 files changed, 18 insertions, 2 deletions
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c
index 93361eadab8d..e7161adc419d 100644
--- a/drivers/mtd/ubi/scan.c
+++ b/drivers/mtd/ubi/scan.c
@@ -75,9 +75,10 @@ static int add_to_list(struct ubi_scan_info *si, int pnum, int ec,
75 dbg_bld("add to free: PEB %d, EC %d", pnum, ec); 75 dbg_bld("add to free: PEB %d, EC %d", pnum, ec);
76 else if (list == &si->erase) 76 else if (list == &si->erase)
77 dbg_bld("add to erase: PEB %d, EC %d", pnum, ec); 77 dbg_bld("add to erase: PEB %d, EC %d", pnum, ec);
78 else if (list == &si->corr) 78 else if (list == &si->corr) {
79 dbg_bld("add to corrupted: PEB %d, EC %d", pnum, ec); 79 dbg_bld("add to corrupted: PEB %d, EC %d", pnum, ec);
80 else if (list == &si->alien) 80 si->corr_count += 1;
81 } else if (list == &si->alien)
81 dbg_bld("add to alien: PEB %d, EC %d", pnum, ec); 82 dbg_bld("add to alien: PEB %d, EC %d", pnum, ec);
82 else 83 else
83 BUG(); 84 BUG();
@@ -938,6 +939,19 @@ struct ubi_scan_info *ubi_scan(struct ubi_device *ubi)
938 ubi_msg("empty MTD device detected"); 939 ubi_msg("empty MTD device detected");
939 940
940 /* 941 /*
942 * Few corrupted PEBs are not a problem and may be just a result of
943 * unclean reboots. However, many of them may indicate some problems
944 * with the flash HW or driver. Print a warning in this case.
945 */
946 if (si->corr_count >= 8 || si->corr_count >= ubi->peb_count / 4) {
947 ubi_warn("%d PEBs are corrupted", si->corr_count);
948 printk(KERN_WARNING "corrupted PEBs are:");
949 list_for_each_entry(seb, &si->corr, u.list)
950 printk(KERN_CONT " %d", seb->pnum);
951 printk(KERN_CONT "\n");
952 }
953
954 /*
941 * In case of unknown erase counter we use the mean erase counter 955 * In case of unknown erase counter we use the mean erase counter
942 * value. 956 * value.
943 */ 957 */
diff --git a/drivers/mtd/ubi/scan.h b/drivers/mtd/ubi/scan.h
index 1017cf12def5..bab31695dace 100644
--- a/drivers/mtd/ubi/scan.h
+++ b/drivers/mtd/ubi/scan.h
@@ -102,6 +102,7 @@ struct ubi_scan_volume {
102 * @mean_ec: mean erase counter value 102 * @mean_ec: mean erase counter value
103 * @ec_sum: a temporary variable used when calculating @mean_ec 103 * @ec_sum: a temporary variable used when calculating @mean_ec
104 * @ec_count: a temporary variable used when calculating @mean_ec 104 * @ec_count: a temporary variable used when calculating @mean_ec
105 * @corr_count: count of corrupted PEBs
105 * @image_seq_set: indicates @ubi->image_seq is known 106 * @image_seq_set: indicates @ubi->image_seq is known
106 * 107 *
107 * This data structure contains the result of scanning and may be used by other 108 * This data structure contains the result of scanning and may be used by other
@@ -125,6 +126,7 @@ struct ubi_scan_info {
125 int mean_ec; 126 int mean_ec;
126 uint64_t ec_sum; 127 uint64_t ec_sum;
127 int ec_count; 128 int ec_count;
129 int corr_count;
128 int image_seq_set; 130 int image_seq_set;
129}; 131};
130 132