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()
242 static int in_wl_tree(struct ubi_wl_entry *e, struct rb_root *root) in in_wl_tree() argument
252 if (e->pnum == e1->pnum) { in in_wl_tree()
253 ubi_assert(e == e1); in in_wl_tree()
257 if (e->ec < e1->ec) in in_wl_tree()
259 else if (e->ec > e1->ec) in in_wl_tree()
262 ubi_assert(e->pnum != e1->pnum); in in_wl_tree()
263 if (e->pnum < e1->pnum) in in_wl_tree()
281 static inline int in_pq(const struct ubi_device *ubi, struct ubi_wl_entry *e) in in_pq() argument
288 if (p == e) in in_pq()
304 static void prot_queue_add(struct ubi_device *ubi, struct ubi_wl_entry *e) in prot_queue_add() argument
311 list_add_tail(&e->u.list, &ubi->pq[pq_tail]); in prot_queue_add()
312 dbg_wl("added PEB %d EC %d to the protection queue", e->pnum, e->ec); in prot_queue_add()
330 struct ubi_wl_entry *e; in find_wl_entry() local
333 e = rb_entry(rb_first(root), struct ubi_wl_entry, u.rb); in find_wl_entry()
334 max = e->ec + diff; in find_wl_entry()
343 e = e1; in find_wl_entry()
347 e = e1; in find_wl_entry()
351 return e; in find_wl_entry()
366 struct ubi_wl_entry *e, *first, *last; in find_mean_wl_entry() local
372 e = rb_entry(root->rb_node, struct ubi_wl_entry, u.rb); in find_mean_wl_entry()
380 e = may_reserve_for_fm(ubi, e, root); in find_mean_wl_entry()
382 e = find_wl_entry(ubi, root, WL_FREE_MAX_DIFF/2, 0); in find_mean_wl_entry()
384 return e; in find_mean_wl_entry()
397 struct ubi_wl_entry *e; in wl_get_wle() local
399 e = find_mean_wl_entry(ubi, &ubi->free); in wl_get_wle()
400 if (!e) { in wl_get_wle()
405 self_check_in_wl_tree(ubi, e, &ubi->free); in wl_get_wle()
411 rb_erase(&e->u.rb, &ubi->free); in wl_get_wle()
413 dbg_wl("PEB %d EC %d", e->pnum, e->ec); in wl_get_wle()
415 return e; in wl_get_wle()
428 struct ubi_wl_entry *e; in prot_queue_del() local
430 e = ubi->lookuptbl[pnum]; in prot_queue_del()
431 if (!e) in prot_queue_del()
434 if (self_check_in_pq(ubi, e)) in prot_queue_del()
437 list_del(&e->u.list); in prot_queue_del()
438 dbg_wl("deleted PEB %d from the protection queue", e->pnum); in prot_queue_del()
451 int ubi_sync_erase(struct ubi_device *ubi, struct ubi_wl_entry *e, int torture) in ubi_sync_erase() argument
455 unsigned long long ec = e->ec; in ubi_sync_erase()
457 dbg_wl("erase PEB %d, old EC %llu", e->pnum, ec); in ubi_sync_erase()
459 err = self_check_ec(ubi, e->pnum, e->ec); in ubi_sync_erase()
467 err = ubi_io_sync_erase(ubi, e->pnum, torture); in ubi_sync_erase()
478 e->pnum, ec); in ubi_sync_erase()
483 dbg_wl("erased PEB %d, new EC %llu", e->pnum, ec); in ubi_sync_erase()
487 err = ubi_io_write_ec_hdr(ubi, e->pnum, ec_hdr); in ubi_sync_erase()
491 e->ec = ec; in ubi_sync_erase()
493 if (e->ec > ubi->max_ec) in ubi_sync_erase()
494 ubi->max_ec = e->ec; in ubi_sync_erase()
512 struct ubi_wl_entry *e, *tmp; in serve_prot_queue() local
522 list_for_each_entry_safe(e, tmp, &ubi->pq[ubi->pq_head], u.list) { in serve_prot_queue()
524 e->pnum, e->ec); in serve_prot_queue()
526 list_del(&e->u.list); in serve_prot_queue()
527 wl_tree_add(e, &ubi->used); in serve_prot_queue()
595 static int schedule_erase(struct ubi_device *ubi, struct ubi_wl_entry *e, in schedule_erase() argument
600 ubi_assert(e); in schedule_erase()
603 e->pnum, e->ec, torture); in schedule_erase()
610 wl_wrk->e = e; in schedule_erase()
632 static int do_sync_erase(struct ubi_device *ubi, struct ubi_wl_entry *e, in do_sync_erase() argument
637 dbg_wl("sync erase of PEB %i", e->pnum); in do_sync_erase()
639 wl_wrk.e = e; in do_sync_erase()
1107 struct ubi_wl_entry *e = wl_wrk->e; local
1108 int pnum = e->pnum;
1114 pnum, e->ec, wl_wrk->vol_id, wl_wrk->lnum);
1116 err = ubi_sync_erase(ubi, e, wl_wrk->torture);
1121 e->pnum < UBI_FM_MAX_START) {
1126 ubi->fm_anchor = e;
1129 wl_tree_add(e, &ubi->free);
1153 err1 = schedule_erase(ubi, e, vol_id, lnum, 0, true);
1156 wl_entry_destroy(ubi, e);
1165 wl_entry_destroy(ubi, e);
1241 struct ubi_wl_entry *e = wl_wrk->e; local
1243 dbg_wl("cancel erasure of PEB %d EC %d", e->pnum, e->ec);
1245 wl_entry_destroy(ubi, e);
1271 struct ubi_wl_entry *e; local
1281 e = ubi->lookuptbl[pnum];
1282 if (!e) {
1294 if (e == ubi->move_from) {
1307 } else if (e == ubi->move_to) {
1324 if (in_wl_tree(e, &ubi->used)) {
1325 self_check_in_wl_tree(ubi, e, &ubi->used);
1326 rb_erase(&e->u.rb, &ubi->used);
1327 } else if (in_wl_tree(e, &ubi->scrub)) {
1328 self_check_in_wl_tree(ubi, e, &ubi->scrub);
1329 rb_erase(&e->u.rb, &ubi->scrub);
1330 } else if (in_wl_tree(e, &ubi->erroneous)) {
1331 self_check_in_wl_tree(ubi, e, &ubi->erroneous);
1332 rb_erase(&e->u.rb, &ubi->erroneous);
1338 err = prot_queue_del(ubi, e->pnum);
1350 err = schedule_erase(ubi, e, vol_id, lnum, torture, false);
1353 wl_tree_add(e, &ubi->used);
1373 struct ubi_wl_entry *e; local
1379 e = ubi->lookuptbl[pnum];
1380 if (e == ubi->move_from || in_wl_tree(e, &ubi->scrub) ||
1381 in_wl_tree(e, &ubi->erroneous)) {
1386 if (e == ubi->move_to) {
1399 if (in_wl_tree(e, &ubi->used)) {
1400 self_check_in_wl_tree(ubi, e, &ubi->used);
1401 rb_erase(&e->u.rb, &ubi->used);
1405 err = prot_queue_del(ubi, e->pnum);
1414 wl_tree_add(e, &ubi->scrub);
1487 static bool scrub_possible(struct ubi_device *ubi, struct ubi_wl_entry *e) argument
1489 if (in_wl_tree(e, &ubi->scrub))
1491 else if (in_wl_tree(e, &ubi->erroneous))
1493 else if (ubi->move_from == e)
1495 else if (ubi->move_to == e)
1523 struct ubi_wl_entry *e; local
1541 e = ubi->lookuptbl[pnum];
1542 if (!e) {
1551 if (!scrub_possible(ubi, e)) {
1574 e = ubi->lookuptbl[pnum];
1575 if (!e) {
1584 if (!scrub_possible(ubi, e)) {
1590 if (in_pq(ubi, e)) {
1591 prot_queue_del(ubi, e->pnum);
1592 wl_tree_add(e, &ubi->scrub);
1596 } else if (in_wl_tree(e, &ubi->used)) {
1597 rb_erase(&e->u.rb, &ubi->used);
1598 wl_tree_add(e, &ubi->scrub);
1602 } else if (in_wl_tree(e, &ubi->free)) {
1603 rb_erase(&e->u.rb, &ubi->free);
1611 err = schedule_erase(ubi, e, UBI_UNKNOWN, UBI_UNKNOWN,
1639 struct ubi_wl_entry *e; local
1648 e = rb_entry(rb, struct ubi_wl_entry, u.rb);
1652 if (rb->rb_left == &e->u.rb)
1658 wl_entry_destroy(ubi, e);
1759 struct ubi_wl_entry *e; local
1762 e = kmem_cache_alloc(ubi_wl_entry_slab, GFP_KERNEL);
1763 if (!e)
1766 e->pnum = aeb->pnum;
1767 e->ec = aeb->ec;
1768 ubi->lookuptbl[e->pnum] = e;
1771 err = ubi_sync_erase(ubi, e, false);
1775 wl_tree_add(e, &ubi->free);
1778 err = schedule_erase(ubi, e, aeb->vol_id, aeb->lnum, 0, false);
1786 wl_entry_destroy(ubi, e);
1805 struct ubi_wl_entry *e; local
1839 e = kmem_cache_alloc(ubi_wl_entry_slab, GFP_KERNEL);
1840 if (!e) {
1845 e->pnum = aeb->pnum;
1846 e->ec = aeb->ec;
1847 ubi_assert(e->ec >= 0);
1849 wl_tree_add(e, &ubi->free);
1852 ubi->lookuptbl[e->pnum] = e;
1861 e = kmem_cache_alloc(ubi_wl_entry_slab, GFP_KERNEL);
1862 if (!e) {
1867 e->pnum = aeb->pnum;
1868 e->ec = aeb->ec;
1869 ubi->lookuptbl[e->pnum] = e;
1873 e->pnum, e->ec);
1874 wl_tree_add(e, &ubi->used);
1877 e->pnum, e->ec);
1878 wl_tree_add(e, &ubi->scrub);
1888 e = ubi_find_fm_block(ubi, aeb->pnum);
1890 if (e) {
1891 ubi_assert(!ubi->lookuptbl[e->pnum]);
1892 ubi->lookuptbl[e->pnum] = e;
1971 struct ubi_wl_entry *e, *tmp; local
1974 list_for_each_entry_safe(e, tmp, &ubi->pq[i], u.list) {
1975 list_del(&e->u.list);
1976 wl_entry_destroy(ubi, e);
2052 struct ubi_wl_entry *e, struct rb_root *root) argument
2057 if (in_wl_tree(e, root))
2061 e->pnum, e->ec, root);
2075 struct ubi_wl_entry *e) argument
2080 if (in_pq(ubi, e))
2084 e->pnum, e->ec);
2091 struct ubi_wl_entry *e; local
2093 e = find_wl_entry(ubi, &ubi->free, WL_FREE_MAX_DIFF, 0);
2094 self_check_in_wl_tree(ubi, e, &ubi->free);
2097 rb_erase(&e->u.rb, &ubi->free);
2099 return e;
2140 struct ubi_wl_entry *e; local
2163 e = wl_get_wle(ubi);
2164 prot_queue_add(ubi, e);
2167 err = ubi_self_check_all_ff(ubi, e->pnum, ubi->vid_hdr_aloffset,
2170 ubi_err(ubi, "new PEB %d does not contain all 0xFF bytes", e->pnum);
2174 return e->pnum;