mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 09:19:51 +00:00
UBI: fastmap: fix backward compatibility with image_seq
Some old UBI implementations (e.g. U-Boot) have not implemented the image sequence feature. So, when erase blocks are written, the image sequence in the ec header is lost (set to zero). UBI scan_all() takes this case into account (commits32bc482028
and2eadaad67b
) But fastmap scan functions (ubi_scan_fastmap() and scan_pool()) didn't. This patch fixes the issue. Signed-off-by: Richard Genoud <richard.genoud@gmail.com> Signed-off-by: Richard Weinberger <richard@nod.at> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
This commit is contained in:
parent
4b3e0a25aa
commit
c22301ad4f
1 changed files with 19 additions and 3 deletions
|
@ -407,6 +407,7 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai,
|
|||
*/
|
||||
for (i = 0; i < pool_size; i++) {
|
||||
int scrub = 0;
|
||||
int image_seq;
|
||||
|
||||
pnum = be32_to_cpu(pebs[i]);
|
||||
|
||||
|
@ -425,7 +426,13 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai,
|
|||
} else if (ret == UBI_IO_BITFLIPS)
|
||||
scrub = 1;
|
||||
|
||||
if (be32_to_cpu(ech->image_seq) != ubi->image_seq) {
|
||||
/*
|
||||
* Older UBI implementations have image_seq set to zero, so
|
||||
* we shouldn't fail if image_seq == 0.
|
||||
*/
|
||||
image_seq = be32_to_cpu(ech->image_seq);
|
||||
|
||||
if (image_seq && (image_seq != ubi->image_seq)) {
|
||||
ubi_err("bad image seq: 0x%x, expected: 0x%x",
|
||||
be32_to_cpu(ech->image_seq), ubi->image_seq);
|
||||
ret = UBI_BAD_FASTMAP;
|
||||
|
@ -923,6 +930,8 @@ int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai,
|
|||
}
|
||||
|
||||
for (i = 0; i < used_blocks; i++) {
|
||||
int image_seq;
|
||||
|
||||
pnum = be32_to_cpu(fmsb->block_loc[i]);
|
||||
|
||||
if (ubi_io_is_bad(ubi, pnum)) {
|
||||
|
@ -940,10 +949,17 @@ int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai,
|
|||
} else if (ret == UBI_IO_BITFLIPS)
|
||||
fm->to_be_tortured[i] = 1;
|
||||
|
||||
image_seq = be32_to_cpu(ech->image_seq);
|
||||
if (!ubi->image_seq)
|
||||
ubi->image_seq = be32_to_cpu(ech->image_seq);
|
||||
ubi->image_seq = image_seq;
|
||||
|
||||
if (be32_to_cpu(ech->image_seq) != ubi->image_seq) {
|
||||
/*
|
||||
* Older UBI implementations have image_seq set to zero, so
|
||||
* we shouldn't fail if image_seq == 0.
|
||||
*/
|
||||
if (image_seq && (image_seq != ubi->image_seq)) {
|
||||
ubi_err("wrong image seq:%d instead of %d",
|
||||
be32_to_cpu(ech->image_seq), ubi->image_seq);
|
||||
ret = UBI_BAD_FASTMAP;
|
||||
goto free_hdr;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue