Lines Matching refs:hd
597 struct dm_clone_region_hydration *hd; in __hash_find() local
599 hlist_for_each_entry(hd, &bucket->head, h) { in __hash_find()
600 if (hd->region_nr == region_nr) in __hash_find()
601 return hd; in __hash_find()
613 struct dm_clone_region_hydration *hd) in __insert_region_hydration() argument
615 hlist_add_head(&hd->h, &bucket->head); in __insert_region_hydration()
627 struct dm_clone_region_hydration *hd) in __find_or_insert_region_hydration() argument
631 hd2 = __hash_find(bucket, hd->region_nr); in __find_or_insert_region_hydration()
635 __insert_region_hydration(bucket, hd); in __find_or_insert_region_hydration()
637 return hd; in __find_or_insert_region_hydration()
645 struct dm_clone_region_hydration *hd; in alloc_hydration() local
651 hd = mempool_alloc(&clone->hydration_pool, GFP_NOIO); in alloc_hydration()
652 hd->clone = clone; in alloc_hydration()
654 return hd; in alloc_hydration()
657 static inline void free_hydration(struct dm_clone_region_hydration *hd) in free_hydration() argument
659 mempool_free(hd, &hd->clone->hydration_pool); in free_hydration()
663 static void hydration_init(struct dm_clone_region_hydration *hd, unsigned long region_nr) in hydration_init() argument
665 hd->region_nr = region_nr; in hydration_init()
666 hd->overwrite_bio = NULL; in hydration_init()
667 bio_list_init(&hd->deferred_bios); in hydration_init()
668 hd->status = 0; in hydration_init()
670 INIT_LIST_HEAD(&hd->list); in hydration_init()
671 INIT_HLIST_NODE(&hd->h); in hydration_init()
680 static int hydration_update_metadata(struct dm_clone_region_hydration *hd) in hydration_update_metadata() argument
685 struct clone *clone = hd->clone; in hydration_update_metadata()
691 if (likely(!r) && hd->status == BLK_STS_OK) in hydration_update_metadata()
692 r = dm_clone_set_region_hydrated(clone->cmd, hd->region_nr); in hydration_update_metadata()
694 bucket = get_hash_table_bucket(clone, hd->region_nr); in hydration_update_metadata()
698 hlist_del(&hd->h); in hydration_update_metadata()
714 static void hydration_complete(struct dm_clone_region_hydration *hd) in hydration_complete() argument
718 struct clone *clone = hd->clone; in hydration_complete()
720 r = hydration_update_metadata(hd); in hydration_complete()
722 if (hd->status == BLK_STS_OK && likely(!r)) { in hydration_complete()
723 if (hd->overwrite_bio) in hydration_complete()
724 complete_overwrite_bio(clone, hd->overwrite_bio); in hydration_complete()
726 issue_deferred_bios(clone, &hd->deferred_bios); in hydration_complete()
728 status = r ? BLK_STS_IOERR : hd->status; in hydration_complete()
730 if (hd->overwrite_bio) in hydration_complete()
731 bio_list_add(&hd->deferred_bios, hd->overwrite_bio); in hydration_complete()
733 fail_bios(&hd->deferred_bios, status); in hydration_complete()
736 free_hydration(hd); in hydration_complete()
746 struct dm_clone_region_hydration *tmp, *hd = context; in hydration_kcopyd_callback() local
747 struct clone *clone = hd->clone; in hydration_kcopyd_callback()
757 list_splice_tail(&hd->list, &batched_hydrations); in hydration_kcopyd_callback()
759 hd->status = status; in hydration_kcopyd_callback()
760 hydration_complete(hd); in hydration_kcopyd_callback()
763 list_for_each_entry_safe(hd, tmp, &batched_hydrations, list) { in hydration_kcopyd_callback()
764 hd->status = status; in hydration_kcopyd_callback()
765 hydration_complete(hd); in hydration_kcopyd_callback()
774 static void hydration_copy(struct dm_clone_region_hydration *hd, unsigned int nr_regions) in hydration_copy() argument
779 struct clone *clone = hd->clone; in hydration_copy()
782 region_start = hd->region_nr; in hydration_copy()
812 hydration_kcopyd_callback, hd); in hydration_copy()
817 struct dm_clone_region_hydration *hd = bio->bi_private; in overwrite_endio() local
819 bio->bi_end_io = hd->overwrite_bio_end_io; in overwrite_endio()
820 hd->status = bio->bi_status; in overwrite_endio()
822 hydration_complete(hd); in overwrite_endio()
825 static void hydration_overwrite(struct dm_clone_region_hydration *hd, struct bio *bio) in hydration_overwrite() argument
832 hd->overwrite_bio = bio; in hydration_overwrite()
833 hd->overwrite_bio_end_io = bio->bi_end_io; in hydration_overwrite()
836 bio->bi_private = hd; in hydration_overwrite()
838 atomic_inc(&hd->clone->hydrations_in_flight); in hydration_overwrite()
857 struct dm_clone_region_hydration *hd, *hd2; in hydrate_bio_region() local
864 hd = __hash_find(bucket, region_nr); in hydrate_bio_region()
865 if (hd) { in hydrate_bio_region()
867 bio_list_add(&hd->deferred_bios, bio); in hydrate_bio_region()
885 hd = alloc_hydration(clone); in hydrate_bio_region()
886 hydration_init(hd, region_nr); in hydrate_bio_region()
893 free_hydration(hd); in hydrate_bio_region()
898 hd2 = __find_or_insert_region_hydration(bucket, hd); in hydrate_bio_region()
899 if (hd2 != hd) { in hydrate_bio_region()
903 free_hydration(hd); in hydrate_bio_region()
913 hlist_del(&hd->h); in hydrate_bio_region()
915 free_hydration(hd); in hydrate_bio_region()
929 hydration_overwrite(hd, bio); in hydrate_bio_region()
931 bio_list_add(&hd->deferred_bios, bio); in hydrate_bio_region()
933 hydration_copy(hd, 1); in hydrate_bio_region()
958 struct dm_clone_region_hydration *hd) in __batch_hydration() argument
960 struct clone *clone = hd->clone; in __batch_hydration()
966 (batch->head->region_nr + batch->nr_batched_regions) == hd->region_nr) { in __batch_hydration()
967 list_add_tail(&hd->list, &batch->head->list); in __batch_hydration()
969 hd = NULL; in __batch_hydration()
973 if (batch->nr_batched_regions >= max_batch_size || hd) { in __batch_hydration()
980 if (!hd) in __batch_hydration()
985 hydration_copy(hd, 1); in __batch_hydration()
990 BUG_ON(!list_empty(&hd->list)); in __batch_hydration()
991 batch->head = hd; in __batch_hydration()
1001 struct dm_clone_region_hydration *hd; in __start_next_hydration() local
1004 hd = alloc_hydration(clone); in __start_next_hydration()
1017 hydration_init(hd, offset); in __start_next_hydration()
1018 __insert_region_hydration(bucket, hd); in __start_next_hydration()
1022 __batch_hydration(batch, hd); in __start_next_hydration()
1031 if (hd) in __start_next_hydration()
1032 free_hydration(hd); in __start_next_hydration()