• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/mtd/ubi/

Lines Matching refs:ubi

63 #include "ubi.h"
66 static void paranoid_vtbl_check(const struct ubi_device *ubi);
68 #define paranoid_vtbl_check(ubi)
76 * @ubi: UBI device description object
85 int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
92 ubi_assert(idx >= 0 && idx < ubi->vtbl_slots);
93 layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)];
102 memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record));
104 err = ubi_eba_unmap_leb(ubi, layout_vol, i);
108 err = ubi_eba_write_leb(ubi, layout_vol, i, ubi->vtbl, 0,
109 ubi->vtbl_size, UBI_LONGTERM);
114 paranoid_vtbl_check(ubi);
120 * @ubi: UBI device description object
127 int ubi_vtbl_rename_volumes(struct ubi_device *ubi,
137 struct ubi_vtbl_record *vtbl_rec = &ubi->vtbl[vol->vol_id];
154 layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)];
156 err = ubi_eba_unmap_leb(ubi, layout_vol, i);
160 err = ubi_eba_write_leb(ubi, layout_vol, i, ubi->vtbl, 0,
161 ubi->vtbl_size, UBI_LONGTERM);
171 * @ubi: UBI device description object
177 static int vtbl_check(const struct ubi_device *ubi,
185 for (i = 0; i < ubi->vtbl_slots; i++) {
219 if (alignment > ubi->leb_size || alignment == 0) {
224 n = alignment & (ubi->min_io_size - 1);
230 n = ubi->leb_size % alignment;
247 if (reserved_pebs > ubi->good_peb_count) {
249 reserved_pebs, ubi->good_peb_count);
271 for (i = 0; i < ubi->vtbl_slots - 1; i++) {
272 for (n = i + 1; n < ubi->vtbl_slots; n++) {
297 * @ubi: UBI device description object
305 static int create_vtbl(struct ubi_device *ubi, struct ubi_scan_info *si,
315 vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL);
329 new_seb = ubi_scan_get_free_peb(ubi, si);
344 err = ubi_io_write_vid_hdr(ubi, new_seb->pnum, vid_hdr);
349 err = ubi_io_write_data(ubi, vtbl, new_seb->pnum, 0, ubi->vtbl_size);
357 err = ubi_scan_add_used(ubi, si, new_seb->pnum, new_seb->ec,
360 ubi_free_vid_hdr(ubi, vid_hdr);
374 ubi_free_vid_hdr(ubi, vid_hdr);
381 * @ubi: UBI device description object
389 static struct ubi_vtbl_record *process_lvol(struct ubi_device *ubi,
428 leb[seb->lnum] = vmalloc(ubi->vtbl_size);
433 memset(leb[seb->lnum], 0, ubi->vtbl_size);
435 err = ubi_io_read_data(ubi, leb[seb->lnum], seb->pnum, 0,
436 ubi->vtbl_size);
455 leb_corrupted[0] = vtbl_check(ubi, leb[0]);
464 ubi->vtbl_size);
467 err = create_vtbl(ubi, si, 1, leb[0]);
479 leb_corrupted[1] = vtbl_check(ubi, leb[1]);
490 err = create_vtbl(ubi, si, 0, leb[1]);
507 * @ubi: UBI device description object
513 static struct ubi_vtbl_record *create_empty_lvol(struct ubi_device *ubi,
519 vtbl = vmalloc(ubi->vtbl_size);
522 memset(vtbl, 0, ubi->vtbl_size);
524 for (i = 0; i < ubi->vtbl_slots; i++)
530 err = create_vtbl(ubi, si, i, vtbl);
542 * @ubi: UBI device description object
550 static int init_volumes(struct ubi_device *ubi, const struct ubi_scan_info *si,
557 for (i = 0; i < ubi->vtbl_slots; i++) {
574 vol->usable_leb_size = ubi->leb_size - vol->data_pad;
581 if (ubi->autoresize_vol_id != -1) {
583 "and %d)", ubi->autoresize_vol_id, i);
588 ubi->autoresize_vol_id = i;
591 ubi_assert(!ubi->volumes[i]);
592 ubi->volumes[i] = vol;
593 ubi->vol_count += 1;
594 vol->ubi = ubi;
643 vol->usable_leb_size = ubi->leb_size;
647 (long long)vol->used_ebs * (ubi->leb_size - vol->data_pad);
651 ubi_assert(!ubi->volumes[i]);
652 ubi->volumes[vol_id2idx(ubi, vol->vol_id)] = vol;
654 ubi->vol_count += 1;
655 vol->ubi = ubi;
657 if (reserved_pebs > ubi->avail_pebs)
659 reserved_pebs, ubi->avail_pebs);
660 ubi->rsvd_pebs += reserved_pebs;
661 ubi->avail_pebs -= reserved_pebs;
710 * @ubi: UBI device description object
718 static int check_scanning_info(const struct ubi_device *ubi,
725 if (si->vols_found > UBI_INT_VOL_COUNT + ubi->vtbl_slots) {
727 si->vols_found, UBI_INT_VOL_COUNT, ubi->vtbl_slots);
731 if (si->highest_vol_id >= ubi->vtbl_slots + UBI_INT_VOL_COUNT &&
738 for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) {
742 vol = ubi->volumes[i];
750 ubi_assert(i < ubi->vtbl_slots);
776 * @ubi: UBI device description object
783 int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si)
794 ubi->vtbl_slots = ubi->leb_size / UBI_VTBL_RECORD_SIZE;
795 if (ubi->vtbl_slots > UBI_MAX_VOLUMES)
796 ubi->vtbl_slots = UBI_MAX_VOLUMES;
798 ubi->vtbl_size = ubi->vtbl_slots * UBI_VTBL_RECORD_SIZE;
799 ubi->vtbl_size = ALIGN(ubi->vtbl_size, ubi->min_io_size);
812 ubi->vtbl = create_empty_lvol(ubi, si);
813 if (IS_ERR(ubi->vtbl))
814 return PTR_ERR(ubi->vtbl);
827 ubi->vtbl = process_lvol(ubi, si, sv);
828 if (IS_ERR(ubi->vtbl))
829 return PTR_ERR(ubi->vtbl);
832 ubi->avail_pebs = ubi->good_peb_count;
838 err = init_volumes(ubi, si, ubi->vtbl);
846 err = check_scanning_info(ubi, si);
853 vfree(ubi->vtbl);
854 for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) {
855 kfree(ubi->volumes[i]);
856 ubi->volumes[i] = NULL;
865 * @ubi: UBI device description object
867 static void paranoid_vtbl_check(const struct ubi_device *ubi)
869 if (vtbl_check(ubi, ubi->vtbl)) {