• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/mtd/ubi/

Lines Matching refs:ubi

62 #include "ubi.h"
65 static void paranoid_vtbl_check(const struct ubi_device *ubi);
67 #define paranoid_vtbl_check(ubi)
75 * @ubi: UBI device description object
84 int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
90 ubi_assert(idx >= 0 && idx < ubi->vtbl_slots);
102 mutex_lock(&ubi->vtbl_mutex);
103 memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record));
105 err = ubi_eba_unmap_leb(ubi, UBI_LAYOUT_VOL_ID, i);
107 mutex_unlock(&ubi->vtbl_mutex);
110 err = ubi_eba_write_leb(ubi, UBI_LAYOUT_VOL_ID, i, ubi->vtbl, 0,
111 ubi->vtbl_size, UBI_LONGTERM);
113 mutex_unlock(&ubi->vtbl_mutex);
118 paranoid_vtbl_check(ubi);
119 mutex_unlock(&ubi->vtbl_mutex);
120 return ubi_wl_flush(ubi);
127 * @ubi: UBI device description object
133 static int vtbl_check(const struct ubi_device *ubi,
141 for (i = 0; i < ubi->vtbl_slots; i++) {
175 if (alignment > ubi->leb_size || alignment == 0) {
180 n = alignment % ubi->min_io_size;
186 n = ubi->leb_size % alignment;
202 if (reserved_pebs > ubi->good_peb_count) {
204 ubi->good_peb_count);
226 for (i = 0; i < ubi->vtbl_slots - 1; i++) {
227 for (n = i + 1; n < ubi->vtbl_slots; n++) {
252 * @ubi: UBI device description object
260 static int create_vtbl(const struct ubi_device *ubi, struct ubi_scan_info *si,
270 vid_hdr = ubi_zalloc_vid_hdr(ubi);
284 new_seb = ubi_scan_get_free_peb(ubi, si);
300 err = ubi_io_write_vid_hdr(ubi, new_seb->pnum, vid_hdr);
305 err = ubi_io_write_data(ubi, vtbl, new_seb->pnum, 0, ubi->vtbl_size);
313 err = ubi_scan_add_used(ubi, si, new_seb->pnum, new_seb->ec,
316 ubi_free_vid_hdr(ubi, vid_hdr);
329 ubi_free_vid_hdr(ubi, vid_hdr);
336 * @ubi: UBI device description object
344 static struct ubi_vtbl_record *process_lvol(const struct ubi_device *ubi,
383 leb[seb->lnum] = kzalloc(ubi->vtbl_size, GFP_KERNEL);
389 err = ubi_io_read_data(ubi, leb[seb->lnum], seb->pnum, 0,
390 ubi->vtbl_size);
400 leb_corrupted[0] = vtbl_check(ubi, leb[0]);
408 leb_corrupted[1] = memcmp(leb[0], leb[1], ubi->vtbl_size);
411 err = create_vtbl(ubi, si, 1, leb[0]);
423 leb_corrupted[1] = vtbl_check(ubi, leb[1]);
434 err = create_vtbl(ubi, si, 0, leb[1]);
451 * @ubi: UBI device description object
457 static struct ubi_vtbl_record *create_empty_lvol(const struct ubi_device *ubi,
463 vtbl = kzalloc(ubi->vtbl_size, GFP_KERNEL);
467 for (i = 0; i < ubi->vtbl_slots; i++)
473 err = create_vtbl(ubi, si, i, vtbl);
485 * @ubi: UBI device description object
493 static int init_volumes(struct ubi_device *ubi, const struct ubi_scan_info *si,
500 for (i = 0; i < ubi->vtbl_slots; i++) {
516 vol->usable_leb_size = ubi->leb_size - vol->data_pad;
521 ubi_assert(!ubi->volumes[i]);
522 ubi->volumes[i] = vol;
523 ubi->vol_count += 1;
524 vol->ubi = ubi;
570 vol->usable_leb_size = ubi->leb_size;
573 vol->used_bytes = vol->used_ebs * (ubi->leb_size - vol->data_pad);
576 ubi_assert(!ubi->volumes[i]);
577 ubi->volumes[vol_id2idx(ubi, vol->vol_id)] = vol;
579 ubi->vol_count += 1;
580 vol->ubi = ubi;
582 if (reserved_pebs > ubi->avail_pebs)
584 reserved_pebs, ubi->avail_pebs);
585 ubi->rsvd_pebs += reserved_pebs;
586 ubi->avail_pebs -= reserved_pebs;
633 * @ubi: UBI device description object
641 static int check_scanning_info(const struct ubi_device *ubi,
648 if (si->vols_found > UBI_INT_VOL_COUNT + ubi->vtbl_slots) {
650 si->vols_found, UBI_INT_VOL_COUNT, ubi->vtbl_slots);
654 if (si->highest_vol_id >= ubi->vtbl_slots + UBI_INT_VOL_COUNT&&
662 for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) {
666 vol = ubi->volumes[i];
674 ubi_assert(i < ubi->vtbl_slots);
701 * @ubi: UBI device description object
708 int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si)
719 ubi->vtbl_slots = ubi->leb_size / UBI_VTBL_RECORD_SIZE;
720 if (ubi->vtbl_slots > UBI_MAX_VOLUMES)
721 ubi->vtbl_slots = UBI_MAX_VOLUMES;
723 ubi->vtbl_size = ubi->vtbl_slots * UBI_VTBL_RECORD_SIZE;
724 ubi->vtbl_size = ALIGN(ubi->vtbl_size, ubi->min_io_size);
737 ubi->vtbl = create_empty_lvol(ubi, si);
738 if (IS_ERR(ubi->vtbl))
739 return PTR_ERR(ubi->vtbl);
752 ubi->vtbl = process_lvol(ubi, si, sv);
753 if (IS_ERR(ubi->vtbl))
754 return PTR_ERR(ubi->vtbl);
757 ubi->avail_pebs = ubi->good_peb_count;
763 err = init_volumes(ubi, si, ubi->vtbl);
771 err = check_scanning_info(ubi, si);
778 kfree(ubi->vtbl);
779 for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++)
780 if (ubi->volumes[i]) {
781 kfree(ubi->volumes[i]);
782 ubi->volumes[i] = NULL;
791 * @ubi: UBI device description object
793 static void paranoid_vtbl_check(const struct ubi_device *ubi)
795 if (vtbl_check(ubi, ubi->vtbl)) {