Commit c22301ad authored by Richard Genoud's avatar Richard Genoud Committed by Artem Bityutskiy

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 (commits
32bc4820 and
2eadaad6)

But fastmap scan functions (ubi_scan_fastmap() and scan_pool()) didn't.

This patch fixes the issue.
Signed-off-by: default avatarRichard Genoud <richard.genoud@gmail.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
parent 4b3e0a25
...@@ -407,6 +407,7 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai, ...@@ -407,6 +407,7 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai,
*/ */
for (i = 0; i < pool_size; i++) { for (i = 0; i < pool_size; i++) {
int scrub = 0; int scrub = 0;
int image_seq;
pnum = be32_to_cpu(pebs[i]); pnum = be32_to_cpu(pebs[i]);
...@@ -425,7 +426,13 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai, ...@@ -425,7 +426,13 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai,
} else if (ret == UBI_IO_BITFLIPS) } else if (ret == UBI_IO_BITFLIPS)
scrub = 1; 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", ubi_err("bad image seq: 0x%x, expected: 0x%x",
be32_to_cpu(ech->image_seq), ubi->image_seq); be32_to_cpu(ech->image_seq), ubi->image_seq);
ret = UBI_BAD_FASTMAP; ret = UBI_BAD_FASTMAP;
...@@ -923,6 +930,8 @@ int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai, ...@@ -923,6 +930,8 @@ int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai,
} }
for (i = 0; i < used_blocks; i++) { for (i = 0; i < used_blocks; i++) {
int image_seq;
pnum = be32_to_cpu(fmsb->block_loc[i]); pnum = be32_to_cpu(fmsb->block_loc[i]);
if (ubi_io_is_bad(ubi, pnum)) { if (ubi_io_is_bad(ubi, pnum)) {
...@@ -940,10 +949,17 @@ int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai, ...@@ -940,10 +949,17 @@ int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai,
} else if (ret == UBI_IO_BITFLIPS) } else if (ret == UBI_IO_BITFLIPS)
fm->to_be_tortured[i] = 1; fm->to_be_tortured[i] = 1;
image_seq = be32_to_cpu(ech->image_seq);
if (!ubi->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; ret = UBI_BAD_FASTMAP;
goto free_hdr; goto free_hdr;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment