Lines Matching refs:ai

88 static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai);
115 static int add_to_list(struct ubi_attach_info *ai, int pnum, int vol_id, in add_to_list() argument
120 if (list == &ai->free) { in add_to_list()
122 } else if (list == &ai->erase) { in add_to_list()
124 } else if (list == &ai->alien) { in add_to_list()
126 ai->alien_peb_count += 1; in add_to_list()
130 aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL); in add_to_list()
156 static int add_corrupted(struct ubi_attach_info *ai, int pnum, int ec) in add_corrupted() argument
162 aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL); in add_corrupted()
166 ai->corr_peb_count += 1; in add_corrupted()
169 list_add(&aeb->u.list, &ai->corr); in add_corrupted()
254 static struct ubi_ainf_volume *add_volume(struct ubi_attach_info *ai, in add_volume() argument
259 struct rb_node **p = &ai->volumes.rb_node, *parent = NULL; in add_volume()
290 if (vol_id > ai->highest_vol_id) in add_volume()
291 ai->highest_vol_id = vol_id; in add_volume()
294 rb_insert_color(&av->rb, &ai->volumes); in add_volume()
295 ai->vols_found += 1; in add_volume()
445 int ubi_add_to_av(struct ubi_device *ubi, struct ubi_attach_info *ai, int pnum, in ubi_add_to_av() argument
461 av = add_volume(ai, vol_id, pnum, vid_hdr); in ubi_add_to_av()
465 if (ai->max_sqnum < sqnum) in ubi_add_to_av()
466 ai->max_sqnum = sqnum; in ubi_add_to_av()
532 err = add_to_list(ai, aeb->pnum, aeb->vol_id, in ubi_add_to_av()
534 &ai->erase); in ubi_add_to_av()
556 return add_to_list(ai, pnum, vol_id, lnum, ec, in ubi_add_to_av()
557 cmp_res & 4, &ai->erase); in ubi_add_to_av()
570 aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL); in ubi_add_to_av()
601 struct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai, in ubi_find_av() argument
605 struct rb_node *p = ai->volumes.rb_node; in ubi_find_av()
627 void ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av) in ubi_remove_av() argument
637 list_add_tail(&aeb->u.list, &ai->erase); in ubi_remove_av()
640 rb_erase(&av->rb, &ai->volumes); in ubi_remove_av()
642 ai->vols_found -= 1; in ubi_remove_av()
659 const struct ubi_attach_info *ai, int pnum, int ec) in early_erase_peb() argument
706 struct ubi_attach_info *ai) in ubi_early_get_peb() argument
711 if (!list_empty(&ai->free)) { in ubi_early_get_peb()
712 aeb = list_entry(ai->free.next, struct ubi_ainf_peb, u.list); in ubi_early_get_peb()
724 list_for_each_entry_safe(aeb, tmp_aeb, &ai->erase, u.list) { in ubi_early_get_peb()
726 aeb->ec = ai->mean_ec; in ubi_early_get_peb()
728 err = early_erase_peb(ubi, ai, aeb->pnum, aeb->ec+1); in ubi_early_get_peb()
815 static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai, in scan_peb() argument
828 ai->bad_peb_count += 1; in scan_peb()
842 ai->empty_peb_count += 1; in scan_peb()
843 return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, in scan_peb()
844 UBI_UNKNOWN, 0, &ai->erase); 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, 1, &ai->erase); in scan_peb()
932 ai->maybe_bad_peb_count += 1; in scan_peb()
959 err = add_to_list(ai, pnum, UBI_UNKNOWN, in scan_peb()
960 UBI_UNKNOWN, ec, 1, &ai->erase); in scan_peb()
963 err = add_corrupted(ai, pnum, ec); in scan_peb()
968 err = add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, in scan_peb()
969 ec, 1, &ai->erase); in scan_peb()
975 err = add_to_list(ai, pnum, UBI_UNKNOWN, in scan_peb()
976 UBI_UNKNOWN, ec, 1, &ai->erase); in scan_peb()
978 err = add_to_list(ai, pnum, UBI_UNKNOWN, in scan_peb()
979 UBI_UNKNOWN, ec, 0, &ai->free); in scan_peb()
1005 err = add_to_list(ai, pnum, vol_id, lnum, in scan_peb()
1006 ec, 1, &ai->erase); in scan_peb()
1020 err = add_to_list(ai, pnum, vol_id, lnum, in scan_peb()
1021 ec, 0, &ai->alien); in scan_peb()
1036 err = ubi_add_to_av(ubi, ai, pnum, ec, vidh, bitflips); in scan_peb()
1042 ai->ec_sum += ec; in scan_peb()
1043 ai->ec_count += 1; in scan_peb()
1044 if (ec > ai->max_ec) in scan_peb()
1045 ai->max_ec = ec; in scan_peb()
1046 if (ec < ai->min_ec) in scan_peb()
1047 ai->min_ec = ec; in scan_peb()
1064 static int late_analysis(struct ubi_device *ubi, struct ubi_attach_info *ai) in late_analysis() argument
1069 peb_count = ubi->peb_count - ai->bad_peb_count - ai->alien_peb_count; in late_analysis()
1077 if (ai->corr_peb_count) { in late_analysis()
1079 ai->corr_peb_count); in late_analysis()
1081 list_for_each_entry(aeb, &ai->corr, u.list) in late_analysis()
1089 if (ai->corr_peb_count >= max_corr) { in late_analysis()
1095 if (ai->empty_peb_count + ai->maybe_bad_peb_count == peb_count) { in late_analysis()
1111 if (ai->maybe_bad_peb_count <= 2) { in late_analysis()
1112 ai->is_empty = 1; in late_analysis()
1133 static void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av) in destroy_av() argument
1153 kmem_cache_free(ai->aeb_slab_cache, aeb); in destroy_av()
1163 static void destroy_ai(struct ubi_attach_info *ai) in destroy_ai() argument
1169 list_for_each_entry_safe(aeb, aeb_tmp, &ai->alien, u.list) { in destroy_ai()
1171 kmem_cache_free(ai->aeb_slab_cache, aeb); in destroy_ai()
1173 list_for_each_entry_safe(aeb, aeb_tmp, &ai->erase, 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->corr, 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->free, u.list) { in destroy_ai()
1183 kmem_cache_free(ai->aeb_slab_cache, aeb); in destroy_ai()
1187 rb = ai->volumes.rb_node; in destroy_ai()
1204 destroy_av(ai, av); in destroy_ai()
1208 kmem_cache_destroy(ai->aeb_slab_cache); in destroy_ai()
1210 kfree(ai); in destroy_ai()
1223 static int scan_all(struct ubi_device *ubi, struct ubi_attach_info *ai, in scan_all() argument
1245 err = scan_peb(ubi, ai, pnum, NULL, NULL); in scan_all()
1253 if (ai->ec_count) in scan_all()
1254 ai->mean_ec = div_u64(ai->ec_sum, ai->ec_count); in scan_all()
1256 err = late_analysis(ubi, ai); in scan_all()
1264 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { in scan_all()
1267 aeb->ec = ai->mean_ec; in scan_all()
1270 list_for_each_entry(aeb, &ai->free, u.list) { in scan_all()
1272 aeb->ec = ai->mean_ec; in scan_all()
1275 list_for_each_entry(aeb, &ai->corr, u.list) in scan_all()
1277 aeb->ec = ai->mean_ec; in scan_all()
1279 list_for_each_entry(aeb, &ai->erase, u.list) in scan_all()
1281 aeb->ec = ai->mean_ec; in scan_all()
1283 err = self_check_ai(ubi, ai); in scan_all()
1301 struct ubi_attach_info *ai; in alloc_ai() local
1303 ai = kzalloc(sizeof(struct ubi_attach_info), GFP_KERNEL); in alloc_ai()
1304 if (!ai) in alloc_ai()
1305 return ai; in alloc_ai()
1307 INIT_LIST_HEAD(&ai->corr); in alloc_ai()
1308 INIT_LIST_HEAD(&ai->free); in alloc_ai()
1309 INIT_LIST_HEAD(&ai->erase); in alloc_ai()
1310 INIT_LIST_HEAD(&ai->alien); in alloc_ai()
1311 ai->volumes = RB_ROOT; in alloc_ai()
1312 ai->aeb_slab_cache = kmem_cache_create("ubi_aeb_slab_cache", in alloc_ai()
1315 if (!ai->aeb_slab_cache) { in alloc_ai()
1316 kfree(ai); in alloc_ai()
1317 ai = NULL; in alloc_ai()
1320 return ai; in alloc_ai()
1335 static int scan_fast(struct ubi_device *ubi, struct ubi_attach_info **ai) in scan_fast() argument
1356 err = scan_peb(ubi, *ai, pnum, &vol_id, &sqnum); in scan_fast()
1372 destroy_ai(*ai); in scan_fast()
1373 *ai = alloc_ai(); in scan_fast()
1374 if (!*ai) in scan_fast()
1377 return ubi_scan_fastmap(ubi, *ai, fm_anchor); in scan_fast()
1400 struct ubi_attach_info *ai; in ubi_attach() local
1402 ai = alloc_ai(); in ubi_attach()
1403 if (!ai) in ubi_attach()
1414 err = scan_all(ubi, ai, 0); in ubi_attach()
1416 err = scan_fast(ubi, &ai); in ubi_attach()
1419 destroy_ai(ai); in ubi_attach()
1420 ai = alloc_ai(); in ubi_attach()
1421 if (!ai) in ubi_attach()
1424 err = scan_all(ubi, ai, 0); in ubi_attach()
1426 err = scan_all(ubi, ai, UBI_FM_MAX_START); in ubi_attach()
1431 err = scan_all(ubi, ai, 0); in ubi_attach()
1436 ubi->bad_peb_count = ai->bad_peb_count; in ubi_attach()
1438 ubi->corr_peb_count = ai->corr_peb_count; in ubi_attach()
1439 ubi->max_ec = ai->max_ec; in ubi_attach()
1440 ubi->mean_ec = ai->mean_ec; in ubi_attach()
1441 dbg_gen("max. sequence number: %llu", ai->max_sqnum); in ubi_attach()
1443 err = ubi_read_volume_table(ubi, ai); in ubi_attach()
1447 err = ubi_wl_init(ubi, ai); in ubi_attach()
1451 err = ubi_eba_init(ubi, ai); in ubi_attach()
1471 err = self_check_eba(ubi, ai, scan_ai); in ubi_attach()
1479 destroy_ai(ai); in ubi_attach()
1488 destroy_ai(ai); in ubi_attach()
1500 static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai) in self_check_ai() argument
1514 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { in self_check_ai()
1521 if (ai->is_empty) { in self_check_ai()
1539 if (av->vol_id > ai->highest_vol_id) { in self_check_ai()
1541 ai->highest_vol_id, av->vol_id); in self_check_ai()
1568 if (aeb->ec < ai->min_ec) { in self_check_ai()
1570 ai->min_ec, aeb->ec); in self_check_ai()
1574 if (aeb->ec > ai->max_ec) { in self_check_ai()
1576 ai->max_ec, aeb->ec); in self_check_ai()
1621 if (vols_found != ai->vols_found) { in self_check_ai()
1623 ai->vols_found, vols_found); in self_check_ai()
1628 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { in self_check_ai()
1716 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) in self_check_ai()
1720 list_for_each_entry(aeb, &ai->free, u.list) in self_check_ai()
1723 list_for_each_entry(aeb, &ai->corr, u.list) in self_check_ai()
1726 list_for_each_entry(aeb, &ai->erase, u.list) in self_check_ai()
1729 list_for_each_entry(aeb, &ai->alien, u.list) in self_check_ai()