Lines Matching refs:hd

609  * Search hash table for a hydration with hd->region_nr == region_nr
616 struct dm_clone_region_hydration *hd;
618 hlist_for_each_entry(hd, &bucket->head, h) {
619 if (hd->region_nr == region_nr)
620 return hd;
632 struct dm_clone_region_hydration *hd)
634 hlist_add_head(&hd->h, &bucket->head);
646 struct dm_clone_region_hydration *hd)
650 hd2 = __hash_find(bucket, hd->region_nr);
654 __insert_region_hydration(bucket, hd);
656 return hd;
664 struct dm_clone_region_hydration *hd;
670 hd = mempool_alloc(&clone->hydration_pool, GFP_NOIO);
671 hd->clone = clone;
673 return hd;
676 static inline void free_hydration(struct dm_clone_region_hydration *hd)
678 mempool_free(hd, &hd->clone->hydration_pool);
682 static void hydration_init(struct dm_clone_region_hydration *hd, unsigned long region_nr)
684 hd->region_nr = region_nr;
685 hd->overwrite_bio = NULL;
686 bio_list_init(&hd->deferred_bios);
687 hd->status = 0;
689 INIT_LIST_HEAD(&hd->list);
690 INIT_HLIST_NODE(&hd->h);
699 static int hydration_update_metadata(struct dm_clone_region_hydration *hd)
704 struct clone *clone = hd->clone;
710 if (likely(!r) && hd->status == BLK_STS_OK)
711 r = dm_clone_set_region_hydrated(clone->cmd, hd->region_nr);
713 bucket = get_hash_table_bucket(clone, hd->region_nr);
717 hlist_del(&hd->h);
733 static void hydration_complete(struct dm_clone_region_hydration *hd)
737 struct clone *clone = hd->clone;
739 r = hydration_update_metadata(hd);
741 if (hd->status == BLK_STS_OK && likely(!r)) {
742 if (hd->overwrite_bio)
743 complete_overwrite_bio(clone, hd->overwrite_bio);
745 issue_deferred_bios(clone, &hd->deferred_bios);
747 status = r ? BLK_STS_IOERR : hd->status;
749 if (hd->overwrite_bio)
750 bio_list_add(&hd->deferred_bios, hd->overwrite_bio);
752 fail_bios(&hd->deferred_bios, status);
755 free_hydration(hd);
765 struct dm_clone_region_hydration *tmp, *hd = context;
766 struct clone *clone = hd->clone;
776 list_splice_tail(&hd->list, &batched_hydrations);
778 hd->status = status;
779 hydration_complete(hd);
782 list_for_each_entry_safe(hd, tmp, &batched_hydrations, list) {
783 hd->status = status;
784 hydration_complete(hd);
793 static void hydration_copy(struct dm_clone_region_hydration *hd, unsigned int nr_regions)
798 struct clone *clone = hd->clone;
804 region_start = hd->region_nr;
834 hydration_kcopyd_callback, hd);
839 struct dm_clone_region_hydration *hd = bio->bi_private;
841 bio->bi_end_io = hd->overwrite_bio_end_io;
842 hd->status = bio->bi_status;
844 hydration_complete(hd);
847 static void hydration_overwrite(struct dm_clone_region_hydration *hd, struct bio *bio)
854 hd->overwrite_bio = bio;
855 hd->overwrite_bio_end_io = bio->bi_end_io;
858 bio->bi_private = hd;
860 atomic_inc(&hd->clone->hydrations_in_flight);
878 struct dm_clone_region_hydration *hd, *hd2;
885 hd = __hash_find(bucket, region_nr);
886 if (hd) {
888 bio_list_add(&hd->deferred_bios, bio);
906 hd = alloc_hydration(clone);
907 hydration_init(hd, region_nr);
914 free_hydration(hd);
919 hd2 = __find_or_insert_region_hydration(bucket, hd);
920 if (hd2 != hd) {
924 free_hydration(hd);
934 hlist_del(&hd->h);
936 free_hydration(hd);
950 hydration_overwrite(hd, bio);
952 bio_list_add(&hd->deferred_bios, bio);
954 hydration_copy(hd, 1);
979 struct dm_clone_region_hydration *hd)
981 struct clone *clone = hd->clone;
987 (batch->head->region_nr + batch->nr_batched_regions) == hd->region_nr) {
988 list_add_tail(&hd->list, &batch->head->list);
990 hd = NULL;
994 if (batch->nr_batched_regions >= max_batch_size || hd) {
1001 if (!hd)
1006 hydration_copy(hd, 1);
1011 BUG_ON(!list_empty(&hd->list));
1012 batch->head = hd;
1021 struct dm_clone_region_hydration *hd;
1024 hd = alloc_hydration(clone);
1037 hydration_init(hd, offset);
1038 __insert_region_hydration(bucket, hd);
1042 __batch_hydration(batch, hd);
1051 if (hd)
1052 free_hydration(hd);