Lines Matching refs:e

127 				 struct ubi_wl_entry *e, struct rb_root *root);
129 struct ubi_wl_entry *e);
139 static void wl_tree_add(struct ubi_wl_entry *e, struct rb_root *root) in wl_tree_add() argument
150 if (e->ec < e1->ec) in wl_tree_add()
152 else if (e->ec > e1->ec) in wl_tree_add()
155 ubi_assert(e->pnum != e1->pnum); in wl_tree_add()
156 if (e->pnum < e1->pnum) in wl_tree_add()
163 rb_link_node(&e->u.rb, parent, p); in wl_tree_add()
164 rb_insert_color(&e->u.rb, root); in wl_tree_add()
175 static void wl_entry_destroy(struct ubi_device *ubi, struct ubi_wl_entry *e) in wl_entry_destroy() argument
177 ubi->lookuptbl[e->pnum] = NULL; in wl_entry_destroy()
178 kmem_cache_free(ubi_wl_entry_slab, e); in wl_entry_destroy()
236 static int in_wl_tree(struct ubi_wl_entry *e, struct rb_root *root) in in_wl_tree() argument
246 if (e->pnum == e1->pnum) { in in_wl_tree()
247 ubi_assert(e == e1); in in_wl_tree()
251 if (e->ec < e1->ec) in in_wl_tree()
253 else if (e->ec > e1->ec) in in_wl_tree()
256 ubi_assert(e->pnum != e1->pnum); in in_wl_tree()
257 if (e->pnum < e1->pnum) in in_wl_tree()
275 static inline int in_pq(const struct ubi_device *ubi, struct ubi_wl_entry *e) in in_pq() argument
282 if (p == e) in in_pq()
298 static void prot_queue_add(struct ubi_device *ubi, struct ubi_wl_entry *e) in prot_queue_add() argument
305 list_add_tail(&e->u.list, &ubi->pq[pq_tail]); in prot_queue_add()
306 dbg_wl("added PEB %d EC %d to the protection queue", e->pnum, e->ec); in prot_queue_add()
322 struct ubi_wl_entry *e, *prev_e = NULL; in find_wl_entry() local
325 e = rb_entry(rb_first(root), struct ubi_wl_entry, u.rb); in find_wl_entry()
326 max = e->ec + diff; in find_wl_entry()
337 prev_e = e; in find_wl_entry()
338 e = e1; in find_wl_entry()
346 !ubi->fm && e->pnum < UBI_FM_MAX_START) in find_wl_entry()
349 return e; in find_wl_entry()
364 struct ubi_wl_entry *e, *first, *last; in find_mean_wl_entry() local
370 e = rb_entry(root->rb_node, struct ubi_wl_entry, u.rb); in find_mean_wl_entry()
375 e = may_reserve_for_fm(ubi, e, root); in find_mean_wl_entry()
377 e = find_wl_entry(ubi, root, WL_FREE_MAX_DIFF/2); in find_mean_wl_entry()
379 return e; in find_mean_wl_entry()
392 struct ubi_wl_entry *e; in wl_get_wle() local
394 e = find_mean_wl_entry(ubi, &ubi->free); in wl_get_wle()
395 if (!e) { in wl_get_wle()
400 self_check_in_wl_tree(ubi, e, &ubi->free); in wl_get_wle()
406 rb_erase(&e->u.rb, &ubi->free); in wl_get_wle()
408 dbg_wl("PEB %d EC %d", e->pnum, e->ec); in wl_get_wle()
410 return e; in wl_get_wle()
423 struct ubi_wl_entry *e; in prot_queue_del() local
425 e = ubi->lookuptbl[pnum]; in prot_queue_del()
426 if (!e) in prot_queue_del()
429 if (self_check_in_pq(ubi, e)) in prot_queue_del()
432 list_del(&e->u.list); in prot_queue_del()
433 dbg_wl("deleted PEB %d from the protection queue", e->pnum); in prot_queue_del()
446 static int sync_erase(struct ubi_device *ubi, struct ubi_wl_entry *e, in sync_erase() argument
451 unsigned long long ec = e->ec; in sync_erase()
453 dbg_wl("erase PEB %d, old EC %llu", e->pnum, ec); in sync_erase()
455 err = self_check_ec(ubi, e->pnum, e->ec); in sync_erase()
463 err = ubi_io_sync_erase(ubi, e->pnum, torture); in sync_erase()
474 e->pnum, ec); in sync_erase()
479 dbg_wl("erased PEB %d, new EC %llu", e->pnum, ec); in sync_erase()
483 err = ubi_io_write_ec_hdr(ubi, e->pnum, ec_hdr); in sync_erase()
487 e->ec = ec; in sync_erase()
489 if (e->ec > ubi->max_ec) in sync_erase()
490 ubi->max_ec = e->ec; in sync_erase()
508 struct ubi_wl_entry *e, *tmp; in serve_prot_queue() local
518 list_for_each_entry_safe(e, tmp, &ubi->pq[ubi->pq_head], u.list) { in serve_prot_queue()
520 e->pnum, e->ec); in serve_prot_queue()
522 list_del(&e->u.list); in serve_prot_queue()
523 wl_tree_add(e, &ubi->used); in serve_prot_queue()
590 static int schedule_erase(struct ubi_device *ubi, struct ubi_wl_entry *e, in schedule_erase() argument
595 ubi_assert(e); in schedule_erase()
598 e->pnum, e->ec, torture); in schedule_erase()
605 wl_wrk->e = e; in schedule_erase()
627 static int do_sync_erase(struct ubi_device *ubi, struct ubi_wl_entry *e, in do_sync_erase() argument
632 dbg_wl("sync erase of PEB %i", e->pnum); in do_sync_erase()
634 wl_wrk.e = e; in do_sync_erase()
1084 struct ubi_wl_entry *e = wl_wrk->e; local
1085 int pnum = e->pnum;
1091 pnum, e->ec, wl_wrk->vol_id, wl_wrk->lnum);
1093 err = sync_erase(ubi, e, wl_wrk->torture);
1096 wl_tree_add(e, &ubi->free);
1118 err1 = schedule_erase(ubi, e, vol_id, lnum, 0, false);
1120 wl_entry_destroy(ubi, e);
1127 wl_entry_destroy(ubi, e);
1202 struct ubi_wl_entry *e = wl_wrk->e; local
1204 dbg_wl("cancel erasure of PEB %d EC %d", e->pnum, e->ec);
1206 wl_entry_destroy(ubi, e);
1232 struct ubi_wl_entry *e; local
1242 e = ubi->lookuptbl[pnum];
1243 if (e == ubi->move_from) {
1256 } else if (e == ubi->move_to) {
1273 if (in_wl_tree(e, &ubi->used)) {
1274 self_check_in_wl_tree(ubi, e, &ubi->used);
1275 rb_erase(&e->u.rb, &ubi->used);
1276 } else if (in_wl_tree(e, &ubi->scrub)) {
1277 self_check_in_wl_tree(ubi, e, &ubi->scrub);
1278 rb_erase(&e->u.rb, &ubi->scrub);
1279 } else if (in_wl_tree(e, &ubi->erroneous)) {
1280 self_check_in_wl_tree(ubi, e, &ubi->erroneous);
1281 rb_erase(&e->u.rb, &ubi->erroneous);
1287 err = prot_queue_del(ubi, e->pnum);
1299 err = schedule_erase(ubi, e, vol_id, lnum, torture, false);
1302 wl_tree_add(e, &ubi->used);
1322 struct ubi_wl_entry *e; local
1328 e = ubi->lookuptbl[pnum];
1329 if (e == ubi->move_from || in_wl_tree(e, &ubi->scrub) ||
1330 in_wl_tree(e, &ubi->erroneous)) {
1335 if (e == ubi->move_to) {
1348 if (in_wl_tree(e, &ubi->used)) {
1349 self_check_in_wl_tree(ubi, e, &ubi->used);
1350 rb_erase(&e->u.rb, &ubi->used);
1354 err = prot_queue_del(ubi, e->pnum);
1363 wl_tree_add(e, &ubi->scrub);
1436 static bool scrub_possible(struct ubi_device *ubi, struct ubi_wl_entry *e) argument
1438 if (in_wl_tree(e, &ubi->scrub))
1440 else if (in_wl_tree(e, &ubi->erroneous))
1442 else if (ubi->move_from == e)
1444 else if (ubi->move_to == e)
1472 struct ubi_wl_entry *e; local
1490 e = ubi->lookuptbl[pnum];
1491 if (!e) {
1500 if (!scrub_possible(ubi, e)) {
1523 e = ubi->lookuptbl[pnum];
1524 if (!e) {
1533 if (!scrub_possible(ubi, e)) {
1539 if (in_pq(ubi, e)) {
1540 prot_queue_del(ubi, e->pnum);
1541 wl_tree_add(e, &ubi->scrub);
1545 } else if (in_wl_tree(e, &ubi->used)) {
1546 rb_erase(&e->u.rb, &ubi->used);
1547 wl_tree_add(e, &ubi->scrub);
1551 } else if (in_wl_tree(e, &ubi->free)) {
1552 rb_erase(&e->u.rb, &ubi->free);
1560 err = schedule_erase(ubi, e, UBI_UNKNOWN, UBI_UNKNOWN,
1588 struct ubi_wl_entry *e; local
1597 e = rb_entry(rb, struct ubi_wl_entry, u.rb);
1601 if (rb->rb_left == &e->u.rb)
1607 wl_entry_destroy(ubi, e);
1695 struct ubi_wl_entry *e; local
1698 e = kmem_cache_alloc(ubi_wl_entry_slab, GFP_KERNEL);
1699 if (!e)
1702 e->pnum = aeb->pnum;
1703 e->ec = aeb->ec;
1704 ubi->lookuptbl[e->pnum] = e;
1707 err = sync_erase(ubi, e, false);
1711 wl_tree_add(e, &ubi->free);
1714 err = schedule_erase(ubi, e, aeb->vol_id, aeb->lnum, 0, false);
1722 wl_entry_destroy(ubi, e);
1741 struct ubi_wl_entry *e; local
1775 e = kmem_cache_alloc(ubi_wl_entry_slab, GFP_KERNEL);
1776 if (!e) {
1781 e->pnum = aeb->pnum;
1782 e->ec = aeb->ec;
1783 ubi_assert(e->ec >= 0);
1785 wl_tree_add(e, &ubi->free);
1788 ubi->lookuptbl[e->pnum] = e;
1797 e = kmem_cache_alloc(ubi_wl_entry_slab, GFP_KERNEL);
1798 if (!e) {
1803 e->pnum = aeb->pnum;
1804 e->ec = aeb->ec;
1805 ubi->lookuptbl[e->pnum] = e;
1809 e->pnum, e->ec);
1810 wl_tree_add(e, &ubi->used);
1813 e->pnum, e->ec);
1814 wl_tree_add(e, &ubi->scrub);
1824 e = ubi_find_fm_block(ubi, aeb->pnum);
1826 if (e) {
1827 ubi_assert(!ubi->lookuptbl[e->pnum]);
1828 ubi->lookuptbl[e->pnum] = e;
1903 struct ubi_wl_entry *e, *tmp; local
1906 list_for_each_entry_safe(e, tmp, &ubi->pq[i], u.list) {
1907 list_del(&e->u.list);
1908 wl_entry_destroy(ubi, e);
1984 struct ubi_wl_entry *e, struct rb_root *root) argument
1989 if (in_wl_tree(e, root))
1993 e->pnum, e->ec, root);
2007 struct ubi_wl_entry *e) argument
2012 if (in_pq(ubi, e))
2016 e->pnum, e->ec);
2023 struct ubi_wl_entry *e; local
2025 e = find_wl_entry(ubi, &ubi->free, WL_FREE_MAX_DIFF);
2026 self_check_in_wl_tree(ubi, e, &ubi->free);
2029 rb_erase(&e->u.rb, &ubi->free);
2031 return e;
2072 struct ubi_wl_entry *e; local
2095 e = wl_get_wle(ubi);
2096 prot_queue_add(ubi, e);
2099 err = ubi_self_check_all_ff(ubi, e->pnum, ubi->vid_hdr_aloffset,
2102 ubi_err(ubi, "new PEB %d does not contain all 0xFF bytes", e->pnum);
2106 return e->pnum;