Lines Matching refs:ubi

67 static void self_vtbl_check(const struct ubi_device *ubi);
83 int ubi_change_vtbl_record(struct ubi_device *ubi, int idx, in ubi_change_vtbl_record() argument
90 ubi_assert(idx >= 0 && idx < ubi->vtbl_slots); in ubi_change_vtbl_record()
91 layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)]; in ubi_change_vtbl_record()
100 memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record)); in ubi_change_vtbl_record()
102 err = ubi_eba_atomic_leb_change(ubi, layout_vol, i, ubi->vtbl, in ubi_change_vtbl_record()
103 ubi->vtbl_size); in ubi_change_vtbl_record()
108 self_vtbl_check(ubi); in ubi_change_vtbl_record()
121 int ubi_vtbl_rename_volumes(struct ubi_device *ubi, in ubi_vtbl_rename_volumes() argument
131 struct ubi_vtbl_record *vtbl_rec = &ubi->vtbl[vol->vol_id]; in ubi_vtbl_rename_volumes()
148 layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)]; in ubi_vtbl_rename_volumes()
150 err = ubi_eba_atomic_leb_change(ubi, layout_vol, i, ubi->vtbl, in ubi_vtbl_rename_volumes()
151 ubi->vtbl_size); in ubi_vtbl_rename_volumes()
167 static int vtbl_check(const struct ubi_device *ubi, in vtbl_check() argument
175 for (i = 0; i < ubi->vtbl_slots; i++) { in vtbl_check()
188 ubi_err(ubi, "bad CRC at record %u: %#08x, not %#08x", in vtbl_check()
209 if (alignment > ubi->leb_size || alignment == 0) { in vtbl_check()
214 n = alignment & (ubi->min_io_size - 1); in vtbl_check()
220 n = ubi->leb_size % alignment; in vtbl_check()
222 ubi_err(ubi, "bad data_pad, has to be %d", n); in vtbl_check()
237 if (reserved_pebs > ubi->good_peb_count) { in vtbl_check()
238 ubi_err(ubi, "too large reserved_pebs %d, good PEBs %d", in vtbl_check()
239 reserved_pebs, ubi->good_peb_count); in vtbl_check()
261 for (i = 0; i < ubi->vtbl_slots - 1; i++) { in vtbl_check()
262 for (n = i + 1; n < ubi->vtbl_slots; n++) { in vtbl_check()
268 ubi_err(ubi, "volumes %d and %d have the same name \"%s\"", in vtbl_check()
280 ubi_err(ubi, "volume table check failed: record %d, error %d", i, err); in vtbl_check()
295 static int create_vtbl(struct ubi_device *ubi, struct ubi_attach_info *ai, in create_vtbl() argument
304 vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL); in create_vtbl()
309 new_aeb = ubi_early_get_peb(ubi, ai); in create_vtbl()
324 err = ubi_io_write_vid_hdr(ubi, new_aeb->pnum, vid_hdr); in create_vtbl()
329 err = ubi_io_write_data(ubi, vtbl, new_aeb->pnum, 0, ubi->vtbl_size); in create_vtbl()
337 err = ubi_add_to_av(ubi, ai, new_aeb->pnum, new_aeb->ec, vid_hdr, 0); in create_vtbl()
339 ubi_free_vid_hdr(ubi, vid_hdr); in create_vtbl()
353 ubi_free_vid_hdr(ubi, vid_hdr); in create_vtbl()
368 static struct ubi_vtbl_record *process_lvol(struct ubi_device *ubi, in process_lvol() argument
407 leb[aeb->lnum] = vzalloc(ubi->vtbl_size); in process_lvol()
413 err = ubi_io_read_data(ubi, leb[aeb->lnum], aeb->pnum, 0, in process_lvol()
414 ubi->vtbl_size); in process_lvol()
433 leb_corrupted[0] = vtbl_check(ubi, leb[0]); in process_lvol()
442 ubi->vtbl_size); in process_lvol()
444 ubi_warn(ubi, "volume table copy #2 is corrupted"); in process_lvol()
445 err = create_vtbl(ubi, ai, 1, leb[0]); in process_lvol()
448 ubi_msg(ubi, "volume table was restored"); in process_lvol()
457 leb_corrupted[1] = vtbl_check(ubi, leb[1]); in process_lvol()
463 ubi_err(ubi, "both volume tables are corrupted"); in process_lvol()
467 ubi_warn(ubi, "volume table copy #1 is corrupted"); in process_lvol()
468 err = create_vtbl(ubi, ai, 0, leb[1]); in process_lvol()
471 ubi_msg(ubi, "volume table was restored"); in process_lvol()
491 static struct ubi_vtbl_record *create_empty_lvol(struct ubi_device *ubi, in create_empty_lvol() argument
497 vtbl = vzalloc(ubi->vtbl_size); in create_empty_lvol()
501 for (i = 0; i < ubi->vtbl_slots; i++) in create_empty_lvol()
507 err = create_vtbl(ubi, ai, i, vtbl); in create_empty_lvol()
527 static int init_volumes(struct ubi_device *ubi, in init_volumes() argument
535 for (i = 0; i < ubi->vtbl_slots; i++) { in init_volumes()
552 vol->usable_leb_size = ubi->leb_size - vol->data_pad; in init_volumes()
559 if (ubi->autoresize_vol_id != -1) { in init_volumes()
560 ubi_err(ubi, "more than one auto-resize volume (%d and %d)", in init_volumes()
561 ubi->autoresize_vol_id, i); in init_volumes()
566 ubi->autoresize_vol_id = i; in init_volumes()
569 ubi_assert(!ubi->volumes[i]); in init_volumes()
570 ubi->volumes[i] = vol; in init_volumes()
571 ubi->vol_count += 1; in init_volumes()
572 vol->ubi = ubi; in init_volumes()
606 ubi_warn(ubi, "static volume %d misses %d LEBs - corrupted", in init_volumes()
629 vol->usable_leb_size = ubi->leb_size; in init_volumes()
633 (long long)vol->used_ebs * (ubi->leb_size - vol->data_pad); in init_volumes()
637 ubi_assert(!ubi->volumes[i]); in init_volumes()
638 ubi->volumes[vol_id2idx(ubi, vol->vol_id)] = vol; in init_volumes()
640 ubi->vol_count += 1; in init_volumes()
641 vol->ubi = ubi; in init_volumes()
643 if (reserved_pebs > ubi->avail_pebs) { in init_volumes()
644 ubi_err(ubi, "not enough PEBs, required %d, available %d", in init_volumes()
645 reserved_pebs, ubi->avail_pebs); in init_volumes()
646 if (ubi->corr_peb_count) in init_volumes()
647 ubi_err(ubi, "%d PEBs are corrupted and not used", in init_volumes()
648 ubi->corr_peb_count); in init_volumes()
651 ubi->rsvd_pebs += reserved_pebs; in init_volumes()
652 ubi->avail_pebs -= reserved_pebs; in init_volumes()
693 ubi_err(vol->ubi, "bad attaching information, error %d", err); in check_av()
709 static int check_attaching_info(const struct ubi_device *ubi, in check_attaching_info() argument
716 if (ai->vols_found > UBI_INT_VOL_COUNT + ubi->vtbl_slots) { in check_attaching_info()
717 ubi_err(ubi, "found %d volumes while attaching, maximum is %d + %d", in check_attaching_info()
718 ai->vols_found, UBI_INT_VOL_COUNT, ubi->vtbl_slots); in check_attaching_info()
722 if (ai->highest_vol_id >= ubi->vtbl_slots + UBI_INT_VOL_COUNT && in check_attaching_info()
724 ubi_err(ubi, "too large volume ID %d found", in check_attaching_info()
729 for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) { in check_attaching_info()
733 vol = ubi->volumes[i]; in check_attaching_info()
741 ubi_assert(i < ubi->vtbl_slots); in check_attaching_info()
753 ubi_msg(ubi, "finish volume %d removal", av->vol_id); in check_attaching_info()
774 int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_attach_info *ai) in ubi_read_volume_table() argument
785 ubi->vtbl_slots = ubi->leb_size / UBI_VTBL_RECORD_SIZE; in ubi_read_volume_table()
786 if (ubi->vtbl_slots > UBI_MAX_VOLUMES) in ubi_read_volume_table()
787 ubi->vtbl_slots = UBI_MAX_VOLUMES; in ubi_read_volume_table()
789 ubi->vtbl_size = ubi->vtbl_slots * UBI_VTBL_RECORD_SIZE; in ubi_read_volume_table()
790 ubi->vtbl_size = ALIGN(ubi->vtbl_size, ubi->min_io_size); in ubi_read_volume_table()
803 ubi->vtbl = create_empty_lvol(ubi, ai); in ubi_read_volume_table()
804 if (IS_ERR(ubi->vtbl)) in ubi_read_volume_table()
805 return PTR_ERR(ubi->vtbl); in ubi_read_volume_table()
807 ubi_err(ubi, "the layout volume was not found"); in ubi_read_volume_table()
813 ubi_err(ubi, "too many LEBs (%d) in layout volume", in ubi_read_volume_table()
818 ubi->vtbl = process_lvol(ubi, ai, av); in ubi_read_volume_table()
819 if (IS_ERR(ubi->vtbl)) in ubi_read_volume_table()
820 return PTR_ERR(ubi->vtbl); in ubi_read_volume_table()
823 ubi->avail_pebs = ubi->good_peb_count - ubi->corr_peb_count; in ubi_read_volume_table()
829 err = init_volumes(ubi, ai, ubi->vtbl); in ubi_read_volume_table()
837 err = check_attaching_info(ubi, ai); in ubi_read_volume_table()
844 vfree(ubi->vtbl); in ubi_read_volume_table()
845 for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) { in ubi_read_volume_table()
846 kfree(ubi->volumes[i]); in ubi_read_volume_table()
847 ubi->volumes[i] = NULL; in ubi_read_volume_table()
856 static void self_vtbl_check(const struct ubi_device *ubi) in self_vtbl_check() argument
858 if (!ubi_dbg_chk_gen(ubi)) in self_vtbl_check()
861 if (vtbl_check(ubi, ubi->vtbl)) { in self_vtbl_check()
862 ubi_err(ubi, "self-check failed"); in self_vtbl_check()