Lines Matching refs:ubi
24 static inline int *init_seen(struct ubi_device *ubi) in init_seen() argument
28 if (!ubi_dbg_chk_fastmap(ubi)) in init_seen()
31 ret = kcalloc(ubi->peb_count, sizeof(int), GFP_KERNEL); in init_seen()
53 static inline void set_seen(struct ubi_device *ubi, int pnum, int *seen) in set_seen() argument
55 if (!ubi_dbg_chk_fastmap(ubi) || !seen) in set_seen()
66 static int self_check_seen(struct ubi_device *ubi, int *seen) in self_check_seen() argument
70 if (!ubi_dbg_chk_fastmap(ubi) || !seen) in self_check_seen()
73 for (pnum = 0; pnum < ubi->peb_count; pnum++) { in self_check_seen()
74 if (!seen[pnum] && ubi->lookuptbl[pnum]) { in self_check_seen()
75 ubi_err(ubi, "self-check failed for PEB %d, fastmap didn't see it", pnum); in self_check_seen()
87 size_t ubi_calc_fm_size(struct ubi_device *ubi) in ubi_calc_fm_size() argument
95 (ubi->peb_count * sizeof(struct ubi_fm_ec)) + \ in ubi_calc_fm_size()
97 (ubi->peb_count * sizeof(__be32))) + \ in ubi_calc_fm_size()
99 return roundup(size, ubi->leb_size); in ubi_calc_fm_size()
111 static struct ubi_vid_hdr *new_fm_vhdr(struct ubi_device *ubi, int vol_id) in new_fm_vhdr() argument
115 new = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL); in new_fm_vhdr()
269 static int update_vol(struct ubi_device *ubi, struct ubi_attach_info *ai, in update_vol() argument
301 cmp_res = ubi_compare_lebs(ubi, aeb, new_aeb->pnum, new_vh); in update_vol()
365 static int process_pool_aeb(struct ubi_device *ubi, struct ubi_attach_info *ai, in process_pool_aeb() argument
398 ubi_err(ubi, "orphaned volume in fastmap pool!"); in process_pool_aeb()
405 return update_vol(ubi, ai, av, new_vh, new_aeb); in process_pool_aeb()
450 static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai, in scan_pool() argument
459 ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL); in scan_pool()
463 vh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL); in scan_pool()
481 if (ubi_io_is_bad(ubi, pnum)) { in scan_pool()
482 ubi_err(ubi, "bad PEB in fastmap pool!"); in scan_pool()
487 err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); in scan_pool()
489 ubi_err(ubi, "unable to read EC header! PEB:%i err:%i", in scan_pool()
502 if (image_seq && (image_seq != ubi->image_seq)) { in scan_pool()
503 ubi_err(ubi, "bad image seq: 0x%x, expected: 0x%x", in scan_pool()
504 be32_to_cpu(ech->image_seq), ubi->image_seq); in scan_pool()
509 err = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); in scan_pool()
542 err = process_pool_aeb(ubi, ai, vh, new_aeb); in scan_pool()
549 ubi_err(ubi, "fastmap pool PEBs contains damaged PEBs!"); in scan_pool()
557 ubi_free_vid_hdr(ubi, vh); in scan_pool()
595 static int ubi_attach_fastmap(struct ubi_device *ubi, in ubi_attach_fastmap() argument
609 size_t fm_pos = 0, fm_size = ubi->fm_size; in ubi_attach_fastmap()
611 void *fm_raw = ubi->fm_buf; in ubi_attach_fastmap()
629 ubi_err(ubi, "bad fastmap header magic: 0x%x, expected: 0x%x", in ubi_attach_fastmap()
639 ubi_err(ubi, "bad fastmap pool magic: 0x%x, expected: 0x%x", in ubi_attach_fastmap()
649 ubi_err(ubi, "bad fastmap pool magic: 0x%x, expected: 0x%x", in ubi_attach_fastmap()
660 ubi_err(ubi, "bad pool size: %i", pool_size); in ubi_attach_fastmap()
665 ubi_err(ubi, "bad WL pool size: %i", wl_pool_size); in ubi_attach_fastmap()
672 ubi_err(ubi, "bad maximal pool size: %i", fm->max_pool_size); in ubi_attach_fastmap()
678 ubi_err(ubi, "bad maximal WL pool size: %i", in ubi_attach_fastmap()
738 ubi_err(ubi, "bad fastmap vol header magic: 0x%x, expected: 0x%x", in ubi_attach_fastmap()
763 ubi_err(ubi, "bad fastmap EBA header magic: 0x%x, expected: 0x%x", in ubi_attach_fastmap()
783 ubi_err(ubi, "PEB %i is in EBA but not in used list", pnum); in ubi_attach_fastmap()
799 ret = scan_pool(ubi, ai, fmpl1->pebs, pool_size, &max_sqnum, &free); in ubi_attach_fastmap()
803 ret = scan_pool(ubi, ai, fmpl2->pebs, wl_pool_size, &max_sqnum, &free); in ubi_attach_fastmap()
824 if (WARN_ON(count_fastmap_pebs(ai) != ubi->peb_count - in ubi_attach_fastmap()
855 int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai, in ubi_scan_fastmap() argument
867 down_write(&ubi->fm_protect); in ubi_scan_fastmap()
868 memset(ubi->fm_buf, 0, ubi->fm_size); in ubi_scan_fastmap()
883 ret = ubi_io_read(ubi, fmsb, fm_anchor, ubi->leb_start, sizeof(*fmsb)); in ubi_scan_fastmap()
890 ubi_err(ubi, "bad super block magic: 0x%x, expected: 0x%x", in ubi_scan_fastmap()
897 ubi_err(ubi, "bad fastmap version: %i, expected: %i", in ubi_scan_fastmap()
905 ubi_err(ubi, "number of fastmap blocks is invalid: %i", in ubi_scan_fastmap()
911 fm_size = ubi->leb_size * used_blocks; in ubi_scan_fastmap()
912 if (fm_size != ubi->fm_size) { in ubi_scan_fastmap()
913 ubi_err(ubi, "bad fastmap size: %zi, expected: %zi", in ubi_scan_fastmap()
914 fm_size, ubi->fm_size); in ubi_scan_fastmap()
919 ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL); in ubi_scan_fastmap()
925 vh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL); in ubi_scan_fastmap()
936 if (ubi_io_is_bad(ubi, pnum)) { in ubi_scan_fastmap()
941 ret = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); in ubi_scan_fastmap()
943 ubi_err(ubi, "unable to read fastmap block# %i EC (PEB: %i)", in ubi_scan_fastmap()
952 if (!ubi->image_seq) in ubi_scan_fastmap()
953 ubi->image_seq = image_seq; in ubi_scan_fastmap()
959 if (image_seq && (image_seq != ubi->image_seq)) { in ubi_scan_fastmap()
960 ubi_err(ubi, "wrong image seq:%d instead of %d", in ubi_scan_fastmap()
961 be32_to_cpu(ech->image_seq), ubi->image_seq); in ubi_scan_fastmap()
966 ret = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); in ubi_scan_fastmap()
968 ubi_err(ubi, "unable to read fastmap block# %i (PEB: %i)", in ubi_scan_fastmap()
975 ubi_err(ubi, "bad fastmap anchor vol_id: 0x%x, expected: 0x%x", in ubi_scan_fastmap()
983 ubi_err(ubi, "bad fastmap data vol_id: 0x%x, expected: 0x%x", in ubi_scan_fastmap()
994 ret = ubi_io_read(ubi, ubi->fm_buf + (ubi->leb_size * i), pnum, in ubi_scan_fastmap()
995 ubi->leb_start, ubi->leb_size); in ubi_scan_fastmap()
997 ubi_err(ubi, "unable to read fastmap block# %i (PEB: %i, " in ubi_scan_fastmap()
1006 fmsb2 = (struct ubi_fm_sb *)(ubi->fm_buf); in ubi_scan_fastmap()
1009 crc = crc32(UBI_CRC32_INIT, ubi->fm_buf, fm_size); in ubi_scan_fastmap()
1011 ubi_err(ubi, "fastmap data CRC is invalid"); in ubi_scan_fastmap()
1012 ubi_err(ubi, "CRC should be: 0x%x, calc: 0x%x", in ubi_scan_fastmap()
1022 ret = ubi_attach_fastmap(ubi, ai, fm); in ubi_scan_fastmap()
1046 ubi->fm = fm; in ubi_scan_fastmap()
1047 ubi->fm_pool.max_size = ubi->fm->max_pool_size; in ubi_scan_fastmap()
1048 ubi->fm_wl_pool.max_size = ubi->fm->max_wl_pool_size; in ubi_scan_fastmap()
1049 ubi_msg(ubi, "attached by fastmap"); in ubi_scan_fastmap()
1050 ubi_msg(ubi, "fastmap pool size: %d", ubi->fm_pool.max_size); in ubi_scan_fastmap()
1051 ubi_msg(ubi, "fastmap WL pool size: %d", in ubi_scan_fastmap()
1052 ubi->fm_wl_pool.max_size); in ubi_scan_fastmap()
1053 ubi->fm_disabled = 0; in ubi_scan_fastmap()
1054 ubi->fast_attach = 1; in ubi_scan_fastmap()
1056 ubi_free_vid_hdr(ubi, vh); in ubi_scan_fastmap()
1059 up_write(&ubi->fm_protect); in ubi_scan_fastmap()
1061 ubi_err(ubi, "Attach by fastmap failed, doing a full scan!"); in ubi_scan_fastmap()
1065 ubi_free_vid_hdr(ubi, vh); in ubi_scan_fastmap()
1080 static int ubi_write_fastmap(struct ubi_device *ubi, in ubi_write_fastmap() argument
1100 fm_raw = ubi->fm_buf; in ubi_write_fastmap()
1101 memset(ubi->fm_buf, 0, ubi->fm_size); in ubi_write_fastmap()
1103 avhdr = new_fm_vhdr(ubi, UBI_FM_SB_VOLUME_ID); in ubi_write_fastmap()
1109 dvhdr = new_fm_vhdr(ubi, UBI_FM_DATA_VOLUME_ID); in ubi_write_fastmap()
1115 seen_pebs = init_seen(ubi); in ubi_write_fastmap()
1121 spin_lock(&ubi->volumes_lock); in ubi_write_fastmap()
1122 spin_lock(&ubi->wl_lock); in ubi_write_fastmap()
1126 ubi_assert(fm_pos <= ubi->fm_size); in ubi_write_fastmap()
1130 ubi_assert(fm_pos <= ubi->fm_size); in ubi_write_fastmap()
1148 fmpl1->size = cpu_to_be16(ubi->fm_pool.size); in ubi_write_fastmap()
1149 fmpl1->max_size = cpu_to_be16(ubi->fm_pool.max_size); in ubi_write_fastmap()
1151 for (i = 0; i < ubi->fm_pool.size; i++) { in ubi_write_fastmap()
1152 fmpl1->pebs[i] = cpu_to_be32(ubi->fm_pool.pebs[i]); in ubi_write_fastmap()
1153 set_seen(ubi, ubi->fm_pool.pebs[i], seen_pebs); in ubi_write_fastmap()
1159 fmpl2->size = cpu_to_be16(ubi->fm_wl_pool.size); in ubi_write_fastmap()
1160 fmpl2->max_size = cpu_to_be16(ubi->fm_wl_pool.max_size); in ubi_write_fastmap()
1162 for (i = 0; i < ubi->fm_wl_pool.size; i++) { in ubi_write_fastmap()
1163 fmpl2->pebs[i] = cpu_to_be32(ubi->fm_wl_pool.pebs[i]); in ubi_write_fastmap()
1164 set_seen(ubi, ubi->fm_wl_pool.pebs[i], seen_pebs); in ubi_write_fastmap()
1167 ubi_for_each_free_peb(ubi, wl_e, tmp_rb) { in ubi_write_fastmap()
1171 set_seen(ubi, wl_e->pnum, seen_pebs); in ubi_write_fastmap()
1176 ubi_assert(fm_pos <= ubi->fm_size); in ubi_write_fastmap()
1180 ubi_for_each_used_peb(ubi, wl_e, tmp_rb) { in ubi_write_fastmap()
1184 set_seen(ubi, wl_e->pnum, seen_pebs); in ubi_write_fastmap()
1189 ubi_assert(fm_pos <= ubi->fm_size); in ubi_write_fastmap()
1192 ubi_for_each_protected_peb(ubi, i, wl_e) { in ubi_write_fastmap()
1196 set_seen(ubi, wl_e->pnum, seen_pebs); in ubi_write_fastmap()
1201 ubi_assert(fm_pos <= ubi->fm_size); in ubi_write_fastmap()
1205 ubi_for_each_scrub_peb(ubi, wl_e, tmp_rb) { in ubi_write_fastmap()
1209 set_seen(ubi, wl_e->pnum, seen_pebs); in ubi_write_fastmap()
1214 ubi_assert(fm_pos <= ubi->fm_size); in ubi_write_fastmap()
1219 list_for_each_entry(ubi_wrk, &ubi->works, list) { in ubi_write_fastmap()
1227 set_seen(ubi, wl_e->pnum, seen_pebs); in ubi_write_fastmap()
1232 ubi_assert(fm_pos <= ubi->fm_size); in ubi_write_fastmap()
1238 vol = ubi->volumes[i]; in ubi_write_fastmap()
1247 ubi_assert(fm_pos <= ubi->fm_size); in ubi_write_fastmap()
1261 ubi_assert(fm_pos <= ubi->fm_size); in ubi_write_fastmap()
1270 fmh->bad_peb_count = cpu_to_be32(ubi->bad_peb_count); in ubi_write_fastmap()
1272 avhdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_write_fastmap()
1275 spin_unlock(&ubi->wl_lock); in ubi_write_fastmap()
1276 spin_unlock(&ubi->volumes_lock); in ubi_write_fastmap()
1279 ret = ubi_io_write_vid_hdr(ubi, new_fm->e[0]->pnum, avhdr); in ubi_write_fastmap()
1281 ubi_err(ubi, "unable to write vid_hdr to fastmap SB!"); in ubi_write_fastmap()
1287 set_seen(ubi, new_fm->e[i]->pnum, seen_pebs); in ubi_write_fastmap()
1293 ubi->fm_size)); in ubi_write_fastmap()
1296 dvhdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_write_fastmap()
1300 ret = ubi_io_write_vid_hdr(ubi, new_fm->e[i]->pnum, dvhdr); in ubi_write_fastmap()
1302 ubi_err(ubi, "unable to write vid_hdr to PEB %i!", in ubi_write_fastmap()
1309 ret = ubi_io_write(ubi, fm_raw + (i * ubi->leb_size), in ubi_write_fastmap()
1310 new_fm->e[i]->pnum, ubi->leb_start, ubi->leb_size); in ubi_write_fastmap()
1312 ubi_err(ubi, "unable to write fastmap to PEB %i!", in ubi_write_fastmap()
1319 ubi->fm = new_fm; in ubi_write_fastmap()
1321 ret = self_check_seen(ubi, seen_pebs); in ubi_write_fastmap()
1325 ubi_free_vid_hdr(ubi, avhdr); in ubi_write_fastmap()
1326 ubi_free_vid_hdr(ubi, dvhdr); in ubi_write_fastmap()
1339 static int erase_block(struct ubi_device *ubi, int pnum) in erase_block() argument
1345 ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL); in erase_block()
1349 ret = ubi_io_read_ec_hdr(ubi, pnum, ec_hdr, 0); in erase_block()
1357 ret = ubi_io_sync_erase(ubi, pnum, 0); in erase_block()
1369 ret = ubi_io_write_ec_hdr(ubi, pnum, ec_hdr); in erase_block()
1391 static int invalidate_fastmap(struct ubi_device *ubi) in invalidate_fastmap() argument
1398 if (!ubi->fm) in invalidate_fastmap()
1401 ubi->fm = NULL; in invalidate_fastmap()
1408 vh = new_fm_vhdr(ubi, UBI_FM_SB_VOLUME_ID); in invalidate_fastmap()
1413 e = ubi_wl_get_fm_peb(ubi, 1); in invalidate_fastmap()
1421 vh->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in invalidate_fastmap()
1422 ret = ubi_io_write_vid_hdr(ubi, e->pnum, vh); in invalidate_fastmap()
1424 ubi_wl_put_fm_peb(ubi, e, 0, 0); in invalidate_fastmap()
1431 ubi->fm = fm; in invalidate_fastmap()
1434 ubi_free_vid_hdr(ubi, vh); in invalidate_fastmap()
1448 static void return_fm_pebs(struct ubi_device *ubi, in return_fm_pebs() argument
1458 ubi_wl_put_fm_peb(ubi, fm->e[i], i, in return_fm_pebs()
1472 int ubi_update_fastmap(struct ubi_device *ubi) in ubi_update_fastmap() argument
1478 down_write(&ubi->fm_protect); in ubi_update_fastmap()
1480 ubi_refill_pools(ubi); in ubi_update_fastmap()
1482 if (ubi->ro_mode || ubi->fm_disabled) { in ubi_update_fastmap()
1483 up_write(&ubi->fm_protect); in ubi_update_fastmap()
1487 ret = ubi_ensure_anchor_pebs(ubi); in ubi_update_fastmap()
1489 up_write(&ubi->fm_protect); in ubi_update_fastmap()
1495 up_write(&ubi->fm_protect); in ubi_update_fastmap()
1499 new_fm->used_blocks = ubi->fm_size / ubi->leb_size; in ubi_update_fastmap()
1500 old_fm = ubi->fm; in ubi_update_fastmap()
1501 ubi->fm = NULL; in ubi_update_fastmap()
1504 ubi_err(ubi, "fastmap too large"); in ubi_update_fastmap()
1510 spin_lock(&ubi->wl_lock); in ubi_update_fastmap()
1511 tmp_e = ubi_wl_get_fm_peb(ubi, 0); in ubi_update_fastmap()
1512 spin_unlock(&ubi->wl_lock); in ubi_update_fastmap()
1516 ret = erase_block(ubi, old_fm->e[i]->pnum); in ubi_update_fastmap()
1518 ubi_err(ubi, "could not erase old fastmap PEB"); in ubi_update_fastmap()
1521 ubi_wl_put_fm_peb(ubi, new_fm->e[j], in ubi_update_fastmap()
1530 ubi_err(ubi, "could not get any free erase block"); in ubi_update_fastmap()
1533 ubi_wl_put_fm_peb(ubi, new_fm->e[j], j, 0); in ubi_update_fastmap()
1544 ubi_wl_put_fm_peb(ubi, old_fm->e[i], i, in ubi_update_fastmap()
1554 ubi_wl_put_fm_peb(ubi, old_fm->e[i], i, in ubi_update_fastmap()
1560 spin_lock(&ubi->wl_lock); in ubi_update_fastmap()
1561 tmp_e = ubi_wl_get_fm_peb(ubi, 1); in ubi_update_fastmap()
1562 spin_unlock(&ubi->wl_lock); in ubi_update_fastmap()
1567 ret = erase_block(ubi, old_fm->e[0]->pnum); in ubi_update_fastmap()
1569 ubi_err(ubi, "could not erase old anchor PEB"); in ubi_update_fastmap()
1572 ubi_wl_put_fm_peb(ubi, new_fm->e[i], in ubi_update_fastmap()
1583 ubi_wl_put_fm_peb(ubi, old_fm->e[0], 0, in ubi_update_fastmap()
1590 ubi_err(ubi, "could not find any anchor PEB"); in ubi_update_fastmap()
1593 ubi_wl_put_fm_peb(ubi, new_fm->e[i], i, 0); in ubi_update_fastmap()
1603 down_write(&ubi->work_sem); in ubi_update_fastmap()
1604 down_write(&ubi->fm_eba_sem); in ubi_update_fastmap()
1605 ret = ubi_write_fastmap(ubi, new_fm); in ubi_update_fastmap()
1606 up_write(&ubi->fm_eba_sem); in ubi_update_fastmap()
1607 up_write(&ubi->work_sem); in ubi_update_fastmap()
1613 up_write(&ubi->fm_protect); in ubi_update_fastmap()
1618 ubi_warn(ubi, "Unable to write new fastmap, err=%i", ret); in ubi_update_fastmap()
1620 ret = invalidate_fastmap(ubi); in ubi_update_fastmap()
1622 ubi_err(ubi, "Unable to invalidiate current fastmap!"); in ubi_update_fastmap()
1623 ubi_ro_mode(ubi); in ubi_update_fastmap()
1625 return_fm_pebs(ubi, old_fm); in ubi_update_fastmap()
1626 return_fm_pebs(ubi, new_fm); in ubi_update_fastmap()