Skip to content

Commit

Permalink
ubi: fastmap: Detect EBA mismatches on-the-fly
Browse files Browse the repository at this point in the history
Now we have the machinery to detect EBA mismatches on-the-fly
by comparing the in-memory volume ID and LEB number with the found
VID header.
This helps to detect malfunction of Fastmap.

Signed-off-by: Richard Weinberger <richard@nod.at>
  • Loading branch information
Richard Weinberger committed Jun 7, 2018
1 parent 34653fd commit 3e5e433
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions drivers/mtd/ubi/eba.c
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,7 @@ static int check_mapping(struct ubi_device *ubi, struct ubi_volume *vol, int lnu
{
int err;
struct ubi_vid_io_buf *vidb;
struct ubi_vid_hdr *vid_hdr;

if (!ubi->fast_attach)
return 0;
Expand Down Expand Up @@ -552,6 +553,22 @@ static int check_mapping(struct ubi_device *ubi, struct ubi_volume *vol, int lnu
*pnum, err);

goto out_free;
} else {
int found_vol_id, found_lnum;

ubi_assert(err == 0 || err == UBI_IO_BITFLIPS);

vid_hdr = ubi_get_vid_hdr(vidb);
found_vol_id = be32_to_cpu(vid_hdr->vol_id);
found_lnum = be32_to_cpu(vid_hdr->lnum);

if (found_lnum != lnum || found_vol_id != vol->vol_id) {
ubi_err(ubi, "EBA mismatch! PEB %i is LEB %i:%i instead of LEB %i:%i",
*pnum, found_vol_id, found_lnum, vol->vol_id, lnum);
ubi_ro_mode(ubi);
err = -EINVAL;
goto out_free;
}
}

set_bit(lnum, vol->checkmap);
Expand Down

0 comments on commit 3e5e433

Please sign in to comment.