Lines Matching refs:ai

92 static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai);
119 static int add_to_list(struct ubi_attach_info *ai, int pnum, int vol_id, in add_to_list() argument
124 if (list == &ai->free) { in add_to_list()
126 } else if (list == &ai->erase) { in add_to_list()
128 } else if (list == &ai->alien) { in add_to_list()
130 ai->alien_peb_count += 1; in add_to_list()
134 aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL); in add_to_list()
160 static int add_corrupted(struct ubi_attach_info *ai, int pnum, int ec) in add_corrupted() argument
166 aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL); in add_corrupted()
170 ai->corr_peb_count += 1; in add_corrupted()
173 list_add(&aeb->u.list, &ai->corr); in add_corrupted()
258 static struct ubi_ainf_volume *add_volume(struct ubi_attach_info *ai, in add_volume() argument
263 struct rb_node **p = &ai->volumes.rb_node, *parent = NULL; in add_volume()
294 if (vol_id > ai->highest_vol_id) in add_volume()
295 ai->highest_vol_id = vol_id; in add_volume()
298 rb_insert_color(&av->rb, &ai->volumes); in add_volume()
299 ai->vols_found += 1; in add_volume()
449 int ubi_add_to_av(struct ubi_device *ubi, struct ubi_attach_info *ai, int pnum, in ubi_add_to_av() argument
465 av = add_volume(ai, vol_id, pnum, vid_hdr); in ubi_add_to_av()
469 if (ai->max_sqnum < sqnum) in ubi_add_to_av()
470 ai->max_sqnum = sqnum; in ubi_add_to_av()
536 err = add_to_list(ai, aeb->pnum, aeb->vol_id, in ubi_add_to_av()
538 &ai->erase); in ubi_add_to_av()
560 return add_to_list(ai, pnum, vol_id, lnum, ec, in ubi_add_to_av()
561 cmp_res & 4, &ai->erase); in ubi_add_to_av()
574 aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL); in ubi_add_to_av()
605 struct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai, in ubi_find_av() argument
609 struct rb_node *p = ai->volumes.rb_node; in ubi_find_av()
631 void ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av) in ubi_remove_av() argument
641 list_add_tail(&aeb->u.list, &ai->erase); in ubi_remove_av()
644 rb_erase(&av->rb, &ai->volumes); in ubi_remove_av()
646 ai->vols_found -= 1; in ubi_remove_av()
663 const struct ubi_attach_info *ai, int pnum, int ec) in early_erase_peb() argument
710 struct ubi_attach_info *ai) in ubi_early_get_peb() argument
715 if (!list_empty(&ai->free)) { in ubi_early_get_peb()
716 aeb = list_entry(ai->free.next, struct ubi_ainf_peb, u.list); in ubi_early_get_peb()
728 list_for_each_entry_safe(aeb, tmp_aeb, &ai->erase, u.list) { in ubi_early_get_peb()
730 aeb->ec = ai->mean_ec; in ubi_early_get_peb()
732 err = early_erase_peb(ubi, ai, aeb->pnum, aeb->ec+1); in ubi_early_get_peb()
819 static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai, in scan_peb() argument
832 ai->bad_peb_count += 1; in scan_peb()
846 ai->empty_peb_count += 1; in scan_peb()
847 return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, in scan_peb()
848 UBI_UNKNOWN, 0, &ai->erase); in scan_peb()
850 ai->empty_peb_count += 1; in scan_peb()
851 return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, in scan_peb()
852 UBI_UNKNOWN, 1, &ai->erase); in scan_peb()
936 ai->maybe_bad_peb_count += 1; in scan_peb()
963 err = add_to_list(ai, pnum, UBI_UNKNOWN, in scan_peb()
964 UBI_UNKNOWN, ec, 1, &ai->erase); in scan_peb()
967 err = add_corrupted(ai, pnum, ec); in scan_peb()
972 err = add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, in scan_peb()
973 ec, 1, &ai->erase); in scan_peb()
979 err = add_to_list(ai, pnum, UBI_UNKNOWN, in scan_peb()
980 UBI_UNKNOWN, ec, 1, &ai->erase); in scan_peb()
982 err = add_to_list(ai, pnum, UBI_UNKNOWN, in scan_peb()
983 UBI_UNKNOWN, ec, 0, &ai->free); in scan_peb()
1009 err = add_to_list(ai, pnum, vol_id, lnum, in scan_peb()
1010 ec, 1, &ai->erase); in scan_peb()
1024 err = add_to_list(ai, pnum, vol_id, lnum, in scan_peb()
1025 ec, 0, &ai->alien); in scan_peb()
1040 err = ubi_add_to_av(ubi, ai, pnum, ec, vidh, bitflips); in scan_peb()
1046 ai->ec_sum += ec; in scan_peb()
1047 ai->ec_count += 1; in scan_peb()
1048 if (ec > ai->max_ec) in scan_peb()
1049 ai->max_ec = ec; in scan_peb()
1050 if (ec < ai->min_ec) in scan_peb()
1051 ai->min_ec = ec; in scan_peb()
1068 static int late_analysis(struct ubi_device *ubi, struct ubi_attach_info *ai) in late_analysis() argument
1073 peb_count = ubi->peb_count - ai->bad_peb_count - ai->alien_peb_count; in late_analysis()
1081 if (ai->corr_peb_count) { in late_analysis()
1083 ai->corr_peb_count); in late_analysis()
1085 list_for_each_entry(aeb, &ai->corr, u.list) in late_analysis()
1093 if (ai->corr_peb_count >= max_corr) { in late_analysis()
1099 if (ai->empty_peb_count + ai->maybe_bad_peb_count == peb_count) { in late_analysis()
1115 if (ai->maybe_bad_peb_count <= 2) { in late_analysis()
1116 ai->is_empty = 1; in late_analysis()
1137 static void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av) in destroy_av() argument
1157 kmem_cache_free(ai->aeb_slab_cache, aeb); in destroy_av()
1167 static void destroy_ai(struct ubi_attach_info *ai) in destroy_ai() argument
1173 list_for_each_entry_safe(aeb, aeb_tmp, &ai->alien, u.list) { in destroy_ai()
1175 kmem_cache_free(ai->aeb_slab_cache, aeb); in destroy_ai()
1177 list_for_each_entry_safe(aeb, aeb_tmp, &ai->erase, u.list) { in destroy_ai()
1179 kmem_cache_free(ai->aeb_slab_cache, aeb); in destroy_ai()
1181 list_for_each_entry_safe(aeb, aeb_tmp, &ai->corr, u.list) { in destroy_ai()
1183 kmem_cache_free(ai->aeb_slab_cache, aeb); in destroy_ai()
1185 list_for_each_entry_safe(aeb, aeb_tmp, &ai->free, u.list) { in destroy_ai()
1187 kmem_cache_free(ai->aeb_slab_cache, aeb); in destroy_ai()
1191 rb = ai->volumes.rb_node; in destroy_ai()
1208 destroy_av(ai, av); in destroy_ai()
1212 if (ai->aeb_slab_cache) in destroy_ai()
1213 kmem_cache_destroy(ai->aeb_slab_cache); in destroy_ai()
1215 kfree(ai); in destroy_ai()
1228 static int scan_all(struct ubi_device *ubi, struct ubi_attach_info *ai, in scan_all() argument
1250 err = scan_peb(ubi, ai, pnum, NULL, NULL); in scan_all()
1258 if (ai->ec_count) in scan_all()
1259 ai->mean_ec = div_u64(ai->ec_sum, ai->ec_count); in scan_all()
1261 err = late_analysis(ubi, ai); in scan_all()
1269 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { in scan_all()
1272 aeb->ec = ai->mean_ec; in scan_all()
1275 list_for_each_entry(aeb, &ai->free, u.list) { in scan_all()
1277 aeb->ec = ai->mean_ec; in scan_all()
1280 list_for_each_entry(aeb, &ai->corr, u.list) in scan_all()
1282 aeb->ec = ai->mean_ec; in scan_all()
1284 list_for_each_entry(aeb, &ai->erase, u.list) in scan_all()
1286 aeb->ec = ai->mean_ec; in scan_all()
1288 err = self_check_ai(ubi, ai); in scan_all()
1306 struct ubi_attach_info *ai; in alloc_ai() local
1308 ai = kzalloc(sizeof(struct ubi_attach_info), GFP_KERNEL); in alloc_ai()
1309 if (!ai) in alloc_ai()
1310 return ai; in alloc_ai()
1312 INIT_LIST_HEAD(&ai->corr); in alloc_ai()
1313 INIT_LIST_HEAD(&ai->free); in alloc_ai()
1314 INIT_LIST_HEAD(&ai->erase); in alloc_ai()
1315 INIT_LIST_HEAD(&ai->alien); in alloc_ai()
1316 ai->volumes = RB_ROOT; in alloc_ai()
1317 ai->aeb_slab_cache = kmem_cache_create("ubi_aeb_slab_cache", in alloc_ai()
1320 if (!ai->aeb_slab_cache) { in alloc_ai()
1321 kfree(ai); in alloc_ai()
1322 ai = NULL; in alloc_ai()
1325 return ai; in alloc_ai()
1340 static int scan_fast(struct ubi_device *ubi, struct ubi_attach_info **ai) in scan_fast() argument
1361 err = scan_peb(ubi, *ai, pnum, &vol_id, &sqnum); in scan_fast()
1377 destroy_ai(*ai); in scan_fast()
1378 *ai = alloc_ai(); in scan_fast()
1379 if (!*ai) in scan_fast()
1382 return ubi_scan_fastmap(ubi, *ai, fm_anchor); in scan_fast()
1405 struct ubi_attach_info *ai; in ubi_attach() local
1407 ai = alloc_ai(); in ubi_attach()
1408 if (!ai) in ubi_attach()
1419 err = scan_all(ubi, ai, 0); in ubi_attach()
1421 err = scan_fast(ubi, &ai); in ubi_attach()
1424 destroy_ai(ai); in ubi_attach()
1425 ai = alloc_ai(); in ubi_attach()
1426 if (!ai) in ubi_attach()
1429 err = scan_all(ubi, ai, 0); in ubi_attach()
1431 err = scan_all(ubi, ai, UBI_FM_MAX_START); in ubi_attach()
1436 err = scan_all(ubi, ai, 0); in ubi_attach()
1441 ubi->bad_peb_count = ai->bad_peb_count; in ubi_attach()
1443 ubi->corr_peb_count = ai->corr_peb_count; in ubi_attach()
1444 ubi->max_ec = ai->max_ec; in ubi_attach()
1445 ubi->mean_ec = ai->mean_ec; in ubi_attach()
1446 dbg_gen("max. sequence number: %llu", ai->max_sqnum); in ubi_attach()
1448 err = ubi_read_volume_table(ubi, ai); in ubi_attach()
1452 err = ubi_wl_init(ubi, ai); in ubi_attach()
1456 err = ubi_eba_init(ubi, ai); in ubi_attach()
1476 err = self_check_eba(ubi, ai, scan_ai); in ubi_attach()
1484 destroy_ai(ai); in ubi_attach()
1493 destroy_ai(ai); in ubi_attach()
1505 static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai) in self_check_ai() argument
1519 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { in self_check_ai()
1526 if (ai->is_empty) { in self_check_ai()
1544 if (av->vol_id > ai->highest_vol_id) { in self_check_ai()
1546 ai->highest_vol_id, av->vol_id); in self_check_ai()
1573 if (aeb->ec < ai->min_ec) { in self_check_ai()
1575 ai->min_ec, aeb->ec); in self_check_ai()
1579 if (aeb->ec > ai->max_ec) { in self_check_ai()
1581 ai->max_ec, aeb->ec); in self_check_ai()
1626 if (vols_found != ai->vols_found) { in self_check_ai()
1628 ai->vols_found, vols_found); in self_check_ai()
1633 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { in self_check_ai()
1721 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) in self_check_ai()
1725 list_for_each_entry(aeb, &ai->free, u.list) in self_check_ai()
1728 list_for_each_entry(aeb, &ai->corr, u.list) in self_check_ai()
1731 list_for_each_entry(aeb, &ai->erase, u.list) in self_check_ai()
1734 list_for_each_entry(aeb, &ai->alien, u.list) in self_check_ai()