Lines Matching refs:eb

199 static loff_t mtdswap_eb_offset(struct mtdswap_dev *d, struct swap_eb *eb)  in mtdswap_eb_offset()  argument
201 return (loff_t)(eb - d->eb_data) * d->mtd->erasesize; in mtdswap_eb_offset()
204 static void mtdswap_eb_detach(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_eb_detach() argument
209 if (eb->root) { in mtdswap_eb_detach()
210 tp = container_of(eb->root, struct mtdswap_tree, root); in mtdswap_eb_detach()
214 rb_erase(&eb->rb, eb->root); in mtdswap_eb_detach()
218 static void __mtdswap_rb_add(struct rb_root *root, struct swap_eb *eb) in __mtdswap_rb_add() argument
227 if (eb->erase_count > cur->erase_count) in __mtdswap_rb_add()
233 rb_link_node(&eb->rb, parent, p); in __mtdswap_rb_add()
234 rb_insert_color(&eb->rb, root); in __mtdswap_rb_add()
237 static void mtdswap_rb_add(struct mtdswap_dev *d, struct swap_eb *eb, int idx) in mtdswap_rb_add() argument
241 if (eb->root == &d->trees[idx].root) in mtdswap_rb_add()
244 mtdswap_eb_detach(d, eb); in mtdswap_rb_add()
246 __mtdswap_rb_add(root, eb); in mtdswap_rb_add()
247 eb->root = root; in mtdswap_rb_add()
266 static int mtdswap_handle_badblock(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_handle_badblock() argument
272 eb->flags |= EBLOCK_BAD; in mtdswap_handle_badblock()
273 mtdswap_eb_detach(d, eb); in mtdswap_handle_badblock()
274 eb->root = NULL; in mtdswap_handle_badblock()
280 offset = mtdswap_eb_offset(d, eb); in mtdswap_handle_badblock()
294 static int mtdswap_handle_write_error(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_handle_write_error() argument
296 unsigned int marked = eb->flags & EBLOCK_FAILED; in mtdswap_handle_write_error()
299 eb->flags |= EBLOCK_FAILED; in mtdswap_handle_write_error()
300 if (curr_write == eb) { in mtdswap_handle_write_error()
304 mtdswap_rb_add(d, eb, MTDSWAP_FAILING); in mtdswap_handle_write_error()
309 return mtdswap_handle_badblock(d, eb); in mtdswap_handle_write_error()
336 static int mtdswap_read_markers(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_read_markers() argument
343 offset = mtdswap_eb_offset(d, eb); in mtdswap_read_markers()
365 eb->erase_count = le32_to_cpu(data->count); in mtdswap_read_markers()
375 eb->flags |= EBLOCK_NOMAGIC; in mtdswap_read_markers()
382 static int mtdswap_write_marker(struct mtdswap_dev *d, struct swap_eb *eb, in mtdswap_write_marker() argument
397 n.count = cpu_to_le32(eb->erase_count); in mtdswap_write_marker()
399 offset = mtdswap_eb_offset(d, eb); in mtdswap_write_marker()
403 offset = mtdswap_eb_offset(d, eb) + d->mtd->writesize; in mtdswap_write_marker()
412 mtdswap_handle_write_error(d, eb); in mtdswap_write_marker()
435 struct swap_eb *eb; in mtdswap_check_counts() local
440 eb = d->eb_data + i; in mtdswap_check_counts()
442 if (eb->flags & (EBLOCK_NOMAGIC | EBLOCK_BAD | EBLOCK_READERR)) in mtdswap_check_counts()
445 __mtdswap_rb_add(&hist_root, eb); in mtdswap_check_counts()
458 eb = d->eb_data + i; in mtdswap_check_counts()
460 if (eb->flags & (EBLOCK_NOMAGIC | EBLOCK_READERR)) in mtdswap_check_counts()
461 eb->erase_count = median; in mtdswap_check_counts()
463 if (eb->flags & (EBLOCK_NOMAGIC | EBLOCK_BAD | EBLOCK_READERR)) in mtdswap_check_counts()
466 rb_erase(&eb->rb, &hist_root); in mtdswap_check_counts()
474 struct swap_eb *eb; in mtdswap_scan_eblks() local
477 eb = d->eb_data + i; in mtdswap_scan_eblks()
479 status = mtdswap_read_markers(d, eb); in mtdswap_scan_eblks()
481 eb->flags |= EBLOCK_READERR; in mtdswap_scan_eblks()
483 eb->flags |= EBLOCK_BAD; in mtdswap_scan_eblks()
499 eb->flags |= (idx << EBLOCK_IDX_SHIFT); in mtdswap_scan_eblks()
505 eb = d->eb_data + i; in mtdswap_scan_eblks()
507 if (eb->flags & EBLOCK_BAD) in mtdswap_scan_eblks()
510 idx = eb->flags >> EBLOCK_IDX_SHIFT; in mtdswap_scan_eblks()
511 mtdswap_rb_add(d, eb, idx); in mtdswap_scan_eblks()
519 static void mtdswap_store_eb(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_store_eb() argument
521 unsigned int weight = eb->active_count; in mtdswap_store_eb()
524 if (eb == d->curr_write) in mtdswap_store_eb()
527 if (eb->flags & EBLOCK_BITFLIP) in mtdswap_store_eb()
528 mtdswap_rb_add(d, eb, MTDSWAP_BITFLIP); in mtdswap_store_eb()
529 else if (eb->flags & (EBLOCK_READERR | EBLOCK_FAILED)) in mtdswap_store_eb()
530 mtdswap_rb_add(d, eb, MTDSWAP_FAILING); in mtdswap_store_eb()
532 mtdswap_rb_add(d, eb, MTDSWAP_USED); in mtdswap_store_eb()
534 mtdswap_rb_add(d, eb, MTDSWAP_DIRTY); in mtdswap_store_eb()
536 mtdswap_rb_add(d, eb, MTDSWAP_LOWFRAG); in mtdswap_store_eb()
538 mtdswap_rb_add(d, eb, MTDSWAP_HIFRAG); in mtdswap_store_eb()
548 static int mtdswap_erase_block(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_erase_block() argument
556 eb->erase_count++; in mtdswap_erase_block()
557 if (eb->erase_count > d->max_erase_count) in mtdswap_erase_block()
558 d->max_erase_count = eb->erase_count; in mtdswap_erase_block()
566 erase.addr = mtdswap_eb_offset(d, eb); in mtdswap_erase_block()
583 mtdswap_handle_badblock(d, eb); in mtdswap_erase_block()
604 mtdswap_handle_badblock(d, eb); in mtdswap_erase_block()
617 struct swap_eb *eb; in mtdswap_map_free_block() local
625 eb = rb_entry(rb_first(clean_root), struct swap_eb, rb); in mtdswap_map_free_block()
626 rb_erase(&eb->rb, clean_root); in mtdswap_map_free_block()
627 eb->root = NULL; in mtdswap_map_free_block()
630 ret = mtdswap_write_marker(d, eb, MTDSWAP_TYPE_DIRTY); in mtdswap_map_free_block()
637 d->curr_write = eb; in mtdswap_map_free_block()
667 struct swap_eb *eb; in mtdswap_write_block() local
679 eb = d->eb_data + (*bp / d->pages_per_eblk); in mtdswap_write_block()
683 eb->active_count--; in mtdswap_write_block()
695 eb->active_count--; in mtdswap_write_block()
697 mtdswap_handle_write_error(d, eb); in mtdswap_write_block()
718 eb->active_count--; in mtdswap_write_block()
728 struct swap_eb *eb, *oldeb; in mtdswap_move_block() local
768 eb = d->eb_data + *newblock / d->pages_per_eblk; in mtdswap_move_block()
771 eb = d->eb_data + oldblock / d->pages_per_eblk; in mtdswap_move_block()
772 eb->active_count--; in mtdswap_move_block()
782 static int mtdswap_gc_eblock(struct mtdswap_dev *d, struct swap_eb *eb) in mtdswap_gc_eblock() argument
788 eblk_base = (eb - d->eb_data) * d->pages_per_eblk; in mtdswap_gc_eblock()
898 struct swap_eb *eb = NULL; in mtdswap_pick_gc_eblk() local
910 eb = rb_entry(rb_first(rp), struct swap_eb, rb); in mtdswap_pick_gc_eblk()
912 rb_erase(&eb->rb, rp); in mtdswap_pick_gc_eblk()
913 eb->root = NULL; in mtdswap_pick_gc_eblk()
915 return eb; in mtdswap_pick_gc_eblk()
924 struct swap_eb *eb) in mtdswap_eblk_passes() argument
940 base = mtdswap_eb_offset(d, eb); in mtdswap_eblk_passes()
974 ret = mtdswap_erase_block(d, eb); in mtdswap_eblk_passes()
979 eb->flags &= ~EBLOCK_READERR; in mtdswap_eblk_passes()
983 mtdswap_handle_badblock(d, eb); in mtdswap_eblk_passes()
989 struct swap_eb *eb; in mtdswap_gc() local
995 eb = mtdswap_pick_gc_eblk(d, background); in mtdswap_gc()
996 if (!eb) in mtdswap_gc()
999 ret = mtdswap_gc_eblock(d, eb); in mtdswap_gc()
1003 if (eb->flags & EBLOCK_FAILED) { in mtdswap_gc()
1004 mtdswap_handle_badblock(d, eb); in mtdswap_gc()
1008 eb->flags &= ~EBLOCK_BITFLIP; in mtdswap_gc()
1009 ret = mtdswap_erase_block(d, eb); in mtdswap_gc()
1010 if ((eb->flags & EBLOCK_READERR) && in mtdswap_gc()
1011 (ret || !mtdswap_eblk_passes(d, eb))) in mtdswap_gc()
1015 ret = mtdswap_write_marker(d, eb, MTDSWAP_TYPE_CLEAN); in mtdswap_gc()
1018 mtdswap_rb_add(d, eb, MTDSWAP_CLEAN); in mtdswap_gc()
1020 mtdswap_rb_add(d, eb, MTDSWAP_DIRTY); in mtdswap_gc()
1074 struct swap_eb *eb; in mtdswap_writesect() local
1092 eb = d->eb_data + (mapped / d->pages_per_eblk); in mtdswap_writesect()
1093 eb->active_count--; in mtdswap_writesect()
1094 mtdswap_store_eb(d, eb); in mtdswap_writesect()
1105 eb = d->eb_data + (newblock / d->pages_per_eblk); in mtdswap_writesect()
1134 struct swap_eb *eb; in mtdswap_readsect() local
1156 eb = d->eb_data + (realblock / d->pages_per_eblk); in mtdswap_readsect()
1167 eb->flags |= EBLOCK_BITFLIP; in mtdswap_readsect()
1168 mtdswap_rb_add(d, eb, MTDSWAP_BITFLIP); in mtdswap_readsect()
1174 eb->flags |= EBLOCK_READERR; in mtdswap_readsect()
1175 mtdswap_rb_add(d, eb, MTDSWAP_FAILING); in mtdswap_readsect()
1196 struct swap_eb *eb; in mtdswap_discard() local
1204 eb = d->eb_data + (mapped / d->pages_per_eblk); in mtdswap_discard()
1205 eb->active_count--; in mtdswap_discard()
1206 mtdswap_store_eb(d, eb); in mtdswap_discard()