Lines Matching refs:ai

92 static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai);
116 static struct ubi_ainf_volume *find_or_add_av(struct ubi_attach_info *ai, in find_or_add_av() argument
121 struct rb_node **p = &ai->volumes.rb_node, *parent = NULL; in find_or_add_av()
153 if (vol_id > ai->highest_vol_id) in find_or_add_av()
154 ai->highest_vol_id = vol_id; in find_or_add_av()
157 rb_insert_color(&av->rb, &ai->volumes); in find_or_add_av()
158 ai->vols_found += 1; in find_or_add_av()
174 static struct ubi_ainf_volume *ubi_find_or_add_av(struct ubi_attach_info *ai, in ubi_find_or_add_av() argument
177 return find_or_add_av(ai, vol_id, AV_FIND_OR_ADD, created); in ubi_find_or_add_av()
191 struct ubi_ainf_peb *ubi_alloc_aeb(struct ubi_attach_info *ai, int pnum, in ubi_alloc_aeb() argument
196 aeb = kmem_cache_zalloc(ai->aeb_slab_cache, GFP_KERNEL); in ubi_alloc_aeb()
216 void ubi_free_aeb(struct ubi_attach_info *ai, struct ubi_ainf_peb *aeb) in ubi_free_aeb() argument
218 kmem_cache_free(ai->aeb_slab_cache, aeb); in ubi_free_aeb()
242 static int add_to_list(struct ubi_attach_info *ai, int pnum, int vol_id, in add_to_list() argument
247 if (list == &ai->free) { in add_to_list()
249 } else if (list == &ai->erase) { in add_to_list()
251 } else if (list == &ai->alien) { in add_to_list()
253 ai->alien_peb_count += 1; in add_to_list()
257 aeb = ubi_alloc_aeb(ai, pnum, ec); in add_to_list()
281 static int add_corrupted(struct ubi_attach_info *ai, int pnum, int ec) in add_corrupted() argument
287 aeb = ubi_alloc_aeb(ai, pnum, ec); in add_corrupted()
291 ai->corr_peb_count += 1; in add_corrupted()
292 list_add(&aeb->u.list, &ai->corr); in add_corrupted()
309 static int add_fastmap(struct ubi_attach_info *ai, int pnum, in add_fastmap() argument
314 aeb = ubi_alloc_aeb(ai, pnum, ec); in add_fastmap()
320 list_add(&aeb->u.list, &ai->fastmap); in add_fastmap()
409 static struct ubi_ainf_volume *add_volume(struct ubi_attach_info *ai, in add_volume() argument
418 av = ubi_find_or_add_av(ai, vol_id, &created); in add_volume()
576 int ubi_add_to_av(struct ubi_device *ubi, struct ubi_attach_info *ai, int pnum, in ubi_add_to_av() argument
592 av = add_volume(ai, vol_id, pnum, vid_hdr); in ubi_add_to_av()
596 if (ai->max_sqnum < sqnum) in ubi_add_to_av()
597 ai->max_sqnum = sqnum; in ubi_add_to_av()
663 err = add_to_list(ai, aeb->pnum, aeb->vol_id, in ubi_add_to_av()
665 &ai->erase); in ubi_add_to_av()
687 return add_to_list(ai, pnum, vol_id, lnum, ec, in ubi_add_to_av()
688 cmp_res & 4, &ai->erase); in ubi_add_to_av()
701 aeb = ubi_alloc_aeb(ai, pnum, ec); in ubi_add_to_av()
730 struct ubi_ainf_volume *ubi_add_av(struct ubi_attach_info *ai, int vol_id) in ubi_add_av() argument
734 return find_or_add_av(ai, vol_id, AV_ADD, &created); in ubi_add_av()
745 struct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai, in ubi_find_av() argument
750 return find_or_add_av((struct ubi_attach_info *)ai, vol_id, AV_FIND, in ubi_find_av()
754 static void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av,
762 void ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av) in ubi_remove_av() argument
766 rb_erase(&av->rb, &ai->volumes); in ubi_remove_av()
767 destroy_av(ai, av, &ai->erase); in ubi_remove_av()
768 ai->vols_found -= 1; in ubi_remove_av()
785 const struct ubi_attach_info *ai, int pnum, int ec) in early_erase_peb() argument
832 struct ubi_attach_info *ai) in ubi_early_get_peb() argument
837 if (!list_empty(&ai->free)) { in ubi_early_get_peb()
838 aeb = list_entry(ai->free.next, struct ubi_ainf_peb, u.list); in ubi_early_get_peb()
850 list_for_each_entry_safe(aeb, tmp_aeb, &ai->erase, u.list) { in ubi_early_get_peb()
852 aeb->ec = ai->mean_ec; in ubi_early_get_peb()
854 err = early_erase_peb(ubi, ai, aeb->pnum, aeb->ec+1); in ubi_early_get_peb()
954 static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai, in scan_peb() argument
957 struct ubi_ec_hdr *ech = ai->ech; in scan_peb()
958 struct ubi_vid_io_buf *vidb = ai->vidb; in scan_peb()
970 ai->bad_peb_count += 1; in scan_peb()
984 ai->empty_peb_count += 1; in scan_peb()
985 return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, in scan_peb()
986 UBI_UNKNOWN, 0, &ai->erase); in scan_peb()
988 ai->empty_peb_count += 1; in scan_peb()
989 return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, in scan_peb()
990 UBI_UNKNOWN, 1, &ai->erase); in scan_peb()
1074 ai->maybe_bad_peb_count += 1; in scan_peb()
1088 ai->force_full_scan = 1; in scan_peb()
1115 err = add_to_list(ai, pnum, UBI_UNKNOWN, in scan_peb()
1116 UBI_UNKNOWN, ec, 1, &ai->erase); in scan_peb()
1119 err = add_corrupted(ai, pnum, ec); in scan_peb()
1124 err = add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, in scan_peb()
1125 ec, 1, &ai->erase); in scan_peb()
1131 err = add_to_list(ai, pnum, UBI_UNKNOWN, in scan_peb()
1132 UBI_UNKNOWN, ec, 1, &ai->erase); in scan_peb()
1134 err = add_to_list(ai, pnum, UBI_UNKNOWN, in scan_peb()
1135 UBI_UNKNOWN, ec, 0, &ai->free); in scan_peb()
1155 err = add_to_list(ai, pnum, vol_id, lnum, in scan_peb()
1156 ec, 1, &ai->erase); in scan_peb()
1170 err = add_to_list(ai, pnum, vol_id, lnum, in scan_peb()
1171 ec, 0, &ai->alien); in scan_peb()
1188 err = add_fastmap(ai, pnum, vidh, ec); in scan_peb()
1190 err = ubi_add_to_av(ubi, ai, pnum, ec, vidh, bitflips); in scan_peb()
1197 ai->ec_sum += ec; in scan_peb()
1198 ai->ec_count += 1; in scan_peb()
1199 if (ec > ai->max_ec) in scan_peb()
1200 ai->max_ec = ec; in scan_peb()
1201 if (ec < ai->min_ec) in scan_peb()
1202 ai->min_ec = ec; in scan_peb()
1219 static int late_analysis(struct ubi_device *ubi, struct ubi_attach_info *ai) in late_analysis() argument
1224 peb_count = ubi->peb_count - ai->bad_peb_count - ai->alien_peb_count; in late_analysis()
1232 if (ai->corr_peb_count) { in late_analysis()
1234 ai->corr_peb_count); in late_analysis()
1236 list_for_each_entry(aeb, &ai->corr, u.list) in late_analysis()
1244 if (ai->corr_peb_count >= max_corr) { in late_analysis()
1250 if (ai->empty_peb_count + ai->maybe_bad_peb_count == peb_count) { in late_analysis()
1266 if (ai->maybe_bad_peb_count <= 2) { in late_analysis()
1267 ai->is_empty = 1; in late_analysis()
1289 static void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av, in destroy_av() argument
1313 ubi_free_aeb(ai, aeb); in destroy_av()
1323 static void destroy_ai(struct ubi_attach_info *ai) in destroy_ai() argument
1329 list_for_each_entry_safe(aeb, aeb_tmp, &ai->alien, u.list) { in destroy_ai()
1331 ubi_free_aeb(ai, aeb); in destroy_ai()
1333 list_for_each_entry_safe(aeb, aeb_tmp, &ai->erase, u.list) { in destroy_ai()
1335 ubi_free_aeb(ai, aeb); in destroy_ai()
1337 list_for_each_entry_safe(aeb, aeb_tmp, &ai->corr, u.list) { in destroy_ai()
1339 ubi_free_aeb(ai, aeb); in destroy_ai()
1341 list_for_each_entry_safe(aeb, aeb_tmp, &ai->free, u.list) { in destroy_ai()
1343 ubi_free_aeb(ai, aeb); in destroy_ai()
1345 list_for_each_entry_safe(aeb, aeb_tmp, &ai->fastmap, u.list) { in destroy_ai()
1347 ubi_free_aeb(ai, aeb); in destroy_ai()
1351 rb = ai->volumes.rb_node; in destroy_ai()
1368 destroy_av(ai, av, NULL); in destroy_ai()
1372 kmem_cache_destroy(ai->aeb_slab_cache); in destroy_ai()
1373 kfree(ai); in destroy_ai()
1386 static int scan_all(struct ubi_device *ubi, struct ubi_attach_info *ai, in scan_all() argument
1396 ai->ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL); in scan_all()
1397 if (!ai->ech) in scan_all()
1400 ai->vidb = ubi_alloc_vid_buf(ubi, GFP_KERNEL); in scan_all()
1401 if (!ai->vidb) in scan_all()
1408 err = scan_peb(ubi, ai, pnum, false); in scan_all()
1416 if (ai->ec_count) in scan_all()
1417 ai->mean_ec = div_u64(ai->ec_sum, ai->ec_count); in scan_all()
1419 err = late_analysis(ubi, ai); in scan_all()
1427 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { in scan_all()
1430 aeb->ec = ai->mean_ec; in scan_all()
1433 list_for_each_entry(aeb, &ai->free, u.list) { in scan_all()
1435 aeb->ec = ai->mean_ec; in scan_all()
1438 list_for_each_entry(aeb, &ai->corr, u.list) in scan_all()
1440 aeb->ec = ai->mean_ec; in scan_all()
1442 list_for_each_entry(aeb, &ai->erase, u.list) in scan_all()
1444 aeb->ec = ai->mean_ec; in scan_all()
1446 err = self_check_ai(ubi, ai); in scan_all()
1450 ubi_free_vid_buf(ai->vidb); in scan_all()
1451 kfree(ai->ech); in scan_all()
1456 ubi_free_vid_buf(ai->vidb); in scan_all()
1458 kfree(ai->ech); in scan_all()
1464 struct ubi_attach_info *ai; in alloc_ai() local
1466 ai = kzalloc(sizeof(struct ubi_attach_info), GFP_KERNEL); in alloc_ai()
1467 if (!ai) in alloc_ai()
1468 return ai; in alloc_ai()
1470 INIT_LIST_HEAD(&ai->corr); in alloc_ai()
1471 INIT_LIST_HEAD(&ai->free); in alloc_ai()
1472 INIT_LIST_HEAD(&ai->erase); in alloc_ai()
1473 INIT_LIST_HEAD(&ai->alien); in alloc_ai()
1474 INIT_LIST_HEAD(&ai->fastmap); in alloc_ai()
1475 ai->volumes = RB_ROOT; in alloc_ai()
1476 ai->aeb_slab_cache = kmem_cache_create("ubi_aeb_slab_cache", in alloc_ai()
1479 if (!ai->aeb_slab_cache) { in alloc_ai()
1480 kfree(ai); in alloc_ai()
1481 ai = NULL; in alloc_ai()
1484 return ai; in alloc_ai()
1499 static int scan_fast(struct ubi_device *ubi, struct ubi_attach_info **ai) in scan_fast() argument
1533 err = ubi_scan_fastmap(ubi, *ai, scan_ai); in scan_fast()
1540 destroy_ai(*ai); in scan_fast()
1541 *ai = scan_ai; in scan_fast()
1570 struct ubi_attach_info *ai; in ubi_attach() local
1572 ai = alloc_ai(); in ubi_attach()
1573 if (!ai) in ubi_attach()
1584 err = scan_all(ubi, ai, 0); in ubi_attach()
1586 err = scan_fast(ubi, &ai); in ubi_attach()
1589 destroy_ai(ai); in ubi_attach()
1590 ai = alloc_ai(); in ubi_attach()
1591 if (!ai) in ubi_attach()
1594 err = scan_all(ubi, ai, 0); in ubi_attach()
1596 err = scan_all(ubi, ai, UBI_FM_MAX_START); in ubi_attach()
1601 err = scan_all(ubi, ai, 0); in ubi_attach()
1606 ubi->bad_peb_count = ai->bad_peb_count; in ubi_attach()
1608 ubi->corr_peb_count = ai->corr_peb_count; in ubi_attach()
1609 ubi->max_ec = ai->max_ec; in ubi_attach()
1610 ubi->mean_ec = ai->mean_ec; in ubi_attach()
1611 dbg_gen("max. sequence number: %llu", ai->max_sqnum); in ubi_attach()
1613 err = ubi_read_volume_table(ubi, ai); in ubi_attach()
1617 err = ubi_wl_init(ubi, ai); in ubi_attach()
1621 err = ubi_eba_init(ubi, ai); in ubi_attach()
1641 err = self_check_eba(ubi, ai, scan_ai); in ubi_attach()
1649 destroy_ai(ai); in ubi_attach()
1658 destroy_ai(ai); in ubi_attach()
1670 static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai) in self_check_ai() argument
1672 struct ubi_vid_io_buf *vidb = ai->vidb; in self_check_ai()
1686 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { in self_check_ai()
1693 if (ai->is_empty) { in self_check_ai()
1711 if (av->vol_id > ai->highest_vol_id) { in self_check_ai()
1713 ai->highest_vol_id, av->vol_id); in self_check_ai()
1740 if (aeb->ec < ai->min_ec) { in self_check_ai()
1742 ai->min_ec, aeb->ec); in self_check_ai()
1746 if (aeb->ec > ai->max_ec) { in self_check_ai()
1748 ai->max_ec, aeb->ec); in self_check_ai()
1793 if (vols_found != ai->vols_found) { in self_check_ai()
1795 ai->vols_found, vols_found); in self_check_ai()
1800 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { in self_check_ai()
1888 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) in self_check_ai()
1892 list_for_each_entry(aeb, &ai->free, u.list) in self_check_ai()
1895 list_for_each_entry(aeb, &ai->corr, u.list) in self_check_ai()
1898 list_for_each_entry(aeb, &ai->erase, u.list) in self_check_ai()
1901 list_for_each_entry(aeb, &ai->alien, u.list) in self_check_ai()