Lines Matching refs:tc

223 typedef void (*process_bio_fn)(struct thin_c *tc, struct bio *bio);
224 typedef void (*process_cell_fn)(struct thin_c *tc, struct dm_bio_prison_cell *cell);
379 struct thin_c *tc; member
385 static void begin_discard(struct discard_op *op, struct thin_c *tc, struct bio *parent) in begin_discard() argument
389 op->tc = tc; in begin_discard()
397 struct thin_c *tc = op->tc; in issue_discard() local
398 sector_t s = block_to_sectors(tc->pool, data_b); in issue_discard()
399 sector_t len = block_to_sectors(tc->pool, data_e - data_b); in issue_discard()
401 return __blkdev_issue_discard(tc->pool_dev->bdev, s, len, in issue_discard()
584 struct thin_c *tc; member
608 static void error_thin_bio_list(struct thin_c *tc, struct bio_list *master, in error_thin_bio_list() argument
616 spin_lock_irqsave(&tc->lock, flags); in error_thin_bio_list()
618 spin_unlock_irqrestore(&tc->lock, flags); in error_thin_bio_list()
623 static void requeue_deferred_cells(struct thin_c *tc) in requeue_deferred_cells() argument
625 struct pool *pool = tc->pool; in requeue_deferred_cells()
632 spin_lock_irqsave(&tc->lock, flags); in requeue_deferred_cells()
633 list_splice_init(&tc->deferred_cells, &cells); in requeue_deferred_cells()
634 spin_unlock_irqrestore(&tc->lock, flags); in requeue_deferred_cells()
640 static void requeue_io(struct thin_c *tc) in requeue_io() argument
647 spin_lock_irqsave(&tc->lock, flags); in requeue_io()
648 __merge_bio_list(&bios, &tc->deferred_bio_list); in requeue_io()
649 __merge_bio_list(&bios, &tc->retry_on_resume_list); in requeue_io()
650 spin_unlock_irqrestore(&tc->lock, flags); in requeue_io()
653 requeue_deferred_cells(tc); in requeue_io()
658 struct thin_c *tc; in error_retry_list_with_code() local
661 list_for_each_entry_rcu(tc, &pool->active_thins, list) in error_retry_list_with_code()
662 error_thin_bio_list(tc, &tc->retry_on_resume_list, error); in error_retry_list_with_code()
678 static dm_block_t get_bio_block(struct thin_c *tc, struct bio *bio) in get_bio_block() argument
680 struct pool *pool = tc->pool; in get_bio_block()
694 static void get_bio_block_range(struct thin_c *tc, struct bio *bio, in get_bio_block_range() argument
697 struct pool *pool = tc->pool; in get_bio_block_range()
719 static void remap(struct thin_c *tc, struct bio *bio, dm_block_t block) in remap() argument
721 struct pool *pool = tc->pool; in remap()
724 bio_set_dev(bio, tc->pool_dev->bdev); in remap()
734 static void remap_to_origin(struct thin_c *tc, struct bio *bio) in remap_to_origin() argument
736 bio_set_dev(bio, tc->origin_dev->bdev); in remap_to_origin()
739 static int bio_triggers_commit(struct thin_c *tc, struct bio *bio) in bio_triggers_commit() argument
742 dm_thin_changed_this_transaction(tc->td); in bio_triggers_commit()
756 static void issue(struct thin_c *tc, struct bio *bio) in issue() argument
758 struct pool *pool = tc->pool; in issue()
761 if (!bio_triggers_commit(tc, bio)) { in issue()
771 if (dm_thin_aborted_changes(tc->td)) { in issue()
785 static void remap_to_origin_and_issue(struct thin_c *tc, struct bio *bio) in remap_to_origin_and_issue() argument
787 remap_to_origin(tc, bio); in remap_to_origin_and_issue()
788 issue(tc, bio); in remap_to_origin_and_issue()
791 static void remap_and_issue(struct thin_c *tc, struct bio *bio, in remap_and_issue() argument
794 remap(tc, bio, block); in remap_and_issue()
795 issue(tc, bio); in remap_and_issue()
817 struct thin_c *tc; member
834 struct pool *pool = m->tc->pool; in __complete_mapping_preparation()
845 struct pool *pool = m->tc->pool; in complete_mapping_preparation()
885 static void cell_defer_no_holder(struct thin_c *tc, struct dm_bio_prison_cell *cell) in cell_defer_no_holder() argument
887 struct pool *pool = tc->pool; in cell_defer_no_holder()
890 spin_lock_irqsave(&tc->lock, flags); in cell_defer_no_holder()
891 cell_release_no_holder(pool, cell, &tc->deferred_bio_list); in cell_defer_no_holder()
892 spin_unlock_irqrestore(&tc->lock, flags); in cell_defer_no_holder()
897 static void thin_defer_bio(struct thin_c *tc, struct bio *bio);
900 struct thin_c *tc; member
915 inc_all_io_entry(info->tc->pool, bio); in __inc_remap_and_issue_cell()
927 static void inc_remap_and_issue_cell(struct thin_c *tc, in inc_remap_and_issue_cell() argument
934 info.tc = tc; in inc_remap_and_issue_cell()
943 cell_visit_release(tc->pool, __inc_remap_and_issue_cell, in inc_remap_and_issue_cell()
947 thin_defer_bio(tc, bio); in inc_remap_and_issue_cell()
950 remap_and_issue(info.tc, bio, block); in inc_remap_and_issue_cell()
955 cell_error(m->tc->pool, m->cell); in process_prepared_mapping_fail()
957 mempool_free(m, &m->tc->pool->mapping_pool); in process_prepared_mapping_fail()
960 static void complete_overwrite_bio(struct thin_c *tc, struct bio *bio) in complete_overwrite_bio() argument
962 struct pool *pool = tc->pool; in complete_overwrite_bio()
969 if (!bio_triggers_commit(tc, bio)) { in complete_overwrite_bio()
979 if (dm_thin_aborted_changes(tc->td)) { in complete_overwrite_bio()
995 struct thin_c *tc = m->tc; in process_prepared_mapping() local
996 struct pool *pool = tc->pool; in process_prepared_mapping()
1010 r = dm_thin_insert_block(tc->td, m->virt_begin, m->data_block); in process_prepared_mapping()
1024 inc_remap_and_issue_cell(tc, m->cell, m->data_block); in process_prepared_mapping()
1025 complete_overwrite_bio(tc, bio); in process_prepared_mapping()
1027 inc_all_io_entry(tc->pool, m->cell->holder); in process_prepared_mapping()
1028 remap_and_issue(tc, m->cell->holder, m->data_block); in process_prepared_mapping()
1029 inc_remap_and_issue_cell(tc, m->cell, m->data_block); in process_prepared_mapping()
1041 struct thin_c *tc = m->tc; in free_discard_mapping() local
1043 cell_defer_no_holder(tc, m->cell); in free_discard_mapping()
1044 mempool_free(m, &tc->pool->mapping_pool); in free_discard_mapping()
1062 struct thin_c *tc = m->tc; in process_prepared_discard_no_passdown() local
1064 r = dm_thin_remove_range(tc->td, m->cell->key.block_begin, m->cell->key.block_end); in process_prepared_discard_no_passdown()
1066 metadata_operation_failed(tc->pool, "dm_thin_remove_range", r); in process_prepared_discard_no_passdown()
1071 cell_defer_no_holder(tc, m->cell); in process_prepared_discard_no_passdown()
1072 mempool_free(m, &tc->pool->mapping_pool); in process_prepared_discard_no_passdown()
1086 struct thin_c *tc = m->tc; in passdown_double_checking_shared_status() local
1087 struct pool *pool = tc->pool; in passdown_double_checking_shared_status()
1091 begin_discard(&op, tc, discard_parent); in passdown_double_checking_shared_status()
1129 struct pool *pool = m->tc->pool; in queue_passdown_pt2()
1150 struct thin_c *tc = m->tc; in process_prepared_discard_passdown_pt1() local
1151 struct pool *pool = tc->pool; in process_prepared_discard_passdown_pt1()
1160 r = dm_thin_remove_range(tc->td, m->virt_begin, m->virt_end); in process_prepared_discard_passdown_pt1()
1164 cell_defer_no_holder(tc, m->cell); in process_prepared_discard_passdown_pt1()
1177 cell_defer_no_holder(tc, m->cell); in process_prepared_discard_passdown_pt1()
1185 dm_device_name(tc->pool->pool_md)); in process_prepared_discard_passdown_pt1()
1197 begin_discard(&op, tc, discard_parent); in process_prepared_discard_passdown_pt1()
1207 struct thin_c *tc = m->tc; in process_prepared_discard_passdown_pt2() local
1208 struct pool *pool = tc->pool; in process_prepared_discard_passdown_pt2()
1222 cell_defer_no_holder(tc, m->cell); in process_prepared_discard_passdown_pt2()
1289 static void ll_zero(struct thin_c *tc, struct dm_thin_new_mapping *m, in ll_zero() argument
1294 to.bdev = tc->pool_dev->bdev; in ll_zero()
1298 dm_kcopyd_zero(tc->pool->copier, 1, &to, 0, copy_complete, m); in ll_zero()
1301 static void remap_and_issue_overwrite(struct thin_c *tc, struct bio *bio, in remap_and_issue_overwrite() argument
1305 struct pool *pool = tc->pool; in remap_and_issue_overwrite()
1312 remap_and_issue(tc, bio, data_begin); in remap_and_issue_overwrite()
1318 static void schedule_copy(struct thin_c *tc, dm_block_t virt_block, in schedule_copy() argument
1324 struct pool *pool = tc->pool; in schedule_copy()
1327 m->tc = tc; in schedule_copy()
1350 remap_and_issue_overwrite(tc, bio, data_dest, m); in schedule_copy()
1358 to.bdev = tc->pool_dev->bdev; in schedule_copy()
1370 ll_zero(tc, m, in schedule_copy()
1379 static void schedule_internal_copy(struct thin_c *tc, dm_block_t virt_block, in schedule_internal_copy() argument
1383 schedule_copy(tc, virt_block, tc->pool_dev, in schedule_internal_copy()
1385 tc->pool->sectors_per_block); in schedule_internal_copy()
1388 static void schedule_zero(struct thin_c *tc, dm_block_t virt_block, in schedule_zero() argument
1392 struct pool *pool = tc->pool; in schedule_zero()
1396 m->tc = tc; in schedule_zero()
1409 remap_and_issue_overwrite(tc, bio, data_block, m); in schedule_zero()
1411 ll_zero(tc, m, data_block * pool->sectors_per_block, in schedule_zero()
1417 static void schedule_external_copy(struct thin_c *tc, dm_block_t virt_block, in schedule_external_copy() argument
1421 struct pool *pool = tc->pool; in schedule_external_copy()
1425 if (virt_block_end <= tc->origin_size) in schedule_external_copy()
1426 schedule_copy(tc, virt_block, tc->origin_dev, in schedule_external_copy()
1430 else if (virt_block_begin < tc->origin_size) in schedule_external_copy()
1431 schedule_copy(tc, virt_block, tc->origin_dev, in schedule_external_copy()
1433 tc->origin_size - virt_block_begin); in schedule_external_copy()
1436 schedule_zero(tc, virt_block, data_dest, cell, bio); in schedule_external_copy()
1525 static int alloc_data_block(struct thin_c *tc, dm_block_t *result) in alloc_data_block() argument
1529 struct pool *pool = tc->pool; in alloc_data_block()
1595 struct thin_c *tc = h->tc; in retry_on_resume() local
1598 spin_lock_irqsave(&tc->lock, flags); in retry_on_resume()
1599 bio_list_add(&tc->retry_on_resume_list, bio); in retry_on_resume()
1600 spin_unlock_irqrestore(&tc->lock, flags); in retry_on_resume()
1657 static void process_discard_cell_no_passdown(struct thin_c *tc, in process_discard_cell_no_passdown() argument
1660 struct pool *pool = tc->pool; in process_discard_cell_no_passdown()
1667 m->tc = tc; in process_discard_cell_no_passdown()
1677 static void break_up_discard_bio(struct thin_c *tc, dm_block_t begin, dm_block_t end, in break_up_discard_bio() argument
1680 struct pool *pool = tc->pool; in break_up_discard_bio()
1695 r = dm_thin_find_mapped_range(tc->td, begin, end, &virt_begin, &virt_end, in break_up_discard_bio()
1704 build_key(tc->td, PHYSICAL, data_begin, data_begin + (virt_end - virt_begin), &data_key); in break_up_discard_bio()
1705 if (bio_detain(tc->pool, &data_key, NULL, &data_cell)) { in break_up_discard_bio()
1716 m->tc = tc; in break_up_discard_bio()
1740 static void process_discard_cell_passdown(struct thin_c *tc, struct dm_bio_prison_cell *virt_cell) in process_discard_cell_passdown() argument
1751 break_up_discard_bio(tc, virt_cell->key.block_begin, virt_cell->key.block_end, bio); in process_discard_cell_passdown()
1761 static void process_discard_bio(struct thin_c *tc, struct bio *bio) in process_discard_bio() argument
1767 get_bio_block_range(tc, bio, &begin, &end); in process_discard_bio()
1776 build_key(tc->td, VIRTUAL, begin, end, &virt_key); in process_discard_bio()
1777 if (bio_detain(tc->pool, &virt_key, bio, &virt_cell)) in process_discard_bio()
1787 tc->pool->process_discard_cell(tc, virt_cell); in process_discard_bio()
1790 static void break_sharing(struct thin_c *tc, struct bio *bio, dm_block_t block, in break_sharing() argument
1797 struct pool *pool = tc->pool; in break_sharing()
1799 r = alloc_data_block(tc, &data_block); in break_sharing()
1802 schedule_internal_copy(tc, block, lookup_result->block, in break_sharing()
1831 h->shared_read_entry = dm_deferred_entry_inc(info->tc->pool->shared_read_ds); in __remap_and_issue_shared_cell()
1832 inc_all_io_entry(info->tc->pool, bio); in __remap_and_issue_shared_cell()
1838 static void remap_and_issue_shared_cell(struct thin_c *tc, in remap_and_issue_shared_cell() argument
1845 info.tc = tc; in remap_and_issue_shared_cell()
1849 cell_visit_release(tc->pool, __remap_and_issue_shared_cell, in remap_and_issue_shared_cell()
1853 thin_defer_bio(tc, bio); in remap_and_issue_shared_cell()
1856 remap_and_issue(tc, bio, block); in remap_and_issue_shared_cell()
1859 static void process_shared_bio(struct thin_c *tc, struct bio *bio, in process_shared_bio() argument
1865 struct pool *pool = tc->pool; in process_shared_bio()
1872 build_data_key(tc->td, lookup_result->block, &key); in process_shared_bio()
1874 cell_defer_no_holder(tc, virt_cell); in process_shared_bio()
1879 break_sharing(tc, bio, block, &key, lookup_result, data_cell); in process_shared_bio()
1880 cell_defer_no_holder(tc, virt_cell); in process_shared_bio()
1886 remap_and_issue(tc, bio, lookup_result->block); in process_shared_bio()
1888 remap_and_issue_shared_cell(tc, data_cell, lookup_result->block); in process_shared_bio()
1889 remap_and_issue_shared_cell(tc, virt_cell, lookup_result->block); in process_shared_bio()
1893 static void provision_block(struct thin_c *tc, struct bio *bio, dm_block_t block, in provision_block() argument
1898 struct pool *pool = tc->pool; in provision_block()
1905 cell_defer_no_holder(tc, cell); in provision_block()
1907 remap_and_issue(tc, bio, 0); in provision_block()
1916 cell_defer_no_holder(tc, cell); in provision_block()
1921 r = alloc_data_block(tc, &data_block); in provision_block()
1924 if (tc->origin_dev) in provision_block()
1925 schedule_external_copy(tc, block, data_block, cell, bio); in provision_block()
1927 schedule_zero(tc, block, data_block, cell, bio); in provision_block()
1942 static void process_cell(struct thin_c *tc, struct dm_bio_prison_cell *cell) in process_cell() argument
1945 struct pool *pool = tc->pool; in process_cell()
1947 dm_block_t block = get_bio_block(tc, bio); in process_cell()
1950 if (tc->requeue_mode) { in process_cell()
1955 r = dm_thin_find_block(tc->td, block, 1, &lookup_result); in process_cell()
1959 process_shared_bio(tc, bio, block, &lookup_result, cell); in process_cell()
1962 remap_and_issue(tc, bio, lookup_result.block); in process_cell()
1963 inc_remap_and_issue_cell(tc, cell, lookup_result.block); in process_cell()
1968 if (bio_data_dir(bio) == READ && tc->origin_dev) { in process_cell()
1970 cell_defer_no_holder(tc, cell); in process_cell()
1972 if (bio_end_sector(bio) <= tc->origin_size) in process_cell()
1973 remap_to_origin_and_issue(tc, bio); in process_cell()
1975 else if (bio->bi_iter.bi_sector < tc->origin_size) { in process_cell()
1977 bio->bi_iter.bi_size = (tc->origin_size - bio->bi_iter.bi_sector) << SECTOR_SHIFT; in process_cell()
1978 remap_to_origin_and_issue(tc, bio); in process_cell()
1985 provision_block(tc, bio, block, cell); in process_cell()
1991 cell_defer_no_holder(tc, cell); in process_cell()
1997 static void process_bio(struct thin_c *tc, struct bio *bio) in process_bio() argument
1999 struct pool *pool = tc->pool; in process_bio()
2000 dm_block_t block = get_bio_block(tc, bio); in process_bio()
2008 build_virtual_key(tc->td, block, &key); in process_bio()
2012 process_cell(tc, cell); in process_bio()
2015 static void __process_bio_read_only(struct thin_c *tc, struct bio *bio, in __process_bio_read_only() argument
2020 dm_block_t block = get_bio_block(tc, bio); in __process_bio_read_only()
2023 r = dm_thin_find_block(tc->td, block, 1, &lookup_result); in __process_bio_read_only()
2027 handle_unserviceable_bio(tc->pool, bio); in __process_bio_read_only()
2029 cell_defer_no_holder(tc, cell); in __process_bio_read_only()
2031 inc_all_io_entry(tc->pool, bio); in __process_bio_read_only()
2032 remap_and_issue(tc, bio, lookup_result.block); in __process_bio_read_only()
2034 inc_remap_and_issue_cell(tc, cell, lookup_result.block); in __process_bio_read_only()
2040 cell_defer_no_holder(tc, cell); in __process_bio_read_only()
2042 handle_unserviceable_bio(tc->pool, bio); in __process_bio_read_only()
2046 if (tc->origin_dev) { in __process_bio_read_only()
2047 inc_all_io_entry(tc->pool, bio); in __process_bio_read_only()
2048 remap_to_origin_and_issue(tc, bio); in __process_bio_read_only()
2060 cell_defer_no_holder(tc, cell); in __process_bio_read_only()
2066 static void process_bio_read_only(struct thin_c *tc, struct bio *bio) in process_bio_read_only() argument
2068 __process_bio_read_only(tc, bio, NULL); in process_bio_read_only()
2071 static void process_cell_read_only(struct thin_c *tc, struct dm_bio_prison_cell *cell) in process_cell_read_only() argument
2073 __process_bio_read_only(tc, cell->holder, cell); in process_cell_read_only()
2076 static void process_bio_success(struct thin_c *tc, struct bio *bio) in process_bio_success() argument
2081 static void process_bio_fail(struct thin_c *tc, struct bio *bio) in process_bio_fail() argument
2086 static void process_cell_success(struct thin_c *tc, struct dm_bio_prison_cell *cell) in process_cell_success() argument
2088 cell_success(tc->pool, cell); in process_cell_success()
2091 static void process_cell_fail(struct thin_c *tc, struct dm_bio_prison_cell *cell) in process_cell_fail() argument
2093 cell_error(tc->pool, cell); in process_cell_fail()
2109 static void __thin_bio_rb_add(struct thin_c *tc, struct bio *bio) in __thin_bio_rb_add() argument
2115 rbp = &tc->sort_bio_list.rb_node; in __thin_bio_rb_add()
2129 rb_insert_color(&pbd->rb_node, &tc->sort_bio_list); in __thin_bio_rb_add()
2132 static void __extract_sorted_bios(struct thin_c *tc) in __extract_sorted_bios() argument
2138 for (node = rb_first(&tc->sort_bio_list); node; node = rb_next(node)) { in __extract_sorted_bios()
2142 bio_list_add(&tc->deferred_bio_list, bio); in __extract_sorted_bios()
2143 rb_erase(&pbd->rb_node, &tc->sort_bio_list); in __extract_sorted_bios()
2146 WARN_ON(!RB_EMPTY_ROOT(&tc->sort_bio_list)); in __extract_sorted_bios()
2149 static void __sort_thin_deferred_bios(struct thin_c *tc) in __sort_thin_deferred_bios() argument
2155 bio_list_merge(&bios, &tc->deferred_bio_list); in __sort_thin_deferred_bios()
2156 bio_list_init(&tc->deferred_bio_list); in __sort_thin_deferred_bios()
2160 __thin_bio_rb_add(tc, bio); in __sort_thin_deferred_bios()
2167 __extract_sorted_bios(tc); in __sort_thin_deferred_bios()
2170 static void process_thin_deferred_bios(struct thin_c *tc) in process_thin_deferred_bios() argument
2172 struct pool *pool = tc->pool; in process_thin_deferred_bios()
2179 if (tc->requeue_mode) { in process_thin_deferred_bios()
2180 error_thin_bio_list(tc, &tc->deferred_bio_list, in process_thin_deferred_bios()
2187 spin_lock_irqsave(&tc->lock, flags); in process_thin_deferred_bios()
2189 if (bio_list_empty(&tc->deferred_bio_list)) { in process_thin_deferred_bios()
2190 spin_unlock_irqrestore(&tc->lock, flags); in process_thin_deferred_bios()
2194 __sort_thin_deferred_bios(tc); in process_thin_deferred_bios()
2196 bio_list_merge(&bios, &tc->deferred_bio_list); in process_thin_deferred_bios()
2197 bio_list_init(&tc->deferred_bio_list); in process_thin_deferred_bios()
2199 spin_unlock_irqrestore(&tc->lock, flags); in process_thin_deferred_bios()
2209 spin_lock_irqsave(&tc->lock, flags); in process_thin_deferred_bios()
2210 bio_list_add(&tc->deferred_bio_list, bio); in process_thin_deferred_bios()
2211 bio_list_merge(&tc->deferred_bio_list, &bios); in process_thin_deferred_bios()
2212 spin_unlock_irqrestore(&tc->lock, flags); in process_thin_deferred_bios()
2217 pool->process_discard(tc, bio); in process_thin_deferred_bios()
2219 pool->process_bio(tc, bio); in process_thin_deferred_bios()
2264 static void process_thin_deferred_cells(struct thin_c *tc) in process_thin_deferred_cells() argument
2266 struct pool *pool = tc->pool; in process_thin_deferred_cells()
2274 spin_lock_irqsave(&tc->lock, flags); in process_thin_deferred_cells()
2275 list_splice_init(&tc->deferred_cells, &cells); in process_thin_deferred_cells()
2276 spin_unlock_irqrestore(&tc->lock, flags); in process_thin_deferred_cells()
2282 count = sort_cells(tc->pool, &cells); in process_thin_deferred_cells()
2297 spin_lock_irqsave(&tc->lock, flags); in process_thin_deferred_cells()
2298 list_splice(&cells, &tc->deferred_cells); in process_thin_deferred_cells()
2299 spin_unlock_irqrestore(&tc->lock, flags); in process_thin_deferred_cells()
2304 pool->process_discard_cell(tc, cell); in process_thin_deferred_cells()
2306 pool->process_cell(tc, cell); in process_thin_deferred_cells()
2311 static void thin_get(struct thin_c *tc);
2312 static void thin_put(struct thin_c *tc);
2321 struct thin_c *tc = NULL; in get_first_thin() local
2325 tc = list_entry_rcu(pool->active_thins.next, struct thin_c, list); in get_first_thin()
2326 thin_get(tc); in get_first_thin()
2330 return tc; in get_first_thin()
2333 static struct thin_c *get_next_thin(struct pool *pool, struct thin_c *tc) in get_next_thin() argument
2335 struct thin_c *old_tc = tc; in get_next_thin()
2338 list_for_each_entry_continue_rcu(tc, &pool->active_thins, list) { in get_next_thin()
2339 thin_get(tc); in get_next_thin()
2342 return tc; in get_next_thin()
2355 struct thin_c *tc; in process_deferred_bios() local
2357 tc = get_first_thin(pool); in process_deferred_bios()
2358 while (tc) { in process_deferred_bios()
2359 process_thin_deferred_cells(tc); in process_deferred_bios()
2360 process_thin_deferred_bios(tc); in process_deferred_bios()
2361 tc = get_next_thin(pool, tc); in process_deferred_bios()
2474 struct thin_c *tc; member
2485 w->tc->requeue_mode = true; in do_noflush_start()
2486 requeue_io(w->tc); in do_noflush_start()
2493 w->tc->requeue_mode = false; in do_noflush_stop()
2497 static void noflush_work(struct thin_c *tc, void (*fn)(struct work_struct *)) in noflush_work() argument
2501 w.tc = tc; in noflush_work()
2502 pool_work_wait(&w.pw, tc->pool, fn); in noflush_work()
2658 static void thin_defer_bio(struct thin_c *tc, struct bio *bio) in thin_defer_bio() argument
2661 struct pool *pool = tc->pool; in thin_defer_bio()
2663 spin_lock_irqsave(&tc->lock, flags); in thin_defer_bio()
2664 bio_list_add(&tc->deferred_bio_list, bio); in thin_defer_bio()
2665 spin_unlock_irqrestore(&tc->lock, flags); in thin_defer_bio()
2670 static void thin_defer_bio_with_throttle(struct thin_c *tc, struct bio *bio) in thin_defer_bio_with_throttle() argument
2672 struct pool *pool = tc->pool; in thin_defer_bio_with_throttle()
2675 thin_defer_bio(tc, bio); in thin_defer_bio_with_throttle()
2679 static void thin_defer_cell(struct thin_c *tc, struct dm_bio_prison_cell *cell) in thin_defer_cell() argument
2682 struct pool *pool = tc->pool; in thin_defer_cell()
2685 spin_lock_irqsave(&tc->lock, flags); in thin_defer_cell()
2686 list_add_tail(&cell->user_list, &tc->deferred_cells); in thin_defer_cell()
2687 spin_unlock_irqrestore(&tc->lock, flags); in thin_defer_cell()
2693 static void thin_hook_bio(struct thin_c *tc, struct bio *bio) in thin_hook_bio() argument
2697 h->tc = tc; in thin_hook_bio()
2710 struct thin_c *tc = ti->private; in thin_bio_map() local
2711 dm_block_t block = get_bio_block(tc, bio); in thin_bio_map()
2712 struct dm_thin_device *td = tc->td; in thin_bio_map()
2717 thin_hook_bio(tc, bio); in thin_bio_map()
2719 if (tc->requeue_mode) { in thin_bio_map()
2725 if (get_pool_mode(tc->pool) == PM_FAIL) { in thin_bio_map()
2731 thin_defer_bio_with_throttle(tc, bio); in thin_bio_map()
2739 build_virtual_key(tc->td, block, &key); in thin_bio_map()
2740 if (bio_detain(tc->pool, &key, bio, &virt_cell)) in thin_bio_map()
2765 thin_defer_cell(tc, virt_cell); in thin_bio_map()
2769 build_data_key(tc->td, result.block, &key); in thin_bio_map()
2770 if (bio_detain(tc->pool, &key, bio, &data_cell)) { in thin_bio_map()
2771 cell_defer_no_holder(tc, virt_cell); in thin_bio_map()
2775 inc_all_io_entry(tc->pool, bio); in thin_bio_map()
2776 cell_defer_no_holder(tc, data_cell); in thin_bio_map()
2777 cell_defer_no_holder(tc, virt_cell); in thin_bio_map()
2779 remap(tc, bio, result.block); in thin_bio_map()
2784 thin_defer_cell(tc, virt_cell); in thin_bio_map()
2794 cell_defer_no_holder(tc, virt_cell); in thin_bio_map()
2814 struct thin_c *tc; in requeue_bios() local
2817 list_for_each_entry_rcu(tc, &pool->active_thins, list) { in requeue_bios()
2818 spin_lock_irqsave(&tc->lock, flags); in requeue_bios()
2819 bio_list_merge(&tc->deferred_bio_list, &tc->retry_on_resume_list); in requeue_bios()
2820 bio_list_init(&tc->retry_on_resume_list); in requeue_bios()
2821 spin_unlock_irqrestore(&tc->lock, flags); in requeue_bios()
3568 struct thin_c *tc; in pool_suspend_active_thins() local
3571 tc = get_first_thin(pool); in pool_suspend_active_thins()
3572 while (tc) { in pool_suspend_active_thins()
3573 dm_internal_suspend_noflush(tc->thin_md); in pool_suspend_active_thins()
3574 tc = get_next_thin(pool, tc); in pool_suspend_active_thins()
3580 struct thin_c *tc; in pool_resume_active_thins() local
3583 tc = get_first_thin(pool); in pool_resume_active_thins()
3584 while (tc) { in pool_resume_active_thins()
3585 dm_internal_resume(tc->thin_md); in pool_resume_active_thins()
3586 tc = get_next_thin(pool, tc); in pool_resume_active_thins()
4099 static void thin_get(struct thin_c *tc) in thin_get() argument
4101 refcount_inc(&tc->refcount); in thin_get()
4104 static void thin_put(struct thin_c *tc) in thin_put() argument
4106 if (refcount_dec_and_test(&tc->refcount)) in thin_put()
4107 complete(&tc->can_destroy); in thin_put()
4112 struct thin_c *tc = ti->private; in thin_dtr() local
4115 spin_lock_irqsave(&tc->pool->lock, flags); in thin_dtr()
4116 list_del_rcu(&tc->list); in thin_dtr()
4117 spin_unlock_irqrestore(&tc->pool->lock, flags); in thin_dtr()
4120 thin_put(tc); in thin_dtr()
4121 wait_for_completion(&tc->can_destroy); in thin_dtr()
4125 __pool_dec(tc->pool); in thin_dtr()
4126 dm_pool_close_thin_device(tc->td); in thin_dtr()
4127 dm_put_device(ti, tc->pool_dev); in thin_dtr()
4128 if (tc->origin_dev) in thin_dtr()
4129 dm_put_device(ti, tc->origin_dev); in thin_dtr()
4130 kfree(tc); in thin_dtr()
4150 struct thin_c *tc; in thin_ctr() local
4163 tc = ti->private = kzalloc(sizeof(*tc), GFP_KERNEL); in thin_ctr()
4164 if (!tc) { in thin_ctr()
4169 tc->thin_md = dm_table_get_md(ti->table); in thin_ctr()
4170 spin_lock_init(&tc->lock); in thin_ctr()
4171 INIT_LIST_HEAD(&tc->deferred_cells); in thin_ctr()
4172 bio_list_init(&tc->deferred_bio_list); in thin_ctr()
4173 bio_list_init(&tc->retry_on_resume_list); in thin_ctr()
4174 tc->sort_bio_list = RB_ROOT; in thin_ctr()
4188 tc->origin_dev = origin_dev; in thin_ctr()
4196 tc->pool_dev = pool_dev; in thin_ctr()
4198 if (read_dev_id(argv[1], (unsigned long long *)&tc->dev_id, 0)) { in thin_ctr()
4204 pool_md = dm_get_md(tc->pool_dev->bdev->bd_dev); in thin_ctr()
4211 tc->pool = __pool_table_lookup(pool_md); in thin_ctr()
4212 if (!tc->pool) { in thin_ctr()
4217 __pool_inc(tc->pool); in thin_ctr()
4219 if (get_pool_mode(tc->pool) == PM_FAIL) { in thin_ctr()
4225 r = dm_pool_open_thin_device(tc->pool->pmd, tc->dev_id, &tc->td); in thin_ctr()
4231 r = dm_set_target_max_io_len(ti, tc->pool->sectors_per_block); in thin_ctr()
4240 if (tc->pool->pf.discard_enabled) { in thin_ctr()
4247 spin_lock_irqsave(&tc->pool->lock, flags); in thin_ctr()
4248 if (tc->pool->suspended) { in thin_ctr()
4249 spin_unlock_irqrestore(&tc->pool->lock, flags); in thin_ctr()
4255 refcount_set(&tc->refcount, 1); in thin_ctr()
4256 init_completion(&tc->can_destroy); in thin_ctr()
4257 list_add_tail_rcu(&tc->list, &tc->pool->active_thins); in thin_ctr()
4258 spin_unlock_irqrestore(&tc->pool->lock, flags); in thin_ctr()
4272 dm_pool_close_thin_device(tc->td); in thin_ctr()
4274 __pool_dec(tc->pool); in thin_ctr()
4278 dm_put_device(ti, tc->pool_dev); in thin_ctr()
4280 if (tc->origin_dev) in thin_ctr()
4281 dm_put_device(ti, tc->origin_dev); in thin_ctr()
4283 kfree(tc); in thin_ctr()
4304 struct pool *pool = h->tc->pool; in thin_endio()
4331 cell_defer_no_holder(h->tc, h->cell); in thin_endio()
4338 struct thin_c *tc = ti->private; in thin_presuspend() local
4341 noflush_work(tc, do_noflush_start); in thin_presuspend()
4346 struct thin_c *tc = ti->private; in thin_postsuspend() local
4352 noflush_work(tc, do_noflush_stop); in thin_postsuspend()
4357 struct thin_c *tc = ti->private; in thin_preresume() local
4359 if (tc->origin_dev) in thin_preresume()
4360 tc->origin_size = get_dev_size(tc->origin_dev->bdev); in thin_preresume()
4375 struct thin_c *tc = ti->private; in thin_status() local
4377 if (get_pool_mode(tc->pool) == PM_FAIL) { in thin_status()
4382 if (!tc->td) in thin_status()
4387 r = dm_thin_get_mapped_count(tc->td, &mapped); in thin_status()
4393 r = dm_thin_get_highest_mapped_block(tc->td, &highest); in thin_status()
4399 DMEMIT("%llu ", mapped * tc->pool->sectors_per_block); in thin_status()
4402 tc->pool->sectors_per_block) - 1); in thin_status()
4409 format_dev_t(buf, tc->pool_dev->bdev->bd_dev), in thin_status()
4410 (unsigned long) tc->dev_id); in thin_status()
4411 if (tc->origin_dev) in thin_status()
4412 DMEMIT(" %s", format_dev_t(buf, tc->origin_dev->bdev->bd_dev)); in thin_status()
4427 struct thin_c *tc = ti->private; in thin_iterate_devices() local
4428 struct pool *pool = tc->pool; in thin_iterate_devices()
4440 return fn(ti, tc->pool_dev, 0, pool->sectors_per_block * blocks, data); in thin_iterate_devices()
4447 struct thin_c *tc = ti->private; in thin_io_hints() local
4448 struct pool *pool = tc->pool; in thin_io_hints()