Lines Matching refs:eb

184 static loff_t mtdswap_eb_offset(struct mtdswap_dev *d, struct swap_eb *eb)  in mtdswap_eb_offset()  argument
186 return (loff_t)(eb - d->eb_data) * d->mtd->erasesize; in mtdswap_eb_offset()
189 static void mtdswap_eb_detach(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_eb_detach() argument
194 if (eb->root) { in mtdswap_eb_detach()
195 tp = container_of(eb->root, struct mtdswap_tree, root); in mtdswap_eb_detach()
199 rb_erase(&eb->rb, eb->root); in mtdswap_eb_detach()
203 static void __mtdswap_rb_add(struct rb_root *root, struct swap_eb *eb) in __mtdswap_rb_add() argument
212 if (eb->erase_count > cur->erase_count) in __mtdswap_rb_add()
218 rb_link_node(&eb->rb, parent, p); in __mtdswap_rb_add()
219 rb_insert_color(&eb->rb, root); in __mtdswap_rb_add()
222 static void mtdswap_rb_add(struct mtdswap_dev *d, struct swap_eb *eb, int idx) in mtdswap_rb_add() argument
226 if (eb->root == &d->trees[idx].root) in mtdswap_rb_add()
229 mtdswap_eb_detach(d, eb); in mtdswap_rb_add()
231 __mtdswap_rb_add(root, eb); in mtdswap_rb_add()
232 eb->root = root; in mtdswap_rb_add()
251 static int mtdswap_handle_badblock(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_handle_badblock() argument
257 eb->flags |= EBLOCK_BAD; in mtdswap_handle_badblock()
258 mtdswap_eb_detach(d, eb); in mtdswap_handle_badblock()
259 eb->root = NULL; in mtdswap_handle_badblock()
265 offset = mtdswap_eb_offset(d, eb); in mtdswap_handle_badblock()
279 static int mtdswap_handle_write_error(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_handle_write_error() argument
281 unsigned int marked = eb->flags & EBLOCK_FAILED; in mtdswap_handle_write_error()
284 eb->flags |= EBLOCK_FAILED; in mtdswap_handle_write_error()
285 if (curr_write == eb) { in mtdswap_handle_write_error()
289 mtdswap_rb_add(d, eb, MTDSWAP_FAILING); in mtdswap_handle_write_error()
294 return mtdswap_handle_badblock(d, eb); in mtdswap_handle_write_error()
321 static int mtdswap_read_markers(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_read_markers() argument
328 offset = mtdswap_eb_offset(d, eb); in mtdswap_read_markers()
350 eb->erase_count = le32_to_cpu(data->count); in mtdswap_read_markers()
360 eb->flags |= EBLOCK_NOMAGIC; in mtdswap_read_markers()
367 static int mtdswap_write_marker(struct mtdswap_dev *d, struct swap_eb *eb, in mtdswap_write_marker() argument
382 n.count = cpu_to_le32(eb->erase_count); in mtdswap_write_marker()
384 offset = mtdswap_eb_offset(d, eb); in mtdswap_write_marker()
388 offset = mtdswap_eb_offset(d, eb) + d->mtd->writesize; in mtdswap_write_marker()
397 mtdswap_handle_write_error(d, eb); in mtdswap_write_marker()
420 struct swap_eb *eb; in mtdswap_check_counts() local
425 eb = d->eb_data + i; in mtdswap_check_counts()
427 if (eb->flags & (EBLOCK_NOMAGIC | EBLOCK_BAD | EBLOCK_READERR)) in mtdswap_check_counts()
430 __mtdswap_rb_add(&hist_root, eb); in mtdswap_check_counts()
443 eb = d->eb_data + i; in mtdswap_check_counts()
445 if (eb->flags & (EBLOCK_NOMAGIC | EBLOCK_READERR)) in mtdswap_check_counts()
446 eb->erase_count = median; in mtdswap_check_counts()
448 if (eb->flags & (EBLOCK_NOMAGIC | EBLOCK_BAD | EBLOCK_READERR)) in mtdswap_check_counts()
451 rb_erase(&eb->rb, &hist_root); in mtdswap_check_counts()
459 struct swap_eb *eb; in mtdswap_scan_eblks() local
462 eb = d->eb_data + i; in mtdswap_scan_eblks()
464 status = mtdswap_read_markers(d, eb); in mtdswap_scan_eblks()
466 eb->flags |= EBLOCK_READERR; in mtdswap_scan_eblks()
468 eb->flags |= EBLOCK_BAD; in mtdswap_scan_eblks()
484 eb->flags |= (idx << EBLOCK_IDX_SHIFT); in mtdswap_scan_eblks()
490 eb = d->eb_data + i; in mtdswap_scan_eblks()
492 if (eb->flags & EBLOCK_BAD) in mtdswap_scan_eblks()
495 idx = eb->flags >> EBLOCK_IDX_SHIFT; in mtdswap_scan_eblks()
496 mtdswap_rb_add(d, eb, idx); in mtdswap_scan_eblks()
504 static void mtdswap_store_eb(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_store_eb() argument
506 unsigned int weight = eb->active_count; in mtdswap_store_eb()
509 if (eb == d->curr_write) in mtdswap_store_eb()
512 if (eb->flags & EBLOCK_BITFLIP) in mtdswap_store_eb()
513 mtdswap_rb_add(d, eb, MTDSWAP_BITFLIP); in mtdswap_store_eb()
514 else if (eb->flags & (EBLOCK_READERR | EBLOCK_FAILED)) in mtdswap_store_eb()
515 mtdswap_rb_add(d, eb, MTDSWAP_FAILING); in mtdswap_store_eb()
517 mtdswap_rb_add(d, eb, MTDSWAP_USED); in mtdswap_store_eb()
519 mtdswap_rb_add(d, eb, MTDSWAP_DIRTY); in mtdswap_store_eb()
521 mtdswap_rb_add(d, eb, MTDSWAP_LOWFRAG); in mtdswap_store_eb()
523 mtdswap_rb_add(d, eb, MTDSWAP_HIFRAG); in mtdswap_store_eb()
526 static int mtdswap_erase_block(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_erase_block() argument
533 eb->erase_count++; in mtdswap_erase_block()
534 if (eb->erase_count > d->max_erase_count) in mtdswap_erase_block()
535 d->max_erase_count = eb->erase_count; in mtdswap_erase_block()
539 erase.addr = mtdswap_eb_offset(d, eb); in mtdswap_erase_block()
555 mtdswap_handle_badblock(d, eb); in mtdswap_erase_block()
568 struct swap_eb *eb; in mtdswap_map_free_block() local
576 eb = rb_entry(rb_first(clean_root), struct swap_eb, rb); in mtdswap_map_free_block()
577 rb_erase(&eb->rb, clean_root); in mtdswap_map_free_block()
578 eb->root = NULL; in mtdswap_map_free_block()
581 ret = mtdswap_write_marker(d, eb, MTDSWAP_TYPE_DIRTY); in mtdswap_map_free_block()
588 d->curr_write = eb; in mtdswap_map_free_block()
618 struct swap_eb *eb; in mtdswap_write_block() local
630 eb = d->eb_data + (*bp / d->pages_per_eblk); in mtdswap_write_block()
634 eb->active_count--; in mtdswap_write_block()
646 eb->active_count--; in mtdswap_write_block()
648 mtdswap_handle_write_error(d, eb); in mtdswap_write_block()
669 eb->active_count--; in mtdswap_write_block()
679 struct swap_eb *eb, *oldeb; in mtdswap_move_block() local
721 eb = d->eb_data + oldblock / d->pages_per_eblk; in mtdswap_move_block()
722 eb->active_count--; in mtdswap_move_block()
732 static int mtdswap_gc_eblock(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_gc_eblock() argument
738 eblk_base = (eb - d->eb_data) * d->pages_per_eblk; in mtdswap_gc_eblock()
848 struct swap_eb *eb = NULL; in mtdswap_pick_gc_eblk() local
860 eb = rb_entry(rb_first(rp), struct swap_eb, rb); in mtdswap_pick_gc_eblk()
862 rb_erase(&eb->rb, rp); in mtdswap_pick_gc_eblk()
863 eb->root = NULL; in mtdswap_pick_gc_eblk()
865 return eb; in mtdswap_pick_gc_eblk()
874 struct swap_eb *eb) in mtdswap_eblk_passes() argument
890 base = mtdswap_eb_offset(d, eb); in mtdswap_eblk_passes()
924 ret = mtdswap_erase_block(d, eb); in mtdswap_eblk_passes()
929 eb->flags &= ~EBLOCK_READERR; in mtdswap_eblk_passes()
933 mtdswap_handle_badblock(d, eb); in mtdswap_eblk_passes()
939 struct swap_eb *eb; in mtdswap_gc() local
945 eb = mtdswap_pick_gc_eblk(d, background); in mtdswap_gc()
946 if (!eb) in mtdswap_gc()
949 ret = mtdswap_gc_eblock(d, eb); in mtdswap_gc()
953 if (eb->flags & EBLOCK_FAILED) { in mtdswap_gc()
954 mtdswap_handle_badblock(d, eb); in mtdswap_gc()
958 eb->flags &= ~EBLOCK_BITFLIP; in mtdswap_gc()
959 ret = mtdswap_erase_block(d, eb); in mtdswap_gc()
960 if ((eb->flags & EBLOCK_READERR) && in mtdswap_gc()
961 (ret || !mtdswap_eblk_passes(d, eb))) in mtdswap_gc()
965 ret = mtdswap_write_marker(d, eb, MTDSWAP_TYPE_CLEAN); in mtdswap_gc()
968 mtdswap_rb_add(d, eb, MTDSWAP_CLEAN); in mtdswap_gc()
970 mtdswap_rb_add(d, eb, MTDSWAP_DIRTY); in mtdswap_gc()
1024 struct swap_eb *eb; in mtdswap_writesect() local
1042 eb = d->eb_data + (mapped / d->pages_per_eblk); in mtdswap_writesect()
1043 eb->active_count--; in mtdswap_writesect()
1044 mtdswap_store_eb(d, eb); in mtdswap_writesect()
1083 struct swap_eb *eb; in mtdswap_readsect() local
1105 eb = d->eb_data + (realblock / d->pages_per_eblk); in mtdswap_readsect()
1116 eb->flags |= EBLOCK_BITFLIP; in mtdswap_readsect()
1117 mtdswap_rb_add(d, eb, MTDSWAP_BITFLIP); in mtdswap_readsect()
1123 eb->flags |= EBLOCK_READERR; in mtdswap_readsect()
1124 mtdswap_rb_add(d, eb, MTDSWAP_FAILING); in mtdswap_readsect()
1145 struct swap_eb *eb; in mtdswap_discard() local
1153 eb = d->eb_data + (mapped / d->pages_per_eblk); in mtdswap_discard()
1154 eb->active_count--; in mtdswap_discard()
1155 mtdswap_store_eb(d, eb); in mtdswap_discard()