|
@@ -8,7 +8,7 @@ Signed-off-by: Daniel Golle <[email protected]>
|
|
|
|
|
|
--- a/drivers/mtd/ubi/build.c
|
|
|
+++ b/drivers/mtd/ubi/build.c
|
|
|
-@@ -1171,6 +1171,54 @@ static struct mtd_info * __init open_mtd
|
|
|
+@@ -1171,6 +1171,68 @@ static struct mtd_info * __init open_mtd
|
|
|
return mtd;
|
|
|
}
|
|
|
|
|
@@ -20,6 +20,7 @@ Signed-off-by: Daniel Golle <[email protected]>
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ struct mtd_info *mtd;
|
|
|
++ loff_t offset = 0;
|
|
|
+ size_t len;
|
|
|
+ char magic[4];
|
|
|
+
|
|
@@ -31,9 +32,22 @@ Signed-off-by: Daniel Golle <[email protected]>
|
|
|
+ if (IS_ERR(mtd))
|
|
|
+ return;
|
|
|
+
|
|
|
++ /* get the first not bad block */
|
|
|
++ if (mtd_can_have_bb(mtd))
|
|
|
++ while (mtd_block_isbad(mtd, offset)) {
|
|
|
++ offset += mtd->erasesize;
|
|
|
++
|
|
|
++ if (offset > mtd->size) {
|
|
|
++ pr_err("UBI error: Failed to find a non-bad "
|
|
|
++ "block on mtd%d\n", mtd->index);
|
|
|
++ goto cleanup;
|
|
|
++ }
|
|
|
++ }
|
|
|
++
|
|
|
+ /* check for a valid ubi magic if read from flash was successful */
|
|
|
-+ err = mtd_read(mtd, 0, 4, &len, (void *) magic);
|
|
|
-+ if (!err && len == 4 && strncmp(magic, "UBI#", 4)) {
|
|
|
++ err = mtd_read(mtd, offset, 4, &len, (void *) magic);
|
|
|
++ if ((!err || mtd_is_bitflip(err)) &&
|
|
|
++ len == 4 && strncmp(magic, "UBI#", 4)) {
|
|
|
+ pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index);
|
|
|
+ goto cleanup;
|
|
|
+ }
|
|
@@ -63,7 +77,7 @@ Signed-off-by: Daniel Golle <[email protected]>
|
|
|
static int __init ubi_init(void)
|
|
|
{
|
|
|
int err, i, k;
|
|
|
-@@ -1254,6 +1302,12 @@ static int __init ubi_init(void)
|
|
|
+@@ -1254,6 +1316,12 @@ static int __init ubi_init(void)
|
|
|
}
|
|
|
}
|
|
|
|