Commit f4b9a988 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.infradead.org/ubi-2.6

* 'for-linus' of git://git.infradead.org/ubi-2.6:
  UBI: compatible fallback in absense of sequence numbers
  UBI: fix double free on error path
parents 17d11ba1 32bc4820
...@@ -1254,6 +1254,7 @@ out_free: ...@@ -1254,6 +1254,7 @@ out_free:
if (!ubi->volumes[i]) if (!ubi->volumes[i])
continue; continue;
kfree(ubi->volumes[i]->eba_tbl); kfree(ubi->volumes[i]->eba_tbl);
ubi->volumes[i]->eba_tbl = NULL;
} }
return err; return err;
} }
...@@ -781,11 +781,22 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, ...@@ -781,11 +781,22 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si,
return -EINVAL; return -EINVAL;
} }
/*
* Make sure that all PEBs have the same image sequence number.
* This allows us to detect situations when users flash UBI
* images incorrectly, so that the flash has the new UBI image
* and leftovers from the old one. This feature was added
* relatively recently, and the sequence number was always
* zero, because old UBI implementations always set it to zero.
* For this reasons, we do not panic if some PEBs have zero
* sequence number, while other PEBs have non-zero sequence
* number.
*/
image_seq = be32_to_cpu(ech->image_seq); image_seq = be32_to_cpu(ech->image_seq);
if (!si->image_seq_set) { if (!si->image_seq_set) {
ubi->image_seq = image_seq; ubi->image_seq = image_seq;
si->image_seq_set = 1; si->image_seq_set = 1;
} else if (ubi->image_seq != image_seq) { } else if (ubi->image_seq && ubi->image_seq != image_seq) {
ubi_err("bad image sequence number %d in PEB %d, " ubi_err("bad image sequence number %d in PEB %d, "
"expected %d", image_seq, pnum, ubi->image_seq); "expected %d", image_seq, pnum, ubi->image_seq);
ubi_dbg_dump_ec_hdr(ech); ubi_dbg_dump_ec_hdr(ech);
......
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