0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072 #include <linux/err.h>
0073 #include <linux/slab.h>
0074 #include <linux/crc32.h>
0075 #include <linux/math64.h>
0076 #include <linux/random.h>
0077 #include "ubi.h"
0078
0079 static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai);
0080
0081 #define AV_FIND BIT(0)
0082 #define AV_ADD BIT(1)
0083 #define AV_FIND_OR_ADD (AV_FIND | AV_ADD)
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103 static struct ubi_ainf_volume *find_or_add_av(struct ubi_attach_info *ai,
0104 int vol_id, unsigned int flags,
0105 bool *created)
0106 {
0107 struct ubi_ainf_volume *av;
0108 struct rb_node **p = &ai->volumes.rb_node, *parent = NULL;
0109
0110
0111 while (*p) {
0112 parent = *p;
0113 av = rb_entry(parent, struct ubi_ainf_volume, rb);
0114
0115 if (vol_id == av->vol_id) {
0116 *created = false;
0117
0118 if (!(flags & AV_FIND))
0119 return ERR_PTR(-EEXIST);
0120
0121 return av;
0122 }
0123
0124 if (vol_id > av->vol_id)
0125 p = &(*p)->rb_left;
0126 else
0127 p = &(*p)->rb_right;
0128 }
0129
0130 if (!(flags & AV_ADD))
0131 return NULL;
0132
0133
0134 av = kzalloc(sizeof(*av), GFP_KERNEL);
0135 if (!av)
0136 return ERR_PTR(-ENOMEM);
0137
0138 av->vol_id = vol_id;
0139
0140 if (vol_id > ai->highest_vol_id)
0141 ai->highest_vol_id = vol_id;
0142
0143 rb_link_node(&av->rb, parent, p);
0144 rb_insert_color(&av->rb, &ai->volumes);
0145 ai->vols_found += 1;
0146 *created = true;
0147 dbg_bld("added volume %d", vol_id);
0148 return av;
0149 }
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161 static struct ubi_ainf_volume *ubi_find_or_add_av(struct ubi_attach_info *ai,
0162 int vol_id, bool *created)
0163 {
0164 return find_or_add_av(ai, vol_id, AV_FIND_OR_ADD, created);
0165 }
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178 struct ubi_ainf_peb *ubi_alloc_aeb(struct ubi_attach_info *ai, int pnum,
0179 int ec)
0180 {
0181 struct ubi_ainf_peb *aeb;
0182
0183 aeb = kmem_cache_zalloc(ai->aeb_slab_cache, GFP_KERNEL);
0184 if (!aeb)
0185 return NULL;
0186
0187 aeb->pnum = pnum;
0188 aeb->ec = ec;
0189 aeb->vol_id = UBI_UNKNOWN;
0190 aeb->lnum = UBI_UNKNOWN;
0191
0192 return aeb;
0193 }
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203 void ubi_free_aeb(struct ubi_attach_info *ai, struct ubi_ainf_peb *aeb)
0204 {
0205 kmem_cache_free(ai->aeb_slab_cache, aeb);
0206 }
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229 static int add_to_list(struct ubi_attach_info *ai, int pnum, int vol_id,
0230 int lnum, int ec, int to_head, struct list_head *list)
0231 {
0232 struct ubi_ainf_peb *aeb;
0233
0234 if (list == &ai->free) {
0235 dbg_bld("add to free: PEB %d, EC %d", pnum, ec);
0236 } else if (list == &ai->erase) {
0237 dbg_bld("add to erase: PEB %d, EC %d", pnum, ec);
0238 } else if (list == &ai->alien) {
0239 dbg_bld("add to alien: PEB %d, EC %d", pnum, ec);
0240 ai->alien_peb_count += 1;
0241 } else
0242 BUG();
0243
0244 aeb = ubi_alloc_aeb(ai, pnum, ec);
0245 if (!aeb)
0246 return -ENOMEM;
0247
0248 aeb->vol_id = vol_id;
0249 aeb->lnum = lnum;
0250 if (to_head)
0251 list_add(&aeb->u.list, list);
0252 else
0253 list_add_tail(&aeb->u.list, list);
0254 return 0;
0255 }
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268 static int add_corrupted(struct ubi_attach_info *ai, int pnum, int ec)
0269 {
0270 struct ubi_ainf_peb *aeb;
0271
0272 dbg_bld("add to corrupted: PEB %d, EC %d", pnum, ec);
0273
0274 aeb = ubi_alloc_aeb(ai, pnum, ec);
0275 if (!aeb)
0276 return -ENOMEM;
0277
0278 ai->corr_peb_count += 1;
0279 list_add(&aeb->u.list, &ai->corr);
0280 return 0;
0281 }
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296 static int add_fastmap(struct ubi_attach_info *ai, int pnum,
0297 struct ubi_vid_hdr *vid_hdr, int ec)
0298 {
0299 struct ubi_ainf_peb *aeb;
0300
0301 aeb = ubi_alloc_aeb(ai, pnum, ec);
0302 if (!aeb)
0303 return -ENOMEM;
0304
0305 aeb->vol_id = be32_to_cpu(vid_hdr->vol_id);
0306 aeb->sqnum = be64_to_cpu(vid_hdr->sqnum);
0307 list_add(&aeb->u.list, &ai->fastmap);
0308
0309 dbg_bld("add to fastmap list: PEB %d, vol_id %d, sqnum: %llu", pnum,
0310 aeb->vol_id, aeb->sqnum);
0311
0312 return 0;
0313 }
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330 static int validate_vid_hdr(const struct ubi_device *ubi,
0331 const struct ubi_vid_hdr *vid_hdr,
0332 const struct ubi_ainf_volume *av, int pnum)
0333 {
0334 int vol_type = vid_hdr->vol_type;
0335 int vol_id = be32_to_cpu(vid_hdr->vol_id);
0336 int used_ebs = be32_to_cpu(vid_hdr->used_ebs);
0337 int data_pad = be32_to_cpu(vid_hdr->data_pad);
0338
0339 if (av->leb_count != 0) {
0340 int av_vol_type;
0341
0342
0343
0344
0345
0346
0347
0348 if (vol_id != av->vol_id) {
0349 ubi_err(ubi, "inconsistent vol_id");
0350 goto bad;
0351 }
0352
0353 if (av->vol_type == UBI_STATIC_VOLUME)
0354 av_vol_type = UBI_VID_STATIC;
0355 else
0356 av_vol_type = UBI_VID_DYNAMIC;
0357
0358 if (vol_type != av_vol_type) {
0359 ubi_err(ubi, "inconsistent vol_type");
0360 goto bad;
0361 }
0362
0363 if (used_ebs != av->used_ebs) {
0364 ubi_err(ubi, "inconsistent used_ebs");
0365 goto bad;
0366 }
0367
0368 if (data_pad != av->data_pad) {
0369 ubi_err(ubi, "inconsistent data_pad");
0370 goto bad;
0371 }
0372 }
0373
0374 return 0;
0375
0376 bad:
0377 ubi_err(ubi, "inconsistent VID header at PEB %d", pnum);
0378 ubi_dump_vid_hdr(vid_hdr);
0379 ubi_dump_av(av);
0380 return -EINVAL;
0381 }
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396 static struct ubi_ainf_volume *add_volume(struct ubi_attach_info *ai,
0397 int vol_id, int pnum,
0398 const struct ubi_vid_hdr *vid_hdr)
0399 {
0400 struct ubi_ainf_volume *av;
0401 bool created;
0402
0403 ubi_assert(vol_id == be32_to_cpu(vid_hdr->vol_id));
0404
0405 av = ubi_find_or_add_av(ai, vol_id, &created);
0406 if (IS_ERR(av) || !created)
0407 return av;
0408
0409 av->used_ebs = be32_to_cpu(vid_hdr->used_ebs);
0410 av->data_pad = be32_to_cpu(vid_hdr->data_pad);
0411 av->compat = vid_hdr->compat;
0412 av->vol_type = vid_hdr->vol_type == UBI_VID_DYNAMIC ? UBI_DYNAMIC_VOLUME
0413 : UBI_STATIC_VOLUME;
0414
0415 return av;
0416 }
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438 int ubi_compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb,
0439 int pnum, const struct ubi_vid_hdr *vid_hdr)
0440 {
0441 int len, err, second_is_newer, bitflips = 0, corrupted = 0;
0442 uint32_t data_crc, crc;
0443 struct ubi_vid_io_buf *vidb = NULL;
0444 unsigned long long sqnum2 = be64_to_cpu(vid_hdr->sqnum);
0445
0446 if (sqnum2 == aeb->sqnum) {
0447
0448
0449
0450
0451
0452
0453
0454
0455 ubi_err(ubi, "unsupported on-flash UBI format");
0456 return -EINVAL;
0457 }
0458
0459
0460 second_is_newer = (sqnum2 > aeb->sqnum);
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471 if (second_is_newer) {
0472 if (!vid_hdr->copy_flag) {
0473
0474 dbg_bld("second PEB %d is newer, copy_flag is unset",
0475 pnum);
0476 return 1;
0477 }
0478 } else {
0479 if (!aeb->copy_flag) {
0480
0481 dbg_bld("first PEB %d is newer, copy_flag is unset",
0482 pnum);
0483 return bitflips << 1;
0484 }
0485
0486 vidb = ubi_alloc_vid_buf(ubi, GFP_KERNEL);
0487 if (!vidb)
0488 return -ENOMEM;
0489
0490 pnum = aeb->pnum;
0491 err = ubi_io_read_vid_hdr(ubi, pnum, vidb, 0);
0492 if (err) {
0493 if (err == UBI_IO_BITFLIPS)
0494 bitflips = 1;
0495 else {
0496 ubi_err(ubi, "VID of PEB %d header is bad, but it was OK earlier, err %d",
0497 pnum, err);
0498 if (err > 0)
0499 err = -EIO;
0500
0501 goto out_free_vidh;
0502 }
0503 }
0504
0505 vid_hdr = ubi_get_vid_hdr(vidb);
0506 }
0507
0508
0509
0510 len = be32_to_cpu(vid_hdr->data_size);
0511
0512 mutex_lock(&ubi->buf_mutex);
0513 err = ubi_io_read_data(ubi, ubi->peb_buf, pnum, 0, len);
0514 if (err && err != UBI_IO_BITFLIPS && !mtd_is_eccerr(err))
0515 goto out_unlock;
0516
0517 data_crc = be32_to_cpu(vid_hdr->data_crc);
0518 crc = crc32(UBI_CRC32_INIT, ubi->peb_buf, len);
0519 if (crc != data_crc) {
0520 dbg_bld("PEB %d CRC error: calculated %#08x, must be %#08x",
0521 pnum, crc, data_crc);
0522 corrupted = 1;
0523 bitflips = 0;
0524 second_is_newer = !second_is_newer;
0525 } else {
0526 dbg_bld("PEB %d CRC is OK", pnum);
0527 bitflips |= !!err;
0528 }
0529 mutex_unlock(&ubi->buf_mutex);
0530
0531 ubi_free_vid_buf(vidb);
0532
0533 if (second_is_newer)
0534 dbg_bld("second PEB %d is newer, copy_flag is set", pnum);
0535 else
0536 dbg_bld("first PEB %d is newer, copy_flag is set", pnum);
0537
0538 return second_is_newer | (bitflips << 1) | (corrupted << 2);
0539
0540 out_unlock:
0541 mutex_unlock(&ubi->buf_mutex);
0542 out_free_vidh:
0543 ubi_free_vid_buf(vidb);
0544 return err;
0545 }
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563 int ubi_add_to_av(struct ubi_device *ubi, struct ubi_attach_info *ai, int pnum,
0564 int ec, const struct ubi_vid_hdr *vid_hdr, int bitflips)
0565 {
0566 int err, vol_id, lnum;
0567 unsigned long long sqnum;
0568 struct ubi_ainf_volume *av;
0569 struct ubi_ainf_peb *aeb;
0570 struct rb_node **p, *parent = NULL;
0571
0572 vol_id = be32_to_cpu(vid_hdr->vol_id);
0573 lnum = be32_to_cpu(vid_hdr->lnum);
0574 sqnum = be64_to_cpu(vid_hdr->sqnum);
0575
0576 dbg_bld("PEB %d, LEB %d:%d, EC %d, sqnum %llu, bitflips %d",
0577 pnum, vol_id, lnum, ec, sqnum, bitflips);
0578
0579 av = add_volume(ai, vol_id, pnum, vid_hdr);
0580 if (IS_ERR(av))
0581 return PTR_ERR(av);
0582
0583 if (ai->max_sqnum < sqnum)
0584 ai->max_sqnum = sqnum;
0585
0586
0587
0588
0589
0590 p = &av->root.rb_node;
0591 while (*p) {
0592 int cmp_res;
0593
0594 parent = *p;
0595 aeb = rb_entry(parent, struct ubi_ainf_peb, u.rb);
0596 if (lnum != aeb->lnum) {
0597 if (lnum < aeb->lnum)
0598 p = &(*p)->rb_left;
0599 else
0600 p = &(*p)->rb_right;
0601 continue;
0602 }
0603
0604
0605
0606
0607
0608
0609 dbg_bld("this LEB already exists: PEB %d, sqnum %llu, EC %d",
0610 aeb->pnum, aeb->sqnum, aeb->ec);
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625 if (aeb->sqnum == sqnum && sqnum != 0) {
0626 ubi_err(ubi, "two LEBs with same sequence number %llu",
0627 sqnum);
0628 ubi_dump_aeb(aeb, 0);
0629 ubi_dump_vid_hdr(vid_hdr);
0630 return -EINVAL;
0631 }
0632
0633
0634
0635
0636
0637 cmp_res = ubi_compare_lebs(ubi, aeb, pnum, vid_hdr);
0638 if (cmp_res < 0)
0639 return cmp_res;
0640
0641 if (cmp_res & 1) {
0642
0643
0644
0645
0646 err = validate_vid_hdr(ubi, vid_hdr, av, pnum);
0647 if (err)
0648 return err;
0649
0650 err = add_to_list(ai, aeb->pnum, aeb->vol_id,
0651 aeb->lnum, aeb->ec, cmp_res & 4,
0652 &ai->erase);
0653 if (err)
0654 return err;
0655
0656 aeb->ec = ec;
0657 aeb->pnum = pnum;
0658 aeb->vol_id = vol_id;
0659 aeb->lnum = lnum;
0660 aeb->scrub = ((cmp_res & 2) || bitflips);
0661 aeb->copy_flag = vid_hdr->copy_flag;
0662 aeb->sqnum = sqnum;
0663
0664 if (av->highest_lnum == lnum)
0665 av->last_data_size =
0666 be32_to_cpu(vid_hdr->data_size);
0667
0668 return 0;
0669 } else {
0670
0671
0672
0673
0674 return add_to_list(ai, pnum, vol_id, lnum, ec,
0675 cmp_res & 4, &ai->erase);
0676 }
0677 }
0678
0679
0680
0681
0682
0683
0684 err = validate_vid_hdr(ubi, vid_hdr, av, pnum);
0685 if (err)
0686 return err;
0687
0688 aeb = ubi_alloc_aeb(ai, pnum, ec);
0689 if (!aeb)
0690 return -ENOMEM;
0691
0692 aeb->vol_id = vol_id;
0693 aeb->lnum = lnum;
0694 aeb->scrub = bitflips;
0695 aeb->copy_flag = vid_hdr->copy_flag;
0696 aeb->sqnum = sqnum;
0697
0698 if (av->highest_lnum <= lnum) {
0699 av->highest_lnum = lnum;
0700 av->last_data_size = be32_to_cpu(vid_hdr->data_size);
0701 }
0702
0703 av->leb_count += 1;
0704 rb_link_node(&aeb->u.rb, parent, p);
0705 rb_insert_color(&aeb->u.rb, &av->root);
0706 return 0;
0707 }
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717 struct ubi_ainf_volume *ubi_add_av(struct ubi_attach_info *ai, int vol_id)
0718 {
0719 bool created;
0720
0721 return find_or_add_av(ai, vol_id, AV_ADD, &created);
0722 }
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732 struct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai,
0733 int vol_id)
0734 {
0735 bool created;
0736
0737 return find_or_add_av((struct ubi_attach_info *)ai, vol_id, AV_FIND,
0738 &created);
0739 }
0740
0741 static void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av,
0742 struct list_head *list);
0743
0744
0745
0746
0747
0748
0749 void ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av)
0750 {
0751 dbg_bld("remove attaching information about volume %d", av->vol_id);
0752
0753 rb_erase(&av->rb, &ai->volumes);
0754 destroy_av(ai, av, &ai->erase);
0755 ai->vols_found -= 1;
0756 }
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768
0769
0770
0771 static int early_erase_peb(struct ubi_device *ubi,
0772 const struct ubi_attach_info *ai, int pnum, int ec)
0773 {
0774 int err;
0775 struct ubi_ec_hdr *ec_hdr;
0776
0777 if ((long long)ec >= UBI_MAX_ERASECOUNTER) {
0778
0779
0780
0781
0782 ubi_err(ubi, "erase counter overflow at PEB %d, EC %d",
0783 pnum, ec);
0784 return -EINVAL;
0785 }
0786
0787 ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
0788 if (!ec_hdr)
0789 return -ENOMEM;
0790
0791 ec_hdr->ec = cpu_to_be64(ec);
0792
0793 err = ubi_io_sync_erase(ubi, pnum, 0);
0794 if (err < 0)
0795 goto out_free;
0796
0797 err = ubi_io_write_ec_hdr(ubi, pnum, ec_hdr);
0798
0799 out_free:
0800 kfree(ec_hdr);
0801 return err;
0802 }
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818 struct ubi_ainf_peb *ubi_early_get_peb(struct ubi_device *ubi,
0819 struct ubi_attach_info *ai)
0820 {
0821 int err = 0;
0822 struct ubi_ainf_peb *aeb, *tmp_aeb;
0823
0824 if (!list_empty(&ai->free)) {
0825 aeb = list_entry(ai->free.next, struct ubi_ainf_peb, u.list);
0826 list_del(&aeb->u.list);
0827 dbg_bld("return free PEB %d, EC %d", aeb->pnum, aeb->ec);
0828 return aeb;
0829 }
0830
0831
0832
0833
0834
0835
0836
0837 list_for_each_entry_safe(aeb, tmp_aeb, &ai->erase, u.list) {
0838 if (aeb->ec == UBI_UNKNOWN)
0839 aeb->ec = ai->mean_ec;
0840
0841 err = early_erase_peb(ubi, ai, aeb->pnum, aeb->ec+1);
0842 if (err)
0843 continue;
0844
0845 aeb->ec += 1;
0846 list_del(&aeb->u.list);
0847 dbg_bld("return PEB %d, EC %d", aeb->pnum, aeb->ec);
0848 return aeb;
0849 }
0850
0851 ubi_err(ubi, "no free eraseblocks");
0852 return ERR_PTR(-ENOSPC);
0853 }
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872 static int check_corruption(struct ubi_device *ubi, struct ubi_vid_hdr *vid_hdr,
0873 int pnum)
0874 {
0875 int err;
0876
0877 mutex_lock(&ubi->buf_mutex);
0878 memset(ubi->peb_buf, 0x00, ubi->leb_size);
0879
0880 err = ubi_io_read(ubi, ubi->peb_buf, pnum, ubi->leb_start,
0881 ubi->leb_size);
0882 if (err == UBI_IO_BITFLIPS || mtd_is_eccerr(err)) {
0883
0884
0885
0886
0887
0888
0889
0890 err = 0;
0891 goto out_unlock;
0892 }
0893
0894 if (err)
0895 goto out_unlock;
0896
0897 if (ubi_check_pattern(ubi->peb_buf, 0xFF, ubi->leb_size))
0898 goto out_unlock;
0899
0900 ubi_err(ubi, "PEB %d contains corrupted VID header, and the data does not contain all 0xFF",
0901 pnum);
0902 ubi_err(ubi, "this may be a non-UBI PEB or a severe VID header corruption which requires manual inspection");
0903 ubi_dump_vid_hdr(vid_hdr);
0904 pr_err("hexdump of PEB %d offset %d, length %d",
0905 pnum, ubi->leb_start, ubi->leb_size);
0906 ubi_dbg_print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1,
0907 ubi->peb_buf, ubi->leb_size, 1);
0908 err = 1;
0909
0910 out_unlock:
0911 mutex_unlock(&ubi->buf_mutex);
0912 return err;
0913 }
0914
0915 static bool vol_ignored(int vol_id)
0916 {
0917 switch (vol_id) {
0918 case UBI_LAYOUT_VOLUME_ID:
0919 return true;
0920 }
0921
0922 #ifdef CONFIG_MTD_UBI_FASTMAP
0923 return ubi_is_fm_vol(vol_id);
0924 #else
0925 return false;
0926 #endif
0927 }
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937
0938
0939
0940
0941 static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai,
0942 int pnum, bool fast)
0943 {
0944 struct ubi_ec_hdr *ech = ai->ech;
0945 struct ubi_vid_io_buf *vidb = ai->vidb;
0946 struct ubi_vid_hdr *vidh = ubi_get_vid_hdr(vidb);
0947 long long ec;
0948 int err, bitflips = 0, vol_id = -1, ec_err = 0;
0949
0950 dbg_bld("scan PEB %d", pnum);
0951
0952
0953 err = ubi_io_is_bad(ubi, pnum);
0954 if (err < 0)
0955 return err;
0956 else if (err) {
0957 ai->bad_peb_count += 1;
0958 return 0;
0959 }
0960
0961 err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);
0962 if (err < 0)
0963 return err;
0964 switch (err) {
0965 case 0:
0966 break;
0967 case UBI_IO_BITFLIPS:
0968 bitflips = 1;
0969 break;
0970 case UBI_IO_FF:
0971 ai->empty_peb_count += 1;
0972 return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN,
0973 UBI_UNKNOWN, 0, &ai->erase);
0974 case UBI_IO_FF_BITFLIPS:
0975 ai->empty_peb_count += 1;
0976 return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN,
0977 UBI_UNKNOWN, 1, &ai->erase);
0978 case UBI_IO_BAD_HDR_EBADMSG:
0979 case UBI_IO_BAD_HDR:
0980
0981
0982
0983
0984
0985 ec_err = err;
0986 ec = UBI_UNKNOWN;
0987 bitflips = 1;
0988 break;
0989 default:
0990 ubi_err(ubi, "'ubi_io_read_ec_hdr()' returned unknown code %d",
0991 err);
0992 return -EINVAL;
0993 }
0994
0995 if (!ec_err) {
0996 int image_seq;
0997
0998
0999 if (ech->version != UBI_VERSION) {
1000 ubi_err(ubi, "this UBI version is %d, image version is %d",
1001 UBI_VERSION, (int)ech->version);
1002 return -EINVAL;
1003 }
1004
1005 ec = be64_to_cpu(ech->ec);
1006 if (ec > UBI_MAX_ERASECOUNTER) {
1007
1008
1009
1010
1011
1012
1013
1014 ubi_err(ubi, "erase counter overflow, max is %d",
1015 UBI_MAX_ERASECOUNTER);
1016 ubi_dump_ec_hdr(ech);
1017 return -EINVAL;
1018 }
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031 image_seq = be32_to_cpu(ech->image_seq);
1032 if (!ubi->image_seq)
1033 ubi->image_seq = image_seq;
1034 if (image_seq && ubi->image_seq != image_seq) {
1035 ubi_err(ubi, "bad image sequence number %d in PEB %d, expected %d",
1036 image_seq, pnum, ubi->image_seq);
1037 ubi_dump_ec_hdr(ech);
1038 return -EINVAL;
1039 }
1040 }
1041
1042
1043
1044 err = ubi_io_read_vid_hdr(ubi, pnum, vidb, 0);
1045 if (err < 0)
1046 return err;
1047 switch (err) {
1048 case 0:
1049 break;
1050 case UBI_IO_BITFLIPS:
1051 bitflips = 1;
1052 break;
1053 case UBI_IO_BAD_HDR_EBADMSG:
1054 if (ec_err == UBI_IO_BAD_HDR_EBADMSG)
1055
1056
1057
1058
1059
1060
1061 ai->maybe_bad_peb_count += 1;
1062 fallthrough;
1063 case UBI_IO_BAD_HDR:
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075 if (fast)
1076 ai->force_full_scan = 1;
1077
1078 if (ec_err)
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091 err = 0;
1092 else
1093
1094
1095
1096
1097 err = check_corruption(ubi, vidh, pnum);
1098
1099 if (err < 0)
1100 return err;
1101 else if (!err)
1102
1103 err = add_to_list(ai, pnum, UBI_UNKNOWN,
1104 UBI_UNKNOWN, ec, 1, &ai->erase);
1105 else
1106
1107 err = add_corrupted(ai, pnum, ec);
1108 if (err)
1109 return err;
1110 goto adjust_mean_ec;
1111 case UBI_IO_FF_BITFLIPS:
1112 err = add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN,
1113 ec, 1, &ai->erase);
1114 if (err)
1115 return err;
1116 goto adjust_mean_ec;
1117 case UBI_IO_FF:
1118 if (ec_err || bitflips)
1119 err = add_to_list(ai, pnum, UBI_UNKNOWN,
1120 UBI_UNKNOWN, ec, 1, &ai->erase);
1121 else
1122 err = add_to_list(ai, pnum, UBI_UNKNOWN,
1123 UBI_UNKNOWN, ec, 0, &ai->free);
1124 if (err)
1125 return err;
1126 goto adjust_mean_ec;
1127 default:
1128 ubi_err(ubi, "'ubi_io_read_vid_hdr()' returned unknown code %d",
1129 err);
1130 return -EINVAL;
1131 }
1132
1133 vol_id = be32_to_cpu(vidh->vol_id);
1134 if (vol_id > UBI_MAX_VOLUMES && !vol_ignored(vol_id)) {
1135 int lnum = be32_to_cpu(vidh->lnum);
1136
1137
1138 switch (vidh->compat) {
1139 case UBI_COMPAT_DELETE:
1140 ubi_msg(ubi, "\"delete\" compatible internal volume %d:%d found, will remove it",
1141 vol_id, lnum);
1142
1143 err = add_to_list(ai, pnum, vol_id, lnum,
1144 ec, 1, &ai->erase);
1145 if (err)
1146 return err;
1147 return 0;
1148
1149 case UBI_COMPAT_RO:
1150 ubi_msg(ubi, "read-only compatible internal volume %d:%d found, switch to read-only mode",
1151 vol_id, lnum);
1152 ubi->ro_mode = 1;
1153 break;
1154
1155 case UBI_COMPAT_PRESERVE:
1156 ubi_msg(ubi, "\"preserve\" compatible internal volume %d:%d found",
1157 vol_id, lnum);
1158 err = add_to_list(ai, pnum, vol_id, lnum,
1159 ec, 0, &ai->alien);
1160 if (err)
1161 return err;
1162 return 0;
1163
1164 case UBI_COMPAT_REJECT:
1165 ubi_err(ubi, "incompatible internal volume %d:%d found",
1166 vol_id, lnum);
1167 return -EINVAL;
1168 }
1169 }
1170
1171 if (ec_err)
1172 ubi_warn(ubi, "valid VID header but corrupted EC header at PEB %d",
1173 pnum);
1174
1175 if (ubi_is_fm_vol(vol_id))
1176 err = add_fastmap(ai, pnum, vidh, ec);
1177 else
1178 err = ubi_add_to_av(ubi, ai, pnum, ec, vidh, bitflips);
1179
1180 if (err)
1181 return err;
1182
1183 adjust_mean_ec:
1184 if (!ec_err) {
1185 ai->ec_sum += ec;
1186 ai->ec_count += 1;
1187 if (ec > ai->max_ec)
1188 ai->max_ec = ec;
1189 if (ec < ai->min_ec)
1190 ai->min_ec = ec;
1191 }
1192
1193 return 0;
1194 }
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207 static int late_analysis(struct ubi_device *ubi, struct ubi_attach_info *ai)
1208 {
1209 struct ubi_ainf_peb *aeb;
1210 int max_corr, peb_count;
1211
1212 peb_count = ubi->peb_count - ai->bad_peb_count - ai->alien_peb_count;
1213 max_corr = peb_count / 20 ?: 8;
1214
1215
1216
1217
1218
1219
1220 if (ai->corr_peb_count) {
1221 ubi_err(ubi, "%d PEBs are corrupted and preserved",
1222 ai->corr_peb_count);
1223 pr_err("Corrupted PEBs are:");
1224 list_for_each_entry(aeb, &ai->corr, u.list)
1225 pr_cont(" %d", aeb->pnum);
1226 pr_cont("\n");
1227
1228
1229
1230
1231
1232 if (ai->corr_peb_count >= max_corr) {
1233 ubi_err(ubi, "too many corrupted PEBs, refusing");
1234 return -EINVAL;
1235 }
1236 }
1237
1238 if (ai->empty_peb_count + ai->maybe_bad_peb_count == peb_count) {
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254 if (ai->maybe_bad_peb_count <= 2) {
1255 ai->is_empty = 1;
1256 ubi_msg(ubi, "empty MTD device detected");
1257 get_random_bytes(&ubi->image_seq,
1258 sizeof(ubi->image_seq));
1259 } else {
1260 ubi_err(ubi, "MTD device is not UBI-formatted and possibly contains non-UBI data - refusing it");
1261 return -EINVAL;
1262 }
1263
1264 }
1265
1266 return 0;
1267 }
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277 static void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av,
1278 struct list_head *list)
1279 {
1280 struct ubi_ainf_peb *aeb;
1281 struct rb_node *this = av->root.rb_node;
1282
1283 while (this) {
1284 if (this->rb_left)
1285 this = this->rb_left;
1286 else if (this->rb_right)
1287 this = this->rb_right;
1288 else {
1289 aeb = rb_entry(this, struct ubi_ainf_peb, u.rb);
1290 this = rb_parent(this);
1291 if (this) {
1292 if (this->rb_left == &aeb->u.rb)
1293 this->rb_left = NULL;
1294 else
1295 this->rb_right = NULL;
1296 }
1297
1298 if (list)
1299 list_add_tail(&aeb->u.list, list);
1300 else
1301 ubi_free_aeb(ai, aeb);
1302 }
1303 }
1304 kfree(av);
1305 }
1306
1307
1308
1309
1310
1311 static void destroy_ai(struct ubi_attach_info *ai)
1312 {
1313 struct ubi_ainf_peb *aeb, *aeb_tmp;
1314 struct ubi_ainf_volume *av;
1315 struct rb_node *rb;
1316
1317 list_for_each_entry_safe(aeb, aeb_tmp, &ai->alien, u.list) {
1318 list_del(&aeb->u.list);
1319 ubi_free_aeb(ai, aeb);
1320 }
1321 list_for_each_entry_safe(aeb, aeb_tmp, &ai->erase, u.list) {
1322 list_del(&aeb->u.list);
1323 ubi_free_aeb(ai, aeb);
1324 }
1325 list_for_each_entry_safe(aeb, aeb_tmp, &ai->corr, u.list) {
1326 list_del(&aeb->u.list);
1327 ubi_free_aeb(ai, aeb);
1328 }
1329 list_for_each_entry_safe(aeb, aeb_tmp, &ai->free, u.list) {
1330 list_del(&aeb->u.list);
1331 ubi_free_aeb(ai, aeb);
1332 }
1333 list_for_each_entry_safe(aeb, aeb_tmp, &ai->fastmap, u.list) {
1334 list_del(&aeb->u.list);
1335 ubi_free_aeb(ai, aeb);
1336 }
1337
1338
1339 rb = ai->volumes.rb_node;
1340 while (rb) {
1341 if (rb->rb_left)
1342 rb = rb->rb_left;
1343 else if (rb->rb_right)
1344 rb = rb->rb_right;
1345 else {
1346 av = rb_entry(rb, struct ubi_ainf_volume, rb);
1347
1348 rb = rb_parent(rb);
1349 if (rb) {
1350 if (rb->rb_left == &av->rb)
1351 rb->rb_left = NULL;
1352 else
1353 rb->rb_right = NULL;
1354 }
1355
1356 destroy_av(ai, av, NULL);
1357 }
1358 }
1359
1360 kmem_cache_destroy(ai->aeb_slab_cache);
1361 kfree(ai);
1362 }
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374 static int scan_all(struct ubi_device *ubi, struct ubi_attach_info *ai,
1375 int start)
1376 {
1377 int err, pnum;
1378 struct rb_node *rb1, *rb2;
1379 struct ubi_ainf_volume *av;
1380 struct ubi_ainf_peb *aeb;
1381
1382 err = -ENOMEM;
1383
1384 ai->ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
1385 if (!ai->ech)
1386 return err;
1387
1388 ai->vidb = ubi_alloc_vid_buf(ubi, GFP_KERNEL);
1389 if (!ai->vidb)
1390 goto out_ech;
1391
1392 for (pnum = start; pnum < ubi->peb_count; pnum++) {
1393 cond_resched();
1394
1395 dbg_gen("process PEB %d", pnum);
1396 err = scan_peb(ubi, ai, pnum, false);
1397 if (err < 0)
1398 goto out_vidh;
1399 }
1400
1401 ubi_msg(ubi, "scanning is finished");
1402
1403
1404 if (ai->ec_count)
1405 ai->mean_ec = div_u64(ai->ec_sum, ai->ec_count);
1406
1407 err = late_analysis(ubi, ai);
1408 if (err)
1409 goto out_vidh;
1410
1411
1412
1413
1414
1415 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
1416 ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb)
1417 if (aeb->ec == UBI_UNKNOWN)
1418 aeb->ec = ai->mean_ec;
1419 }
1420
1421 list_for_each_entry(aeb, &ai->free, u.list) {
1422 if (aeb->ec == UBI_UNKNOWN)
1423 aeb->ec = ai->mean_ec;
1424 }
1425
1426 list_for_each_entry(aeb, &ai->corr, u.list)
1427 if (aeb->ec == UBI_UNKNOWN)
1428 aeb->ec = ai->mean_ec;
1429
1430 list_for_each_entry(aeb, &ai->erase, u.list)
1431 if (aeb->ec == UBI_UNKNOWN)
1432 aeb->ec = ai->mean_ec;
1433
1434 err = self_check_ai(ubi, ai);
1435 if (err)
1436 goto out_vidh;
1437
1438 ubi_free_vid_buf(ai->vidb);
1439 kfree(ai->ech);
1440
1441 return 0;
1442
1443 out_vidh:
1444 ubi_free_vid_buf(ai->vidb);
1445 out_ech:
1446 kfree(ai->ech);
1447 return err;
1448 }
1449
1450 static struct ubi_attach_info *alloc_ai(void)
1451 {
1452 struct ubi_attach_info *ai;
1453
1454 ai = kzalloc(sizeof(struct ubi_attach_info), GFP_KERNEL);
1455 if (!ai)
1456 return ai;
1457
1458 INIT_LIST_HEAD(&ai->corr);
1459 INIT_LIST_HEAD(&ai->free);
1460 INIT_LIST_HEAD(&ai->erase);
1461 INIT_LIST_HEAD(&ai->alien);
1462 INIT_LIST_HEAD(&ai->fastmap);
1463 ai->volumes = RB_ROOT;
1464 ai->aeb_slab_cache = kmem_cache_create("ubi_aeb_slab_cache",
1465 sizeof(struct ubi_ainf_peb),
1466 0, 0, NULL);
1467 if (!ai->aeb_slab_cache) {
1468 kfree(ai);
1469 ai = NULL;
1470 }
1471
1472 return ai;
1473 }
1474
1475 #ifdef CONFIG_MTD_UBI_FASTMAP
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487 static int scan_fast(struct ubi_device *ubi, struct ubi_attach_info **ai)
1488 {
1489 int err, pnum;
1490 struct ubi_attach_info *scan_ai;
1491
1492 err = -ENOMEM;
1493
1494 scan_ai = alloc_ai();
1495 if (!scan_ai)
1496 goto out;
1497
1498 scan_ai->ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
1499 if (!scan_ai->ech)
1500 goto out_ai;
1501
1502 scan_ai->vidb = ubi_alloc_vid_buf(ubi, GFP_KERNEL);
1503 if (!scan_ai->vidb)
1504 goto out_ech;
1505
1506 for (pnum = 0; pnum < UBI_FM_MAX_START; pnum++) {
1507 cond_resched();
1508
1509 dbg_gen("process PEB %d", pnum);
1510 err = scan_peb(ubi, scan_ai, pnum, true);
1511 if (err < 0)
1512 goto out_vidh;
1513 }
1514
1515 ubi_free_vid_buf(scan_ai->vidb);
1516 kfree(scan_ai->ech);
1517
1518 if (scan_ai->force_full_scan)
1519 err = UBI_NO_FASTMAP;
1520 else
1521 err = ubi_scan_fastmap(ubi, *ai, scan_ai);
1522
1523 if (err) {
1524
1525
1526
1527
1528 destroy_ai(*ai);
1529 *ai = scan_ai;
1530 } else
1531 destroy_ai(scan_ai);
1532
1533 return err;
1534
1535 out_vidh:
1536 ubi_free_vid_buf(scan_ai->vidb);
1537 out_ech:
1538 kfree(scan_ai->ech);
1539 out_ai:
1540 destroy_ai(scan_ai);
1541 out:
1542 return err;
1543 }
1544
1545 #endif
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555 int ubi_attach(struct ubi_device *ubi, int force_scan)
1556 {
1557 int err;
1558 struct ubi_attach_info *ai;
1559
1560 ai = alloc_ai();
1561 if (!ai)
1562 return -ENOMEM;
1563
1564 #ifdef CONFIG_MTD_UBI_FASTMAP
1565
1566 if ((int)mtd_div_by_eb(ubi->mtd->size, ubi->mtd) <= UBI_FM_MAX_START) {
1567 ubi->fm_disabled = 1;
1568 force_scan = 1;
1569 }
1570
1571 if (force_scan)
1572 err = scan_all(ubi, ai, 0);
1573 else {
1574 err = scan_fast(ubi, &ai);
1575 if (err > 0 || mtd_is_eccerr(err)) {
1576 if (err != UBI_NO_FASTMAP) {
1577 destroy_ai(ai);
1578 ai = alloc_ai();
1579 if (!ai)
1580 return -ENOMEM;
1581
1582 err = scan_all(ubi, ai, 0);
1583 } else {
1584 err = scan_all(ubi, ai, UBI_FM_MAX_START);
1585 }
1586 }
1587 }
1588 #else
1589 err = scan_all(ubi, ai, 0);
1590 #endif
1591 if (err)
1592 goto out_ai;
1593
1594 ubi->bad_peb_count = ai->bad_peb_count;
1595 ubi->good_peb_count = ubi->peb_count - ubi->bad_peb_count;
1596 ubi->corr_peb_count = ai->corr_peb_count;
1597 ubi->max_ec = ai->max_ec;
1598 ubi->mean_ec = ai->mean_ec;
1599 dbg_gen("max. sequence number: %llu", ai->max_sqnum);
1600
1601 err = ubi_read_volume_table(ubi, ai);
1602 if (err)
1603 goto out_ai;
1604
1605 err = ubi_wl_init(ubi, ai);
1606 if (err)
1607 goto out_vtbl;
1608
1609 err = ubi_eba_init(ubi, ai);
1610 if (err)
1611 goto out_wl;
1612
1613 #ifdef CONFIG_MTD_UBI_FASTMAP
1614 if (ubi->fm && ubi_dbg_chk_fastmap(ubi)) {
1615 struct ubi_attach_info *scan_ai;
1616
1617 scan_ai = alloc_ai();
1618 if (!scan_ai) {
1619 err = -ENOMEM;
1620 goto out_wl;
1621 }
1622
1623 err = scan_all(ubi, scan_ai, 0);
1624 if (err) {
1625 destroy_ai(scan_ai);
1626 goto out_wl;
1627 }
1628
1629 err = self_check_eba(ubi, ai, scan_ai);
1630 destroy_ai(scan_ai);
1631
1632 if (err)
1633 goto out_wl;
1634 }
1635 #endif
1636
1637 destroy_ai(ai);
1638 return 0;
1639
1640 out_wl:
1641 ubi_wl_close(ubi);
1642 out_vtbl:
1643 ubi_free_all_volumes(ubi);
1644 vfree(ubi->vtbl);
1645 out_ai:
1646 destroy_ai(ai);
1647 return err;
1648 }
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658 static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai)
1659 {
1660 struct ubi_vid_io_buf *vidb = ai->vidb;
1661 struct ubi_vid_hdr *vidh = ubi_get_vid_hdr(vidb);
1662 int pnum, err, vols_found = 0;
1663 struct rb_node *rb1, *rb2;
1664 struct ubi_ainf_volume *av;
1665 struct ubi_ainf_peb *aeb, *last_aeb;
1666 uint8_t *buf;
1667
1668 if (!ubi_dbg_chk_gen(ubi))
1669 return 0;
1670
1671
1672
1673
1674 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
1675 int leb_count = 0;
1676
1677 cond_resched();
1678
1679 vols_found += 1;
1680
1681 if (ai->is_empty) {
1682 ubi_err(ubi, "bad is_empty flag");
1683 goto bad_av;
1684 }
1685
1686 if (av->vol_id < 0 || av->highest_lnum < 0 ||
1687 av->leb_count < 0 || av->vol_type < 0 || av->used_ebs < 0 ||
1688 av->data_pad < 0 || av->last_data_size < 0) {
1689 ubi_err(ubi, "negative values");
1690 goto bad_av;
1691 }
1692
1693 if (av->vol_id >= UBI_MAX_VOLUMES &&
1694 av->vol_id < UBI_INTERNAL_VOL_START) {
1695 ubi_err(ubi, "bad vol_id");
1696 goto bad_av;
1697 }
1698
1699 if (av->vol_id > ai->highest_vol_id) {
1700 ubi_err(ubi, "highest_vol_id is %d, but vol_id %d is there",
1701 ai->highest_vol_id, av->vol_id);
1702 goto out;
1703 }
1704
1705 if (av->vol_type != UBI_DYNAMIC_VOLUME &&
1706 av->vol_type != UBI_STATIC_VOLUME) {
1707 ubi_err(ubi, "bad vol_type");
1708 goto bad_av;
1709 }
1710
1711 if (av->data_pad > ubi->leb_size / 2) {
1712 ubi_err(ubi, "bad data_pad");
1713 goto bad_av;
1714 }
1715
1716 last_aeb = NULL;
1717 ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb) {
1718 cond_resched();
1719
1720 last_aeb = aeb;
1721 leb_count += 1;
1722
1723 if (aeb->pnum < 0 || aeb->ec < 0) {
1724 ubi_err(ubi, "negative values");
1725 goto bad_aeb;
1726 }
1727
1728 if (aeb->ec < ai->min_ec) {
1729 ubi_err(ubi, "bad ai->min_ec (%d), %d found",
1730 ai->min_ec, aeb->ec);
1731 goto bad_aeb;
1732 }
1733
1734 if (aeb->ec > ai->max_ec) {
1735 ubi_err(ubi, "bad ai->max_ec (%d), %d found",
1736 ai->max_ec, aeb->ec);
1737 goto bad_aeb;
1738 }
1739
1740 if (aeb->pnum >= ubi->peb_count) {
1741 ubi_err(ubi, "too high PEB number %d, total PEBs %d",
1742 aeb->pnum, ubi->peb_count);
1743 goto bad_aeb;
1744 }
1745
1746 if (av->vol_type == UBI_STATIC_VOLUME) {
1747 if (aeb->lnum >= av->used_ebs) {
1748 ubi_err(ubi, "bad lnum or used_ebs");
1749 goto bad_aeb;
1750 }
1751 } else {
1752 if (av->used_ebs != 0) {
1753 ubi_err(ubi, "non-zero used_ebs");
1754 goto bad_aeb;
1755 }
1756 }
1757
1758 if (aeb->lnum > av->highest_lnum) {
1759 ubi_err(ubi, "incorrect highest_lnum or lnum");
1760 goto bad_aeb;
1761 }
1762 }
1763
1764 if (av->leb_count != leb_count) {
1765 ubi_err(ubi, "bad leb_count, %d objects in the tree",
1766 leb_count);
1767 goto bad_av;
1768 }
1769
1770 if (!last_aeb)
1771 continue;
1772
1773 aeb = last_aeb;
1774
1775 if (aeb->lnum != av->highest_lnum) {
1776 ubi_err(ubi, "bad highest_lnum");
1777 goto bad_aeb;
1778 }
1779 }
1780
1781 if (vols_found != ai->vols_found) {
1782 ubi_err(ubi, "bad ai->vols_found %d, should be %d",
1783 ai->vols_found, vols_found);
1784 goto out;
1785 }
1786
1787
1788 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
1789 last_aeb = NULL;
1790 ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb) {
1791 int vol_type;
1792
1793 cond_resched();
1794
1795 last_aeb = aeb;
1796
1797 err = ubi_io_read_vid_hdr(ubi, aeb->pnum, vidb, 1);
1798 if (err && err != UBI_IO_BITFLIPS) {
1799 ubi_err(ubi, "VID header is not OK (%d)",
1800 err);
1801 if (err > 0)
1802 err = -EIO;
1803 return err;
1804 }
1805
1806 vol_type = vidh->vol_type == UBI_VID_DYNAMIC ?
1807 UBI_DYNAMIC_VOLUME : UBI_STATIC_VOLUME;
1808 if (av->vol_type != vol_type) {
1809 ubi_err(ubi, "bad vol_type");
1810 goto bad_vid_hdr;
1811 }
1812
1813 if (aeb->sqnum != be64_to_cpu(vidh->sqnum)) {
1814 ubi_err(ubi, "bad sqnum %llu", aeb->sqnum);
1815 goto bad_vid_hdr;
1816 }
1817
1818 if (av->vol_id != be32_to_cpu(vidh->vol_id)) {
1819 ubi_err(ubi, "bad vol_id %d", av->vol_id);
1820 goto bad_vid_hdr;
1821 }
1822
1823 if (av->compat != vidh->compat) {
1824 ubi_err(ubi, "bad compat %d", vidh->compat);
1825 goto bad_vid_hdr;
1826 }
1827
1828 if (aeb->lnum != be32_to_cpu(vidh->lnum)) {
1829 ubi_err(ubi, "bad lnum %d", aeb->lnum);
1830 goto bad_vid_hdr;
1831 }
1832
1833 if (av->used_ebs != be32_to_cpu(vidh->used_ebs)) {
1834 ubi_err(ubi, "bad used_ebs %d", av->used_ebs);
1835 goto bad_vid_hdr;
1836 }
1837
1838 if (av->data_pad != be32_to_cpu(vidh->data_pad)) {
1839 ubi_err(ubi, "bad data_pad %d", av->data_pad);
1840 goto bad_vid_hdr;
1841 }
1842 }
1843
1844 if (!last_aeb)
1845 continue;
1846
1847 if (av->highest_lnum != be32_to_cpu(vidh->lnum)) {
1848 ubi_err(ubi, "bad highest_lnum %d", av->highest_lnum);
1849 goto bad_vid_hdr;
1850 }
1851
1852 if (av->last_data_size != be32_to_cpu(vidh->data_size)) {
1853 ubi_err(ubi, "bad last_data_size %d",
1854 av->last_data_size);
1855 goto bad_vid_hdr;
1856 }
1857 }
1858
1859
1860
1861
1862
1863 buf = kzalloc(ubi->peb_count, GFP_KERNEL);
1864 if (!buf)
1865 return -ENOMEM;
1866
1867 for (pnum = 0; pnum < ubi->peb_count; pnum++) {
1868 err = ubi_io_is_bad(ubi, pnum);
1869 if (err < 0) {
1870 kfree(buf);
1871 return err;
1872 } else if (err)
1873 buf[pnum] = 1;
1874 }
1875
1876 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb)
1877 ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb)
1878 buf[aeb->pnum] = 1;
1879
1880 list_for_each_entry(aeb, &ai->free, u.list)
1881 buf[aeb->pnum] = 1;
1882
1883 list_for_each_entry(aeb, &ai->corr, u.list)
1884 buf[aeb->pnum] = 1;
1885
1886 list_for_each_entry(aeb, &ai->erase, u.list)
1887 buf[aeb->pnum] = 1;
1888
1889 list_for_each_entry(aeb, &ai->alien, u.list)
1890 buf[aeb->pnum] = 1;
1891
1892 err = 0;
1893 for (pnum = 0; pnum < ubi->peb_count; pnum++)
1894 if (!buf[pnum]) {
1895 ubi_err(ubi, "PEB %d is not referred", pnum);
1896 err = 1;
1897 }
1898
1899 kfree(buf);
1900 if (err)
1901 goto out;
1902 return 0;
1903
1904 bad_aeb:
1905 ubi_err(ubi, "bad attaching information about LEB %d", aeb->lnum);
1906 ubi_dump_aeb(aeb, 0);
1907 ubi_dump_av(av);
1908 goto out;
1909
1910 bad_av:
1911 ubi_err(ubi, "bad attaching information about volume %d", av->vol_id);
1912 ubi_dump_av(av);
1913 goto out;
1914
1915 bad_vid_hdr:
1916 ubi_err(ubi, "bad attaching information about volume %d", av->vol_id);
1917 ubi_dump_av(av);
1918 ubi_dump_vid_hdr(vidh);
1919
1920 out:
1921 dump_stack();
1922 return -EINVAL;
1923 }