Lines Matching refs:pmd

205 	struct dm_pool_metadata *pmd;  member
361 static int superblock_lock_zero(struct dm_pool_metadata *pmd, in superblock_lock_zero() argument
364 return dm_bm_write_lock_zero(pmd->bm, THIN_SUPERBLOCK_LOCATION, in superblock_lock_zero()
368 static int superblock_lock(struct dm_pool_metadata *pmd, in superblock_lock() argument
371 return dm_bm_write_lock(pmd->bm, THIN_SUPERBLOCK_LOCATION, in superblock_lock()
404 static void __setup_btree_details(struct dm_pool_metadata *pmd) in __setup_btree_details() argument
406 pmd->info.tm = pmd->tm; in __setup_btree_details()
407 pmd->info.levels = 2; in __setup_btree_details()
408 pmd->info.value_type.context = pmd->data_sm; in __setup_btree_details()
409 pmd->info.value_type.size = sizeof(__le64); in __setup_btree_details()
410 pmd->info.value_type.inc = data_block_inc; in __setup_btree_details()
411 pmd->info.value_type.dec = data_block_dec; in __setup_btree_details()
412 pmd->info.value_type.equal = data_block_equal; in __setup_btree_details()
414 memcpy(&pmd->nb_info, &pmd->info, sizeof(pmd->nb_info)); in __setup_btree_details()
415 pmd->nb_info.tm = pmd->nb_tm; in __setup_btree_details()
417 pmd->tl_info.tm = pmd->tm; in __setup_btree_details()
418 pmd->tl_info.levels = 1; in __setup_btree_details()
419 pmd->tl_info.value_type.context = &pmd->bl_info; in __setup_btree_details()
420 pmd->tl_info.value_type.size = sizeof(__le64); in __setup_btree_details()
421 pmd->tl_info.value_type.inc = subtree_inc; in __setup_btree_details()
422 pmd->tl_info.value_type.dec = subtree_dec; in __setup_btree_details()
423 pmd->tl_info.value_type.equal = subtree_equal; in __setup_btree_details()
425 pmd->bl_info.tm = pmd->tm; in __setup_btree_details()
426 pmd->bl_info.levels = 1; in __setup_btree_details()
427 pmd->bl_info.value_type.context = pmd->data_sm; in __setup_btree_details()
428 pmd->bl_info.value_type.size = sizeof(__le64); in __setup_btree_details()
429 pmd->bl_info.value_type.inc = data_block_inc; in __setup_btree_details()
430 pmd->bl_info.value_type.dec = data_block_dec; in __setup_btree_details()
431 pmd->bl_info.value_type.equal = data_block_equal; in __setup_btree_details()
433 pmd->details_info.tm = pmd->tm; in __setup_btree_details()
434 pmd->details_info.levels = 1; in __setup_btree_details()
435 pmd->details_info.value_type.context = NULL; in __setup_btree_details()
436 pmd->details_info.value_type.size = sizeof(struct disk_device_details); in __setup_btree_details()
437 pmd->details_info.value_type.inc = NULL; in __setup_btree_details()
438 pmd->details_info.value_type.dec = NULL; in __setup_btree_details()
439 pmd->details_info.value_type.equal = NULL; in __setup_btree_details()
442 static int save_sm_roots(struct dm_pool_metadata *pmd) in save_sm_roots() argument
447 r = dm_sm_root_size(pmd->metadata_sm, &len); in save_sm_roots()
451 r = dm_sm_copy_root(pmd->metadata_sm, &pmd->metadata_space_map_root, len); in save_sm_roots()
455 r = dm_sm_root_size(pmd->data_sm, &len); in save_sm_roots()
459 return dm_sm_copy_root(pmd->data_sm, &pmd->data_space_map_root, len); in save_sm_roots()
462 static void copy_sm_roots(struct dm_pool_metadata *pmd, in copy_sm_roots() argument
466 &pmd->metadata_space_map_root, in copy_sm_roots()
467 sizeof(pmd->metadata_space_map_root)); in copy_sm_roots()
470 &pmd->data_space_map_root, in copy_sm_roots()
471 sizeof(pmd->data_space_map_root)); in copy_sm_roots()
474 static int __write_initial_superblock(struct dm_pool_metadata *pmd) in __write_initial_superblock() argument
479 sector_t bdev_size = i_size_read(pmd->bdev->bd_inode) >> SECTOR_SHIFT; in __write_initial_superblock()
484 r = dm_sm_commit(pmd->data_sm); in __write_initial_superblock()
488 r = save_sm_roots(pmd); in __write_initial_superblock()
492 r = dm_tm_pre_commit(pmd->tm); in __write_initial_superblock()
496 r = superblock_lock_zero(pmd, &sblock); in __write_initial_superblock()
509 copy_sm_roots(pmd, disk_super); in __write_initial_superblock()
511 disk_super->data_mapping_root = cpu_to_le64(pmd->root); in __write_initial_superblock()
512 disk_super->device_details_root = cpu_to_le64(pmd->details_root); in __write_initial_superblock()
515 disk_super->data_block_size = cpu_to_le32(pmd->data_block_size); in __write_initial_superblock()
517 return dm_tm_commit(pmd->tm, sblock); in __write_initial_superblock()
520 static int __format_metadata(struct dm_pool_metadata *pmd) in __format_metadata() argument
524 r = dm_tm_create_with_sm(pmd->bm, THIN_SUPERBLOCK_LOCATION, in __format_metadata()
525 &pmd->tm, &pmd->metadata_sm); in __format_metadata()
531 pmd->data_sm = dm_sm_disk_create(pmd->tm, 0); in __format_metadata()
532 if (IS_ERR(pmd->data_sm)) { in __format_metadata()
534 r = PTR_ERR(pmd->data_sm); in __format_metadata()
538 pmd->nb_tm = dm_tm_create_non_blocking_clone(pmd->tm); in __format_metadata()
539 if (!pmd->nb_tm) { in __format_metadata()
545 __setup_btree_details(pmd); in __format_metadata()
547 r = dm_btree_empty(&pmd->info, &pmd->root); in __format_metadata()
551 r = dm_btree_empty(&pmd->details_info, &pmd->details_root); in __format_metadata()
557 r = __write_initial_superblock(pmd); in __format_metadata()
564 dm_tm_destroy(pmd->nb_tm); in __format_metadata()
566 dm_sm_destroy(pmd->data_sm); in __format_metadata()
568 dm_tm_destroy(pmd->tm); in __format_metadata()
569 dm_sm_destroy(pmd->metadata_sm); in __format_metadata()
575 struct dm_pool_metadata *pmd) in __check_incompat_features() argument
589 if (get_disk_ro(pmd->bdev->bd_disk)) in __check_incompat_features()
602 static int __open_metadata(struct dm_pool_metadata *pmd) in __open_metadata() argument
608 r = dm_bm_read_lock(pmd->bm, THIN_SUPERBLOCK_LOCATION, in __open_metadata()
618 if (le32_to_cpu(disk_super->data_block_size) != pmd->data_block_size) { in __open_metadata()
621 (unsigned long long)pmd->data_block_size); in __open_metadata()
626 r = __check_incompat_features(disk_super, pmd); in __open_metadata()
630 r = dm_tm_open_with_sm(pmd->bm, THIN_SUPERBLOCK_LOCATION, in __open_metadata()
633 &pmd->tm, &pmd->metadata_sm); in __open_metadata()
639 pmd->data_sm = dm_sm_disk_open(pmd->tm, disk_super->data_space_map_root, in __open_metadata()
641 if (IS_ERR(pmd->data_sm)) { in __open_metadata()
643 r = PTR_ERR(pmd->data_sm); in __open_metadata()
647 pmd->nb_tm = dm_tm_create_non_blocking_clone(pmd->tm); in __open_metadata()
648 if (!pmd->nb_tm) { in __open_metadata()
654 __setup_btree_details(pmd); in __open_metadata()
660 dm_sm_destroy(pmd->data_sm); in __open_metadata()
662 dm_tm_destroy(pmd->tm); in __open_metadata()
663 dm_sm_destroy(pmd->metadata_sm); in __open_metadata()
670 static int __open_or_format_metadata(struct dm_pool_metadata *pmd, bool format_device) in __open_or_format_metadata() argument
674 r = __superblock_all_zeroes(pmd->bm, &unformatted); in __open_or_format_metadata()
679 return format_device ? __format_metadata(pmd) : -EPERM; in __open_or_format_metadata()
681 return __open_metadata(pmd); in __open_or_format_metadata()
684 static int __create_persistent_data_objects(struct dm_pool_metadata *pmd, bool format_device) in __create_persistent_data_objects() argument
688 pmd->bm = dm_block_manager_create(pmd->bdev, THIN_METADATA_BLOCK_SIZE << SECTOR_SHIFT, in __create_persistent_data_objects()
691 if (IS_ERR(pmd->bm)) { in __create_persistent_data_objects()
693 return PTR_ERR(pmd->bm); in __create_persistent_data_objects()
696 r = __open_or_format_metadata(pmd, format_device); in __create_persistent_data_objects()
698 dm_block_manager_destroy(pmd->bm); in __create_persistent_data_objects()
703 static void __destroy_persistent_data_objects(struct dm_pool_metadata *pmd) in __destroy_persistent_data_objects() argument
705 dm_sm_destroy(pmd->data_sm); in __destroy_persistent_data_objects()
706 dm_sm_destroy(pmd->metadata_sm); in __destroy_persistent_data_objects()
707 dm_tm_destroy(pmd->nb_tm); in __destroy_persistent_data_objects()
708 dm_tm_destroy(pmd->tm); in __destroy_persistent_data_objects()
709 dm_block_manager_destroy(pmd->bm); in __destroy_persistent_data_objects()
712 static int __begin_transaction(struct dm_pool_metadata *pmd) in __begin_transaction() argument
722 r = dm_bm_read_lock(pmd->bm, THIN_SUPERBLOCK_LOCATION, in __begin_transaction()
728 pmd->time = le32_to_cpu(disk_super->time); in __begin_transaction()
729 pmd->root = le64_to_cpu(disk_super->data_mapping_root); in __begin_transaction()
730 pmd->details_root = le64_to_cpu(disk_super->device_details_root); in __begin_transaction()
731 pmd->trans_id = le64_to_cpu(disk_super->trans_id); in __begin_transaction()
732 pmd->flags = le32_to_cpu(disk_super->flags); in __begin_transaction()
733 pmd->data_block_size = le32_to_cpu(disk_super->data_block_size); in __begin_transaction()
739 static int __write_changed_details(struct dm_pool_metadata *pmd) in __write_changed_details() argument
746 list_for_each_entry_safe(td, tmp, &pmd->thin_devices, list) { in __write_changed_details()
758 r = dm_btree_insert(&pmd->details_info, pmd->details_root, in __write_changed_details()
759 &key, &details, &pmd->details_root); in __write_changed_details()
774 static int __commit_transaction(struct dm_pool_metadata *pmd) in __commit_transaction() argument
786 r = __write_changed_details(pmd); in __commit_transaction()
790 r = dm_sm_commit(pmd->data_sm); in __commit_transaction()
794 r = dm_tm_pre_commit(pmd->tm); in __commit_transaction()
798 r = dm_sm_root_size(pmd->metadata_sm, &metadata_len); in __commit_transaction()
802 r = dm_sm_root_size(pmd->data_sm, &data_len); in __commit_transaction()
806 r = save_sm_roots(pmd); in __commit_transaction()
810 r = superblock_lock(pmd, &sblock); in __commit_transaction()
815 disk_super->time = cpu_to_le32(pmd->time); in __commit_transaction()
816 disk_super->data_mapping_root = cpu_to_le64(pmd->root); in __commit_transaction()
817 disk_super->device_details_root = cpu_to_le64(pmd->details_root); in __commit_transaction()
818 disk_super->trans_id = cpu_to_le64(pmd->trans_id); in __commit_transaction()
819 disk_super->flags = cpu_to_le32(pmd->flags); in __commit_transaction()
821 copy_sm_roots(pmd, disk_super); in __commit_transaction()
823 return dm_tm_commit(pmd->tm, sblock); in __commit_transaction()
831 struct dm_pool_metadata *pmd; in dm_pool_metadata_open() local
833 pmd = kmalloc(sizeof(*pmd), GFP_KERNEL); in dm_pool_metadata_open()
834 if (!pmd) { in dm_pool_metadata_open()
839 init_rwsem(&pmd->root_lock); in dm_pool_metadata_open()
840 pmd->time = 0; in dm_pool_metadata_open()
841 INIT_LIST_HEAD(&pmd->thin_devices); in dm_pool_metadata_open()
842 pmd->fail_io = false; in dm_pool_metadata_open()
843 pmd->bdev = bdev; in dm_pool_metadata_open()
844 pmd->data_block_size = data_block_size; in dm_pool_metadata_open()
846 r = __create_persistent_data_objects(pmd, format_device); in dm_pool_metadata_open()
848 kfree(pmd); in dm_pool_metadata_open()
852 r = __begin_transaction(pmd); in dm_pool_metadata_open()
854 if (dm_pool_metadata_close(pmd) < 0) in dm_pool_metadata_open()
859 return pmd; in dm_pool_metadata_open()
862 int dm_pool_metadata_close(struct dm_pool_metadata *pmd) in dm_pool_metadata_close() argument
868 down_read(&pmd->root_lock); in dm_pool_metadata_close()
869 list_for_each_entry_safe(td, tmp, &pmd->thin_devices, list) { in dm_pool_metadata_close()
877 up_read(&pmd->root_lock); in dm_pool_metadata_close()
885 if (!dm_bm_is_read_only(pmd->bm) && !pmd->fail_io) { in dm_pool_metadata_close()
886 r = __commit_transaction(pmd); in dm_pool_metadata_close()
892 if (!pmd->fail_io) in dm_pool_metadata_close()
893 __destroy_persistent_data_objects(pmd); in dm_pool_metadata_close()
895 kfree(pmd); in dm_pool_metadata_close()
904 static int __open_device(struct dm_pool_metadata *pmd, in __open_device() argument
916 list_for_each_entry(td2, &pmd->thin_devices, list) in __open_device()
932 r = dm_btree_lookup(&pmd->details_info, pmd->details_root, in __open_device()
943 details_le.transaction_id = cpu_to_le64(pmd->trans_id); in __open_device()
944 details_le.creation_time = cpu_to_le32(pmd->time); in __open_device()
945 details_le.snapshotted_time = cpu_to_le32(pmd->time); in __open_device()
952 (*td)->pmd = pmd; in __open_device()
962 list_add(&(*td)->list, &pmd->thin_devices); in __open_device()
972 static int __create_thin(struct dm_pool_metadata *pmd, in __create_thin() argument
982 r = dm_btree_lookup(&pmd->details_info, pmd->details_root, in __create_thin()
990 r = dm_btree_empty(&pmd->bl_info, &dev_root); in __create_thin()
999 r = dm_btree_insert(&pmd->tl_info, pmd->root, &key, &value, &pmd->root); in __create_thin()
1001 dm_btree_del(&pmd->bl_info, dev_root); in __create_thin()
1005 r = __open_device(pmd, dev, 1, &td); in __create_thin()
1007 dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); in __create_thin()
1008 dm_btree_del(&pmd->bl_info, dev_root); in __create_thin()
1016 int dm_pool_create_thin(struct dm_pool_metadata *pmd, dm_thin_id dev) in dm_pool_create_thin() argument
1020 down_write(&pmd->root_lock); in dm_pool_create_thin()
1021 if (!pmd->fail_io) in dm_pool_create_thin()
1022 r = __create_thin(pmd, dev); in dm_pool_create_thin()
1023 up_write(&pmd->root_lock); in dm_pool_create_thin()
1028 static int __set_snapshot_details(struct dm_pool_metadata *pmd, in __set_snapshot_details() argument
1035 r = __open_device(pmd, origin, 0, &td); in __set_snapshot_details()
1049 static int __create_snap(struct dm_pool_metadata *pmd, in __create_snap() argument
1060 r = dm_btree_lookup(&pmd->details_info, pmd->details_root, in __create_snap()
1066 r = dm_btree_lookup(&pmd->tl_info, pmd->root, &key, &value); in __create_snap()
1072 dm_tm_inc(pmd->tm, origin_root); in __create_snap()
1078 r = dm_btree_insert(&pmd->tl_info, pmd->root, &key, &value, &pmd->root); in __create_snap()
1080 dm_tm_dec(pmd->tm, origin_root); in __create_snap()
1084 pmd->time++; in __create_snap()
1086 r = __open_device(pmd, dev, 1, &td); in __create_snap()
1090 r = __set_snapshot_details(pmd, td, origin, pmd->time); in __create_snap()
1099 dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); in __create_snap()
1100 dm_btree_remove(&pmd->details_info, pmd->details_root, in __create_snap()
1101 &key, &pmd->details_root); in __create_snap()
1105 int dm_pool_create_snap(struct dm_pool_metadata *pmd, in dm_pool_create_snap() argument
1111 down_write(&pmd->root_lock); in dm_pool_create_snap()
1112 if (!pmd->fail_io) in dm_pool_create_snap()
1113 r = __create_snap(pmd, dev, origin); in dm_pool_create_snap()
1114 up_write(&pmd->root_lock); in dm_pool_create_snap()
1119 static int __delete_device(struct dm_pool_metadata *pmd, dm_thin_id dev) in __delete_device() argument
1126 r = __open_device(pmd, dev, 0, &td); in __delete_device()
1137 r = dm_btree_remove(&pmd->details_info, pmd->details_root, in __delete_device()
1138 &key, &pmd->details_root); in __delete_device()
1142 r = dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); in __delete_device()
1149 int dm_pool_delete_thin_device(struct dm_pool_metadata *pmd, in dm_pool_delete_thin_device() argument
1154 down_write(&pmd->root_lock); in dm_pool_delete_thin_device()
1155 if (!pmd->fail_io) in dm_pool_delete_thin_device()
1156 r = __delete_device(pmd, dev); in dm_pool_delete_thin_device()
1157 up_write(&pmd->root_lock); in dm_pool_delete_thin_device()
1162 int dm_pool_set_metadata_transaction_id(struct dm_pool_metadata *pmd, in dm_pool_set_metadata_transaction_id() argument
1168 down_write(&pmd->root_lock); in dm_pool_set_metadata_transaction_id()
1170 if (pmd->fail_io) in dm_pool_set_metadata_transaction_id()
1173 if (pmd->trans_id != current_id) { in dm_pool_set_metadata_transaction_id()
1178 pmd->trans_id = new_id; in dm_pool_set_metadata_transaction_id()
1182 up_write(&pmd->root_lock); in dm_pool_set_metadata_transaction_id()
1187 int dm_pool_get_metadata_transaction_id(struct dm_pool_metadata *pmd, in dm_pool_get_metadata_transaction_id() argument
1192 down_read(&pmd->root_lock); in dm_pool_get_metadata_transaction_id()
1193 if (!pmd->fail_io) { in dm_pool_get_metadata_transaction_id()
1194 *result = pmd->trans_id; in dm_pool_get_metadata_transaction_id()
1197 up_read(&pmd->root_lock); in dm_pool_get_metadata_transaction_id()
1202 static int __reserve_metadata_snap(struct dm_pool_metadata *pmd) in __reserve_metadata_snap() argument
1213 __commit_transaction(pmd); in __reserve_metadata_snap()
1218 dm_sm_inc_block(pmd->metadata_sm, THIN_SUPERBLOCK_LOCATION); in __reserve_metadata_snap()
1219 r = dm_tm_shadow_block(pmd->tm, THIN_SUPERBLOCK_LOCATION, in __reserve_metadata_snap()
1232 dm_tm_dec(pmd->tm, held_root); in __reserve_metadata_snap()
1233 dm_tm_unlock(pmd->tm, copy); in __reserve_metadata_snap()
1248 dm_tm_inc(pmd->tm, le64_to_cpu(disk_super->data_mapping_root)); in __reserve_metadata_snap()
1249 dm_tm_inc(pmd->tm, le64_to_cpu(disk_super->device_details_root)); in __reserve_metadata_snap()
1250 dm_tm_unlock(pmd->tm, copy); in __reserve_metadata_snap()
1255 r = superblock_lock(pmd, &sblock); in __reserve_metadata_snap()
1257 dm_tm_dec(pmd->tm, held_root); in __reserve_metadata_snap()
1267 int dm_pool_reserve_metadata_snap(struct dm_pool_metadata *pmd) in dm_pool_reserve_metadata_snap() argument
1271 down_write(&pmd->root_lock); in dm_pool_reserve_metadata_snap()
1272 if (!pmd->fail_io) in dm_pool_reserve_metadata_snap()
1273 r = __reserve_metadata_snap(pmd); in dm_pool_reserve_metadata_snap()
1274 up_write(&pmd->root_lock); in dm_pool_reserve_metadata_snap()
1279 static int __release_metadata_snap(struct dm_pool_metadata *pmd) in __release_metadata_snap() argument
1286 r = superblock_lock(pmd, &sblock); in __release_metadata_snap()
1301 r = dm_tm_read_lock(pmd->tm, held_root, &sb_validator, &copy); in __release_metadata_snap()
1306 dm_btree_del(&pmd->info, le64_to_cpu(disk_super->data_mapping_root)); in __release_metadata_snap()
1307 dm_btree_del(&pmd->details_info, le64_to_cpu(disk_super->device_details_root)); in __release_metadata_snap()
1308 dm_sm_dec_block(pmd->metadata_sm, held_root); in __release_metadata_snap()
1310 dm_tm_unlock(pmd->tm, copy); in __release_metadata_snap()
1315 int dm_pool_release_metadata_snap(struct dm_pool_metadata *pmd) in dm_pool_release_metadata_snap() argument
1319 down_write(&pmd->root_lock); in dm_pool_release_metadata_snap()
1320 if (!pmd->fail_io) in dm_pool_release_metadata_snap()
1321 r = __release_metadata_snap(pmd); in dm_pool_release_metadata_snap()
1322 up_write(&pmd->root_lock); in dm_pool_release_metadata_snap()
1327 static int __get_metadata_snap(struct dm_pool_metadata *pmd, in __get_metadata_snap() argument
1334 r = dm_bm_read_lock(pmd->bm, THIN_SUPERBLOCK_LOCATION, in __get_metadata_snap()
1347 int dm_pool_get_metadata_snap(struct dm_pool_metadata *pmd, in dm_pool_get_metadata_snap() argument
1352 down_read(&pmd->root_lock); in dm_pool_get_metadata_snap()
1353 if (!pmd->fail_io) in dm_pool_get_metadata_snap()
1354 r = __get_metadata_snap(pmd, result); in dm_pool_get_metadata_snap()
1355 up_read(&pmd->root_lock); in dm_pool_get_metadata_snap()
1360 int dm_pool_open_thin_device(struct dm_pool_metadata *pmd, dm_thin_id dev, in dm_pool_open_thin_device() argument
1365 down_write(&pmd->root_lock); in dm_pool_open_thin_device()
1366 if (!pmd->fail_io) in dm_pool_open_thin_device()
1367 r = __open_device(pmd, dev, 0, td); in dm_pool_open_thin_device()
1368 up_write(&pmd->root_lock); in dm_pool_open_thin_device()
1375 down_write(&td->pmd->root_lock); in dm_pool_close_thin_device()
1377 up_write(&td->pmd->root_lock); in dm_pool_close_thin_device()
1403 struct dm_pool_metadata *pmd = td->pmd; in dm_thin_find_block() local
1407 down_read(&pmd->root_lock); in dm_thin_find_block()
1408 if (pmd->fail_io) { in dm_thin_find_block()
1409 up_read(&pmd->root_lock); in dm_thin_find_block()
1414 info = &pmd->info; in dm_thin_find_block()
1416 info = &pmd->nb_info; in dm_thin_find_block()
1418 r = dm_btree_lookup(info, pmd->root, keys, &value); in dm_thin_find_block()
1431 up_read(&pmd->root_lock); in dm_thin_find_block()
1497 struct dm_pool_metadata *pmd = td->pmd; in __insert() local
1500 value = cpu_to_le64(pack_block_time(data_block, pmd->time)); in __insert()
1503 r = dm_btree_insert_notify(&pmd->info, pmd->root, keys, &value, in __insert()
1504 &pmd->root, &inserted); in __insert()
1520 down_write(&td->pmd->root_lock); in dm_thin_insert_block()
1521 if (!td->pmd->fail_io) in dm_thin_insert_block()
1523 up_write(&td->pmd->root_lock); in dm_thin_insert_block()
1531 struct dm_pool_metadata *pmd = td->pmd; in __remove() local
1534 r = dm_btree_remove(&pmd->info, pmd->root, keys, &pmd->root); in __remove()
1548 struct dm_pool_metadata *pmd = td->pmd; in __remove_range() local
1556 r = dm_btree_lookup(&pmd->tl_info, pmd->root, keys, &value); in __remove_range()
1565 dm_tm_inc(pmd->tm, mapping_root); in __remove_range()
1566 r = dm_btree_remove(&pmd->tl_info, pmd->root, keys, &pmd->root); in __remove_range()
1575 r = dm_btree_lookup_next(&pmd->bl_info, mapping_root, &begin, &begin, &value); in __remove_range()
1585 r = dm_btree_remove_leaves(&pmd->bl_info, mapping_root, &begin, end, &mapping_root, &count); in __remove_range()
1600 return dm_btree_insert(&pmd->tl_info, pmd->root, keys, &value, &pmd->root); in __remove_range()
1607 down_write(&td->pmd->root_lock); in dm_thin_remove_block()
1608 if (!td->pmd->fail_io) in dm_thin_remove_block()
1610 up_write(&td->pmd->root_lock); in dm_thin_remove_block()
1620 down_write(&td->pmd->root_lock); in dm_thin_remove_range()
1621 if (!td->pmd->fail_io) in dm_thin_remove_range()
1623 up_write(&td->pmd->root_lock); in dm_thin_remove_range()
1628 int dm_pool_block_is_used(struct dm_pool_metadata *pmd, dm_block_t b, bool *result) in dm_pool_block_is_used() argument
1633 down_read(&pmd->root_lock); in dm_pool_block_is_used()
1634 r = dm_sm_get_count(pmd->data_sm, b, &ref_count); in dm_pool_block_is_used()
1637 up_read(&pmd->root_lock); in dm_pool_block_is_used()
1646 down_read(&td->pmd->root_lock); in dm_thin_changed_this_transaction()
1648 up_read(&td->pmd->root_lock); in dm_thin_changed_this_transaction()
1653 bool dm_pool_changed_this_transaction(struct dm_pool_metadata *pmd) in dm_pool_changed_this_transaction() argument
1658 down_read(&pmd->root_lock); in dm_pool_changed_this_transaction()
1659 list_for_each_entry_safe(td, tmp, &pmd->thin_devices, list) { in dm_pool_changed_this_transaction()
1665 up_read(&pmd->root_lock); in dm_pool_changed_this_transaction()
1674 down_read(&td->pmd->root_lock); in dm_thin_aborted_changes()
1676 up_read(&td->pmd->root_lock); in dm_thin_aborted_changes()
1681 int dm_pool_alloc_data_block(struct dm_pool_metadata *pmd, dm_block_t *result) in dm_pool_alloc_data_block() argument
1685 down_write(&pmd->root_lock); in dm_pool_alloc_data_block()
1686 if (!pmd->fail_io) in dm_pool_alloc_data_block()
1687 r = dm_sm_new_block(pmd->data_sm, result); in dm_pool_alloc_data_block()
1688 up_write(&pmd->root_lock); in dm_pool_alloc_data_block()
1693 int dm_pool_commit_metadata(struct dm_pool_metadata *pmd) in dm_pool_commit_metadata() argument
1697 down_write(&pmd->root_lock); in dm_pool_commit_metadata()
1698 if (pmd->fail_io) in dm_pool_commit_metadata()
1701 r = __commit_transaction(pmd); in dm_pool_commit_metadata()
1708 r = __begin_transaction(pmd); in dm_pool_commit_metadata()
1710 up_write(&pmd->root_lock); in dm_pool_commit_metadata()
1714 static void __set_abort_with_changes_flags(struct dm_pool_metadata *pmd) in __set_abort_with_changes_flags() argument
1718 list_for_each_entry(td, &pmd->thin_devices, list) in __set_abort_with_changes_flags()
1722 int dm_pool_abort_metadata(struct dm_pool_metadata *pmd) in dm_pool_abort_metadata() argument
1726 down_write(&pmd->root_lock); in dm_pool_abort_metadata()
1727 if (pmd->fail_io) in dm_pool_abort_metadata()
1730 __set_abort_with_changes_flags(pmd); in dm_pool_abort_metadata()
1731 __destroy_persistent_data_objects(pmd); in dm_pool_abort_metadata()
1732 r = __create_persistent_data_objects(pmd, false); in dm_pool_abort_metadata()
1734 pmd->fail_io = true; in dm_pool_abort_metadata()
1737 up_write(&pmd->root_lock); in dm_pool_abort_metadata()
1742 int dm_pool_get_free_block_count(struct dm_pool_metadata *pmd, dm_block_t *result) in dm_pool_get_free_block_count() argument
1746 down_read(&pmd->root_lock); in dm_pool_get_free_block_count()
1747 if (!pmd->fail_io) in dm_pool_get_free_block_count()
1748 r = dm_sm_get_nr_free(pmd->data_sm, result); in dm_pool_get_free_block_count()
1749 up_read(&pmd->root_lock); in dm_pool_get_free_block_count()
1754 int dm_pool_get_free_metadata_block_count(struct dm_pool_metadata *pmd, in dm_pool_get_free_metadata_block_count() argument
1759 down_read(&pmd->root_lock); in dm_pool_get_free_metadata_block_count()
1760 if (!pmd->fail_io) in dm_pool_get_free_metadata_block_count()
1761 r = dm_sm_get_nr_free(pmd->metadata_sm, result); in dm_pool_get_free_metadata_block_count()
1762 up_read(&pmd->root_lock); in dm_pool_get_free_metadata_block_count()
1767 int dm_pool_get_metadata_dev_size(struct dm_pool_metadata *pmd, in dm_pool_get_metadata_dev_size() argument
1772 down_read(&pmd->root_lock); in dm_pool_get_metadata_dev_size()
1773 if (!pmd->fail_io) in dm_pool_get_metadata_dev_size()
1774 r = dm_sm_get_nr_blocks(pmd->metadata_sm, result); in dm_pool_get_metadata_dev_size()
1775 up_read(&pmd->root_lock); in dm_pool_get_metadata_dev_size()
1780 int dm_pool_get_data_dev_size(struct dm_pool_metadata *pmd, dm_block_t *result) in dm_pool_get_data_dev_size() argument
1784 down_read(&pmd->root_lock); in dm_pool_get_data_dev_size()
1785 if (!pmd->fail_io) in dm_pool_get_data_dev_size()
1786 r = dm_sm_get_nr_blocks(pmd->data_sm, result); in dm_pool_get_data_dev_size()
1787 up_read(&pmd->root_lock); in dm_pool_get_data_dev_size()
1795 struct dm_pool_metadata *pmd = td->pmd; in dm_thin_get_mapped_count() local
1797 down_read(&pmd->root_lock); in dm_thin_get_mapped_count()
1798 if (!pmd->fail_io) { in dm_thin_get_mapped_count()
1802 up_read(&pmd->root_lock); in dm_thin_get_mapped_count()
1812 struct dm_pool_metadata *pmd = td->pmd; in __highest_block() local
1814 r = dm_btree_lookup(&pmd->tl_info, pmd->root, &td->id, &value_le); in __highest_block()
1820 return dm_btree_find_highest_key(&pmd->bl_info, thin_root, result); in __highest_block()
1827 struct dm_pool_metadata *pmd = td->pmd; in dm_thin_get_highest_mapped_block() local
1829 down_read(&pmd->root_lock); in dm_thin_get_highest_mapped_block()
1830 if (!pmd->fail_io) in dm_thin_get_highest_mapped_block()
1832 up_read(&pmd->root_lock); in dm_thin_get_highest_mapped_block()
1857 int dm_pool_resize_data_dev(struct dm_pool_metadata *pmd, dm_block_t new_count) in dm_pool_resize_data_dev() argument
1861 down_write(&pmd->root_lock); in dm_pool_resize_data_dev()
1862 if (!pmd->fail_io) in dm_pool_resize_data_dev()
1863 r = __resize_space_map(pmd->data_sm, new_count); in dm_pool_resize_data_dev()
1864 up_write(&pmd->root_lock); in dm_pool_resize_data_dev()
1869 int dm_pool_resize_metadata_dev(struct dm_pool_metadata *pmd, dm_block_t new_count) in dm_pool_resize_metadata_dev() argument
1873 down_write(&pmd->root_lock); in dm_pool_resize_metadata_dev()
1874 if (!pmd->fail_io) in dm_pool_resize_metadata_dev()
1875 r = __resize_space_map(pmd->metadata_sm, new_count); in dm_pool_resize_metadata_dev()
1876 up_write(&pmd->root_lock); in dm_pool_resize_metadata_dev()
1881 void dm_pool_metadata_read_only(struct dm_pool_metadata *pmd) in dm_pool_metadata_read_only() argument
1883 down_write(&pmd->root_lock); in dm_pool_metadata_read_only()
1884 dm_bm_set_read_only(pmd->bm); in dm_pool_metadata_read_only()
1885 up_write(&pmd->root_lock); in dm_pool_metadata_read_only()
1888 void dm_pool_metadata_read_write(struct dm_pool_metadata *pmd) in dm_pool_metadata_read_write() argument
1890 down_write(&pmd->root_lock); in dm_pool_metadata_read_write()
1891 dm_bm_set_read_write(pmd->bm); in dm_pool_metadata_read_write()
1892 up_write(&pmd->root_lock); in dm_pool_metadata_read_write()
1895 int dm_pool_register_metadata_threshold(struct dm_pool_metadata *pmd, in dm_pool_register_metadata_threshold() argument
1902 down_write(&pmd->root_lock); in dm_pool_register_metadata_threshold()
1903 r = dm_sm_register_threshold_callback(pmd->metadata_sm, threshold, fn, context); in dm_pool_register_metadata_threshold()
1904 up_write(&pmd->root_lock); in dm_pool_register_metadata_threshold()
1909 int dm_pool_metadata_set_needs_check(struct dm_pool_metadata *pmd) in dm_pool_metadata_set_needs_check() argument
1915 down_write(&pmd->root_lock); in dm_pool_metadata_set_needs_check()
1916 pmd->flags |= THIN_METADATA_NEEDS_CHECK_FLAG; in dm_pool_metadata_set_needs_check()
1918 r = superblock_lock(pmd, &sblock); in dm_pool_metadata_set_needs_check()
1925 disk_super->flags = cpu_to_le32(pmd->flags); in dm_pool_metadata_set_needs_check()
1929 up_write(&pmd->root_lock); in dm_pool_metadata_set_needs_check()
1933 bool dm_pool_metadata_needs_check(struct dm_pool_metadata *pmd) in dm_pool_metadata_needs_check() argument
1937 down_read(&pmd->root_lock); in dm_pool_metadata_needs_check()
1938 needs_check = pmd->flags & THIN_METADATA_NEEDS_CHECK_FLAG; in dm_pool_metadata_needs_check()
1939 up_read(&pmd->root_lock); in dm_pool_metadata_needs_check()
1944 void dm_pool_issue_prefetches(struct dm_pool_metadata *pmd) in dm_pool_issue_prefetches() argument
1946 down_read(&pmd->root_lock); in dm_pool_issue_prefetches()
1947 if (!pmd->fail_io) in dm_pool_issue_prefetches()
1948 dm_tm_issue_prefetches(pmd->tm); in dm_pool_issue_prefetches()
1949 up_read(&pmd->root_lock); in dm_pool_issue_prefetches()