diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2009-07-19 07:33:14 -0400 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2009-08-14 13:01:36 -0400 |
commit | 4a406856ea6830d8b8dba6a27d9f9331c5f4c13a (patch) | |
tree | 9bca90ac072a68eb762f985d62c512c55ba6dadc /drivers/mtd/ubi | |
parent | 5b289b562f6d236108569a880cb38cc03d17a50d (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.c | 18 | ||||
-rw-r--r-- | drivers/mtd/ubi/scan.h | 2 |
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 | ||