Lines Matching full:ubi

9  * The UBI Eraseblock Association (EBA) sub-system.
39 #include "ubi.h"
46 * @ubi: UBI device description object
52 unsigned long long ubi_next_sqnum(struct ubi_device *ubi) in ubi_next_sqnum() argument
56 spin_lock(&ubi->ltree_lock); in ubi_next_sqnum()
57 sqnum = ubi->global_sqnum++; in ubi_next_sqnum()
58 spin_unlock(&ubi->ltree_lock); in ubi_next_sqnum()
65 * @ubi: UBI device description object
71 static int ubi_get_compat(const struct ubi_device *ubi, int vol_id) in ubi_get_compat() argument
80 * @ubi: UBI device description object
86 * @ubi->ltree_lock has to be locked.
88 static struct ubi_ltree_entry *ltree_lookup(struct ubi_device *ubi, int vol_id, in ltree_lookup() argument
93 p = ubi->ltree.rb_node; in ltree_lookup()
118 * @ubi: UBI device description object
127 static struct ubi_ltree_entry *ltree_add_entry(struct ubi_device *ubi, in ltree_add_entry() argument
141 spin_lock(&ubi->ltree_lock); in ltree_add_entry()
142 le1 = ltree_lookup(ubi, vol_id, lnum); in ltree_add_entry()
156 * @ubi->ltree RB-tree. in ltree_add_entry()
160 p = &ubi->ltree.rb_node; in ltree_add_entry()
179 rb_insert_color(&le->rb, &ubi->ltree); in ltree_add_entry()
182 spin_unlock(&ubi->ltree_lock); in ltree_add_entry()
190 * @ubi: UBI device description object
197 static int leb_read_lock(struct ubi_device *ubi, int vol_id, int lnum) in leb_read_lock() argument
201 le = ltree_add_entry(ubi, vol_id, lnum); in leb_read_lock()
210 * @ubi: UBI device description object
214 static void leb_read_unlock(struct ubi_device *ubi, int vol_id, int lnum) in leb_read_unlock() argument
218 spin_lock(&ubi->ltree_lock); in leb_read_unlock()
219 le = ltree_lookup(ubi, vol_id, lnum); in leb_read_unlock()
224 rb_erase(&le->rb, &ubi->ltree); in leb_read_unlock()
227 spin_unlock(&ubi->ltree_lock); in leb_read_unlock()
232 * @ubi: UBI device description object
239 static int leb_write_lock(struct ubi_device *ubi, int vol_id, int lnum) in leb_write_lock() argument
243 le = ltree_add_entry(ubi, vol_id, lnum); in leb_write_lock()
252 * @ubi: UBI device description object
261 static int leb_write_trylock(struct ubi_device *ubi, int vol_id, int lnum) in leb_write_trylock() argument
265 le = ltree_add_entry(ubi, vol_id, lnum); in leb_write_trylock()
272 spin_lock(&ubi->ltree_lock); in leb_write_trylock()
276 rb_erase(&le->rb, &ubi->ltree); in leb_write_trylock()
279 spin_unlock(&ubi->ltree_lock); in leb_write_trylock()
286 * @ubi: UBI device description object
290 static void leb_write_unlock(struct ubi_device *ubi, int vol_id, int lnum) in leb_write_unlock() argument
294 spin_lock(&ubi->ltree_lock); in leb_write_unlock()
295 le = ltree_lookup(ubi, vol_id, lnum); in leb_write_unlock()
300 rb_erase(&le->rb, &ubi->ltree); in leb_write_unlock()
303 spin_unlock(&ubi->ltree_lock); in leb_write_unlock()
308 * @ubi: UBI device description object
316 int ubi_eba_unmap_leb(struct ubi_device *ubi, struct ubi_volume *vol, in ubi_eba_unmap_leb() argument
321 if (ubi->ro_mode) in ubi_eba_unmap_leb()
324 err = leb_write_lock(ubi, vol_id, lnum); in ubi_eba_unmap_leb()
335 down_read(&ubi->fm_eba_sem); in ubi_eba_unmap_leb()
337 up_read(&ubi->fm_eba_sem); in ubi_eba_unmap_leb()
338 err = ubi_wl_put_peb(ubi, vol_id, lnum, pnum, 0); in ubi_eba_unmap_leb()
341 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_unmap_leb()
347 * @ubi: UBI device description object
364 int ubi_eba_read_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum, in ubi_eba_read_leb() argument
371 err = leb_read_lock(ubi, vol_id, lnum); in ubi_eba_read_leb()
384 leb_read_unlock(ubi, vol_id, lnum); in ubi_eba_read_leb()
398 vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS); in ubi_eba_read_leb()
404 err = ubi_io_read_vid_hdr(ubi, pnum, vid_hdr, 1); in ubi_eba_read_leb()
417 ubi_warn(ubi, "corrupted VID header at PEB %d, LEB %d:%d", in ubi_eba_read_leb()
422 ubi_ro_mode(ubi); in ubi_eba_read_leb()
433 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_read_leb()
436 err = ubi_io_read_data(ubi, buf, pnum, offset, len); in ubi_eba_read_leb()
445 ubi_msg(ubi, "force data checking"); in ubi_eba_read_leb()
456 ubi_warn(ubi, "CRC error: calculated %#08x, must be %#08x", in ubi_eba_read_leb()
464 err = ubi_wl_scrub_peb(ubi, pnum); in ubi_eba_read_leb()
466 leb_read_unlock(ubi, vol_id, lnum); in ubi_eba_read_leb()
470 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_read_leb()
472 leb_read_unlock(ubi, vol_id, lnum); in ubi_eba_read_leb()
479 * @ubi: UBI device description object
482 * @sgl: UBI scatter gather list to store the read data
488 * storing the read data into a buffer it writes to an UBI scatter gather
491 int ubi_eba_read_leb_sg(struct ubi_device *ubi, struct ubi_volume *vol, in ubi_eba_read_leb_sg() argument
507 ret = ubi_eba_read_leb(ubi, vol, lnum, in ubi_eba_read_leb_sg()
535 * @ubi: UBI device description object
549 static int recover_peb(struct ubi_device *ubi, int pnum, int vol_id, int lnum, in recover_peb() argument
552 int err, idx = vol_id2idx(ubi, vol_id), new_pnum, data_size, tries = 0; in recover_peb()
553 struct ubi_volume *vol = ubi->volumes[idx]; in recover_peb()
556 vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS); in recover_peb()
561 new_pnum = ubi_wl_get_peb(ubi); in recover_peb()
563 ubi_free_vid_hdr(ubi, vid_hdr); in recover_peb()
564 up_read(&ubi->fm_eba_sem); in recover_peb()
568 ubi_msg(ubi, "recover PEB %d, move data to PEB %d", in recover_peb()
571 err = ubi_io_read_vid_hdr(ubi, pnum, vid_hdr, 1); in recover_peb()
575 up_read(&ubi->fm_eba_sem); in recover_peb()
579 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in recover_peb()
580 err = ubi_io_write_vid_hdr(ubi, new_pnum, vid_hdr); in recover_peb()
582 up_read(&ubi->fm_eba_sem); in recover_peb()
587 mutex_lock(&ubi->buf_mutex); in recover_peb()
588 memset(ubi->peb_buf + offset, 0xFF, len); in recover_peb()
592 err = ubi_io_read_data(ubi, ubi->peb_buf, pnum, 0, offset); in recover_peb()
594 up_read(&ubi->fm_eba_sem); in recover_peb()
599 memcpy(ubi->peb_buf + offset, buf, len); in recover_peb()
601 err = ubi_io_write_data(ubi, ubi->peb_buf, new_pnum, 0, data_size); in recover_peb()
603 mutex_unlock(&ubi->buf_mutex); in recover_peb()
604 up_read(&ubi->fm_eba_sem); in recover_peb()
608 mutex_unlock(&ubi->buf_mutex); in recover_peb()
609 ubi_free_vid_hdr(ubi, vid_hdr); in recover_peb()
612 up_read(&ubi->fm_eba_sem); in recover_peb()
613 ubi_wl_put_peb(ubi, vol_id, lnum, pnum, 1); in recover_peb()
615 ubi_msg(ubi, "data was successfully recovered"); in recover_peb()
619 mutex_unlock(&ubi->buf_mutex); in recover_peb()
621 ubi_wl_put_peb(ubi, vol_id, lnum, new_pnum, 1); in recover_peb()
622 ubi_free_vid_hdr(ubi, vid_hdr); in recover_peb()
630 ubi_warn(ubi, "failed to write to PEB %d", new_pnum); in recover_peb()
631 ubi_wl_put_peb(ubi, vol_id, lnum, new_pnum, 1); in recover_peb()
633 ubi_free_vid_hdr(ubi, vid_hdr); in recover_peb()
636 ubi_msg(ubi, "try again"); in recover_peb()
642 * @ubi: UBI device description object
654 int ubi_eba_write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum, in ubi_eba_write_leb() argument
660 if (ubi->ro_mode) in ubi_eba_write_leb()
663 err = leb_write_lock(ubi, vol_id, lnum); in ubi_eba_write_leb()
672 err = ubi_io_write_data(ubi, buf, pnum, offset, len); in ubi_eba_write_leb()
674 ubi_warn(ubi, "failed to write data to PEB %d", pnum); in ubi_eba_write_leb()
675 if (err == -EIO && ubi->bad_allowed) in ubi_eba_write_leb()
676 err = recover_peb(ubi, pnum, vol_id, lnum, buf, in ubi_eba_write_leb()
679 ubi_ro_mode(ubi); in ubi_eba_write_leb()
681 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_write_leb()
689 vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS); in ubi_eba_write_leb()
691 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_write_leb()
696 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_write_leb()
699 vid_hdr->compat = ubi_get_compat(ubi, vol_id); in ubi_eba_write_leb()
703 pnum = ubi_wl_get_peb(ubi); in ubi_eba_write_leb()
705 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_write_leb()
706 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_write_leb()
707 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb()
714 err = ubi_io_write_vid_hdr(ubi, pnum, vid_hdr); in ubi_eba_write_leb()
716 ubi_warn(ubi, "failed to write VID header to LEB %d:%d, PEB %d", in ubi_eba_write_leb()
718 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb()
723 err = ubi_io_write_data(ubi, buf, pnum, offset, len); in ubi_eba_write_leb()
725 ubi_warn(ubi, "failed to write %d bytes at offset %d of LEB %d:%d, PEB %d", in ubi_eba_write_leb()
727 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb()
733 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb()
735 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_write_leb()
736 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_write_leb()
740 if (err != -EIO || !ubi->bad_allowed) { in ubi_eba_write_leb()
741 ubi_ro_mode(ubi); in ubi_eba_write_leb()
742 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_write_leb()
743 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_write_leb()
752 err = ubi_wl_put_peb(ubi, vol_id, lnum, pnum, 1); in ubi_eba_write_leb()
754 ubi_ro_mode(ubi); in ubi_eba_write_leb()
755 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_write_leb()
756 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_write_leb()
760 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_write_leb()
761 ubi_msg(ubi, "try another PEB"); in ubi_eba_write_leb()
767 * @ubi: UBI device description object
787 int ubi_eba_write_leb_st(struct ubi_device *ubi, struct ubi_volume *vol, in ubi_eba_write_leb_st() argument
794 if (ubi->ro_mode) in ubi_eba_write_leb_st()
799 len = ALIGN(data_size, ubi->min_io_size); in ubi_eba_write_leb_st()
801 ubi_assert(!(len & (ubi->min_io_size - 1))); in ubi_eba_write_leb_st()
803 vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS); in ubi_eba_write_leb_st()
807 err = leb_write_lock(ubi, vol_id, lnum); in ubi_eba_write_leb_st()
809 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_write_leb_st()
813 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_write_leb_st()
816 vid_hdr->compat = ubi_get_compat(ubi, vol_id); in ubi_eba_write_leb_st()
826 pnum = ubi_wl_get_peb(ubi); in ubi_eba_write_leb_st()
828 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_write_leb_st()
829 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_write_leb_st()
830 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb_st()
837 err = ubi_io_write_vid_hdr(ubi, pnum, vid_hdr); in ubi_eba_write_leb_st()
839 ubi_warn(ubi, "failed to write VID header to LEB %d:%d, PEB %d", in ubi_eba_write_leb_st()
841 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb_st()
845 err = ubi_io_write_data(ubi, buf, pnum, 0, len); in ubi_eba_write_leb_st()
847 ubi_warn(ubi, "failed to write %d bytes of data to PEB %d", in ubi_eba_write_leb_st()
849 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb_st()
855 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb_st()
857 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_write_leb_st()
858 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_write_leb_st()
862 if (err != -EIO || !ubi->bad_allowed) { in ubi_eba_write_leb_st()
868 ubi_ro_mode(ubi); in ubi_eba_write_leb_st()
869 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_write_leb_st()
870 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_write_leb_st()
874 err = ubi_wl_put_peb(ubi, vol_id, lnum, pnum, 1); in ubi_eba_write_leb_st()
876 ubi_ro_mode(ubi); in ubi_eba_write_leb_st()
877 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_write_leb_st()
878 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_write_leb_st()
882 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_write_leb_st()
883 ubi_msg(ubi, "try another PEB"); in ubi_eba_write_leb_st()
889 * @ubi: UBI device description object
901 * UBI reserves one LEB for the "atomic LEB change" operation, so only one
902 * LEB change may be done at a time. This is ensured by @ubi->alc_mutex.
904 int ubi_eba_atomic_leb_change(struct ubi_device *ubi, struct ubi_volume *vol, in ubi_eba_atomic_leb_change() argument
911 if (ubi->ro_mode) in ubi_eba_atomic_leb_change()
919 err = ubi_eba_unmap_leb(ubi, vol, lnum); in ubi_eba_atomic_leb_change()
922 return ubi_eba_write_leb(ubi, vol, lnum, NULL, 0, 0); in ubi_eba_atomic_leb_change()
925 vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS); in ubi_eba_atomic_leb_change()
929 mutex_lock(&ubi->alc_mutex); in ubi_eba_atomic_leb_change()
930 err = leb_write_lock(ubi, vol_id, lnum); in ubi_eba_atomic_leb_change()
934 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_atomic_leb_change()
937 vid_hdr->compat = ubi_get_compat(ubi, vol_id); in ubi_eba_atomic_leb_change()
947 pnum = ubi_wl_get_peb(ubi); in ubi_eba_atomic_leb_change()
950 up_read(&ubi->fm_eba_sem); in ubi_eba_atomic_leb_change()
957 err = ubi_io_write_vid_hdr(ubi, pnum, vid_hdr); in ubi_eba_atomic_leb_change()
959 ubi_warn(ubi, "failed to write VID header to LEB %d:%d, PEB %d", in ubi_eba_atomic_leb_change()
961 up_read(&ubi->fm_eba_sem); in ubi_eba_atomic_leb_change()
965 err = ubi_io_write_data(ubi, buf, pnum, 0, len); in ubi_eba_atomic_leb_change()
967 ubi_warn(ubi, "failed to write %d bytes of data to PEB %d", in ubi_eba_atomic_leb_change()
969 up_read(&ubi->fm_eba_sem); in ubi_eba_atomic_leb_change()
975 up_read(&ubi->fm_eba_sem); in ubi_eba_atomic_leb_change()
978 err = ubi_wl_put_peb(ubi, vol_id, lnum, old_pnum, 0); in ubi_eba_atomic_leb_change()
984 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_atomic_leb_change()
986 mutex_unlock(&ubi->alc_mutex); in ubi_eba_atomic_leb_change()
987 ubi_free_vid_hdr(ubi, vid_hdr); in ubi_eba_atomic_leb_change()
991 if (err != -EIO || !ubi->bad_allowed) { in ubi_eba_atomic_leb_change()
997 ubi_ro_mode(ubi); in ubi_eba_atomic_leb_change()
1001 err = ubi_wl_put_peb(ubi, vol_id, lnum, pnum, 1); in ubi_eba_atomic_leb_change()
1003 ubi_ro_mode(ubi); in ubi_eba_atomic_leb_change()
1007 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_atomic_leb_change()
1008 ubi_msg(ubi, "try another PEB"); in ubi_eba_atomic_leb_change()
1019 * fatal and UBI will be switched to R/O mode later.
1041 * @ubi: UBI device description object
1053 int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, in ubi_eba_copy_leb() argument
1067 aldata_size = ALIGN(data_size, ubi->min_io_size); in ubi_eba_copy_leb()
1070 ubi->leb_size - be32_to_cpu(vid_hdr->data_pad); in ubi_eba_copy_leb()
1072 idx = vol_id2idx(ubi, vol_id); in ubi_eba_copy_leb()
1073 spin_lock(&ubi->volumes_lock); in ubi_eba_copy_leb()
1080 vol = ubi->volumes[idx]; in ubi_eba_copy_leb()
1081 spin_unlock(&ubi->volumes_lock); in ubi_eba_copy_leb()
1096 * 'ubi_wl_put_peb()' function on the @ubi->move_mutex. In turn, we are in ubi_eba_copy_leb()
1097 * holding @ubi->move_mutex and go sleep on the LEB lock. So, if the in ubi_eba_copy_leb()
1103 err = leb_write_trylock(ubi, vol_id, lnum); in ubi_eba_copy_leb()
1111 * probably waiting on @ubi->move_mutex. No need to continue the work, in ubi_eba_copy_leb()
1123 * this function utilizes the @ubi->peb_buf buffer which is shared in ubi_eba_copy_leb()
1125 * @ubi->buf_mutex. in ubi_eba_copy_leb()
1127 mutex_lock(&ubi->buf_mutex); in ubi_eba_copy_leb()
1129 err = ubi_io_read_data(ubi, ubi->peb_buf, from, 0, aldata_size); in ubi_eba_copy_leb()
1131 ubi_warn(ubi, "error %d while reading data from PEB %d", in ubi_eba_copy_leb()
1149 ubi_calc_data_len(ubi, ubi->peb_buf, data_size); in ubi_eba_copy_leb()
1152 crc = crc32(UBI_CRC32_INIT, ubi->peb_buf, data_size); in ubi_eba_copy_leb()
1166 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_copy_leb()
1168 err = ubi_io_write_vid_hdr(ubi, to, vid_hdr); in ubi_eba_copy_leb()
1178 err = ubi_io_read_vid_hdr(ubi, to, vid_hdr, 1); in ubi_eba_copy_leb()
1181 ubi_warn(ubi, "error %d while reading VID header back from PEB %d", in ubi_eba_copy_leb()
1191 err = ubi_io_write_data(ubi, ubi->peb_buf, to, 0, aldata_size); in ubi_eba_copy_leb()
1204 memset(ubi->peb_buf, 0xFF, aldata_size); in ubi_eba_copy_leb()
1205 err = ubi_io_read_data(ubi, ubi->peb_buf, to, 0, aldata_size); in ubi_eba_copy_leb()
1208 ubi_warn(ubi, "error %d while reading data back from PEB %d", in ubi_eba_copy_leb()
1219 if (crc != crc32(UBI_CRC32_INIT, ubi->peb_buf, data_size)) { in ubi_eba_copy_leb()
1220 ubi_warn(ubi, "read data back from PEB %d and it is different", in ubi_eba_copy_leb()
1228 down_read(&ubi->fm_eba_sem); in ubi_eba_copy_leb()
1230 up_read(&ubi->fm_eba_sem); in ubi_eba_copy_leb()
1233 mutex_unlock(&ubi->buf_mutex); in ubi_eba_copy_leb()
1235 leb_write_unlock(ubi, vol_id, lnum); in ubi_eba_copy_leb()
1241 * @ubi: UBI device description object
1243 * This is a helper function for 'ubi_eba_init()' which is called when UBI
1247 * o if this is a new UBI image, then just print the warning
1248 * o if this is an UBI image which has already been used for some time, print
1252 * The idea is that when UBI is used, PEBs become bad, and the reserved pool
1257 static void print_rsvd_warning(struct ubi_device *ubi, in print_rsvd_warning() argument
1265 int min = ubi->beb_rsvd_level / 10; in print_rsvd_warning()
1269 if (ubi->beb_rsvd_pebs > min) in print_rsvd_warning()
1273 ubi_warn(ubi, "cannot reserve enough PEBs for bad PEB handling, reserved %d, need %d", in print_rsvd_warning()
1274 ubi->beb_rsvd_pebs, ubi->beb_rsvd_level); in print_rsvd_warning()
1275 if (ubi->corr_peb_count) in print_rsvd_warning()
1276 ubi_warn(ubi, "%d PEBs are corrupted and not used", in print_rsvd_warning()
1277 ubi->corr_peb_count); in print_rsvd_warning()
1282 * @ubi: UBI device description object
1283 * @ai_fastmap: UBI attach info object created by fastmap
1284 * @ai_scan: UBI attach info object created by scanning
1290 int self_check_eba(struct ubi_device *ubi, struct ubi_attach_info *ai_fastmap, in self_check_eba() argument
1300 num_volumes = ubi->vtbl_slots + UBI_INT_VOL_COUNT; in self_check_eba()
1313 vol = ubi->volumes[i]; in self_check_eba()
1334 av = ubi_find_av(ai_scan, idx2vol_id(ubi, i)); in self_check_eba()
1341 av = ubi_find_av(ai_fastmap, idx2vol_id(ubi, i)); in self_check_eba()
1354 ubi_err(ubi, "LEB:%i:%i is PEB:%i instead of %i!", in self_check_eba()
1364 if (!ubi->volumes[i]) in self_check_eba()
1378 * @ubi: UBI device description object
1384 int ubi_eba_init(struct ubi_device *ubi, struct ubi_attach_info *ai) in ubi_eba_init() argument
1394 spin_lock_init(&ubi->ltree_lock); in ubi_eba_init()
1395 mutex_init(&ubi->alc_mutex); in ubi_eba_init()
1396 ubi->ltree = RB_ROOT; in ubi_eba_init()
1398 ubi->global_sqnum = ai->max_sqnum + 1; in ubi_eba_init()
1399 num_volumes = ubi->vtbl_slots + UBI_INT_VOL_COUNT; in ubi_eba_init()
1402 vol = ubi->volumes[i]; in ubi_eba_init()
1418 av = ubi_find_av(ai, idx2vol_id(ubi, i)); in ubi_eba_init()
1434 if (ubi->avail_pebs < EBA_RESERVED_PEBS) { in ubi_eba_init()
1435 ubi_err(ubi, "no enough physical eraseblocks (%d, need %d)", in ubi_eba_init()
1436 ubi->avail_pebs, EBA_RESERVED_PEBS); in ubi_eba_init()
1437 if (ubi->corr_peb_count) in ubi_eba_init()
1438 ubi_err(ubi, "%d PEBs are corrupted and not used", in ubi_eba_init()
1439 ubi->corr_peb_count); in ubi_eba_init()
1443 ubi->avail_pebs -= EBA_RESERVED_PEBS; in ubi_eba_init()
1444 ubi->rsvd_pebs += EBA_RESERVED_PEBS; in ubi_eba_init()
1446 if (ubi->bad_allowed) { in ubi_eba_init()
1447 ubi_calculate_reserved(ubi); in ubi_eba_init()
1449 if (ubi->avail_pebs < ubi->beb_rsvd_level) { in ubi_eba_init()
1451 ubi->beb_rsvd_pebs = ubi->avail_pebs; in ubi_eba_init()
1452 print_rsvd_warning(ubi, ai); in ubi_eba_init()
1454 ubi->beb_rsvd_pebs = ubi->beb_rsvd_level; in ubi_eba_init()
1456 ubi->avail_pebs -= ubi->beb_rsvd_pebs; in ubi_eba_init()
1457 ubi->rsvd_pebs += ubi->beb_rsvd_pebs; in ubi_eba_init()
1465 if (!ubi->volumes[i]) in ubi_eba_init()
1467 kfree(ubi->volumes[i]->eba_tbl); in ubi_eba_init()
1468 ubi->volumes[i]->eba_tbl = NULL; in ubi_eba_init()