Lines Matching refs:mblk
135 struct dmz_mblock *mblk; member
409 struct dmz_mblock *mblk = NULL; in dmz_alloc_mblock() local
414 mblk = list_first_entry_or_null(&zmd->mblk_lru_list, in dmz_alloc_mblock()
416 if (mblk) { in dmz_alloc_mblock()
417 list_del_init(&mblk->link); in dmz_alloc_mblock()
418 rb_erase(&mblk->node, &zmd->mblk_rbtree); in dmz_alloc_mblock()
419 mblk->no = mblk_no; in dmz_alloc_mblock()
422 if (mblk) in dmz_alloc_mblock()
423 return mblk; in dmz_alloc_mblock()
427 mblk = kmalloc(sizeof(struct dmz_mblock), GFP_NOIO); in dmz_alloc_mblock()
428 if (!mblk) in dmz_alloc_mblock()
431 mblk->page = alloc_page(GFP_NOIO); in dmz_alloc_mblock()
432 if (!mblk->page) { in dmz_alloc_mblock()
433 kfree(mblk); in dmz_alloc_mblock()
437 RB_CLEAR_NODE(&mblk->node); in dmz_alloc_mblock()
438 INIT_LIST_HEAD(&mblk->link); in dmz_alloc_mblock()
439 mblk->ref = 0; in dmz_alloc_mblock()
440 mblk->state = 0; in dmz_alloc_mblock()
441 mblk->no = mblk_no; in dmz_alloc_mblock()
442 mblk->data = page_address(mblk->page); in dmz_alloc_mblock()
446 return mblk; in dmz_alloc_mblock()
452 static void dmz_free_mblock(struct dmz_metadata *zmd, struct dmz_mblock *mblk) in dmz_free_mblock() argument
454 __free_pages(mblk->page, 0); in dmz_free_mblock()
455 kfree(mblk); in dmz_free_mblock()
463 static void dmz_insert_mblock(struct dmz_metadata *zmd, struct dmz_mblock *mblk) in dmz_insert_mblock() argument
473 new = (b->no < mblk->no) ? &((*new)->rb_left) : &((*new)->rb_right); in dmz_insert_mblock()
477 rb_link_node(&mblk->node, parent, new); in dmz_insert_mblock()
478 rb_insert_color(&mblk->node, root); in dmz_insert_mblock()
490 struct dmz_mblock *mblk; in dmz_get_mblock_fast() local
493 mblk = container_of(node, struct dmz_mblock, node); in dmz_get_mblock_fast()
494 if (mblk->no == mblk_no) { in dmz_get_mblock_fast()
499 mblk->ref++; in dmz_get_mblock_fast()
500 if (mblk->ref == 1 && in dmz_get_mblock_fast()
501 !test_bit(DMZ_META_DIRTY, &mblk->state)) in dmz_get_mblock_fast()
502 list_del_init(&mblk->link); in dmz_get_mblock_fast()
503 return mblk; in dmz_get_mblock_fast()
505 node = (mblk->no < mblk_no) ? node->rb_left : node->rb_right; in dmz_get_mblock_fast()
516 struct dmz_mblock *mblk = bio->bi_private; in dmz_mblock_bio_end_io() local
520 set_bit(DMZ_META_ERROR, &mblk->state); in dmz_mblock_bio_end_io()
527 clear_bit_unlock(flag, &mblk->state); in dmz_mblock_bio_end_io()
529 wake_up_bit(&mblk->state, flag); in dmz_mblock_bio_end_io()
540 struct dmz_mblock *mblk, *m; in dmz_get_mblock_slow() local
549 mblk = dmz_alloc_mblock(zmd, mblk_no); in dmz_get_mblock_slow()
550 if (!mblk) in dmz_get_mblock_slow()
555 dmz_free_mblock(zmd, mblk); in dmz_get_mblock_slow()
568 dmz_free_mblock(zmd, mblk); in dmz_get_mblock_slow()
573 mblk->ref++; in dmz_get_mblock_slow()
574 set_bit(DMZ_META_READING, &mblk->state); in dmz_get_mblock_slow()
575 dmz_insert_mblock(zmd, mblk); in dmz_get_mblock_slow()
582 bio->bi_private = mblk; in dmz_get_mblock_slow()
585 bio_add_page(bio, mblk->page, DMZ_BLOCK_SIZE, 0); in dmz_get_mblock_slow()
588 return mblk; in dmz_get_mblock_slow()
597 struct dmz_mblock *mblk; in dmz_shrink_mblock_cache() local
606 mblk = list_first_entry(&zmd->mblk_lru_list, in dmz_shrink_mblock_cache()
608 list_del_init(&mblk->link); in dmz_shrink_mblock_cache()
609 rb_erase(&mblk->node, &zmd->mblk_rbtree); in dmz_shrink_mblock_cache()
610 dmz_free_mblock(zmd, mblk); in dmz_shrink_mblock_cache()
648 struct dmz_mblock *mblk) in dmz_release_mblock() argument
651 if (!mblk) in dmz_release_mblock()
656 mblk->ref--; in dmz_release_mblock()
657 if (mblk->ref == 0) { in dmz_release_mblock()
658 if (test_bit(DMZ_META_ERROR, &mblk->state)) { in dmz_release_mblock()
659 rb_erase(&mblk->node, &zmd->mblk_rbtree); in dmz_release_mblock()
660 dmz_free_mblock(zmd, mblk); in dmz_release_mblock()
661 } else if (!test_bit(DMZ_META_DIRTY, &mblk->state)) { in dmz_release_mblock()
662 list_add_tail(&mblk->link, &zmd->mblk_lru_list); in dmz_release_mblock()
677 struct dmz_mblock *mblk; in dmz_get_mblock() local
682 mblk = dmz_get_mblock_fast(zmd, mblk_no); in dmz_get_mblock()
685 if (!mblk) { in dmz_get_mblock()
687 mblk = dmz_get_mblock_slow(zmd, mblk_no); in dmz_get_mblock()
688 if (IS_ERR(mblk)) in dmz_get_mblock()
689 return mblk; in dmz_get_mblock()
693 wait_on_bit_io(&mblk->state, DMZ_META_READING, in dmz_get_mblock()
695 if (test_bit(DMZ_META_ERROR, &mblk->state)) { in dmz_get_mblock()
696 dmz_release_mblock(zmd, mblk); in dmz_get_mblock()
701 return mblk; in dmz_get_mblock()
707 static void dmz_dirty_mblock(struct dmz_metadata *zmd, struct dmz_mblock *mblk) in dmz_dirty_mblock() argument
710 if (!test_and_set_bit(DMZ_META_DIRTY, &mblk->state)) in dmz_dirty_mblock()
711 list_add_tail(&mblk->link, &zmd->mblk_dirty_list); in dmz_dirty_mblock()
718 static int dmz_write_mblock(struct dmz_metadata *zmd, struct dmz_mblock *mblk, in dmz_write_mblock() argument
722 sector_t block = zmd->sb[set].block + mblk->no; in dmz_write_mblock()
730 set_bit(DMZ_META_ERROR, &mblk->state); in dmz_write_mblock()
734 set_bit(DMZ_META_WRITING, &mblk->state); in dmz_write_mblock()
738 bio->bi_private = mblk; in dmz_write_mblock()
741 bio_add_page(bio, mblk->page, DMZ_BLOCK_SIZE, 0); in dmz_write_mblock()
783 struct dmz_mblock *mblk = zmd->sb[set].mblk; in dmz_write_sb() local
820 mblk->page); in dmz_write_sb()
834 struct dmz_mblock *mblk; in dmz_write_dirty_mblocks() local
841 list_for_each_entry(mblk, write_list, link) { in dmz_write_dirty_mblocks()
842 ret = dmz_write_mblock(zmd, mblk, set); in dmz_write_dirty_mblocks()
850 list_for_each_entry(mblk, write_list, link) { in dmz_write_dirty_mblocks()
853 wait_on_bit_io(&mblk->state, DMZ_META_WRITING, in dmz_write_dirty_mblocks()
855 if (test_bit(DMZ_META_ERROR, &mblk->state)) { in dmz_write_dirty_mblocks()
856 clear_bit(DMZ_META_ERROR, &mblk->state); in dmz_write_dirty_mblocks()
900 struct dmz_mblock *mblk; in dmz_flush_metadata() local
962 mblk = list_first_entry(&write_list, struct dmz_mblock, link); in dmz_flush_metadata()
963 list_del_init(&mblk->link); in dmz_flush_metadata()
966 clear_bit(DMZ_META_DIRTY, &mblk->state); in dmz_flush_metadata()
967 if (mblk->ref == 0) in dmz_flush_metadata()
968 list_add_tail(&mblk->link, &zmd->mblk_lru_list); in dmz_flush_metadata()
1122 sb->block, sb->mblk->page); in dmz_read_sb()
1133 struct dmz_mblock *mblk; in dmz_lookup_secondary_sb() local
1138 mblk = dmz_alloc_mblock(zmd, 0); in dmz_lookup_secondary_sb()
1139 if (!mblk) in dmz_lookup_secondary_sb()
1142 zmd->sb[1].mblk = mblk; in dmz_lookup_secondary_sb()
1143 zmd->sb[1].sb = mblk->data; in dmz_lookup_secondary_sb()
1158 dmz_free_mblock(zmd, mblk); in dmz_lookup_secondary_sb()
1159 zmd->sb[1].mblk = NULL; in dmz_lookup_secondary_sb()
1171 struct dmz_mblock *mblk; in dmz_get_sb() local
1175 mblk = dmz_alloc_mblock(zmd, 0); in dmz_get_sb()
1176 if (!mblk) in dmz_get_sb()
1179 sb->mblk = mblk; in dmz_get_sb()
1180 sb->sb = mblk->data; in dmz_get_sb()
1185 dmz_free_mblock(zmd, mblk); in dmz_get_sb()
1186 sb->mblk = NULL; in dmz_get_sb()
1227 if (!zmd->sb[dst_set].mblk) { in dmz_recover_mblocks()
1228 zmd->sb[dst_set].mblk = dmz_alloc_mblock(zmd, 0); in dmz_recover_mblocks()
1229 if (!zmd->sb[dst_set].mblk) { in dmz_recover_mblocks()
1233 zmd->sb[dst_set].sb = zmd->sb[dst_set].mblk->data; in dmz_recover_mblocks()
1355 dmz_free_mblock(zmd, sb->mblk); in dmz_load_sb()
1359 dmz_free_mblock(zmd, sb->mblk); in dmz_load_sb()
2498 struct dmz_mblock *mblk; in dmz_validate_blocks() local
2509 mblk = dmz_get_bitmap(zmd, zone, chunk_block); in dmz_validate_blocks()
2510 if (IS_ERR(mblk)) in dmz_validate_blocks()
2511 return PTR_ERR(mblk); in dmz_validate_blocks()
2517 count = dmz_set_bits((unsigned long *)mblk->data, bit, nr_bits); in dmz_validate_blocks()
2519 dmz_dirty_mblock(zmd, mblk); in dmz_validate_blocks()
2522 dmz_release_mblock(zmd, mblk); in dmz_validate_blocks()
2578 struct dmz_mblock *mblk; in dmz_invalidate_blocks() local
2588 mblk = dmz_get_bitmap(zmd, zone, chunk_block); in dmz_invalidate_blocks()
2589 if (IS_ERR(mblk)) in dmz_invalidate_blocks()
2590 return PTR_ERR(mblk); in dmz_invalidate_blocks()
2596 count = dmz_clear_bits((unsigned long *)mblk->data, in dmz_invalidate_blocks()
2599 dmz_dirty_mblock(zmd, mblk); in dmz_invalidate_blocks()
2602 dmz_release_mblock(zmd, mblk); in dmz_invalidate_blocks()
2625 struct dmz_mblock *mblk; in dmz_test_block() local
2631 mblk = dmz_get_bitmap(zmd, zone, chunk_block); in dmz_test_block()
2632 if (IS_ERR(mblk)) in dmz_test_block()
2633 return PTR_ERR(mblk); in dmz_test_block()
2637 (unsigned long *) mblk->data) != 0; in dmz_test_block()
2639 dmz_release_mblock(zmd, mblk); in dmz_test_block()
2652 struct dmz_mblock *mblk; in dmz_to_next_set_block() local
2662 mblk = dmz_get_bitmap(zmd, zone, chunk_block); in dmz_to_next_set_block()
2663 if (IS_ERR(mblk)) in dmz_to_next_set_block()
2664 return PTR_ERR(mblk); in dmz_to_next_set_block()
2667 bitmap = (unsigned long *) mblk->data; in dmz_to_next_set_block()
2674 dmz_release_mblock(zmd, mblk); in dmz_to_next_set_block()
2762 struct dmz_mblock *mblk; in dmz_get_zone_weight() local
2771 mblk = dmz_get_bitmap(zmd, zone, chunk_block); in dmz_get_zone_weight()
2772 if (IS_ERR(mblk)) { in dmz_get_zone_weight()
2778 bitmap = mblk->data; in dmz_get_zone_weight()
2783 dmz_release_mblock(zmd, mblk); in dmz_get_zone_weight()
2798 struct dmz_mblock *mblk, *next; in dmz_cleanup_metadata() local
2811 if (zmd->sb[i].mblk) { in dmz_cleanup_metadata()
2812 dmz_free_mblock(zmd, zmd->sb[i].mblk); in dmz_cleanup_metadata()
2813 zmd->sb[i].mblk = NULL; in dmz_cleanup_metadata()
2819 mblk = list_first_entry(&zmd->mblk_dirty_list, in dmz_cleanup_metadata()
2822 (u64)mblk->no, mblk->ref); in dmz_cleanup_metadata()
2823 list_del_init(&mblk->link); in dmz_cleanup_metadata()
2824 rb_erase(&mblk->node, &zmd->mblk_rbtree); in dmz_cleanup_metadata()
2825 dmz_free_mblock(zmd, mblk); in dmz_cleanup_metadata()
2829 mblk = list_first_entry(&zmd->mblk_lru_list, in dmz_cleanup_metadata()
2831 list_del_init(&mblk->link); in dmz_cleanup_metadata()
2832 rb_erase(&mblk->node, &zmd->mblk_rbtree); in dmz_cleanup_metadata()
2833 dmz_free_mblock(zmd, mblk); in dmz_cleanup_metadata()
2838 rbtree_postorder_for_each_entry_safe(mblk, next, root, node) { in dmz_cleanup_metadata()
2840 (u64)mblk->no, mblk->ref); in dmz_cleanup_metadata()
2841 mblk->ref = 0; in dmz_cleanup_metadata()
2842 dmz_free_mblock(zmd, mblk); in dmz_cleanup_metadata()