Lines Matching +full:lock +full:- +full:offset

1 // SPDX-License-Identifier: GPL-2.0+
9 * The UBI Eraseblock Association (EBA) sub-system.
11 * This sub-system is responsible for I/O to/from logical eraseblock.
17 * The EBA sub-system implements per-logical eraseblock locking. Before
19 * per-logical eraseblock locking is implemented by means of the lock tree. The
20 * lock tree is an RB-tree which refers all the currently locked logical
21 * eraseblocks. The lock tree elements are &struct ubi_ltree_entry objects.
45 * next_sqnum - get next sequence number.
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()
64 * ubi_get_compat - get compatibility flags of a volume.
79 * ltree_lookup - look up the lock tree.
86 * @ubi->ltree_lock has to be locked.
93 p = ubi->ltree.rb_node; in ltree_lookup()
99 if (vol_id < le->vol_id) in ltree_lookup()
100 p = p->rb_left; in ltree_lookup()
101 else if (vol_id > le->vol_id) in ltree_lookup()
102 p = p->rb_right; in ltree_lookup()
104 if (lnum < le->lnum) in ltree_lookup()
105 p = p->rb_left; in ltree_lookup()
106 else if (lnum > le->lnum) in ltree_lookup()
107 p = p->rb_right; in ltree_lookup()
117 * ltree_add_entry - add new entry to the lock tree.
123 * lock tree. If such entry is already there, its usage counter is increased.
124 * Returns pointer to the lock tree entry or %-ENOMEM if memory allocation
134 return ERR_PTR(-ENOMEM); in ltree_add_entry()
136 le->users = 0; in ltree_add_entry()
137 init_rwsem(&le->mutex); in ltree_add_entry()
138 le->vol_id = vol_id; in ltree_add_entry()
139 le->lnum = lnum; in ltree_add_entry()
141 spin_lock(&ubi->ltree_lock); in ltree_add_entry()
147 * allocated lock entry is not needed. in ltree_add_entry()
155 * No lock entry, add the newly allocated one to the in ltree_add_entry()
156 * @ubi->ltree RB-tree. in ltree_add_entry()
160 p = &ubi->ltree.rb_node; in ltree_add_entry()
165 if (vol_id < le1->vol_id) in ltree_add_entry()
166 p = &(*p)->rb_left; in ltree_add_entry()
167 else if (vol_id > le1->vol_id) in ltree_add_entry()
168 p = &(*p)->rb_right; in ltree_add_entry()
170 ubi_assert(lnum != le1->lnum); in ltree_add_entry()
171 if (lnum < le1->lnum) in ltree_add_entry()
172 p = &(*p)->rb_left; in ltree_add_entry()
174 p = &(*p)->rb_right; in ltree_add_entry()
178 rb_link_node(&le->rb, parent, p); in ltree_add_entry()
179 rb_insert_color(&le->rb, &ubi->ltree); in ltree_add_entry()
181 le->users += 1; in ltree_add_entry()
182 spin_unlock(&ubi->ltree_lock); in ltree_add_entry()
189 * leb_read_lock - lock logical eraseblock for reading.
204 down_read(&le->mutex); in leb_read_lock()
209 * leb_read_unlock - unlock logical eraseblock.
218 spin_lock(&ubi->ltree_lock); in leb_read_unlock()
220 le->users -= 1; in leb_read_unlock()
221 ubi_assert(le->users >= 0); in leb_read_unlock()
222 up_read(&le->mutex); in leb_read_unlock()
223 if (le->users == 0) { 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()
231 * leb_write_lock - lock logical eraseblock for writing.
246 down_write(&le->mutex); in leb_write_lock()
251 * leb_write_lock - lock logical eraseblock for writing.
268 if (down_write_trylock(&le->mutex)) in leb_write_trylock()
272 spin_lock(&ubi->ltree_lock); in leb_write_trylock()
273 le->users -= 1; in leb_write_trylock()
274 ubi_assert(le->users >= 0); in leb_write_trylock()
275 if (le->users == 0) { 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()
285 * leb_write_unlock - unlock logical eraseblock.
294 spin_lock(&ubi->ltree_lock); in leb_write_unlock()
296 le->users -= 1; in leb_write_unlock()
297 ubi_assert(le->users >= 0); in leb_write_unlock()
298 up_write(&le->mutex); in leb_write_unlock()
299 if (le->users == 0) { 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()
307 * ubi_eba_unmap_leb - un-map logical eraseblock.
312 * This function un-maps logical eraseblock @lnum and schedules corresponding
319 int err, pnum, vol_id = vol->vol_id; in ubi_eba_unmap_leb()
321 if (ubi->ro_mode) in ubi_eba_unmap_leb()
322 return -EROFS; in ubi_eba_unmap_leb()
328 pnum = vol->eba_tbl[lnum]; in ubi_eba_unmap_leb()
335 down_read(&ubi->fm_eba_sem); in ubi_eba_unmap_leb()
336 vol->eba_tbl[lnum] = UBI_LEB_UNMAPPED; in ubi_eba_unmap_leb()
337 up_read(&ubi->fm_eba_sem); in ubi_eba_unmap_leb()
346 * ubi_eba_read_leb - read data.
351 * @offset: offset from where to read
360 * if data CRC mismatches - %-EBADMSG is returned. %-EBADMSG may also be
365 void *buf, int offset, int len, int check) in ubi_eba_read_leb() argument
367 int err, pnum, scrub = 0, vol_id = vol->vol_id; in ubi_eba_read_leb()
375 pnum = vol->eba_tbl[lnum]; in ubi_eba_read_leb()
382 dbg_eba("read %d bytes from offset %d of LEB %d:%d (unmapped)", in ubi_eba_read_leb()
383 len, offset, vol_id, lnum); in ubi_eba_read_leb()
385 ubi_assert(vol->vol_type != UBI_STATIC_VOLUME); in ubi_eba_read_leb()
390 dbg_eba("read %d bytes from offset %d of LEB %d:%d, PEB %d", in ubi_eba_read_leb()
391 len, offset, vol_id, lnum, pnum); in ubi_eba_read_leb()
393 if (vol->vol_type == UBI_DYNAMIC_VOLUME) in ubi_eba_read_leb()
400 err = -ENOMEM; in ubi_eba_read_leb()
409 * The former case means there is a bug - in ubi_eba_read_leb()
410 * switch to read-only mode just in case. in ubi_eba_read_leb()
411 * The latter case means a real corruption - we in ubi_eba_read_leb()
419 err = -EBADMSG; in ubi_eba_read_leb()
421 err = -EINVAL; in ubi_eba_read_leb()
429 ubi_assert(lnum < be32_to_cpu(vid_hdr->used_ebs)); in ubi_eba_read_leb()
430 ubi_assert(len == be32_to_cpu(vid_hdr->data_size)); in ubi_eba_read_leb()
432 crc = be32_to_cpu(vid_hdr->data_crc); in ubi_eba_read_leb()
436 err = ubi_io_read_data(ubi, buf, pnum, offset, len); in ubi_eba_read_leb()
441 if (vol->vol_type == UBI_DYNAMIC_VOLUME) in ubi_eba_read_leb()
458 err = -EBADMSG; in ubi_eba_read_leb()
478 * ubi_eba_read_leb_sg - read data into a scatter gather list.
483 * @offset: offset from where to read
492 struct ubi_sgl *sgl, int lnum, int offset, int len, in ubi_eba_read_leb_sg() argument
500 ubi_assert(sgl->list_pos < UBI_MAX_SG_COUNT); in ubi_eba_read_leb_sg()
501 sg = &sgl->sg[sgl->list_pos]; in ubi_eba_read_leb_sg()
502 if (len < sg->length - sgl->page_pos) in ubi_eba_read_leb_sg()
505 to_read = sg->length - sgl->page_pos; in ubi_eba_read_leb_sg()
508 sg_virt(sg) + sgl->page_pos, offset, in ubi_eba_read_leb_sg()
513 offset += to_read; in ubi_eba_read_leb_sg()
514 len -= to_read; in ubi_eba_read_leb_sg()
516 sgl->page_pos += to_read; in ubi_eba_read_leb_sg()
517 if (sgl->page_pos == sg->length) { in ubi_eba_read_leb_sg()
518 sgl->list_pos++; in ubi_eba_read_leb_sg()
519 sgl->page_pos = 0; in ubi_eba_read_leb_sg()
525 sgl->list_pos++; in ubi_eba_read_leb_sg()
526 sgl->page_pos = 0; in ubi_eba_read_leb_sg()
534 * recover_peb - recover from write failure.
540 * @offset: offset of the failed write
550 const void *buf, int offset, int len) in recover_peb() argument
553 struct ubi_volume *vol = ubi->volumes[idx]; in recover_peb()
558 return -ENOMEM; in recover_peb()
564 up_read(&ubi->fm_eba_sem); in recover_peb()
574 err = -EIO; 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()
582 up_read(&ubi->fm_eba_sem); in recover_peb()
586 data_size = offset + len; in recover_peb()
587 mutex_lock(&ubi->buf_mutex); in recover_peb()
588 memset(ubi->peb_buf + offset, 0xFF, len); in recover_peb()
591 if (offset > 0) { 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()
611 vol->eba_tbl[lnum] = new_pnum; in recover_peb()
612 up_read(&ubi->fm_eba_sem); in recover_peb()
619 mutex_unlock(&ubi->buf_mutex); in recover_peb()
641 * ubi_eba_write_leb - write data to dynamic volume.
646 * @offset: offset within the logical eraseblock where to write
655 const void *buf, int offset, int len) in ubi_eba_write_leb() argument
657 int err, pnum, tries = 0, vol_id = vol->vol_id; in ubi_eba_write_leb()
660 if (ubi->ro_mode) in ubi_eba_write_leb()
661 return -EROFS; in ubi_eba_write_leb()
667 pnum = vol->eba_tbl[lnum]; in ubi_eba_write_leb()
669 dbg_eba("write %d bytes at offset %d of LEB %d:%d, PEB %d", in ubi_eba_write_leb()
670 len, offset, vol_id, lnum, pnum); in ubi_eba_write_leb()
672 err = ubi_io_write_data(ubi, buf, pnum, offset, len); in ubi_eba_write_leb()
675 if (err == -EIO && ubi->bad_allowed) in ubi_eba_write_leb()
677 offset, len); in ubi_eba_write_leb()
692 return -ENOMEM; in ubi_eba_write_leb()
695 vid_hdr->vol_type = UBI_VID_DYNAMIC; in ubi_eba_write_leb()
696 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_write_leb()
697 vid_hdr->vol_id = cpu_to_be32(vol_id); in ubi_eba_write_leb()
698 vid_hdr->lnum = cpu_to_be32(lnum); in ubi_eba_write_leb()
699 vid_hdr->compat = ubi_get_compat(ubi, vol_id); in ubi_eba_write_leb()
700 vid_hdr->data_pad = cpu_to_be32(vol->data_pad); in ubi_eba_write_leb()
707 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb()
711 dbg_eba("write VID hdr and %d bytes at offset %d of LEB %d:%d, PEB %d", in ubi_eba_write_leb()
712 len, offset, vol_id, lnum, pnum); 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()
726 len, offset, vol_id, lnum, pnum); in ubi_eba_write_leb()
727 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb()
732 vol->eba_tbl[lnum] = pnum; in ubi_eba_write_leb()
733 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb()
740 if (err != -EIO || !ubi->bad_allowed) { in ubi_eba_write_leb()
760 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_write_leb()
766 * ubi_eba_write_leb_st - write data to static volume.
790 int err, pnum, tries = 0, data_size = len, vol_id = vol->vol_id; in ubi_eba_write_leb_st()
794 if (ubi->ro_mode) in ubi_eba_write_leb_st()
795 return -EROFS; in ubi_eba_write_leb_st()
797 if (lnum == used_ebs - 1) 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()
805 return -ENOMEM; in ubi_eba_write_leb_st()
813 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_write_leb_st()
814 vid_hdr->vol_id = cpu_to_be32(vol_id); in ubi_eba_write_leb_st()
815 vid_hdr->lnum = cpu_to_be32(lnum); in ubi_eba_write_leb_st()
816 vid_hdr->compat = ubi_get_compat(ubi, vol_id); in ubi_eba_write_leb_st()
817 vid_hdr->data_pad = cpu_to_be32(vol->data_pad); in ubi_eba_write_leb_st()
820 vid_hdr->vol_type = UBI_VID_STATIC; in ubi_eba_write_leb_st()
821 vid_hdr->data_size = cpu_to_be32(data_size); in ubi_eba_write_leb_st()
822 vid_hdr->used_ebs = cpu_to_be32(used_ebs); in ubi_eba_write_leb_st()
823 vid_hdr->data_crc = cpu_to_be32(crc); in ubi_eba_write_leb_st()
830 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb_st()
841 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb_st()
849 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb_st()
853 ubi_assert(vol->eba_tbl[lnum] < 0); in ubi_eba_write_leb_st()
854 vol->eba_tbl[lnum] = pnum; in ubi_eba_write_leb_st()
855 up_read(&ubi->fm_eba_sem); in ubi_eba_write_leb_st()
862 if (err != -EIO || !ubi->bad_allowed) { in ubi_eba_write_leb_st()
865 * something nasty and unexpected happened. Switch to read-only in ubi_eba_write_leb_st()
882 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_write_leb_st()
888 * ubi_eba_atomic_leb_change - change logical eraseblock atomically.
896 * has to contain new logical eraseblock data, and @len - the length of the
902 * LEB change may be done at a time. This is ensured by @ubi->alc_mutex.
907 int err, pnum, old_pnum, tries = 0, vol_id = vol->vol_id; in ubi_eba_atomic_leb_change()
911 if (ubi->ro_mode) in ubi_eba_atomic_leb_change()
912 return -EROFS; in ubi_eba_atomic_leb_change()
927 return -ENOMEM; in ubi_eba_atomic_leb_change()
929 mutex_lock(&ubi->alc_mutex); in ubi_eba_atomic_leb_change()
934 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_atomic_leb_change()
935 vid_hdr->vol_id = cpu_to_be32(vol_id); in ubi_eba_atomic_leb_change()
936 vid_hdr->lnum = cpu_to_be32(lnum); in ubi_eba_atomic_leb_change()
937 vid_hdr->compat = ubi_get_compat(ubi, vol_id); in ubi_eba_atomic_leb_change()
938 vid_hdr->data_pad = cpu_to_be32(vol->data_pad); in ubi_eba_atomic_leb_change()
941 vid_hdr->vol_type = UBI_VID_DYNAMIC; in ubi_eba_atomic_leb_change()
942 vid_hdr->data_size = cpu_to_be32(len); in ubi_eba_atomic_leb_change()
943 vid_hdr->copy_flag = 1; in ubi_eba_atomic_leb_change()
944 vid_hdr->data_crc = cpu_to_be32(crc); in ubi_eba_atomic_leb_change()
950 up_read(&ubi->fm_eba_sem); in ubi_eba_atomic_leb_change()
955 vol_id, lnum, vol->eba_tbl[lnum], pnum); in ubi_eba_atomic_leb_change()
961 up_read(&ubi->fm_eba_sem); in ubi_eba_atomic_leb_change()
969 up_read(&ubi->fm_eba_sem); in ubi_eba_atomic_leb_change()
973 old_pnum = vol->eba_tbl[lnum]; in ubi_eba_atomic_leb_change()
974 vol->eba_tbl[lnum] = pnum; in ubi_eba_atomic_leb_change()
975 up_read(&ubi->fm_eba_sem); in ubi_eba_atomic_leb_change()
986 mutex_unlock(&ubi->alc_mutex); in ubi_eba_atomic_leb_change()
991 if (err != -EIO || !ubi->bad_allowed) { in ubi_eba_atomic_leb_change()
994 * something nasty and unexpected happened. Switch to read-only in ubi_eba_atomic_leb_change()
1007 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_atomic_leb_change()
1013 * is_error_sane - check whether a read error is sane.
1018 * code is sane, then we treat this error as non-fatal. Otherwise the error is
1022 * something which suggests there was a real read problem. E.g., %-EIO. Or a
1023 * memory allocation failed (-%ENOMEM). Otherwise, it is safer to switch to R/O
1033 if (err == -EIO || err == -ENOMEM || err == UBI_IO_BAD_HDR || in is_error_sane()
1034 err == UBI_IO_BAD_HDR_EBADMSG || err == -ETIMEDOUT) in is_error_sane()
1040 * ubi_eba_copy_leb - copy logical eraseblock.
1060 vol_id = be32_to_cpu(vid_hdr->vol_id); in ubi_eba_copy_leb()
1061 lnum = be32_to_cpu(vid_hdr->lnum); in ubi_eba_copy_leb()
1065 if (vid_hdr->vol_type == UBI_VID_STATIC) { in ubi_eba_copy_leb()
1066 data_size = be32_to_cpu(vid_hdr->data_size); in ubi_eba_copy_leb()
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()
1073 spin_lock(&ubi->volumes_lock); in ubi_eba_copy_leb()
1077 * volume deletion un-maps all the volume's logical eraseblocks, it will 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()
1090 * are moving it, so lock it. in ubi_eba_copy_leb()
1092 * Note, we are using non-waiting locking here, because we cannot sleep 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()
1100 * we do not know the reasons of the contention - it may be just a in ubi_eba_copy_leb()
1101 * normal I/O on this LEB, so we want to re-try. in ubi_eba_copy_leb()
1111 * probably waiting on @ubi->move_mutex. No need to continue the work, in ubi_eba_copy_leb()
1114 if (vol->eba_tbl[lnum] != from) { in ubi_eba_copy_leb()
1116 vol_id, lnum, from, vol->eba_tbl[lnum]); in ubi_eba_copy_leb()
1123 * this function utilizes the @ubi->peb_buf buffer which is shared in ubi_eba_copy_leb()
1124 * with some other functions - we lock the buffer by taking the 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()
1139 * case of a static volume it is fairly easy - the VID header contains in ubi_eba_copy_leb()
1140 * the data size. In case of a dynamic volume it is more difficult - we in ubi_eba_copy_leb()
1143 * may have some side-effects. And not only this. It is important not in ubi_eba_copy_leb()
1147 if (vid_hdr->vol_type == UBI_VID_DYNAMIC) 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()
1159 * @vid_hdr->copy_flag, @vid_hdr->data_size, and @vid_hdr->data_crc. in ubi_eba_copy_leb()
1162 vid_hdr->copy_flag = 1; in ubi_eba_copy_leb()
1163 vid_hdr->data_size = cpu_to_be32(data_size); in ubi_eba_copy_leb()
1164 vid_hdr->data_crc = cpu_to_be32(crc); in ubi_eba_copy_leb()
1166 vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); in ubi_eba_copy_leb()
1170 if (err == -EIO) in ubi_eba_copy_leb()
1191 err = ubi_io_write_data(ubi, ubi->peb_buf, to, 0, aldata_size); in ubi_eba_copy_leb()
1193 if (err == -EIO) 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()
1219 if (crc != crc32(UBI_CRC32_INIT, ubi->peb_buf, data_size)) { in ubi_eba_copy_leb()
1222 err = -EINVAL; in ubi_eba_copy_leb()
1227 ubi_assert(vol->eba_tbl[lnum] == from); in ubi_eba_copy_leb()
1228 down_read(&ubi->fm_eba_sem); in ubi_eba_copy_leb()
1229 vol->eba_tbl[lnum] = to; 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()
1240 * print_rsvd_warning - warn about not having enough reserved PEBs.
1264 if (ai->max_sqnum > (1 << 18)) { in print_rsvd_warning()
1265 int min = ubi->beb_rsvd_level / 10; in print_rsvd_warning()
1269 if (ubi->beb_rsvd_pebs > min) 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()
1277 ubi->corr_peb_count); in print_rsvd_warning()
1281 * self_check_eba - run a self check on the EBA table constructed by fastmap.
1300 num_volumes = ubi->vtbl_slots + UBI_INT_VOL_COUNT; in self_check_eba()
1304 return -ENOMEM; in self_check_eba()
1309 return -ENOMEM; in self_check_eba()
1313 vol = ubi->volumes[i]; in self_check_eba()
1317 scan_eba[i] = kmalloc(vol->reserved_pebs * sizeof(**scan_eba), in self_check_eba()
1320 ret = -ENOMEM; in self_check_eba()
1324 fm_eba[i] = kmalloc(vol->reserved_pebs * sizeof(**fm_eba), in self_check_eba()
1327 ret = -ENOMEM; in self_check_eba()
1331 for (j = 0; j < vol->reserved_pebs; j++) in self_check_eba()
1338 ubi_rb_for_each_entry(rb, aeb, &av->root, u.rb) in self_check_eba()
1339 scan_eba[i][aeb->lnum] = aeb->pnum; in self_check_eba()
1345 ubi_rb_for_each_entry(rb, aeb, &av->root, u.rb) in self_check_eba()
1346 fm_eba[i][aeb->lnum] = aeb->pnum; in self_check_eba()
1348 for (j = 0; j < vol->reserved_pebs; j++) { in self_check_eba()
1355 vol->vol_id, i, fm_eba[i][j], in self_check_eba()
1364 if (!ubi->volumes[i]) in self_check_eba()
1377 * ubi_eba_init - initialize the EBA sub-system using attaching information.
1392 dbg_eba("initialize EBA sub-system"); in ubi_eba_init()
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()
1408 vol->eba_tbl = kmalloc(vol->reserved_pebs * sizeof(int), in ubi_eba_init()
1410 if (!vol->eba_tbl) { in ubi_eba_init()
1411 err = -ENOMEM; in ubi_eba_init()
1415 for (j = 0; j < vol->reserved_pebs; j++) in ubi_eba_init()
1416 vol->eba_tbl[j] = UBI_LEB_UNMAPPED; in ubi_eba_init()
1422 ubi_rb_for_each_entry(rb, aeb, &av->root, u.rb) { in ubi_eba_init()
1423 if (aeb->lnum >= vol->reserved_pebs) in ubi_eba_init()
1426 * during re-size. in ubi_eba_init()
1428 ubi_move_aeb_to_list(av, aeb, &ai->erase); in ubi_eba_init()
1430 vol->eba_tbl[aeb->lnum] = aeb->pnum; in ubi_eba_init()
1434 if (ubi->avail_pebs < EBA_RESERVED_PEBS) { 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()
1439 ubi->corr_peb_count); in ubi_eba_init()
1440 err = -ENOSPC; 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()
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()
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()
1460 dbg_eba("EBA sub-system is initialized"); 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()