• Home
  • Raw
  • Download

Lines Matching refs:ubi

61 static void self_vtbl_check(const struct ubi_device *ubi);
70 static int ubi_update_layout_vol(struct ubi_device *ubi) in ubi_update_layout_vol() argument
75 layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)]; in ubi_update_layout_vol()
77 err = ubi_eba_atomic_leb_change(ubi, layout_vol, i, ubi->vtbl, in ubi_update_layout_vol()
78 ubi->vtbl_size); in ubi_update_layout_vol()
97 int ubi_change_vtbl_record(struct ubi_device *ubi, int idx, in ubi_change_vtbl_record() argument
103 ubi_assert(idx >= 0 && idx < ubi->vtbl_slots); in ubi_change_vtbl_record()
112 memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record)); in ubi_change_vtbl_record()
113 err = ubi_update_layout_vol(ubi); in ubi_change_vtbl_record()
115 self_vtbl_check(ubi); in ubi_change_vtbl_record()
128 int ubi_vtbl_rename_volumes(struct ubi_device *ubi, in ubi_vtbl_rename_volumes() argument
136 struct ubi_vtbl_record *vtbl_rec = &ubi->vtbl[vol->vol_id]; in ubi_vtbl_rename_volumes()
153 return ubi_update_layout_vol(ubi); in ubi_vtbl_rename_volumes()
164 static int vtbl_check(const struct ubi_device *ubi, argument
172 for (i = 0; i < ubi->vtbl_slots; i++) {
185 ubi_err(ubi, "bad CRC at record %u: %#08x, not %#08x",
206 if (alignment > ubi->leb_size || alignment == 0) {
211 n = alignment & (ubi->min_io_size - 1);
217 n = ubi->leb_size % alignment;
219 ubi_err(ubi, "bad data_pad, has to be %d", n);
234 if (reserved_pebs > ubi->good_peb_count) {
235 ubi_err(ubi, "too large reserved_pebs %d, good PEBs %d",
236 reserved_pebs, ubi->good_peb_count);
258 for (i = 0; i < ubi->vtbl_slots - 1; i++) {
259 for (n = i + 1; n < ubi->vtbl_slots; n++) {
269 ubi_err(ubi, "volumes %d and %d have the same name \"%s\"",
281 ubi_err(ubi, "volume table check failed: record %d, error %d", i, err);
296 static int create_vtbl(struct ubi_device *ubi, struct ubi_attach_info *ai, argument
305 vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL);
310 new_aeb = ubi_early_get_peb(ubi, ai);
325 err = ubi_io_write_vid_hdr(ubi, new_aeb->pnum, vid_hdr);
330 err = ubi_io_write_data(ubi, vtbl, new_aeb->pnum, 0, ubi->vtbl_size);
338 err = ubi_add_to_av(ubi, ai, new_aeb->pnum, new_aeb->ec, vid_hdr, 0);
340 ubi_free_vid_hdr(ubi, vid_hdr);
354 ubi_free_vid_hdr(ubi, vid_hdr);
369 static struct ubi_vtbl_record *process_lvol(struct ubi_device *ubi, argument
408 leb[aeb->lnum] = vzalloc(ubi->vtbl_size);
414 err = ubi_io_read_data(ubi, leb[aeb->lnum], aeb->pnum, 0,
415 ubi->vtbl_size);
434 leb_corrupted[0] = vtbl_check(ubi, leb[0]);
443 ubi->vtbl_size);
445 ubi_warn(ubi, "volume table copy #2 is corrupted");
446 err = create_vtbl(ubi, ai, 1, leb[0]);
449 ubi_msg(ubi, "volume table was restored");
458 leb_corrupted[1] = vtbl_check(ubi, leb[1]);
464 ubi_err(ubi, "both volume tables are corrupted");
468 ubi_warn(ubi, "volume table copy #1 is corrupted");
469 err = create_vtbl(ubi, ai, 0, leb[1]);
472 ubi_msg(ubi, "volume table was restored");
492 static struct ubi_vtbl_record *create_empty_lvol(struct ubi_device *ubi, argument
498 vtbl = vzalloc(ubi->vtbl_size);
502 for (i = 0; i < ubi->vtbl_slots; i++)
508 err = create_vtbl(ubi, ai, i, vtbl);
528 static int init_volumes(struct ubi_device *ubi, argument
536 for (i = 0; i < ubi->vtbl_slots; i++) {
553 vol->usable_leb_size = ubi->leb_size - vol->data_pad;
563 if (ubi->autoresize_vol_id != -1) {
564 ubi_err(ubi, "more than one auto-resize volume (%d and %d)",
565 ubi->autoresize_vol_id, i);
570 ubi->autoresize_vol_id = i;
573 ubi_assert(!ubi->volumes[i]);
574 ubi->volumes[i] = vol;
575 ubi->vol_count += 1;
576 vol->ubi = ubi;
610 ubi_warn(ubi, "static volume %d misses %d LEBs - corrupted",
633 vol->usable_leb_size = ubi->leb_size;
637 (long long)vol->used_ebs * (ubi->leb_size - vol->data_pad);
641 ubi_assert(!ubi->volumes[i]);
642 ubi->volumes[vol_id2idx(ubi, vol->vol_id)] = vol;
644 ubi->vol_count += 1;
645 vol->ubi = ubi;
647 if (reserved_pebs > ubi->avail_pebs) {
648 ubi_err(ubi, "not enough PEBs, required %d, available %d",
649 reserved_pebs, ubi->avail_pebs);
650 if (ubi->corr_peb_count)
651 ubi_err(ubi, "%d PEBs are corrupted and not used",
652 ubi->corr_peb_count);
654 ubi->rsvd_pebs += reserved_pebs;
655 ubi->avail_pebs -= reserved_pebs;
696 ubi_err(vol->ubi, "bad attaching information, error %d", err);
712 static int check_attaching_info(const struct ubi_device *ubi, argument
719 if (ai->vols_found > UBI_INT_VOL_COUNT + ubi->vtbl_slots) {
720 ubi_err(ubi, "found %d volumes while attaching, maximum is %d + %d",
721 ai->vols_found, UBI_INT_VOL_COUNT, ubi->vtbl_slots);
725 if (ai->highest_vol_id >= ubi->vtbl_slots + UBI_INT_VOL_COUNT &&
727 ubi_err(ubi, "too large volume ID %d found",
732 for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) {
736 vol = ubi->volumes[i];
744 ubi_assert(i < ubi->vtbl_slots);
756 ubi_msg(ubi, "finish volume %d removal", av->vol_id);
777 int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_attach_info *ai) argument
788 ubi->vtbl_slots = ubi->leb_size / UBI_VTBL_RECORD_SIZE;
789 if (ubi->vtbl_slots > UBI_MAX_VOLUMES)
790 ubi->vtbl_slots = UBI_MAX_VOLUMES;
792 ubi->vtbl_size = ubi->vtbl_slots * UBI_VTBL_RECORD_SIZE;
793 ubi->vtbl_size = ALIGN(ubi->vtbl_size, ubi->min_io_size);
806 ubi->vtbl = create_empty_lvol(ubi, ai);
807 if (IS_ERR(ubi->vtbl))
808 return PTR_ERR(ubi->vtbl);
810 ubi_err(ubi, "the layout volume was not found");
816 ubi_err(ubi, "too many LEBs (%d) in layout volume",
821 ubi->vtbl = process_lvol(ubi, ai, av);
822 if (IS_ERR(ubi->vtbl))
823 return PTR_ERR(ubi->vtbl);
826 ubi->avail_pebs = ubi->good_peb_count - ubi->corr_peb_count;
832 err = init_volumes(ubi, ai, ubi->vtbl);
840 err = check_attaching_info(ubi, ai);
847 vfree(ubi->vtbl);
848 for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) {
849 kfree(ubi->volumes[i]);
850 ubi->volumes[i] = NULL;
859 static void self_vtbl_check(const struct ubi_device *ubi) argument
861 if (!ubi_dbg_chk_gen(ubi))
864 if (vtbl_check(ubi, ubi->vtbl)) {
865 ubi_err(ubi, "self-check failed");