Lines Matching defs:ai

79 static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai);
88 * @ai: attaching information
103 static struct ubi_ainf_volume *find_or_add_av(struct ubi_attach_info *ai,
108 struct rb_node **p = &ai->volumes.rb_node, *parent = NULL;
140 if (vol_id > ai->highest_vol_id)
141 ai->highest_vol_id = vol_id;
144 rb_insert_color(&av->rb, &ai->volumes);
145 ai->vols_found += 1;
154 * @ai: attaching information
161 static struct ubi_ainf_volume *ubi_find_or_add_av(struct ubi_attach_info *ai,
164 return find_or_add_av(ai, vol_id, AV_FIND_OR_ADD, created);
169 * @ai: attaching information
178 struct ubi_ainf_peb *ubi_alloc_aeb(struct ubi_attach_info *ai, int pnum,
183 aeb = kmem_cache_zalloc(ai->aeb_slab_cache, GFP_KERNEL);
197 * @ai: attaching information
203 void ubi_free_aeb(struct ubi_attach_info *ai, struct ubi_ainf_peb *aeb)
205 kmem_cache_free(ai->aeb_slab_cache, aeb);
210 * @ai: attaching information
229 static int add_to_list(struct ubi_attach_info *ai, int pnum, int vol_id,
234 if (list == &ai->free) {
236 } else if (list == &ai->erase) {
238 } else if (list == &ai->alien) {
240 ai->alien_peb_count += 1;
244 aeb = ubi_alloc_aeb(ai, pnum, ec);
259 * @ai: attaching information
268 static int add_corrupted(struct ubi_attach_info *ai, int pnum, int ec)
274 aeb = ubi_alloc_aeb(ai, pnum, ec);
278 ai->corr_peb_count += 1;
279 list_add(&aeb->u.list, &ai->corr);
285 * @ai: attaching information
296 static int add_fastmap(struct ubi_attach_info *ai, int pnum,
301 aeb = ubi_alloc_aeb(ai, pnum, ec);
307 list_add(&aeb->u.list, &ai->fastmap);
385 * @ai: attaching information
396 static struct ubi_ainf_volume *add_volume(struct ubi_attach_info *ai,
405 av = ubi_find_or_add_av(ai, vol_id, &created);
550 * @ai: attaching information
563 int ubi_add_to_av(struct ubi_device *ubi, struct ubi_attach_info *ai, int pnum,
579 av = add_volume(ai, vol_id, pnum, vid_hdr);
583 if (ai->max_sqnum < sqnum)
584 ai->max_sqnum = sqnum;
650 err = add_to_list(ai, aeb->pnum, aeb->vol_id,
652 &ai->erase);
674 return add_to_list(ai, pnum, vol_id, lnum, ec,
675 cmp_res & 4, &ai->erase);
688 aeb = ubi_alloc_aeb(ai, pnum, ec);
711 * @ai: attaching information
717 struct ubi_ainf_volume *ubi_add_av(struct ubi_attach_info *ai, int vol_id)
721 return find_or_add_av(ai, vol_id, AV_ADD, &created);
726 * @ai: attaching information
732 struct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai,
737 return find_or_add_av((struct ubi_attach_info *)ai, vol_id, AV_FIND,
741 static void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av,
746 * @ai: attaching information
749 void ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av)
753 rb_erase(&av->rb, &ai->volumes);
754 destroy_av(ai, av, &ai->erase);
755 ai->vols_found -= 1;
761 * @ai: attaching information
772 const struct ubi_attach_info *ai, int pnum, int ec)
807 * @ai: attaching information
819 struct ubi_attach_info *ai)
824 if (!list_empty(&ai->free)) {
825 aeb = list_entry(ai->free.next, struct ubi_ainf_peb, u.list);
837 list_for_each_entry_safe(aeb, tmp_aeb, &ai->erase, u.list) {
839 aeb->ec = ai->mean_ec;
841 err = early_erase_peb(ubi, ai, aeb->pnum, aeb->ec+1);
932 * @ai: attaching information
941 static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai,
944 struct ubi_ec_hdr *ech = ai->ech;
945 struct ubi_vid_io_buf *vidb = ai->vidb;
957 ai->bad_peb_count += 1;
971 ai->empty_peb_count += 1;
972 return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN,
973 UBI_UNKNOWN, 0, &ai->erase);
975 ai->empty_peb_count += 1;
976 return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN,
977 UBI_UNKNOWN, 1, &ai->erase);
1061 ai->maybe_bad_peb_count += 1;
1076 ai->force_full_scan = 1;
1103 err = add_to_list(ai, pnum, UBI_UNKNOWN,
1104 UBI_UNKNOWN, ec, 1, &ai->erase);
1107 err = add_corrupted(ai, pnum, ec);
1112 err = add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN,
1113 ec, 1, &ai->erase);
1119 err = add_to_list(ai, pnum, UBI_UNKNOWN,
1120 UBI_UNKNOWN, ec, 1, &ai->erase);
1122 err = add_to_list(ai, pnum, UBI_UNKNOWN,
1123 UBI_UNKNOWN, ec, 0, &ai->free);
1143 err = add_to_list(ai, pnum, vol_id, lnum,
1144 ec, 1, &ai->erase);
1158 err = add_to_list(ai, pnum, vol_id, lnum,
1159 ec, 0, &ai->alien);
1176 err = add_fastmap(ai, pnum, vidh, ec);
1178 err = ubi_add_to_av(ubi, ai, pnum, ec, vidh, bitflips);
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;
1199 * @ai: attaching information
1202 * gather information about all of them ("ai" is compete). It decides whether
1207 static int late_analysis(struct ubi_device *ubi, struct ubi_attach_info *ai)
1212 peb_count = ubi->peb_count - ai->bad_peb_count - ai->alien_peb_count;
1220 if (ai->corr_peb_count) {
1222 ai->corr_peb_count);
1224 list_for_each_entry(aeb, &ai->corr, u.list)
1232 if (ai->corr_peb_count >= max_corr) {
1238 if (ai->empty_peb_count + ai->maybe_bad_peb_count == peb_count) {
1254 if (ai->maybe_bad_peb_count <= 2) {
1255 ai->is_empty = 1;
1272 * @ai: attaching information
1277 static void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av,
1301 ubi_free_aeb(ai, aeb);
1309 * @ai: attaching information
1311 static void destroy_ai(struct ubi_attach_info *ai)
1317 list_for_each_entry_safe(aeb, aeb_tmp, &ai->alien, u.list) {
1319 ubi_free_aeb(ai, aeb);
1321 list_for_each_entry_safe(aeb, aeb_tmp, &ai->erase, u.list) {
1323 ubi_free_aeb(ai, aeb);
1325 list_for_each_entry_safe(aeb, aeb_tmp, &ai->corr, u.list) {
1327 ubi_free_aeb(ai, aeb);
1329 list_for_each_entry_safe(aeb, aeb_tmp, &ai->free, u.list) {
1331 ubi_free_aeb(ai, aeb);
1333 list_for_each_entry_safe(aeb, aeb_tmp, &ai->fastmap, u.list) {
1335 ubi_free_aeb(ai, aeb);
1339 rb = ai->volumes.rb_node;
1356 destroy_av(ai, av, NULL);
1360 kmem_cache_destroy(ai->aeb_slab_cache);
1361 kfree(ai);
1367 * @ai: attach info object
1374 static int scan_all(struct ubi_device *ubi, struct ubi_attach_info *ai,
1384 ai->ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
1385 if (!ai->ech)
1388 ai->vidb = ubi_alloc_vid_buf(ubi, GFP_KERNEL);
1389 if (!ai->vidb)
1396 err = scan_peb(ubi, ai, pnum, false);
1404 if (ai->ec_count)
1405 ai->mean_ec = div_u64(ai->ec_sum, ai->ec_count);
1407 err = late_analysis(ubi, ai);
1415 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
1418 aeb->ec = ai->mean_ec;
1421 list_for_each_entry(aeb, &ai->free, u.list) {
1423 aeb->ec = ai->mean_ec;
1426 list_for_each_entry(aeb, &ai->corr, u.list)
1428 aeb->ec = ai->mean_ec;
1430 list_for_each_entry(aeb, &ai->erase, u.list)
1432 aeb->ec = ai->mean_ec;
1434 err = self_check_ai(ubi, ai);
1438 ubi_free_vid_buf(ai->vidb);
1439 kfree(ai->ech);
1444 ubi_free_vid_buf(ai->vidb);
1446 kfree(ai->ech);
1452 struct ubi_attach_info *ai;
1454 ai = kzalloc(sizeof(struct ubi_attach_info), GFP_KERNEL);
1455 if (!ai)
1456 return ai;
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",
1467 if (!ai->aeb_slab_cache) {
1468 kfree(ai);
1469 ai = NULL;
1472 return ai;
1480 * @ai: attach info object
1487 static int scan_fast(struct ubi_device *ubi, struct ubi_attach_info **ai)
1521 err = ubi_scan_fastmap(ubi, *ai, scan_ai);
1528 destroy_ai(*ai);
1529 *ai = scan_ai;
1558 struct ubi_attach_info *ai;
1560 ai = alloc_ai();
1561 if (!ai)
1572 err = scan_all(ubi, ai, 0);
1574 err = scan_fast(ubi, &ai);
1577 destroy_ai(ai);
1578 ai = alloc_ai();
1579 if (!ai)
1582 err = scan_all(ubi, ai, 0);
1584 err = scan_all(ubi, ai, UBI_FM_MAX_START);
1589 err = scan_all(ubi, ai, 0);
1594 ubi->bad_peb_count = ai->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);
1601 err = ubi_read_volume_table(ubi, ai);
1605 err = ubi_wl_init(ubi, ai);
1609 err = ubi_eba_init(ubi, ai);
1629 err = self_check_eba(ubi, ai, scan_ai);
1637 destroy_ai(ai);
1646 destroy_ai(ai);
1653 * @ai: attaching information
1658 static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai)
1660 struct ubi_vid_io_buf *vidb = ai->vidb;
1674 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
1681 if (ai->is_empty) {
1699 if (av->vol_id > ai->highest_vol_id) {
1701 ai->highest_vol_id, av->vol_id);
1728 if (aeb->ec < ai->min_ec) {
1729 ubi_err(ubi, "bad ai->min_ec (%d), %d found",
1730 ai->min_ec, aeb->ec);
1734 if (aeb->ec > ai->max_ec) {
1735 ubi_err(ubi, "bad ai->max_ec (%d), %d found",
1736 ai->max_ec, aeb->ec);
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);
1788 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
1876 ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb)
1880 list_for_each_entry(aeb, &ai->free, u.list)
1883 list_for_each_entry(aeb, &ai->corr, u.list)
1886 list_for_each_entry(aeb, &ai->erase, u.list)
1889 list_for_each_entry(aeb, &ai->alien, u.list)