diff options
| -rw-r--r-- | drivers/mtd/ubi/eba.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c index 1ceab201a27b..edb1c8362faa 100644 --- a/drivers/mtd/ubi/eba.c +++ b/drivers/mtd/ubi/eba.c | |||
| @@ -513,6 +513,7 @@ static int check_mapping(struct ubi_device *ubi, struct ubi_volume *vol, int lnu | |||
| 513 | { | 513 | { |
| 514 | int err; | 514 | int err; |
| 515 | struct ubi_vid_io_buf *vidb; | 515 | struct ubi_vid_io_buf *vidb; |
| 516 | struct ubi_vid_hdr *vid_hdr; | ||
| 516 | 517 | ||
| 517 | if (!ubi->fast_attach) | 518 | if (!ubi->fast_attach) |
| 518 | return 0; | 519 | return 0; |
| @@ -552,6 +553,22 @@ static int check_mapping(struct ubi_device *ubi, struct ubi_volume *vol, int lnu | |||
| 552 | *pnum, err); | 553 | *pnum, err); |
| 553 | 554 | ||
| 554 | goto out_free; | 555 | goto out_free; |
| 556 | } else { | ||
| 557 | int found_vol_id, found_lnum; | ||
| 558 | |||
| 559 | ubi_assert(err == 0 || err == UBI_IO_BITFLIPS); | ||
| 560 | |||
| 561 | vid_hdr = ubi_get_vid_hdr(vidb); | ||
| 562 | found_vol_id = be32_to_cpu(vid_hdr->vol_id); | ||
| 563 | found_lnum = be32_to_cpu(vid_hdr->lnum); | ||
| 564 | |||
| 565 | if (found_lnum != lnum || found_vol_id != vol->vol_id) { | ||
| 566 | ubi_err(ubi, "EBA mismatch! PEB %i is LEB %i:%i instead of LEB %i:%i", | ||
| 567 | *pnum, found_vol_id, found_lnum, vol->vol_id, lnum); | ||
| 568 | ubi_ro_mode(ubi); | ||
| 569 | err = -EINVAL; | ||
| 570 | goto out_free; | ||
| 571 | } | ||
| 555 | } | 572 | } |
| 556 | 573 | ||
| 557 | set_bit(lnum, vol->checkmap); | 574 | set_bit(lnum, vol->checkmap); |
