diff options
-rw-r--r-- | drivers/mtd/ubi/debug.c | 2 | ||||
-rw-r--r-- | drivers/mtd/ubi/scan.c | 87 | ||||
-rw-r--r-- | drivers/mtd/ubi/scan.h | 2 | ||||
-rw-r--r-- | drivers/mtd/ubi/ubi-media.h | 17 | ||||
-rw-r--r-- | drivers/mtd/ubi/vtbl.c | 1 |
5 files changed, 30 insertions, 79 deletions
diff --git a/drivers/mtd/ubi/debug.c b/drivers/mtd/ubi/debug.c index 21e0d7d76a44..c0ed60e8ade9 100644 --- a/drivers/mtd/ubi/debug.c +++ b/drivers/mtd/ubi/debug.c | |||
@@ -65,7 +65,6 @@ void ubi_dbg_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr) | |||
65 | printk(KERN_DEBUG "\tcompat %d\n", (int)vid_hdr->compat); | 65 | printk(KERN_DEBUG "\tcompat %d\n", (int)vid_hdr->compat); |
66 | printk(KERN_DEBUG "\tvol_id %d\n", be32_to_cpu(vid_hdr->vol_id)); | 66 | printk(KERN_DEBUG "\tvol_id %d\n", be32_to_cpu(vid_hdr->vol_id)); |
67 | printk(KERN_DEBUG "\tlnum %d\n", be32_to_cpu(vid_hdr->lnum)); | 67 | printk(KERN_DEBUG "\tlnum %d\n", be32_to_cpu(vid_hdr->lnum)); |
68 | printk(KERN_DEBUG "\tleb_ver %u\n", be32_to_cpu(vid_hdr->leb_ver)); | ||
69 | printk(KERN_DEBUG "\tdata_size %d\n", be32_to_cpu(vid_hdr->data_size)); | 68 | printk(KERN_DEBUG "\tdata_size %d\n", be32_to_cpu(vid_hdr->data_size)); |
70 | printk(KERN_DEBUG "\tused_ebs %d\n", be32_to_cpu(vid_hdr->used_ebs)); | 69 | printk(KERN_DEBUG "\tused_ebs %d\n", be32_to_cpu(vid_hdr->used_ebs)); |
71 | printk(KERN_DEBUG "\tdata_pad %d\n", be32_to_cpu(vid_hdr->data_pad)); | 70 | printk(KERN_DEBUG "\tdata_pad %d\n", be32_to_cpu(vid_hdr->data_pad)); |
@@ -172,7 +171,6 @@ void ubi_dbg_dump_seb(const struct ubi_scan_leb *seb, int type) | |||
172 | printk(KERN_DEBUG "\tlnum %d\n", seb->lnum); | 171 | printk(KERN_DEBUG "\tlnum %d\n", seb->lnum); |
173 | printk(KERN_DEBUG "\tscrub %d\n", seb->scrub); | 172 | printk(KERN_DEBUG "\tscrub %d\n", seb->scrub); |
174 | printk(KERN_DEBUG "\tsqnum %llu\n", seb->sqnum); | 173 | printk(KERN_DEBUG "\tsqnum %llu\n", seb->sqnum); |
175 | printk(KERN_DEBUG "\tleb_ver %u\n", seb->leb_ver); | ||
176 | } | 174 | } |
177 | } | 175 | } |
178 | 176 | ||
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index 4dfbf27b0656..967bb4406df9 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
@@ -246,46 +246,21 @@ static int compare_lebs(struct ubi_device *ubi, const struct ubi_scan_leb *seb, | |||
246 | struct ubi_vid_hdr *vh = NULL; | 246 | struct ubi_vid_hdr *vh = NULL; |
247 | unsigned long long sqnum2 = be64_to_cpu(vid_hdr->sqnum); | 247 | unsigned long long sqnum2 = be64_to_cpu(vid_hdr->sqnum); |
248 | 248 | ||
249 | if (seb->sqnum == 0 && sqnum2 == 0) { | 249 | if (sqnum2 == seb->sqnum) { |
250 | long long abs; | ||
251 | long long v1 = seb->leb_ver, v2 = be32_to_cpu(vid_hdr->leb_ver); | ||
252 | |||
253 | /* | 250 | /* |
254 | * UBI constantly increases the logical eraseblock version | 251 | * This must be a really ancient UBI image which has been |
255 | * number and it can overflow. Thus, we have to bear in mind | 252 | * created before sequence numbers support has been added. At |
256 | * that versions that are close to %0xFFFFFFFF are less then | 253 | * that times we used 32-bit LEB versions stored in logical |
257 | * versions that are close to %0. | 254 | * eraseblocks. That was before UBI got into mainline. We do not |
258 | * | 255 | * support these images anymore. Well, those images will work |
259 | * The UBI WL sub-system guarantees that the number of pending | 256 | * still work, but only if no unclean reboots happened. |
260 | * tasks is not greater then %0x7FFFFFFF. So, if the difference | ||
261 | * between any two versions is greater or equivalent to | ||
262 | * %0x7FFFFFFF, there was an overflow and the logical | ||
263 | * eraseblock with lower version is actually newer then the one | ||
264 | * with higher version. | ||
265 | * | ||
266 | * FIXME: but this is anyway obsolete and will be removed at | ||
267 | * some point. | ||
268 | */ | 257 | */ |
269 | dbg_bld("using old crappy leb_ver stuff"); | 258 | ubi_err("unsupported on-flash UBI format\n"); |
270 | 259 | return -EINVAL; | |
271 | if (v1 == v2) { | 260 | } |
272 | ubi_err("PEB %d and PEB %d have the same version %lld", | ||
273 | seb->pnum, pnum, v1); | ||
274 | return -EINVAL; | ||
275 | } | ||
276 | 261 | ||
277 | abs = v1 - v2; | 262 | /* Obviously the LEB with lower sequence counter is older */ |
278 | if (abs < 0) | 263 | second_is_newer = !!(sqnum2 > seb->sqnum); |
279 | abs = -abs; | ||
280 | |||
281 | if (abs < 0x7FFFFFFF) | ||
282 | /* Non-overflow situation */ | ||
283 | second_is_newer = (v2 > v1); | ||
284 | else | ||
285 | second_is_newer = (v2 < v1); | ||
286 | } else | ||
287 | /* Obviously the LEB with lower sequence counter is older */ | ||
288 | second_is_newer = sqnum2 > seb->sqnum; | ||
289 | 264 | ||
290 | /* | 265 | /* |
291 | * Now we know which copy is newer. If the copy flag of the PEB with | 266 | * Now we know which copy is newer. If the copy flag of the PEB with |
@@ -293,7 +268,7 @@ static int compare_lebs(struct ubi_device *ubi, const struct ubi_scan_leb *seb, | |||
293 | * check data CRC. For the second PEB we already have the VID header, | 268 | * check data CRC. For the second PEB we already have the VID header, |
294 | * for the first one - we'll need to re-read it from flash. | 269 | * for the first one - we'll need to re-read it from flash. |
295 | * | 270 | * |
296 | * FIXME: this may be optimized so that we wouldn't read twice. | 271 | * Note: this may be optimized so that we wouldn't read twice. |
297 | */ | 272 | */ |
298 | 273 | ||
299 | if (second_is_newer) { | 274 | if (second_is_newer) { |
@@ -399,7 +374,6 @@ int ubi_scan_add_used(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
399 | int bitflips) | 374 | int bitflips) |
400 | { | 375 | { |
401 | int err, vol_id, lnum; | 376 | int err, vol_id, lnum; |
402 | uint32_t leb_ver; | ||
403 | unsigned long long sqnum; | 377 | unsigned long long sqnum; |
404 | struct ubi_scan_volume *sv; | 378 | struct ubi_scan_volume *sv; |
405 | struct ubi_scan_leb *seb; | 379 | struct ubi_scan_leb *seb; |
@@ -408,10 +382,9 @@ int ubi_scan_add_used(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
408 | vol_id = be32_to_cpu(vid_hdr->vol_id); | 382 | vol_id = be32_to_cpu(vid_hdr->vol_id); |
409 | lnum = be32_to_cpu(vid_hdr->lnum); | 383 | lnum = be32_to_cpu(vid_hdr->lnum); |
410 | sqnum = be64_to_cpu(vid_hdr->sqnum); | 384 | sqnum = be64_to_cpu(vid_hdr->sqnum); |
411 | leb_ver = be32_to_cpu(vid_hdr->leb_ver); | ||
412 | 385 | ||
413 | dbg_bld("PEB %d, LEB %d:%d, EC %d, sqnum %llu, ver %u, bitflips %d", | 386 | dbg_bld("PEB %d, LEB %d:%d, EC %d, sqnum %llu, bitflips %d", |
414 | pnum, vol_id, lnum, ec, sqnum, leb_ver, bitflips); | 387 | pnum, vol_id, lnum, ec, sqnum, bitflips); |
415 | 388 | ||
416 | sv = add_volume(si, vol_id, pnum, vid_hdr); | 389 | sv = add_volume(si, vol_id, pnum, vid_hdr); |
417 | if (IS_ERR(sv) < 0) | 390 | if (IS_ERR(sv) < 0) |
@@ -444,25 +417,20 @@ int ubi_scan_add_used(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
444 | */ | 417 | */ |
445 | 418 | ||
446 | dbg_bld("this LEB already exists: PEB %d, sqnum %llu, " | 419 | dbg_bld("this LEB already exists: PEB %d, sqnum %llu, " |
447 | "LEB ver %u, EC %d", seb->pnum, seb->sqnum, | 420 | "EC %d", seb->pnum, seb->sqnum, seb->ec); |
448 | seb->leb_ver, seb->ec); | ||
449 | |||
450 | /* | ||
451 | * Make sure that the logical eraseblocks have different | ||
452 | * versions. Otherwise the image is bad. | ||
453 | */ | ||
454 | if (seb->leb_ver == leb_ver && leb_ver != 0) { | ||
455 | ubi_err("two LEBs with same version %u", leb_ver); | ||
456 | ubi_dbg_dump_seb(seb, 0); | ||
457 | ubi_dbg_dump_vid_hdr(vid_hdr); | ||
458 | return -EINVAL; | ||
459 | } | ||
460 | 421 | ||
461 | /* | 422 | /* |
462 | * Make sure that the logical eraseblocks have different | 423 | * Make sure that the logical eraseblocks have different |
463 | * sequence numbers. Otherwise the image is bad. | 424 | * sequence numbers. Otherwise the image is bad. |
464 | * | 425 | * |
465 | * FIXME: remove 'sqnum != 0' check when leb_ver is removed. | 426 | * However, if the sequence number is zero, we assume it must |
427 | * be an ancient UBI image from the era when UBI did not have | ||
428 | * sequence numbers. We still can attach these images, unless | ||
429 | * there is a need to distinguish between old and new | ||
430 | * eraseblocks, in which case we'll refuse the image in | ||
431 | * 'compare_lebs()'. In other words, we attach old clean | ||
432 | * images, but refuse attaching old images with duplicated | ||
433 | * logical eraseblocks because there was an unclean reboot. | ||
466 | */ | 434 | */ |
467 | if (seb->sqnum == sqnum && sqnum != 0) { | 435 | if (seb->sqnum == sqnum && sqnum != 0) { |
468 | ubi_err("two LEBs with same sequence number %llu", | 436 | ubi_err("two LEBs with same sequence number %llu", |
@@ -502,7 +470,6 @@ int ubi_scan_add_used(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
502 | seb->pnum = pnum; | 470 | seb->pnum = pnum; |
503 | seb->scrub = ((cmp_res & 2) || bitflips); | 471 | seb->scrub = ((cmp_res & 2) || bitflips); |
504 | seb->sqnum = sqnum; | 472 | seb->sqnum = sqnum; |
505 | seb->leb_ver = leb_ver; | ||
506 | 473 | ||
507 | if (sv->highest_lnum == lnum) | 474 | if (sv->highest_lnum == lnum) |
508 | sv->last_data_size = | 475 | sv->last_data_size = |
@@ -539,7 +506,6 @@ int ubi_scan_add_used(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
539 | seb->lnum = lnum; | 506 | seb->lnum = lnum; |
540 | seb->sqnum = sqnum; | 507 | seb->sqnum = sqnum; |
541 | seb->scrub = bitflips; | 508 | seb->scrub = bitflips; |
542 | seb->leb_ver = leb_ver; | ||
543 | 509 | ||
544 | if (sv->highest_lnum <= lnum) { | 510 | if (sv->highest_lnum <= lnum) { |
545 | sv->highest_lnum = lnum; | 511 | sv->highest_lnum = lnum; |
@@ -1263,11 +1229,6 @@ static int paranoid_check_si(struct ubi_device *ubi, struct ubi_scan_info *si) | |||
1263 | ubi_err("bad data_pad %d", sv->data_pad); | 1229 | ubi_err("bad data_pad %d", sv->data_pad); |
1264 | goto bad_vid_hdr; | 1230 | goto bad_vid_hdr; |
1265 | } | 1231 | } |
1266 | |||
1267 | if (seb->leb_ver != be32_to_cpu(vidh->leb_ver)) { | ||
1268 | ubi_err("bad leb_ver %u", seb->leb_ver); | ||
1269 | goto bad_vid_hdr; | ||
1270 | } | ||
1271 | } | 1232 | } |
1272 | 1233 | ||
1273 | if (!last_seb) | 1234 | if (!last_seb) |
diff --git a/drivers/mtd/ubi/scan.h b/drivers/mtd/ubi/scan.h index 4e2e3cc0becd..61df208e2f20 100644 --- a/drivers/mtd/ubi/scan.h +++ b/drivers/mtd/ubi/scan.h | |||
@@ -34,7 +34,6 @@ | |||
34 | * @u: unions RB-tree or @list links | 34 | * @u: unions RB-tree or @list links |
35 | * @u.rb: link in the per-volume RB-tree of &struct ubi_scan_leb objects | 35 | * @u.rb: link in the per-volume RB-tree of &struct ubi_scan_leb objects |
36 | * @u.list: link in one of the eraseblock lists | 36 | * @u.list: link in one of the eraseblock lists |
37 | * @leb_ver: logical eraseblock version (obsolete) | ||
38 | * | 37 | * |
39 | * One object of this type is allocated for each physical eraseblock during | 38 | * One object of this type is allocated for each physical eraseblock during |
40 | * scanning. | 39 | * scanning. |
@@ -49,7 +48,6 @@ struct ubi_scan_leb { | |||
49 | struct rb_node rb; | 48 | struct rb_node rb; |
50 | struct list_head list; | 49 | struct list_head list; |
51 | } u; | 50 | } u; |
52 | uint32_t leb_ver; | ||
53 | }; | 51 | }; |
54 | 52 | ||
55 | /** | 53 | /** |
diff --git a/drivers/mtd/ubi/ubi-media.h b/drivers/mtd/ubi/ubi-media.h index 26bb7af9787a..2ad940409053 100644 --- a/drivers/mtd/ubi/ubi-media.h +++ b/drivers/mtd/ubi/ubi-media.h | |||
@@ -168,16 +168,15 @@ struct ubi_ec_hdr { | |||
168 | * %UBI_COMPAT_IGNORE, %UBI_COMPAT_PRESERVE, or %UBI_COMPAT_REJECT) | 168 | * %UBI_COMPAT_IGNORE, %UBI_COMPAT_PRESERVE, or %UBI_COMPAT_REJECT) |
169 | * @vol_id: ID of this volume | 169 | * @vol_id: ID of this volume |
170 | * @lnum: logical eraseblock number | 170 | * @lnum: logical eraseblock number |
171 | * @leb_ver: version of this logical eraseblock (IMPORTANT: obsolete, to be | 171 | * @padding1: reserved for future, zeroes |
172 | * removed, kept only for not breaking older UBI users) | ||
173 | * @data_size: how many bytes of data this logical eraseblock contains | 172 | * @data_size: how many bytes of data this logical eraseblock contains |
174 | * @used_ebs: total number of used logical eraseblocks in this volume | 173 | * @used_ebs: total number of used logical eraseblocks in this volume |
175 | * @data_pad: how many bytes at the end of this physical eraseblock are not | 174 | * @data_pad: how many bytes at the end of this physical eraseblock are not |
176 | * used | 175 | * used |
177 | * @data_crc: CRC checksum of the data stored in this logical eraseblock | 176 | * @data_crc: CRC checksum of the data stored in this logical eraseblock |
178 | * @padding1: reserved for future, zeroes | ||
179 | * @sqnum: sequence number | ||
180 | * @padding2: reserved for future, zeroes | 177 | * @padding2: reserved for future, zeroes |
178 | * @sqnum: sequence number | ||
179 | * @padding3: reserved for future, zeroes | ||
181 | * @hdr_crc: volume identifier header CRC checksum | 180 | * @hdr_crc: volume identifier header CRC checksum |
182 | * | 181 | * |
183 | * The @sqnum is the value of the global sequence counter at the time when this | 182 | * The @sqnum is the value of the global sequence counter at the time when this |
@@ -225,10 +224,6 @@ struct ubi_ec_hdr { | |||
225 | * checksum is correct, this physical eraseblock is selected (P1). Otherwise | 224 | * checksum is correct, this physical eraseblock is selected (P1). Otherwise |
226 | * the older one (P) is selected. | 225 | * the older one (P) is selected. |
227 | * | 226 | * |
228 | * Note, there is an obsolete @leb_ver field which was used instead of @sqnum | ||
229 | * in the past. But it is not used anymore and we keep it in order to be able | ||
230 | * to deal with old UBI images. It will be removed at some point. | ||
231 | * | ||
232 | * There are 2 sorts of volumes in UBI: user volumes and internal volumes. | 227 | * There are 2 sorts of volumes in UBI: user volumes and internal volumes. |
233 | * Internal volumes are not seen from outside and are used for various internal | 228 | * Internal volumes are not seen from outside and are used for various internal |
234 | * UBI purposes. In this implementation there is only one internal volume - the | 229 | * UBI purposes. In this implementation there is only one internal volume - the |
@@ -278,14 +273,14 @@ struct ubi_vid_hdr { | |||
278 | __u8 compat; | 273 | __u8 compat; |
279 | __be32 vol_id; | 274 | __be32 vol_id; |
280 | __be32 lnum; | 275 | __be32 lnum; |
281 | __be32 leb_ver; /* obsolete, to be removed, don't use */ | 276 | __u8 padding1[4]; |
282 | __be32 data_size; | 277 | __be32 data_size; |
283 | __be32 used_ebs; | 278 | __be32 used_ebs; |
284 | __be32 data_pad; | 279 | __be32 data_pad; |
285 | __be32 data_crc; | 280 | __be32 data_crc; |
286 | __u8 padding1[4]; | 281 | __u8 padding2[4]; |
287 | __be64 sqnum; | 282 | __be64 sqnum; |
288 | __u8 padding2[12]; | 283 | __u8 padding3[12]; |
289 | __be32 hdr_crc; | 284 | __be32 hdr_crc; |
290 | } __attribute__ ((packed)); | 285 | } __attribute__ ((packed)); |
291 | 286 | ||
diff --git a/drivers/mtd/ubi/vtbl.c b/drivers/mtd/ubi/vtbl.c index 4e1c489a3bae..217d0e111b2a 100644 --- a/drivers/mtd/ubi/vtbl.c +++ b/drivers/mtd/ubi/vtbl.c | |||
@@ -338,7 +338,6 @@ retry: | |||
338 | vid_hdr->data_pad = cpu_to_be32(0); | 338 | vid_hdr->data_pad = cpu_to_be32(0); |
339 | vid_hdr->lnum = cpu_to_be32(copy); | 339 | vid_hdr->lnum = cpu_to_be32(copy); |
340 | vid_hdr->sqnum = cpu_to_be64(++si->max_sqnum); | 340 | vid_hdr->sqnum = cpu_to_be64(++si->max_sqnum); |
341 | vid_hdr->leb_ver = cpu_to_be32(old_seb ? old_seb->leb_ver + 1: 0); | ||
342 | 341 | ||
343 | /* The EC header is already there, write the VID header */ | 342 | /* The EC header is already there, write the VID header */ |
344 | err = ubi_io_write_vid_hdr(ubi, new_seb->pnum, vid_hdr); | 343 | err = ubi_io_write_vid_hdr(ubi, new_seb->pnum, vid_hdr); |