ubi: fastmap: Detect EBA mismatches on-the-fly
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>
This commit is contained in:
parent
34653fd8c4
commit
3e5e4335cc
|
@ -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;
|
||||
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue