Lines Matching refs:vd

150 vdev_dbgmsg(vdev_t *vd, const char *fmt, ...)  in vdev_dbgmsg()  argument
159 if (vd->vdev_path != NULL) { in vdev_dbgmsg()
160 zfs_dbgmsg("%s vdev '%s': %s", vd->vdev_ops->vdev_op_type, in vdev_dbgmsg()
161 vd->vdev_path, buf); in vdev_dbgmsg()
164 vd->vdev_ops->vdev_op_type, in vdev_dbgmsg()
165 (u_longlong_t)vd->vdev_id, in vdev_dbgmsg()
166 (u_longlong_t)vd->vdev_guid, buf); in vdev_dbgmsg()
171 vdev_dbgmsg_print_tree(vdev_t *vd, int indent) in vdev_dbgmsg_print_tree() argument
175 if (vd->vdev_ishole || vd->vdev_ops == &vdev_missing_ops) { in vdev_dbgmsg_print_tree()
177 (u_longlong_t)vd->vdev_id, in vdev_dbgmsg_print_tree()
178 vd->vdev_ops->vdev_op_type); in vdev_dbgmsg_print_tree()
182 switch (vd->vdev_state) { in vdev_dbgmsg_print_tree()
209 (uint_t)vd->vdev_state); in vdev_dbgmsg_print_tree()
213 "", (int)vd->vdev_id, vd->vdev_ops->vdev_op_type, in vdev_dbgmsg_print_tree()
214 vd->vdev_islog ? " (log)" : "", in vdev_dbgmsg_print_tree()
215 (u_longlong_t)vd->vdev_guid, in vdev_dbgmsg_print_tree()
216 vd->vdev_path ? vd->vdev_path : "N/A", state); in vdev_dbgmsg_print_tree()
218 for (uint64_t i = 0; i < vd->vdev_children; i++) in vdev_dbgmsg_print_tree()
219 vdev_dbgmsg_print_tree(vd->vdev_child[i], indent + 2); in vdev_dbgmsg_print_tree()
264 vdev_get_mg(vdev_t *vd, metaslab_class_t *mc) in vdev_get_mg() argument
266 if (mc == spa_embedded_log_class(vd->vdev_spa) && in vdev_get_mg()
267 vd->vdev_log_mg != NULL) in vdev_get_mg()
268 return (vd->vdev_log_mg); in vdev_get_mg()
270 return (vd->vdev_mg); in vdev_get_mg()
274 vdev_default_xlate(vdev_t *vd, const range_seg64_t *logical_rs, in vdev_default_xlate() argument
277 (void) vd, (void) remain_rs; in vdev_default_xlate()
307 vdev_default_asize(vdev_t *vd, uint64_t psize) in vdev_default_asize() argument
309 uint64_t asize = P2ROUNDUP(psize, 1ULL << vd->vdev_top->vdev_ashift); in vdev_default_asize()
312 for (int c = 0; c < vd->vdev_children; c++) { in vdev_default_asize()
313 csize = vdev_psize_to_asize(vd->vdev_child[c], psize); in vdev_default_asize()
321 vdev_default_min_asize(vdev_t *vd) in vdev_default_min_asize() argument
323 return (vd->vdev_min_asize); in vdev_default_min_asize()
333 vdev_get_min_asize(vdev_t *vd) in vdev_get_min_asize() argument
335 vdev_t *pvd = vd->vdev_parent; in vdev_get_min_asize()
342 return (vd->vdev_asize); in vdev_get_min_asize()
348 if (vd == vd->vdev_top) in vdev_get_min_asize()
349 return (P2ALIGN(vd->vdev_asize, 1ULL << vd->vdev_ms_shift)); in vdev_get_min_asize()
355 vdev_set_min_asize(vdev_t *vd) in vdev_set_min_asize() argument
357 vd->vdev_min_asize = vdev_get_min_asize(vd); in vdev_set_min_asize()
359 for (int c = 0; c < vd->vdev_children; c++) in vdev_set_min_asize()
360 vdev_set_min_asize(vd->vdev_child[c]); in vdev_set_min_asize()
367 vdev_get_min_alloc(vdev_t *vd) in vdev_get_min_alloc() argument
369 uint64_t min_alloc = 1ULL << vd->vdev_ashift; in vdev_get_min_alloc()
371 if (vd->vdev_ops->vdev_op_min_alloc != NULL) in vdev_get_min_alloc()
372 min_alloc = vd->vdev_ops->vdev_op_min_alloc(vd); in vdev_get_min_alloc()
381 vdev_get_nparity(vdev_t *vd) in vdev_get_nparity() argument
385 if (vd->vdev_ops->vdev_op_nparity != NULL) in vdev_get_nparity()
386 nparity = vd->vdev_ops->vdev_op_nparity(vd); in vdev_get_nparity()
395 vdev_get_ndisks(vdev_t *vd) in vdev_get_ndisks() argument
399 if (vd->vdev_ops->vdev_op_ndisks != NULL) in vdev_get_ndisks()
400 ndisks = vd->vdev_ops->vdev_op_ndisks(vd); in vdev_get_ndisks()
421 vdev_lookup_by_guid(vdev_t *vd, uint64_t guid) in vdev_lookup_by_guid() argument
425 if (vd->vdev_guid == guid) in vdev_lookup_by_guid()
426 return (vd); in vdev_lookup_by_guid()
428 for (int c = 0; c < vd->vdev_children; c++) in vdev_lookup_by_guid()
429 if ((mvd = vdev_lookup_by_guid(vd->vdev_child[c], guid)) != in vdev_lookup_by_guid()
437 vdev_count_leaves_impl(vdev_t *vd) in vdev_count_leaves_impl() argument
441 if (vd->vdev_ops->vdev_op_leaf) in vdev_count_leaves_impl()
444 for (int c = 0; c < vd->vdev_children; c++) in vdev_count_leaves_impl()
445 n += vdev_count_leaves_impl(vd->vdev_child[c]); in vdev_count_leaves_impl()
590 vdev_t *vd; in vdev_alloc_common() local
593 vd = kmem_zalloc(sizeof (vdev_t), KM_SLEEP); in vdev_alloc_common()
594 vic = &vd->vdev_indirect_config; in vdev_alloc_common()
598 spa->spa_root_vdev = vd; in vdev_alloc_common()
603 if (spa->spa_root_vdev == vd) { in vdev_alloc_common()
618 vd->vdev_spa = spa; in vdev_alloc_common()
619 vd->vdev_id = id; in vdev_alloc_common()
620 vd->vdev_guid = guid; in vdev_alloc_common()
621 vd->vdev_guid_sum = guid; in vdev_alloc_common()
622 vd->vdev_ops = ops; in vdev_alloc_common()
623 vd->vdev_state = VDEV_STATE_CLOSED; in vdev_alloc_common()
624 vd->vdev_ishole = (ops == &vdev_hole_ops); in vdev_alloc_common()
627 rw_init(&vd->vdev_indirect_rwlock, NULL, RW_DEFAULT, NULL); in vdev_alloc_common()
628 mutex_init(&vd->vdev_obsolete_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
629 vd->vdev_obsolete_segments = range_tree_create(NULL, RANGE_SEG64, NULL, in vdev_alloc_common()
637 zfs_ratelimit_init(&vd->vdev_delay_rl, &zfs_slow_io_events_per_second, in vdev_alloc_common()
639 zfs_ratelimit_init(&vd->vdev_deadman_rl, &zfs_slow_io_events_per_second, in vdev_alloc_common()
641 zfs_ratelimit_init(&vd->vdev_checksum_rl, in vdev_alloc_common()
644 list_link_init(&vd->vdev_config_dirty_node); in vdev_alloc_common()
645 list_link_init(&vd->vdev_state_dirty_node); in vdev_alloc_common()
646 list_link_init(&vd->vdev_initialize_node); in vdev_alloc_common()
647 list_link_init(&vd->vdev_leaf_node); in vdev_alloc_common()
648 list_link_init(&vd->vdev_trim_node); in vdev_alloc_common()
650 mutex_init(&vd->vdev_dtl_lock, NULL, MUTEX_NOLOCKDEP, NULL); in vdev_alloc_common()
651 mutex_init(&vd->vdev_stat_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
652 mutex_init(&vd->vdev_probe_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
653 mutex_init(&vd->vdev_scan_io_queue_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
655 mutex_init(&vd->vdev_initialize_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
656 mutex_init(&vd->vdev_initialize_io_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
657 cv_init(&vd->vdev_initialize_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
658 cv_init(&vd->vdev_initialize_io_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
660 mutex_init(&vd->vdev_trim_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
661 mutex_init(&vd->vdev_autotrim_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
662 mutex_init(&vd->vdev_trim_io_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
663 cv_init(&vd->vdev_trim_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
664 cv_init(&vd->vdev_autotrim_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
665 cv_init(&vd->vdev_trim_io_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
667 mutex_init(&vd->vdev_rebuild_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
668 cv_init(&vd->vdev_rebuild_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
671 vd->vdev_dtl[t] = range_tree_create(NULL, RANGE_SEG64, NULL, 0, in vdev_alloc_common()
675 txg_list_create(&vd->vdev_ms_list, spa, in vdev_alloc_common()
677 txg_list_create(&vd->vdev_dtl_list, spa, in vdev_alloc_common()
679 vd->vdev_stat.vs_timestamp = gethrtime(); in vdev_alloc_common()
680 vdev_queue_init(vd); in vdev_alloc_common()
681 vdev_cache_init(vd); in vdev_alloc_common()
683 return (vd); in vdev_alloc_common()
698 vdev_t *vd; in vdev_alloc() local
794 vd = vdev_alloc_common(spa, id, guid, ops); in vdev_alloc()
795 vd->vdev_tsd = tsd; in vdev_alloc()
796 vd->vdev_islog = islog; in vdev_alloc()
799 vd->vdev_alloc_bias = alloc_bias; in vdev_alloc()
801 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &vd->vdev_path) == 0) in vdev_alloc()
802 vd->vdev_path = spa_strdup(vd->vdev_path); in vdev_alloc()
811 vd->vdev_stat.vs_aux = VDEV_AUX_EXTERNAL; in vdev_alloc()
812 vd->vdev_faulted = 1; in vdev_alloc()
813 vd->vdev_label_aux = VDEV_AUX_EXTERNAL; in vdev_alloc()
816 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &vd->vdev_devid) == 0) in vdev_alloc()
817 vd->vdev_devid = spa_strdup(vd->vdev_devid); in vdev_alloc()
819 &vd->vdev_physpath) == 0) in vdev_alloc()
820 vd->vdev_physpath = spa_strdup(vd->vdev_physpath); in vdev_alloc()
823 &vd->vdev_enc_sysfs_path) == 0) in vdev_alloc()
824 vd->vdev_enc_sysfs_path = spa_strdup(vd->vdev_enc_sysfs_path); in vdev_alloc()
826 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_FRU, &vd->vdev_fru) == 0) in vdev_alloc()
827 vd->vdev_fru = spa_strdup(vd->vdev_fru); in vdev_alloc()
834 &vd->vdev_wholedisk) != 0) in vdev_alloc()
835 vd->vdev_wholedisk = -1ULL; in vdev_alloc()
837 vic = &vd->vdev_indirect_config; in vdev_alloc()
854 &vd->vdev_not_present); in vdev_alloc()
859 (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ASHIFT, &vd->vdev_ashift); in vdev_alloc()
865 &vd->vdev_crtxg); in vdev_alloc()
873 &vd->vdev_ms_array); in vdev_alloc()
875 &vd->vdev_ms_shift); in vdev_alloc()
877 &vd->vdev_asize); in vdev_alloc()
879 &vd->vdev_removing); in vdev_alloc()
881 &vd->vdev_top_zap); in vdev_alloc()
883 ASSERT0(vd->vdev_top_zap); in vdev_alloc()
894 if (vd->vdev_ops->vdev_op_leaf && in vdev_alloc()
897 ZPOOL_CONFIG_VDEV_LEAF_ZAP, &vd->vdev_leaf_zap); in vdev_alloc()
899 ASSERT0(vd->vdev_leaf_zap); in vdev_alloc()
906 if (vd->vdev_ops->vdev_op_leaf && in vdev_alloc()
911 &vd->vdev_dtl_object); in vdev_alloc()
913 &vd->vdev_unspare); in vdev_alloc()
921 spa_spare_add(vd); in vdev_alloc()
925 &vd->vdev_offline); in vdev_alloc()
928 &vd->vdev_resilver_txg); in vdev_alloc()
931 &vd->vdev_rebuild_txg); in vdev_alloc()
934 vdev_defer_resilver(vd); in vdev_alloc()
949 &vd->vdev_faulted); in vdev_alloc()
951 &vd->vdev_degraded); in vdev_alloc()
953 &vd->vdev_removed); in vdev_alloc()
955 if (vd->vdev_faulted || vd->vdev_degraded) { in vdev_alloc()
958 vd->vdev_label_aux = in vdev_alloc()
963 vd->vdev_label_aux = VDEV_AUX_EXTERNAL; in vdev_alloc()
965 vd->vdev_faulted = 0ULL; in vdev_alloc()
973 vdev_add_child(parent, vd); in vdev_alloc()
975 *vdp = vd; in vdev_alloc()
981 vdev_free(vdev_t *vd) in vdev_free() argument
983 spa_t *spa = vd->vdev_spa; in vdev_free()
985 ASSERT3P(vd->vdev_initialize_thread, ==, NULL); in vdev_free()
986 ASSERT3P(vd->vdev_trim_thread, ==, NULL); in vdev_free()
987 ASSERT3P(vd->vdev_autotrim_thread, ==, NULL); in vdev_free()
988 ASSERT3P(vd->vdev_rebuild_thread, ==, NULL); in vdev_free()
995 if (vd->vdev_scan_io_queue != NULL) { in vdev_free()
996 mutex_enter(&vd->vdev_scan_io_queue_lock); in vdev_free()
997 dsl_scan_io_queue_destroy(vd->vdev_scan_io_queue); in vdev_free()
998 vd->vdev_scan_io_queue = NULL; in vdev_free()
999 mutex_exit(&vd->vdev_scan_io_queue_lock); in vdev_free()
1006 vdev_close(vd); in vdev_free()
1008 ASSERT(!list_link_active(&vd->vdev_config_dirty_node)); in vdev_free()
1009 ASSERT(!list_link_active(&vd->vdev_state_dirty_node)); in vdev_free()
1014 for (int c = 0; c < vd->vdev_children; c++) in vdev_free()
1015 vdev_free(vd->vdev_child[c]); in vdev_free()
1017 ASSERT(vd->vdev_child == NULL); in vdev_free()
1018 ASSERT(vd->vdev_guid_sum == vd->vdev_guid); in vdev_free()
1020 if (vd->vdev_ops->vdev_op_fini != NULL) in vdev_free()
1021 vd->vdev_ops->vdev_op_fini(vd); in vdev_free()
1026 if (vd->vdev_mg != NULL) { in vdev_free()
1027 vdev_metaslab_fini(vd); in vdev_free()
1028 metaslab_group_destroy(vd->vdev_mg); in vdev_free()
1029 vd->vdev_mg = NULL; in vdev_free()
1031 if (vd->vdev_log_mg != NULL) { in vdev_free()
1032 ASSERT0(vd->vdev_ms_count); in vdev_free()
1033 metaslab_group_destroy(vd->vdev_log_mg); in vdev_free()
1034 vd->vdev_log_mg = NULL; in vdev_free()
1037 ASSERT0(vd->vdev_stat.vs_space); in vdev_free()
1038 ASSERT0(vd->vdev_stat.vs_dspace); in vdev_free()
1039 ASSERT0(vd->vdev_stat.vs_alloc); in vdev_free()
1044 vdev_remove_child(vd->vdev_parent, vd); in vdev_free()
1046 ASSERT(vd->vdev_parent == NULL); in vdev_free()
1047 ASSERT(!list_link_active(&vd->vdev_leaf_node)); in vdev_free()
1052 vdev_queue_fini(vd); in vdev_free()
1053 vdev_cache_fini(vd); in vdev_free()
1055 if (vd->vdev_path) in vdev_free()
1056 spa_strfree(vd->vdev_path); in vdev_free()
1057 if (vd->vdev_devid) in vdev_free()
1058 spa_strfree(vd->vdev_devid); in vdev_free()
1059 if (vd->vdev_physpath) in vdev_free()
1060 spa_strfree(vd->vdev_physpath); in vdev_free()
1062 if (vd->vdev_enc_sysfs_path) in vdev_free()
1063 spa_strfree(vd->vdev_enc_sysfs_path); in vdev_free()
1065 if (vd->vdev_fru) in vdev_free()
1066 spa_strfree(vd->vdev_fru); in vdev_free()
1068 if (vd->vdev_isspare) in vdev_free()
1069 spa_spare_remove(vd); in vdev_free()
1070 if (vd->vdev_isl2cache) in vdev_free()
1071 spa_l2cache_remove(vd); in vdev_free()
1073 txg_list_destroy(&vd->vdev_ms_list); in vdev_free()
1074 txg_list_destroy(&vd->vdev_dtl_list); in vdev_free()
1076 mutex_enter(&vd->vdev_dtl_lock); in vdev_free()
1077 space_map_close(vd->vdev_dtl_sm); in vdev_free()
1079 range_tree_vacate(vd->vdev_dtl[t], NULL, NULL); in vdev_free()
1080 range_tree_destroy(vd->vdev_dtl[t]); in vdev_free()
1082 mutex_exit(&vd->vdev_dtl_lock); in vdev_free()
1084 EQUIV(vd->vdev_indirect_births != NULL, in vdev_free()
1085 vd->vdev_indirect_mapping != NULL); in vdev_free()
1086 if (vd->vdev_indirect_births != NULL) { in vdev_free()
1087 vdev_indirect_mapping_close(vd->vdev_indirect_mapping); in vdev_free()
1088 vdev_indirect_births_close(vd->vdev_indirect_births); in vdev_free()
1091 if (vd->vdev_obsolete_sm != NULL) { in vdev_free()
1092 ASSERT(vd->vdev_removing || in vdev_free()
1093 vd->vdev_ops == &vdev_indirect_ops); in vdev_free()
1094 space_map_close(vd->vdev_obsolete_sm); in vdev_free()
1095 vd->vdev_obsolete_sm = NULL; in vdev_free()
1097 range_tree_destroy(vd->vdev_obsolete_segments); in vdev_free()
1098 rw_destroy(&vd->vdev_indirect_rwlock); in vdev_free()
1099 mutex_destroy(&vd->vdev_obsolete_lock); in vdev_free()
1101 mutex_destroy(&vd->vdev_dtl_lock); in vdev_free()
1102 mutex_destroy(&vd->vdev_stat_lock); in vdev_free()
1103 mutex_destroy(&vd->vdev_probe_lock); in vdev_free()
1104 mutex_destroy(&vd->vdev_scan_io_queue_lock); in vdev_free()
1106 mutex_destroy(&vd->vdev_initialize_lock); in vdev_free()
1107 mutex_destroy(&vd->vdev_initialize_io_lock); in vdev_free()
1108 cv_destroy(&vd->vdev_initialize_io_cv); in vdev_free()
1109 cv_destroy(&vd->vdev_initialize_cv); in vdev_free()
1111 mutex_destroy(&vd->vdev_trim_lock); in vdev_free()
1112 mutex_destroy(&vd->vdev_autotrim_lock); in vdev_free()
1113 mutex_destroy(&vd->vdev_trim_io_lock); in vdev_free()
1114 cv_destroy(&vd->vdev_trim_cv); in vdev_free()
1115 cv_destroy(&vd->vdev_autotrim_cv); in vdev_free()
1116 cv_destroy(&vd->vdev_trim_io_cv); in vdev_free()
1118 mutex_destroy(&vd->vdev_rebuild_lock); in vdev_free()
1119 cv_destroy(&vd->vdev_rebuild_cv); in vdev_free()
1121 zfs_ratelimit_fini(&vd->vdev_delay_rl); in vdev_free()
1122 zfs_ratelimit_fini(&vd->vdev_deadman_rl); in vdev_free()
1123 zfs_ratelimit_fini(&vd->vdev_checksum_rl); in vdev_free()
1125 if (vd == spa->spa_root_vdev) in vdev_free()
1128 kmem_free(vd, sizeof (vdev_t)); in vdev_free()
1139 vdev_t *vd; in vdev_top_transfer() local
1219 while ((vd = txg_list_remove(&svd->vdev_dtl_list, t)) != NULL) in vdev_top_transfer()
1220 (void) txg_list_add(&tvd->vdev_dtl_list, vd, t); in vdev_top_transfer()
1245 vdev_top_update(vdev_t *tvd, vdev_t *vd) in vdev_top_update() argument
1247 if (vd == NULL) in vdev_top_update()
1250 vd->vdev_top = tvd; in vdev_top_update()
1252 for (int c = 0; c < vd->vdev_children; c++) in vdev_top_update()
1253 vdev_top_update(tvd, vd->vdev_child[c]); in vdev_top_update()
1349 vdev_metaslab_group_create(vdev_t *vd) in vdev_metaslab_group_create() argument
1351 spa_t *spa = vd->vdev_spa; in vdev_metaslab_group_create()
1356 if (vd->vdev_mg == NULL) { in vdev_metaslab_group_create()
1359 if (vd->vdev_islog && vd->vdev_alloc_bias == VDEV_BIAS_NONE) in vdev_metaslab_group_create()
1360 vd->vdev_alloc_bias = VDEV_BIAS_LOG; in vdev_metaslab_group_create()
1362 ASSERT3U(vd->vdev_islog, ==, in vdev_metaslab_group_create()
1363 (vd->vdev_alloc_bias == VDEV_BIAS_LOG)); in vdev_metaslab_group_create()
1365 switch (vd->vdev_alloc_bias) { in vdev_metaslab_group_create()
1379 vd->vdev_mg = metaslab_group_create(mc, vd, in vdev_metaslab_group_create()
1382 if (!vd->vdev_islog) { in vdev_metaslab_group_create()
1383 vd->vdev_log_mg = metaslab_group_create( in vdev_metaslab_group_create()
1384 spa_embedded_log_class(spa), vd, 1); in vdev_metaslab_group_create()
1392 if (vd->vdev_top == vd && vd->vdev_ashift != 0 && in vdev_metaslab_group_create()
1393 mc == spa_normal_class(spa) && vd->vdev_aux == NULL) { in vdev_metaslab_group_create()
1394 if (vd->vdev_ashift > spa->spa_max_ashift) in vdev_metaslab_group_create()
1395 spa->spa_max_ashift = vd->vdev_ashift; in vdev_metaslab_group_create()
1396 if (vd->vdev_ashift < spa->spa_min_ashift) in vdev_metaslab_group_create()
1397 spa->spa_min_ashift = vd->vdev_ashift; in vdev_metaslab_group_create()
1399 uint64_t min_alloc = vdev_get_min_alloc(vd); in vdev_metaslab_group_create()
1407 vdev_metaslab_init(vdev_t *vd, uint64_t txg) in vdev_metaslab_init() argument
1409 spa_t *spa = vd->vdev_spa; in vdev_metaslab_init()
1410 uint64_t oldc = vd->vdev_ms_count; in vdev_metaslab_init()
1411 uint64_t newc = vd->vdev_asize >> vd->vdev_ms_shift; in vdev_metaslab_init()
1421 if (vd->vdev_ms_shift == 0) in vdev_metaslab_init()
1424 ASSERT(!vd->vdev_ishole); in vdev_metaslab_init()
1431 bcopy(vd->vdev_ms, mspp, oldc * sizeof (*mspp)); in vdev_metaslab_init()
1432 vmem_free(vd->vdev_ms, oldc * sizeof (*mspp)); in vdev_metaslab_init()
1435 vd->vdev_ms = mspp; in vdev_metaslab_init()
1436 vd->vdev_ms_count = newc; in vdev_metaslab_init()
1445 if (txg == 0 && vd->vdev_ms_array != 0) { in vdev_metaslab_init()
1447 vd->vdev_ms_array, in vdev_metaslab_init()
1451 vdev_dbgmsg(vd, "unable to read the metaslab " in vdev_metaslab_init()
1457 error = metaslab_init(vd->vdev_mg, m, object, txg, in vdev_metaslab_init()
1458 &(vd->vdev_ms[m])); in vdev_metaslab_init()
1460 vdev_dbgmsg(vd, "metaslab_init failed [error=%d]", in vdev_metaslab_init()
1471 if (vd->vdev_mg->mg_class == spa_normal_class(spa) && in vdev_metaslab_init()
1472 vd->vdev_ms_count > zfs_embedded_slog_min_ms && in vdev_metaslab_init()
1473 avl_is_empty(&vd->vdev_log_mg->mg_metaslab_tree)) { in vdev_metaslab_init()
1485 space_map_allocated(vd->vdev_ms[m]->ms_sm); in vdev_metaslab_init()
1491 metaslab_t *slog_ms = vd->vdev_ms[slog_msid]; in vdev_metaslab_init()
1498 (void) txg_list_remove_this(&vd->vdev_ms_list, in vdev_metaslab_init()
1503 VERIFY0(metaslab_init(vd->vdev_log_mg, slog_msid, sm_obj, txg, in vdev_metaslab_init()
1504 &vd->vdev_ms[slog_msid])); in vdev_metaslab_init()
1515 if (!expanding && !vd->vdev_removing) { in vdev_metaslab_init()
1516 metaslab_group_activate(vd->vdev_mg); in vdev_metaslab_init()
1517 if (vd->vdev_log_mg != NULL) in vdev_metaslab_init()
1518 metaslab_group_activate(vd->vdev_log_mg); in vdev_metaslab_init()
1528 vdev_metaslab_fini(vdev_t *vd) in vdev_metaslab_fini() argument
1530 if (vd->vdev_checkpoint_sm != NULL) { in vdev_metaslab_fini()
1531 ASSERT(spa_feature_is_active(vd->vdev_spa, in vdev_metaslab_fini()
1533 space_map_close(vd->vdev_checkpoint_sm); in vdev_metaslab_fini()
1542 vd->vdev_checkpoint_sm = NULL; in vdev_metaslab_fini()
1545 if (vd->vdev_ms != NULL) { in vdev_metaslab_fini()
1546 metaslab_group_t *mg = vd->vdev_mg; in vdev_metaslab_fini()
1549 if (vd->vdev_log_mg != NULL) { in vdev_metaslab_fini()
1550 ASSERT(!vd->vdev_islog); in vdev_metaslab_fini()
1551 metaslab_group_passivate(vd->vdev_log_mg); in vdev_metaslab_fini()
1554 uint64_t count = vd->vdev_ms_count; in vdev_metaslab_fini()
1556 metaslab_t *msp = vd->vdev_ms[m]; in vdev_metaslab_fini()
1560 vmem_free(vd->vdev_ms, count * sizeof (metaslab_t *)); in vdev_metaslab_fini()
1561 vd->vdev_ms = NULL; in vdev_metaslab_fini()
1562 vd->vdev_ms_count = 0; in vdev_metaslab_fini()
1566 if (vd->vdev_log_mg != NULL) in vdev_metaslab_fini()
1567 ASSERT0(vd->vdev_log_mg->mg_histogram[i]); in vdev_metaslab_fini()
1570 ASSERT0(vd->vdev_ms_count); in vdev_metaslab_fini()
1571 ASSERT3U(vd->vdev_pending_fastwrite, ==, 0); in vdev_metaslab_fini()
1584 vdev_t *vd = zio->io_vd; in vdev_probe_done() local
1587 ASSERT(vd->vdev_probe_zio != NULL); in vdev_probe_done()
1593 zio_nowait(zio_write_phys(vd->vdev_probe_zio, vd, in vdev_probe_done()
1608 vd->vdev_cant_read |= !vps->vps_readable; in vdev_probe_done()
1609 vd->vdev_cant_write |= !vps->vps_writeable; in vdev_probe_done()
1611 if (vdev_readable(vd) && in vdev_probe_done()
1612 (vdev_writeable(vd) || !spa_writeable(spa))) { in vdev_probe_done()
1616 vdev_dbgmsg(vd, "failed probe"); in vdev_probe_done()
1618 spa, vd, NULL, NULL, 0); in vdev_probe_done()
1622 mutex_enter(&vd->vdev_probe_lock); in vdev_probe_done()
1623 ASSERT(vd->vdev_probe_zio == zio); in vdev_probe_done()
1624 vd->vdev_probe_zio = NULL; in vdev_probe_done()
1625 mutex_exit(&vd->vdev_probe_lock); in vdev_probe_done()
1629 if (!vdev_accessible(vd, pio)) in vdev_probe_done()
1644 vdev_probe(vdev_t *vd, zio_t *zio) in vdev_probe() argument
1646 spa_t *spa = vd->vdev_spa; in vdev_probe()
1650 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_probe()
1663 mutex_enter(&vd->vdev_probe_lock); in vdev_probe()
1665 if ((pio = vd->vdev_probe_zio) == NULL) { in vdev_probe()
1690 vd->vdev_cant_read = B_FALSE; in vdev_probe()
1691 vd->vdev_cant_write = B_FALSE; in vdev_probe()
1694 vd->vdev_probe_zio = pio = zio_null(NULL, spa, vd, in vdev_probe()
1703 vd->vdev_probe_wanted = B_TRUE; in vdev_probe()
1711 mutex_exit(&vd->vdev_probe_lock); in vdev_probe()
1719 zio_nowait(zio_read_phys(pio, vd, in vdev_probe()
1720 vdev_label_offset(vd->vdev_psize, l, in vdev_probe()
1737 vdev_t *vd = arg; in vdev_load_child() local
1739 vd->vdev_load_error = vdev_load(vd); in vdev_load_child()
1745 vdev_t *vd = arg; in vdev_open_child() local
1747 vd->vdev_open_thread = curthread; in vdev_open_child()
1748 vd->vdev_open_error = vdev_open(vd); in vdev_open_child()
1749 vd->vdev_open_thread = NULL; in vdev_open_child()
1753 vdev_uses_zvols(vdev_t *vd) in vdev_uses_zvols() argument
1756 if (zvol_is_zvol(vd->vdev_path)) in vdev_uses_zvols()
1760 for (int c = 0; c < vd->vdev_children; c++) in vdev_uses_zvols()
1761 if (vdev_uses_zvols(vd->vdev_child[c])) in vdev_uses_zvols()
1771 vdev_default_open_children_func(vdev_t *vd) in vdev_default_open_children_func() argument
1773 (void) vd; in vdev_default_open_children_func()
1783 vdev_open_children_impl(vdev_t *vd, vdev_open_children_func_t *open_func) in vdev_open_children_impl() argument
1785 int children = vd->vdev_children; in vdev_open_children_impl()
1789 vd->vdev_nonrot = B_TRUE; in vdev_open_children_impl()
1792 vdev_t *cvd = vd->vdev_child[c]; in vdev_open_children_impl()
1797 if (tq == NULL || vdev_uses_zvols(vd)) { in vdev_open_children_impl()
1804 vd->vdev_nonrot &= cvd->vdev_nonrot; in vdev_open_children_impl()
1817 vdev_open_children(vdev_t *vd) in vdev_open_children() argument
1819 vdev_open_children_impl(vd, vdev_default_open_children_func); in vdev_open_children()
1826 vdev_open_children_subset(vdev_t *vd, vdev_open_children_func_t *open_func) in vdev_open_children_subset() argument
1828 vdev_open_children_impl(vd, open_func); in vdev_open_children_subset()
1838 vdev_set_deflate_ratio(vdev_t *vd) in vdev_set_deflate_ratio() argument
1840 if (vd == vd->vdev_top && !vd->vdev_ishole && vd->vdev_ashift != 0) { in vdev_set_deflate_ratio()
1841 vd->vdev_deflate_ratio = (1 << 17) / in vdev_set_deflate_ratio()
1842 (vdev_psize_to_asize(vd, 1 << 17) >> SPA_MINBLOCKSHIFT); in vdev_set_deflate_ratio()
1871 vdev_ashift_optimize(vdev_t *vd) in vdev_ashift_optimize() argument
1873 ASSERT(vd == vd->vdev_top); in vdev_ashift_optimize()
1875 if (vd->vdev_ashift < vd->vdev_physical_ashift && in vdev_ashift_optimize()
1876 vd->vdev_physical_ashift <= zfs_vdev_max_auto_ashift) { in vdev_ashift_optimize()
1877 vd->vdev_ashift = MIN( in vdev_ashift_optimize()
1878 MAX(zfs_vdev_max_auto_ashift, vd->vdev_ashift), in vdev_ashift_optimize()
1880 vd->vdev_physical_ashift)); in vdev_ashift_optimize()
1892 vd->vdev_ashift = MAX(zfs_vdev_min_auto_ashift, in vdev_ashift_optimize()
1893 vd->vdev_ashift); in vdev_ashift_optimize()
1901 vdev_open(vdev_t *vd) in vdev_open() argument
1903 spa_t *spa = vd->vdev_spa; in vdev_open()
1911 ASSERT(vd->vdev_open_thread == curthread || in vdev_open()
1913 ASSERT(vd->vdev_state == VDEV_STATE_CLOSED || in vdev_open()
1914 vd->vdev_state == VDEV_STATE_CANT_OPEN || in vdev_open()
1915 vd->vdev_state == VDEV_STATE_OFFLINE); in vdev_open()
1917 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_open()
1918 vd->vdev_cant_read = B_FALSE; in vdev_open()
1919 vd->vdev_cant_write = B_FALSE; in vdev_open()
1920 vd->vdev_min_asize = vdev_get_min_asize(vd); in vdev_open()
1926 if (!vd->vdev_removed && vd->vdev_faulted) { in vdev_open()
1927 ASSERT(vd->vdev_children == 0); in vdev_open()
1928 ASSERT(vd->vdev_label_aux == VDEV_AUX_ERR_EXCEEDED || in vdev_open()
1929 vd->vdev_label_aux == VDEV_AUX_EXTERNAL); in vdev_open()
1930 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1931 vd->vdev_label_aux); in vdev_open()
1933 } else if (vd->vdev_offline) { in vdev_open()
1934 ASSERT(vd->vdev_children == 0); in vdev_open()
1935 vdev_set_state(vd, B_TRUE, VDEV_STATE_OFFLINE, VDEV_AUX_NONE); in vdev_open()
1939 error = vd->vdev_ops->vdev_op_open(vd, &osize, &max_osize, in vdev_open()
1943 if (error == ENOENT && vd->vdev_removed) { in vdev_open()
1944 vdev_set_state(vd, B_TRUE, VDEV_STATE_REMOVED, in vdev_open()
1955 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1964 vd->vdev_reopening = B_FALSE; in vdev_open()
1966 error = zio_handle_device_injection(vd, NULL, SET_ERROR(ENXIO)); in vdev_open()
1969 if (vd->vdev_removed && in vdev_open()
1970 vd->vdev_stat.vs_aux != VDEV_AUX_OPEN_FAILED) in vdev_open()
1971 vd->vdev_removed = B_FALSE; in vdev_open()
1973 if (vd->vdev_stat.vs_aux == VDEV_AUX_CHILDREN_OFFLINE) { in vdev_open()
1974 vdev_set_state(vd, B_TRUE, VDEV_STATE_OFFLINE, in vdev_open()
1975 vd->vdev_stat.vs_aux); in vdev_open()
1977 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1978 vd->vdev_stat.vs_aux); in vdev_open()
1983 vd->vdev_removed = B_FALSE; in vdev_open()
1989 if (vd->vdev_faulted) { in vdev_open()
1990 ASSERT(vd->vdev_children == 0); in vdev_open()
1991 ASSERT(vd->vdev_label_aux == VDEV_AUX_ERR_EXCEEDED || in vdev_open()
1992 vd->vdev_label_aux == VDEV_AUX_EXTERNAL); in vdev_open()
1993 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1994 vd->vdev_label_aux); in vdev_open()
1998 if (vd->vdev_degraded) { in vdev_open()
1999 ASSERT(vd->vdev_children == 0); in vdev_open()
2000 vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED, in vdev_open()
2003 vdev_set_state(vd, B_TRUE, VDEV_STATE_HEALTHY, 0); in vdev_open()
2009 if (vd->vdev_ishole || vd->vdev_ops == &vdev_missing_ops) in vdev_open()
2012 for (int c = 0; c < vd->vdev_children; c++) { in vdev_open()
2013 if (vd->vdev_child[c]->vdev_state != VDEV_STATE_HEALTHY) { in vdev_open()
2014 vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED, in vdev_open()
2023 if (vd->vdev_children == 0) { in vdev_open()
2025 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
2034 if (vd->vdev_parent != NULL && osize < SPA_MINDEVSIZE - in vdev_open()
2036 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
2049 if ((psize > vd->vdev_psize) && (vd->vdev_psize != 0)) in vdev_open()
2050 vd->vdev_copy_uberblocks = B_TRUE; in vdev_open()
2052 vd->vdev_psize = psize; in vdev_open()
2057 if (asize < vd->vdev_min_asize) { in vdev_open()
2058 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
2070 vd->vdev_physical_ashift = in vdev_open()
2071 MAX(physical_ashift, vd->vdev_physical_ashift); in vdev_open()
2072 vd->vdev_logical_ashift = MAX(logical_ashift, in vdev_open()
2073 vd->vdev_logical_ashift); in vdev_open()
2075 if (vd->vdev_asize == 0) { in vdev_open()
2080 vd->vdev_asize = asize; in vdev_open()
2081 vd->vdev_max_asize = max_asize; in vdev_open()
2087 if (vd->vdev_ashift == 0) { in vdev_open()
2088 vd->vdev_ashift = vd->vdev_logical_ashift; in vdev_open()
2090 if (vd->vdev_logical_ashift > ASHIFT_MAX) { in vdev_open()
2091 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
2096 if (vd->vdev_top == vd) { in vdev_open()
2097 vdev_ashift_optimize(vd); in vdev_open()
2100 if (vd->vdev_ashift != 0 && (vd->vdev_ashift < ASHIFT_MIN || in vdev_open()
2101 vd->vdev_ashift > ASHIFT_MAX)) { in vdev_open()
2102 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
2110 if (vd->vdev_ashift > vd->vdev_top->vdev_ashift && in vdev_open()
2111 vd->vdev_ops->vdev_op_leaf) { in vdev_open()
2114 spa, vd, NULL, NULL, 0); in vdev_open()
2115 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
2119 vd->vdev_max_asize = max_asize; in vdev_open()
2134 if (vd->vdev_state == VDEV_STATE_HEALTHY && in vdev_open()
2135 ((asize > vd->vdev_asize && in vdev_open()
2136 (vd->vdev_expanding || spa->spa_autoexpand)) || in vdev_open()
2137 (asize < vd->vdev_asize))) in vdev_open()
2138 vd->vdev_asize = asize; in vdev_open()
2140 vdev_set_min_asize(vd); in vdev_open()
2146 if (vd->vdev_ops->vdev_op_leaf && in vdev_open()
2147 (error = zio_wait(vdev_probe(vd, NULL))) != 0) { in vdev_open()
2148 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
2156 if (vd->vdev_top == vd && vd->vdev_ashift != 0 && in vdev_open()
2157 vd->vdev_islog == 0 && vd->vdev_aux == NULL) { in vdev_open()
2158 uint64_t min_alloc = vdev_get_min_alloc(vd); in vdev_open()
2168 if (vd->vdev_ops->vdev_op_leaf && !spa->spa_scrub_reopen) in vdev_open()
2169 dsl_scan_assess_vdev(spa->spa_dsl_pool, vd); in vdev_open()
2177 vdev_t *vd = arg; in vdev_validate_child() local
2179 vd->vdev_validate_thread = curthread; in vdev_validate_child()
2180 vd->vdev_validate_error = vdev_validate(vd); in vdev_validate_child()
2181 vd->vdev_validate_thread = NULL; in vdev_validate_child()
2195 vdev_validate(vdev_t *vd) in vdev_validate() argument
2197 spa_t *spa = vd->vdev_spa; in vdev_validate()
2204 int children = vd->vdev_children; in vdev_validate()
2215 vdev_t *cvd = vd->vdev_child[c]; in vdev_validate()
2229 int error = vd->vdev_child[c]->vdev_validate_error; in vdev_validate()
2241 if (!vd->vdev_ops->vdev_op_leaf || !vdev_readable(vd)) in vdev_validate()
2256 if ((label = vdev_label_read_config(vd, txg)) == NULL) { in vdev_validate()
2257 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
2259 vdev_dbgmsg(vd, "vdev_validate: failed reading config for " in vdev_validate()
2270 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
2273 vdev_dbgmsg(vd, "vdev_validate: vdev split into other pool"); in vdev_validate()
2278 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
2281 vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", in vdev_validate()
2294 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
2297 vdev_dbgmsg(vd, "vdev_validate: vdev label pool_guid doesn't " in vdev_validate()
2309 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
2312 vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", in vdev_validate()
2319 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
2322 vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", in vdev_validate()
2342 if (vd->vdev_guid != guid && vd->vdev_guid != aux_guid) { in vdev_validate()
2345 if (vd != vd->vdev_top || vd->vdev_guid != top_guid) in vdev_validate()
2348 if (vd->vdev_guid != top_guid && in vdev_validate()
2349 vd->vdev_top->vdev_guid != guid) in vdev_validate()
2354 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
2357 vdev_dbgmsg(vd, "vdev_validate: config guid " in vdev_validate()
2359 vdev_dbgmsg(vd, "CONFIG: guid %llu, top_guid %llu", in vdev_validate()
2360 (u_longlong_t)vd->vdev_guid, in vdev_validate()
2361 (u_longlong_t)vd->vdev_top->vdev_guid); in vdev_validate()
2362 vdev_dbgmsg(vd, "LABEL: guid %llu, top_guid %llu, " in vdev_validate()
2371 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
2374 vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", in vdev_validate()
2388 vdev_dbgmsg(vd, "vdev_validate: invalid pool state (%llu) " in vdev_validate()
2398 if (vd->vdev_not_present) in vdev_validate()
2399 vd->vdev_not_present = 0; in vdev_validate()
2510 vdev_t *vd = vdev_lookup_by_guid(stvd, dvd->vdev_guid); in vdev_copy_path_search() local
2512 if (vd == NULL || vd->vdev_ops != dvd->vdev_ops) in vdev_copy_path_search()
2515 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_copy_path_search()
2517 vdev_copy_path_impl(vd, dvd); in vdev_copy_path_search()
2543 vdev_close(vdev_t *vd) in vdev_close() argument
2545 vdev_t *pvd = vd->vdev_parent; in vdev_close()
2546 spa_t *spa __maybe_unused = vd->vdev_spa; in vdev_close()
2548 ASSERT(vd != NULL); in vdev_close()
2549 ASSERT(vd->vdev_open_thread == curthread || in vdev_close()
2557 vd->vdev_reopening = (pvd->vdev_reopening && !vd->vdev_offline); in vdev_close()
2559 vd->vdev_ops->vdev_op_close(vd); in vdev_close()
2561 vdev_cache_purge(vd); in vdev_close()
2568 vd->vdev_prevstate = vd->vdev_state; in vdev_close()
2570 if (vd->vdev_offline) in vdev_close()
2571 vd->vdev_state = VDEV_STATE_OFFLINE; in vdev_close()
2573 vd->vdev_state = VDEV_STATE_CLOSED; in vdev_close()
2574 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_close()
2578 vdev_hold(vdev_t *vd) in vdev_hold() argument
2580 spa_t *spa = vd->vdev_spa; in vdev_hold()
2586 for (int c = 0; c < vd->vdev_children; c++) in vdev_hold()
2587 vdev_hold(vd->vdev_child[c]); in vdev_hold()
2589 if (vd->vdev_ops->vdev_op_leaf && vd->vdev_ops->vdev_op_hold != NULL) in vdev_hold()
2590 vd->vdev_ops->vdev_op_hold(vd); in vdev_hold()
2594 vdev_rele(vdev_t *vd) in vdev_rele() argument
2596 ASSERT(spa_is_root(vd->vdev_spa)); in vdev_rele()
2597 for (int c = 0; c < vd->vdev_children; c++) in vdev_rele()
2598 vdev_rele(vd->vdev_child[c]); in vdev_rele()
2600 if (vd->vdev_ops->vdev_op_leaf && vd->vdev_ops->vdev_op_rele != NULL) in vdev_rele()
2601 vd->vdev_ops->vdev_op_rele(vd); in vdev_rele()
2611 vdev_reopen(vdev_t *vd) in vdev_reopen() argument
2613 spa_t *spa = vd->vdev_spa; in vdev_reopen()
2618 vd->vdev_reopening = !vd->vdev_offline; in vdev_reopen()
2619 vdev_close(vd); in vdev_reopen()
2620 (void) vdev_open(vd); in vdev_reopen()
2627 if (vd->vdev_aux) { in vdev_reopen()
2628 (void) vdev_validate_aux(vd); in vdev_reopen()
2629 if (vdev_readable(vd) && vdev_writeable(vd) && in vdev_reopen()
2630 vd->vdev_aux == &spa->spa_l2cache) { in vdev_reopen()
2636 if (l2arc_vdev_present(vd)) { in vdev_reopen()
2637 l2arc_rebuild_vdev(vd, B_TRUE); in vdev_reopen()
2639 l2arc_add_vdev(spa, vd); in vdev_reopen()
2645 (void) vdev_validate(vd); in vdev_reopen()
2662 vdev_propagate_state(vd); in vdev_reopen()
2666 vdev_create(vdev_t *vd, uint64_t txg, boolean_t isreplacing) in vdev_create() argument
2675 error = vdev_open(vd); in vdev_create()
2677 if (error || vd->vdev_state != VDEV_STATE_HEALTHY) { in vdev_create()
2678 vdev_close(vd); in vdev_create()
2685 if ((error = vdev_dtl_load(vd)) != 0 || in vdev_create()
2686 (error = vdev_label_init(vd, txg, isreplacing ? in vdev_create()
2688 vdev_close(vd); in vdev_create()
2696 vdev_metaslab_set_size(vdev_t *vd) in vdev_metaslab_set_size() argument
2698 uint64_t asize = vd->vdev_asize; in vdev_metaslab_set_size()
2762 vd->vdev_ms_shift = ms_shift; in vdev_metaslab_set_size()
2763 ASSERT3U(vd->vdev_ms_shift, >=, SPA_MAXBLOCKSHIFT); in vdev_metaslab_set_size()
2767 vdev_dirty(vdev_t *vd, int flags, void *arg, uint64_t txg) in vdev_dirty() argument
2769 ASSERT(vd == vd->vdev_top); in vdev_dirty()
2771 ASSERT(vdev_is_concrete(vd) || flags == 0); in vdev_dirty()
2773 ASSERT(spa_writeable(vd->vdev_spa)); in vdev_dirty()
2776 (void) txg_list_add(&vd->vdev_ms_list, arg, txg); in vdev_dirty()
2779 (void) txg_list_add(&vd->vdev_dtl_list, arg, txg); in vdev_dirty()
2781 (void) txg_list_add(&vd->vdev_spa->spa_vdev_txg_list, vd, txg); in vdev_dirty()
2785 vdev_dirty_leaves(vdev_t *vd, int flags, uint64_t txg) in vdev_dirty_leaves() argument
2787 for (int c = 0; c < vd->vdev_children; c++) in vdev_dirty_leaves()
2788 vdev_dirty_leaves(vd->vdev_child[c], flags, txg); in vdev_dirty_leaves()
2790 if (vd->vdev_ops->vdev_op_leaf) in vdev_dirty_leaves()
2791 vdev_dirty(vd->vdev_top, flags, vd, txg); in vdev_dirty_leaves()
2833 vdev_dtl_dirty(vdev_t *vd, vdev_dtl_type_t t, uint64_t txg, uint64_t size) in vdev_dtl_dirty() argument
2835 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_dirty()
2838 ASSERT(vd != vd->vdev_spa->spa_root_vdev); in vdev_dtl_dirty()
2839 ASSERT(spa_writeable(vd->vdev_spa)); in vdev_dtl_dirty()
2841 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_dirty()
2844 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_dirty()
2848 vdev_dtl_contains(vdev_t *vd, vdev_dtl_type_t t, uint64_t txg, uint64_t size) in vdev_dtl_contains() argument
2850 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_contains()
2854 ASSERT(vd != vd->vdev_spa->spa_root_vdev); in vdev_dtl_contains()
2864 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_contains()
2867 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_contains()
2873 vdev_dtl_empty(vdev_t *vd, vdev_dtl_type_t t) in vdev_dtl_empty() argument
2875 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_empty()
2878 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_empty()
2880 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_empty()
2890 vdev_default_need_resilver(vdev_t *vd, const dva_t *dva, size_t psize, in vdev_default_need_resilver() argument
2899 return (vdev_dtl_contains(vd, DTL_PARTIAL, phys_birth, 1)); in vdev_default_need_resilver()
2906 vdev_dtl_need_resilver(vdev_t *vd, const dva_t *dva, size_t psize, in vdev_dtl_need_resilver() argument
2909 ASSERT(vd != vd->vdev_spa->spa_root_vdev); in vdev_dtl_need_resilver()
2911 if (vd->vdev_ops->vdev_op_need_resilver == NULL || in vdev_dtl_need_resilver()
2912 vd->vdev_ops->vdev_op_leaf) in vdev_dtl_need_resilver()
2915 return (vd->vdev_ops->vdev_op_need_resilver(vd, dva, psize, in vdev_dtl_need_resilver()
2923 vdev_dtl_min(vdev_t *vd) in vdev_dtl_min() argument
2925 ASSERT(MUTEX_HELD(&vd->vdev_dtl_lock)); in vdev_dtl_min()
2926 ASSERT3U(range_tree_space(vd->vdev_dtl[DTL_MISSING]), !=, 0); in vdev_dtl_min()
2927 ASSERT0(vd->vdev_children); in vdev_dtl_min()
2929 return (range_tree_min(vd->vdev_dtl[DTL_MISSING]) - 1); in vdev_dtl_min()
2936 vdev_dtl_max(vdev_t *vd) in vdev_dtl_max() argument
2938 ASSERT(MUTEX_HELD(&vd->vdev_dtl_lock)); in vdev_dtl_max()
2939 ASSERT3U(range_tree_space(vd->vdev_dtl[DTL_MISSING]), !=, 0); in vdev_dtl_max()
2940 ASSERT0(vd->vdev_children); in vdev_dtl_max()
2942 return (range_tree_max(vd->vdev_dtl[DTL_MISSING])); in vdev_dtl_max()
2954 vdev_dtl_should_excise(vdev_t *vd, boolean_t rebuild_done) in vdev_dtl_should_excise() argument
2956 ASSERT0(vd->vdev_children); in vdev_dtl_should_excise()
2958 if (vd->vdev_state < VDEV_STATE_DEGRADED) in vdev_dtl_should_excise()
2961 if (vd->vdev_resilver_deferred) in vdev_dtl_should_excise()
2964 if (range_tree_is_empty(vd->vdev_dtl[DTL_MISSING])) in vdev_dtl_should_excise()
2968 vdev_rebuild_t *vr = &vd->vdev_top->vdev_rebuild_config; in vdev_dtl_should_excise()
2972 if (vd->vdev_rebuild_txg == 0) in vdev_dtl_should_excise()
2981 vdev_dtl_max(vd) <= vrp->vrp_max_txg) { in vdev_dtl_should_excise()
2982 ASSERT3U(vrp->vrp_min_txg, <=, vdev_dtl_min(vd)); in vdev_dtl_should_excise()
2983 ASSERT3U(vrp->vrp_min_txg, <, vd->vdev_rebuild_txg); in vdev_dtl_should_excise()
2984 ASSERT3U(vd->vdev_rebuild_txg, <=, vrp->vrp_max_txg); in vdev_dtl_should_excise()
2988 dsl_scan_t *scn = vd->vdev_spa->spa_dsl_pool->dp_scan; in vdev_dtl_should_excise()
2992 if (vd->vdev_resilver_txg == 0) in vdev_dtl_should_excise()
3002 if (vdev_dtl_max(vd) <= scn->scn_phys.scn_max_txg) { in vdev_dtl_should_excise()
3003 ASSERT3U(scnp->scn_min_txg, <=, vdev_dtl_min(vd)); in vdev_dtl_should_excise()
3004 ASSERT3U(scnp->scn_min_txg, <, vd->vdev_resilver_txg); in vdev_dtl_should_excise()
3005 ASSERT3U(vd->vdev_resilver_txg, <=, scnp->scn_max_txg); in vdev_dtl_should_excise()
3018 vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg, in vdev_dtl_reassess() argument
3021 spa_t *spa = vd->vdev_spa; in vdev_dtl_reassess()
3027 for (int c = 0; c < vd->vdev_children; c++) in vdev_dtl_reassess()
3028 vdev_dtl_reassess(vd->vdev_child[c], txg, in vdev_dtl_reassess()
3031 if (vd == spa->spa_root_vdev || !vdev_is_concrete(vd) || vd->vdev_aux) in vdev_dtl_reassess()
3034 if (vd->vdev_ops->vdev_op_leaf) { in vdev_dtl_reassess()
3036 vdev_rebuild_t *vr = &vd->vdev_top->vdev_rebuild_config; in vdev_dtl_reassess()
3040 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
3053 !range_tree_is_empty(vd->vdev_dtl[DTL_MISSING])) { in vdev_dtl_reassess()
3057 (u_longlong_t)vd->vdev_guid, (u_longlong_t)txg, in vdev_dtl_reassess()
3059 (u_longlong_t)vdev_dtl_min(vd), in vdev_dtl_reassess()
3060 (u_longlong_t)vdev_dtl_max(vd), in vdev_dtl_reassess()
3081 vdev_dtl_should_excise(vd, rebuild_done)) { in vdev_dtl_reassess()
3101 vd->vdev_dtl[DTL_MISSING], 1); in vdev_dtl_reassess()
3104 vd->vdev_dtl[DTL_SCRUB], 2); in vdev_dtl_reassess()
3106 vd->vdev_dtl[DTL_MISSING], 1); in vdev_dtl_reassess()
3109 if (!range_tree_is_empty(vd->vdev_dtl[DTL_MISSING])) { in vdev_dtl_reassess()
3111 (u_longlong_t)vdev_dtl_min(vd), in vdev_dtl_reassess()
3112 (u_longlong_t)vdev_dtl_max(vd)); in vdev_dtl_reassess()
3117 range_tree_vacate(vd->vdev_dtl[DTL_PARTIAL], NULL, NULL); in vdev_dtl_reassess()
3118 range_tree_walk(vd->vdev_dtl[DTL_MISSING], in vdev_dtl_reassess()
3119 range_tree_add, vd->vdev_dtl[DTL_PARTIAL]); in vdev_dtl_reassess()
3121 range_tree_vacate(vd->vdev_dtl[DTL_SCRUB], NULL, NULL); in vdev_dtl_reassess()
3122 range_tree_vacate(vd->vdev_dtl[DTL_OUTAGE], NULL, NULL); in vdev_dtl_reassess()
3123 if (!vdev_readable(vd)) in vdev_dtl_reassess()
3124 range_tree_add(vd->vdev_dtl[DTL_OUTAGE], 0, -1ULL); in vdev_dtl_reassess()
3126 range_tree_walk(vd->vdev_dtl[DTL_MISSING], in vdev_dtl_reassess()
3127 range_tree_add, vd->vdev_dtl[DTL_OUTAGE]); in vdev_dtl_reassess()
3135 range_tree_is_empty(vd->vdev_dtl[DTL_MISSING]) && in vdev_dtl_reassess()
3136 range_tree_is_empty(vd->vdev_dtl[DTL_OUTAGE])) { in vdev_dtl_reassess()
3137 if (vd->vdev_rebuild_txg != 0) { in vdev_dtl_reassess()
3138 vd->vdev_rebuild_txg = 0; in vdev_dtl_reassess()
3139 vdev_config_dirty(vd->vdev_top); in vdev_dtl_reassess()
3140 } else if (vd->vdev_resilver_txg != 0) { in vdev_dtl_reassess()
3141 vd->vdev_resilver_txg = 0; in vdev_dtl_reassess()
3142 vdev_config_dirty(vd->vdev_top); in vdev_dtl_reassess()
3146 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
3149 vdev_dirty(vd->vdev_top, VDD_DTL, vd, txg); in vdev_dtl_reassess()
3153 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
3161 else if (vdev_get_nparity(vd) != 0) in vdev_dtl_reassess()
3162 minref = vdev_get_nparity(vd) + 1; /* RAID-Z, dRAID */ in vdev_dtl_reassess()
3164 minref = vd->vdev_children; /* any kind of mirror */ in vdev_dtl_reassess()
3166 for (int c = 0; c < vd->vdev_children; c++) { in vdev_dtl_reassess()
3167 vdev_t *cvd = vd->vdev_child[c]; in vdev_dtl_reassess()
3172 space_reftree_generate_map(&reftree, vd->vdev_dtl[t], minref); in vdev_dtl_reassess()
3175 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
3182 vdev_post_kobj_evt(vdev_t *vd) in vdev_post_kobj_evt() argument
3184 if (vd->vdev_ops->vdev_op_kobj_evt_post && in vdev_post_kobj_evt()
3185 vd->vdev_kobj_flag == B_FALSE) { in vdev_post_kobj_evt()
3186 vd->vdev_kobj_flag = B_TRUE; in vdev_post_kobj_evt()
3187 vd->vdev_ops->vdev_op_kobj_evt_post(vd); in vdev_post_kobj_evt()
3190 for (int c = 0; c < vd->vdev_children; c++) in vdev_post_kobj_evt()
3191 vdev_post_kobj_evt(vd->vdev_child[c]); in vdev_post_kobj_evt()
3198 vdev_clear_kobj_evt(vdev_t *vd) in vdev_clear_kobj_evt() argument
3200 vd->vdev_kobj_flag = B_FALSE; in vdev_clear_kobj_evt()
3202 for (int c = 0; c < vd->vdev_children; c++) in vdev_clear_kobj_evt()
3203 vdev_clear_kobj_evt(vd->vdev_child[c]); in vdev_clear_kobj_evt()
3207 vdev_dtl_load(vdev_t *vd) in vdev_dtl_load() argument
3209 spa_t *spa = vd->vdev_spa; in vdev_dtl_load()
3214 if (vd->vdev_ops->vdev_op_leaf && vd->vdev_dtl_object != 0) { in vdev_dtl_load()
3215 ASSERT(vdev_is_concrete(vd)); in vdev_dtl_load()
3223 error = space_map_open(&vd->vdev_dtl_sm, mos, in vdev_dtl_load()
3224 vd->vdev_dtl_object, 0, -1ULL, 0); in vdev_dtl_load()
3227 ASSERT(vd->vdev_dtl_sm != NULL); in vdev_dtl_load()
3230 error = space_map_load(vd->vdev_dtl_sm, rt, SM_ALLOC); in vdev_dtl_load()
3232 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_load()
3234 vd->vdev_dtl[DTL_MISSING]); in vdev_dtl_load()
3235 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_load()
3244 for (int c = 0; c < vd->vdev_children; c++) { in vdev_dtl_load()
3245 error = vdev_dtl_load(vd->vdev_child[c]); in vdev_dtl_load()
3254 vdev_zap_allocation_data(vdev_t *vd, dmu_tx_t *tx) in vdev_zap_allocation_data() argument
3256 spa_t *spa = vd->vdev_spa; in vdev_zap_allocation_data()
3258 vdev_alloc_bias_t alloc_bias = vd->vdev_alloc_bias; in vdev_zap_allocation_data()
3269 VERIFY0(zap_add(mos, vd->vdev_top_zap, VDEV_TOP_ZAP_ALLOCATION_BIAS, in vdev_zap_allocation_data()
3278 vdev_destroy_unlink_zap(vdev_t *vd, uint64_t zapobj, dmu_tx_t *tx) in vdev_destroy_unlink_zap() argument
3280 spa_t *spa = vd->vdev_spa; in vdev_destroy_unlink_zap()
3288 vdev_create_link_zap(vdev_t *vd, dmu_tx_t *tx) in vdev_create_link_zap() argument
3290 spa_t *spa = vd->vdev_spa; in vdev_create_link_zap()
3302 vdev_construct_zaps(vdev_t *vd, dmu_tx_t *tx) in vdev_construct_zaps() argument
3304 if (vd->vdev_ops != &vdev_hole_ops && in vdev_construct_zaps()
3305 vd->vdev_ops != &vdev_missing_ops && in vdev_construct_zaps()
3306 vd->vdev_ops != &vdev_root_ops && in vdev_construct_zaps()
3307 !vd->vdev_top->vdev_removing) { in vdev_construct_zaps()
3308 if (vd->vdev_ops->vdev_op_leaf && vd->vdev_leaf_zap == 0) { in vdev_construct_zaps()
3309 vd->vdev_leaf_zap = vdev_create_link_zap(vd, tx); in vdev_construct_zaps()
3311 if (vd == vd->vdev_top && vd->vdev_top_zap == 0) { in vdev_construct_zaps()
3312 vd->vdev_top_zap = vdev_create_link_zap(vd, tx); in vdev_construct_zaps()
3313 if (vd->vdev_alloc_bias != VDEV_BIAS_NONE) in vdev_construct_zaps()
3314 vdev_zap_allocation_data(vd, tx); in vdev_construct_zaps()
3318 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_construct_zaps()
3319 vdev_construct_zaps(vd->vdev_child[i], tx); in vdev_construct_zaps()
3324 vdev_dtl_sync(vdev_t *vd, uint64_t txg) in vdev_dtl_sync() argument
3326 spa_t *spa = vd->vdev_spa; in vdev_dtl_sync()
3327 range_tree_t *rt = vd->vdev_dtl[DTL_MISSING]; in vdev_dtl_sync()
3331 uint64_t object = space_map_object(vd->vdev_dtl_sm); in vdev_dtl_sync()
3333 ASSERT(vdev_is_concrete(vd)); in vdev_dtl_sync()
3334 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_dtl_sync()
3338 if (vd->vdev_detached || vd->vdev_top->vdev_removing) { in vdev_dtl_sync()
3339 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_sync()
3340 space_map_free(vd->vdev_dtl_sm, tx); in vdev_dtl_sync()
3341 space_map_close(vd->vdev_dtl_sm); in vdev_dtl_sync()
3342 vd->vdev_dtl_sm = NULL; in vdev_dtl_sync()
3343 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_sync()
3350 if (vd->vdev_leaf_zap != 0 && (vd->vdev_detached || in vdev_dtl_sync()
3351 vd->vdev_top->vdev_islog)) { in vdev_dtl_sync()
3352 vdev_destroy_unlink_zap(vd, vd->vdev_leaf_zap, tx); in vdev_dtl_sync()
3353 vd->vdev_leaf_zap = 0; in vdev_dtl_sync()
3360 if (vd->vdev_dtl_sm == NULL) { in vdev_dtl_sync()
3366 VERIFY0(space_map_open(&vd->vdev_dtl_sm, mos, new_object, in vdev_dtl_sync()
3368 ASSERT(vd->vdev_dtl_sm != NULL); in vdev_dtl_sync()
3373 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_sync()
3375 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_sync()
3377 space_map_truncate(vd->vdev_dtl_sm, zfs_vdev_dtl_sm_blksz, tx); in vdev_dtl_sync()
3378 space_map_write(vd->vdev_dtl_sm, rtsync, SM_ALLOC, SM_NO_VDEVID, tx); in vdev_dtl_sync()
3387 if (object != space_map_object(vd->vdev_dtl_sm)) { in vdev_dtl_sync()
3388 vdev_dbgmsg(vd, "txg %llu, spa %s, DTL old object %llu, " in vdev_dtl_sync()
3391 (u_longlong_t)space_map_object(vd->vdev_dtl_sm)); in vdev_dtl_sync()
3392 vdev_config_dirty(vd->vdev_top); in vdev_dtl_sync()
3403 vdev_dtl_required(vdev_t *vd) in vdev_dtl_required() argument
3405 spa_t *spa = vd->vdev_spa; in vdev_dtl_required()
3406 vdev_t *tvd = vd->vdev_top; in vdev_dtl_required()
3407 uint8_t cant_read = vd->vdev_cant_read; in vdev_dtl_required()
3412 if (vd == spa->spa_root_vdev || vd == tvd) in vdev_dtl_required()
3420 vd->vdev_cant_read = B_TRUE; in vdev_dtl_required()
3423 vd->vdev_cant_read = cant_read; in vdev_dtl_required()
3427 required = !!zio_handle_device_injection(vd, NULL, in vdev_dtl_required()
3438 vdev_resilver_needed(vdev_t *vd, uint64_t *minp, uint64_t *maxp) in vdev_resilver_needed() argument
3444 if (vd->vdev_children == 0) { in vdev_resilver_needed()
3445 mutex_enter(&vd->vdev_dtl_lock); in vdev_resilver_needed()
3446 if (!range_tree_is_empty(vd->vdev_dtl[DTL_MISSING]) && in vdev_resilver_needed()
3447 vdev_writeable(vd)) { in vdev_resilver_needed()
3449 thismin = vdev_dtl_min(vd); in vdev_resilver_needed()
3450 thismax = vdev_dtl_max(vd); in vdev_resilver_needed()
3453 mutex_exit(&vd->vdev_dtl_lock); in vdev_resilver_needed()
3455 for (int c = 0; c < vd->vdev_children; c++) { in vdev_resilver_needed()
3456 vdev_t *cvd = vd->vdev_child[c]; in vdev_resilver_needed()
3480 vdev_checkpoint_sm_object(vdev_t *vd, uint64_t *sm_obj) in vdev_checkpoint_sm_object() argument
3482 ASSERT0(spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER)); in vdev_checkpoint_sm_object()
3484 if (vd->vdev_top_zap == 0) { in vdev_checkpoint_sm_object()
3489 int error = zap_lookup(spa_meta_objset(vd->vdev_spa), vd->vdev_top_zap, in vdev_checkpoint_sm_object()
3500 vdev_load(vdev_t *vd) in vdev_load() argument
3502 int children = vd->vdev_children; in vdev_load()
3511 if (vd->vdev_ops == &vdev_root_ops && vd->vdev_children > 0) { in vdev_load()
3519 for (int c = 0; c < vd->vdev_children; c++) { in vdev_load()
3520 vdev_t *cvd = vd->vdev_child[c]; in vdev_load()
3535 for (int c = 0; c < vd->vdev_children; c++) { in vdev_load()
3536 int error = vd->vdev_child[c]->vdev_load_error; in vdev_load()
3542 vdev_set_deflate_ratio(vd); in vdev_load()
3547 if (vd == vd->vdev_top && vd->vdev_top_zap != 0) { in vdev_load()
3548 spa_t *spa = vd->vdev_spa; in vdev_load()
3551 error = zap_lookup(spa->spa_meta_objset, vd->vdev_top_zap, in vdev_load()
3555 ASSERT(vd->vdev_alloc_bias == VDEV_BIAS_NONE); in vdev_load()
3556 vd->vdev_alloc_bias = vdev_derive_alloc_bias(bias_str); in vdev_load()
3558 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
3560 vdev_dbgmsg(vd, "vdev_load: zap_lookup(top_zap=%llu) " in vdev_load()
3561 "failed [error=%d]", vd->vdev_top_zap, error); in vdev_load()
3569 if (vd == vd->vdev_top && vd->vdev_top_zap != 0) { in vdev_load()
3570 error = vdev_rebuild_load(vd); in vdev_load()
3572 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
3574 vdev_dbgmsg(vd, "vdev_load: vdev_rebuild_load " in vdev_load()
3583 if (vd == vd->vdev_top && vdev_is_concrete(vd)) { in vdev_load()
3584 vdev_metaslab_group_create(vd); in vdev_load()
3586 if (vd->vdev_ashift == 0 || vd->vdev_asize == 0) { in vdev_load()
3587 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
3589 vdev_dbgmsg(vd, "vdev_load: invalid size. ashift=%llu, " in vdev_load()
3590 "asize=%llu", (u_longlong_t)vd->vdev_ashift, in vdev_load()
3591 (u_longlong_t)vd->vdev_asize); in vdev_load()
3595 error = vdev_metaslab_init(vd, 0); in vdev_load()
3597 vdev_dbgmsg(vd, "vdev_load: metaslab_init failed " in vdev_load()
3599 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
3605 error = vdev_checkpoint_sm_object(vd, &checkpoint_sm_obj); in vdev_load()
3607 objset_t *mos = spa_meta_objset(vd->vdev_spa); in vdev_load()
3608 ASSERT(vd->vdev_asize != 0); in vdev_load()
3609 ASSERT3P(vd->vdev_checkpoint_sm, ==, NULL); in vdev_load()
3611 error = space_map_open(&vd->vdev_checkpoint_sm, in vdev_load()
3612 mos, checkpoint_sm_obj, 0, vd->vdev_asize, in vdev_load()
3613 vd->vdev_ashift); in vdev_load()
3615 vdev_dbgmsg(vd, "vdev_load: space_map_open " in vdev_load()
3621 ASSERT3P(vd->vdev_checkpoint_sm, !=, NULL); in vdev_load()
3629 vd->vdev_stat.vs_checkpoint_space = in vdev_load()
3630 -space_map_allocated(vd->vdev_checkpoint_sm); in vdev_load()
3631 vd->vdev_spa->spa_checkpoint_info.sci_dspace += in vdev_load()
3632 vd->vdev_stat.vs_checkpoint_space; in vdev_load()
3634 vdev_dbgmsg(vd, "vdev_load: failed to retrieve " in vdev_load()
3644 if (vd->vdev_ops->vdev_op_leaf && (error = vdev_dtl_load(vd)) != 0) { in vdev_load()
3645 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
3647 vdev_dbgmsg(vd, "vdev_load: vdev_dtl_load failed " in vdev_load()
3653 error = vdev_obsolete_sm_object(vd, &obsolete_sm_object); in vdev_load()
3655 objset_t *mos = vd->vdev_spa->spa_meta_objset; in vdev_load()
3656 ASSERT(vd->vdev_asize != 0); in vdev_load()
3657 ASSERT3P(vd->vdev_obsolete_sm, ==, NULL); in vdev_load()
3659 if ((error = space_map_open(&vd->vdev_obsolete_sm, mos, in vdev_load()
3660 obsolete_sm_object, 0, vd->vdev_asize, 0))) { in vdev_load()
3661 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
3663 vdev_dbgmsg(vd, "vdev_load: space_map_open failed for " in vdev_load()
3669 vdev_dbgmsg(vd, "vdev_load: failed to retrieve obsolete " in vdev_load()
3685 vdev_validate_aux(vdev_t *vd) in vdev_validate_aux() argument
3691 if (!vdev_readable(vd)) in vdev_validate_aux()
3694 if ((label = vdev_label_read_config(vd, -1ULL)) == NULL) { in vdev_validate_aux()
3695 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate_aux()
3703 guid != vd->vdev_guid || in vdev_validate_aux()
3705 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate_aux()
3720 vdev_destroy_ms_flush_data(vdev_t *vd, dmu_tx_t *tx) in vdev_destroy_ms_flush_data() argument
3722 objset_t *mos = spa_meta_objset(vd->vdev_spa); in vdev_destroy_ms_flush_data()
3724 if (vd->vdev_top_zap == 0) in vdev_destroy_ms_flush_data()
3728 int err = zap_lookup(mos, vd->vdev_top_zap, in vdev_destroy_ms_flush_data()
3735 VERIFY0(zap_remove(mos, vd->vdev_top_zap, in vdev_destroy_ms_flush_data()
3744 vdev_destroy_spacemaps(vdev_t *vd, dmu_tx_t *tx) in vdev_destroy_spacemaps() argument
3746 if (vd->vdev_ms_array == 0) in vdev_destroy_spacemaps()
3749 objset_t *mos = vd->vdev_spa->spa_meta_objset; in vdev_destroy_spacemaps()
3750 uint64_t array_count = vd->vdev_asize >> vd->vdev_ms_shift; in vdev_destroy_spacemaps()
3753 VERIFY0(dmu_read(mos, vd->vdev_ms_array, 0, in vdev_destroy_spacemaps()
3765 VERIFY0(dmu_object_free(mos, vd->vdev_ms_array, tx)); in vdev_destroy_spacemaps()
3766 vdev_destroy_ms_flush_data(vd, tx); in vdev_destroy_spacemaps()
3767 vd->vdev_ms_array = 0; in vdev_destroy_spacemaps()
3771 vdev_remove_empty_log(vdev_t *vd, uint64_t txg) in vdev_remove_empty_log() argument
3773 spa_t *spa = vd->vdev_spa; in vdev_remove_empty_log()
3775 ASSERT(vd->vdev_islog); in vdev_remove_empty_log()
3776 ASSERT(vd == vd->vdev_top); in vdev_remove_empty_log()
3781 vdev_destroy_spacemaps(vd, tx); in vdev_remove_empty_log()
3782 if (vd->vdev_top_zap != 0) { in vdev_remove_empty_log()
3783 vdev_destroy_unlink_zap(vd, vd->vdev_top_zap, tx); in vdev_remove_empty_log()
3784 vd->vdev_top_zap = 0; in vdev_remove_empty_log()
3791 vdev_sync_done(vdev_t *vd, uint64_t txg) in vdev_sync_done() argument
3794 boolean_t reassess = !txg_list_empty(&vd->vdev_ms_list, TXG_CLEAN(txg)); in vdev_sync_done()
3796 ASSERT(vdev_is_concrete(vd)); in vdev_sync_done()
3798 while ((msp = txg_list_remove(&vd->vdev_ms_list, TXG_CLEAN(txg))) in vdev_sync_done()
3803 metaslab_sync_reassess(vd->vdev_mg); in vdev_sync_done()
3804 if (vd->vdev_log_mg != NULL) in vdev_sync_done()
3805 metaslab_sync_reassess(vd->vdev_log_mg); in vdev_sync_done()
3810 vdev_sync(vdev_t *vd, uint64_t txg) in vdev_sync() argument
3812 spa_t *spa = vd->vdev_spa; in vdev_sync()
3818 if (range_tree_space(vd->vdev_obsolete_segments) > 0) { in vdev_sync()
3819 ASSERT(vd->vdev_removing || in vdev_sync()
3820 vd->vdev_ops == &vdev_indirect_ops); in vdev_sync()
3822 vdev_indirect_sync_obsolete(vd, tx); in vdev_sync()
3828 if (vd->vdev_ops == &vdev_indirect_ops) { in vdev_sync()
3829 ASSERT(txg_list_empty(&vd->vdev_ms_list, txg)); in vdev_sync()
3830 ASSERT(txg_list_empty(&vd->vdev_dtl_list, txg)); in vdev_sync()
3836 ASSERT(vdev_is_concrete(vd)); in vdev_sync()
3838 if (vd->vdev_ms_array == 0 && vd->vdev_ms_shift != 0 && in vdev_sync()
3839 !vd->vdev_removing) { in vdev_sync()
3840 ASSERT(vd == vd->vdev_top); in vdev_sync()
3841 ASSERT0(vd->vdev_indirect_config.vic_mapping_object); in vdev_sync()
3842 vd->vdev_ms_array = dmu_object_alloc(spa->spa_meta_objset, in vdev_sync()
3844 ASSERT(vd->vdev_ms_array != 0); in vdev_sync()
3845 vdev_config_dirty(vd); in vdev_sync()
3848 while ((msp = txg_list_remove(&vd->vdev_ms_list, txg)) != NULL) { in vdev_sync()
3850 (void) txg_list_add(&vd->vdev_ms_list, msp, TXG_CLEAN(txg)); in vdev_sync()
3853 while ((lvd = txg_list_remove(&vd->vdev_dtl_list, txg)) != NULL) in vdev_sync()
3860 if (vd->vdev_islog && vd->vdev_stat.vs_alloc == 0 && vd->vdev_removing) in vdev_sync()
3861 vdev_remove_empty_log(vd, txg); in vdev_sync()
3863 (void) txg_list_add(&spa->spa_vdev_txg_list, vd, TXG_CLEAN(txg)); in vdev_sync()
3868 vdev_psize_to_asize(vdev_t *vd, uint64_t psize) in vdev_psize_to_asize() argument
3870 return (vd->vdev_ops->vdev_op_asize(vd, psize)); in vdev_psize_to_asize()
3880 vdev_t *vd, *tvd; in vdev_fault() local
3884 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_fault()
3887 if (!vd->vdev_ops->vdev_op_leaf) in vdev_fault()
3890 tvd = vd->vdev_top; in vdev_fault()
3911 vd->vdev_stat.vs_aux = VDEV_AUX_EXTERNAL; in vdev_fault()
3912 vd->vdev_tmpoffline = B_FALSE; in vdev_fault()
3915 vd->vdev_tmpoffline = B_TRUE; in vdev_fault()
3923 vd->vdev_label_aux = aux; in vdev_fault()
3928 vd->vdev_delayed_close = B_FALSE; in vdev_fault()
3929 vd->vdev_faulted = 1ULL; in vdev_fault()
3930 vd->vdev_degraded = 0ULL; in vdev_fault()
3931 vdev_set_state(vd, B_FALSE, VDEV_STATE_FAULTED, aux); in vdev_fault()
3937 if (!tvd->vdev_islog && vd->vdev_aux == NULL && vdev_dtl_required(vd)) { in vdev_fault()
3938 vd->vdev_degraded = 1ULL; in vdev_fault()
3939 vd->vdev_faulted = 0ULL; in vdev_fault()
3947 if (vdev_readable(vd)) in vdev_fault()
3948 vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, aux); in vdev_fault()
3951 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_fault()
3962 vdev_t *vd; in vdev_degrade() local
3966 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_degrade()
3969 if (!vd->vdev_ops->vdev_op_leaf) in vdev_degrade()
3975 if (vd->vdev_faulted || vd->vdev_degraded) in vdev_degrade()
3978 vd->vdev_degraded = 1ULL; in vdev_degrade()
3979 if (!vdev_is_dead(vd)) in vdev_degrade()
3980 vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, in vdev_degrade()
3983 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_degrade()
3989 vdev_t *vd; in vdev_remove_wanted() local
3993 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_remove_wanted()
4000 if (vd->vdev_removed || vd->vdev_expanding) in vdev_remove_wanted()
4006 if (vd->vdev_ops->vdev_op_leaf && !zio_wait(vdev_probe(vd, NULL))) in vdev_remove_wanted()
4009 vd->vdev_remove_wanted = B_TRUE; in vdev_remove_wanted()
4012 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_remove_wanted()
4027 vdev_t *vd, *tvd, *pvd, *rvd = spa->spa_root_vdev; in vdev_online() local
4033 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_online()
4036 if (!vd->vdev_ops->vdev_op_leaf) in vdev_online()
4039 wasoffline = (vd->vdev_offline || vd->vdev_tmpoffline); in vdev_online()
4040 oldstate = vd->vdev_state; in vdev_online()
4042 tvd = vd->vdev_top; in vdev_online()
4043 vd->vdev_offline = B_FALSE; in vdev_online()
4044 vd->vdev_tmpoffline = B_FALSE; in vdev_online()
4045 vd->vdev_checkremove = !!(flags & ZFS_ONLINE_CHECKREMOVE); in vdev_online()
4046 vd->vdev_forcefault = !!(flags & ZFS_ONLINE_FORCEFAULT); in vdev_online()
4049 if (!vd->vdev_aux) { in vdev_online()
4050 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_online()
4053 vd->vdev_expansion_time = gethrestime_sec(); in vdev_online()
4057 vd->vdev_checkremove = vd->vdev_forcefault = B_FALSE; in vdev_online()
4059 if (!vd->vdev_aux) { in vdev_online()
4060 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_online()
4065 *newstate = vd->vdev_state; in vdev_online()
4067 !vdev_is_dead(vd) && vd->vdev_parent && in vdev_online()
4068 vd->vdev_parent->vdev_ops == &vdev_spare_ops && in vdev_online()
4069 vd->vdev_parent->vdev_child[0] == vd) in vdev_online()
4070 vd->vdev_unspare = B_TRUE; in vdev_online()
4075 if (vd->vdev_aux) in vdev_online()
4076 return (spa_vdev_state_exit(spa, vd, ENOTSUP)); in vdev_online()
4081 mutex_enter(&vd->vdev_initialize_lock); in vdev_online()
4082 if (vdev_writeable(vd) && in vdev_online()
4083 vd->vdev_initialize_thread == NULL && in vdev_online()
4084 vd->vdev_initialize_state == VDEV_INITIALIZE_ACTIVE) { in vdev_online()
4085 (void) vdev_initialize(vd); in vdev_online()
4087 mutex_exit(&vd->vdev_initialize_lock); in vdev_online()
4095 mutex_enter(&vd->vdev_trim_lock); in vdev_online()
4096 if (vdev_writeable(vd) && !vd->vdev_isl2cache && in vdev_online()
4097 vd->vdev_trim_thread == NULL && in vdev_online()
4098 vd->vdev_trim_state == VDEV_TRIM_ACTIVE) { in vdev_online()
4099 (void) vdev_trim(vd, vd->vdev_trim_rate, vd->vdev_trim_partial, in vdev_online()
4100 vd->vdev_trim_secure); in vdev_online()
4102 mutex_exit(&vd->vdev_trim_lock); in vdev_online()
4106 vd->vdev_state >= VDEV_STATE_DEGRADED)) { in vdev_online()
4107 spa_event_notify(spa, vd, NULL, ESC_ZFS_VDEV_ONLINE); in vdev_online()
4113 if (vd->vdev_unspare && in vdev_online()
4119 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_online()
4125 vdev_t *vd, *tvd; in vdev_offline_locked() local
4133 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_offline_locked()
4136 if (!vd->vdev_ops->vdev_op_leaf) in vdev_offline_locked()
4139 if (vd->vdev_ops == &vdev_draid_spare_ops) in vdev_offline_locked()
4142 tvd = vd->vdev_top; in vdev_offline_locked()
4149 if (!vd->vdev_offline) { in vdev_offline_locked()
4155 if (!tvd->vdev_islog && vd->vdev_aux == NULL && in vdev_offline_locked()
4156 vdev_dtl_required(vd)) in vdev_offline_locked()
4172 (void) spa_vdev_state_exit(spa, vd, 0); in vdev_offline_locked()
4196 vd, error)); in vdev_offline_locked()
4197 (void) spa_vdev_state_exit(spa, vd, 0); in vdev_offline_locked()
4209 vd->vdev_offline = B_TRUE; in vdev_offline_locked()
4212 if (!tvd->vdev_islog && vd->vdev_aux == NULL && in vdev_offline_locked()
4214 vd->vdev_offline = B_FALSE; in vdev_offline_locked()
4228 vd->vdev_tmpoffline = !!(flags & ZFS_OFFLINE_TEMPORARY); in vdev_offline_locked()
4230 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_offline_locked()
4251 vdev_clear(spa_t *spa, vdev_t *vd) in vdev_clear() argument
4257 if (vd == NULL) in vdev_clear()
4258 vd = rvd; in vdev_clear()
4260 vd->vdev_stat.vs_read_errors = 0; in vdev_clear()
4261 vd->vdev_stat.vs_write_errors = 0; in vdev_clear()
4262 vd->vdev_stat.vs_checksum_errors = 0; in vdev_clear()
4263 vd->vdev_stat.vs_slow_ios = 0; in vdev_clear()
4265 for (int c = 0; c < vd->vdev_children; c++) in vdev_clear()
4266 vdev_clear(spa, vd->vdev_child[c]); in vdev_clear()
4271 if (!vdev_is_concrete(vd) || vd->vdev_removed) in vdev_clear()
4280 if (vd->vdev_faulted || vd->vdev_degraded || in vdev_clear()
4281 !vdev_readable(vd) || !vdev_writeable(vd)) { in vdev_clear()
4287 vd->vdev_forcefault = B_TRUE; in vdev_clear()
4289 vd->vdev_faulted = vd->vdev_degraded = 0ULL; in vdev_clear()
4290 vd->vdev_cant_read = B_FALSE; in vdev_clear()
4291 vd->vdev_cant_write = B_FALSE; in vdev_clear()
4292 vd->vdev_stat.vs_aux = 0; in vdev_clear()
4294 vdev_reopen(vd == rvd ? rvd : vd->vdev_top); in vdev_clear()
4296 vd->vdev_forcefault = B_FALSE; in vdev_clear()
4298 if (vd != rvd && vdev_writeable(vd->vdev_top)) in vdev_clear()
4299 vdev_state_dirty(vd->vdev_top); in vdev_clear()
4302 if (vd->vdev_aux == NULL && !vdev_is_dead(vd) && in vdev_clear()
4307 spa_event_notify(spa, vd, NULL, ESC_ZFS_VDEV_CLEAR); in vdev_clear()
4315 if (!vdev_is_dead(vd) && vd->vdev_parent != NULL && in vdev_clear()
4316 vd->vdev_parent->vdev_ops == &vdev_spare_ops && in vdev_clear()
4317 vd->vdev_parent->vdev_child[0] == vd) in vdev_clear()
4318 vd->vdev_unspare = B_TRUE; in vdev_clear()
4321 zfs_ereport_clear(spa, vd); in vdev_clear()
4325 vdev_is_dead(vdev_t *vd) in vdev_is_dead() argument
4334 return (vd->vdev_state < VDEV_STATE_DEGRADED || in vdev_is_dead()
4335 vd->vdev_ops == &vdev_hole_ops || in vdev_is_dead()
4336 vd->vdev_ops == &vdev_missing_ops); in vdev_is_dead()
4340 vdev_readable(vdev_t *vd) in vdev_readable() argument
4342 return (!vdev_is_dead(vd) && !vd->vdev_cant_read); in vdev_readable()
4346 vdev_writeable(vdev_t *vd) in vdev_writeable() argument
4348 return (!vdev_is_dead(vd) && !vd->vdev_cant_write && in vdev_writeable()
4349 vdev_is_concrete(vd)); in vdev_writeable()
4353 vdev_allocatable(vdev_t *vd) in vdev_allocatable() argument
4355 uint64_t state = vd->vdev_state; in vdev_allocatable()
4366 !vd->vdev_cant_write && vdev_is_concrete(vd) && in vdev_allocatable()
4367 vd->vdev_mg->mg_initialized); in vdev_allocatable()
4371 vdev_accessible(vdev_t *vd, zio_t *zio) in vdev_accessible() argument
4373 ASSERT(zio->io_vd == vd); in vdev_accessible()
4375 if (vdev_is_dead(vd) || vd->vdev_remove_wanted) in vdev_accessible()
4379 return (!vd->vdev_cant_read); in vdev_accessible()
4382 return (!vd->vdev_cant_write); in vdev_accessible()
4442 vdev_is_spacemap_addressable(vdev_t *vd) in vdev_is_spacemap_addressable() argument
4444 if (spa_feature_is_active(vd->vdev_spa, SPA_FEATURE_SPACEMAP_V2)) in vdev_is_spacemap_addressable()
4454 uint64_t shift = vd->vdev_ashift + SM_OFFSET_BITS; in vdev_is_spacemap_addressable()
4459 return (vd->vdev_asize < (1ULL << shift)); in vdev_is_spacemap_addressable()
4466 vdev_get_stats_ex_impl(vdev_t *vd, vdev_stat_t *vs, vdev_stat_ex_t *vsx) in vdev_get_stats_ex_impl() argument
4473 if (!vd->vdev_ops->vdev_op_leaf) { in vdev_get_stats_ex_impl()
4481 for (int c = 0; c < vd->vdev_children; c++) { in vdev_get_stats_ex_impl()
4482 vdev_t *cvd = vd->vdev_child[c]; in vdev_get_stats_ex_impl()
4500 memcpy(vsx, &vd->vdev_stat_ex, sizeof (vd->vdev_stat_ex)); in vdev_get_stats_ex_impl()
4502 for (t = 0; t < ARRAY_SIZE(vd->vdev_queue.vq_class); t++) { in vdev_get_stats_ex_impl()
4504 vd->vdev_queue.vq_class[t].vqc_active; in vdev_get_stats_ex_impl()
4506 &vd->vdev_queue.vq_class[t].vqc_queued_tree); in vdev_get_stats_ex_impl()
4512 vdev_get_stats_ex(vdev_t *vd, vdev_stat_t *vs, vdev_stat_ex_t *vsx) in vdev_get_stats_ex() argument
4514 vdev_t *tvd = vd->vdev_top; in vdev_get_stats_ex()
4515 mutex_enter(&vd->vdev_stat_lock); in vdev_get_stats_ex()
4517 bcopy(&vd->vdev_stat, vs, sizeof (*vs)); in vdev_get_stats_ex()
4519 vs->vs_state = vd->vdev_state; in vdev_get_stats_ex()
4520 vs->vs_rsize = vdev_get_min_asize(vd); in vdev_get_stats_ex()
4522 if (vd->vdev_ops->vdev_op_leaf) { in vdev_get_stats_ex()
4523 vs->vs_pspace = vd->vdev_psize; in vdev_get_stats_ex()
4532 vd->vdev_initialize_bytes_done; in vdev_get_stats_ex()
4534 vd->vdev_initialize_bytes_est; in vdev_get_stats_ex()
4535 vs->vs_initialize_state = vd->vdev_initialize_state; in vdev_get_stats_ex()
4537 vd->vdev_initialize_action_time; in vdev_get_stats_ex()
4544 vs->vs_trim_notsup = !vd->vdev_has_trim; in vdev_get_stats_ex()
4545 vs->vs_trim_bytes_done = vd->vdev_trim_bytes_done; in vdev_get_stats_ex()
4546 vs->vs_trim_bytes_est = vd->vdev_trim_bytes_est; in vdev_get_stats_ex()
4547 vs->vs_trim_state = vd->vdev_trim_state; in vdev_get_stats_ex()
4548 vs->vs_trim_action_time = vd->vdev_trim_action_time; in vdev_get_stats_ex()
4551 vs->vs_resilver_deferred = vd->vdev_resilver_deferred; in vdev_get_stats_ex()
4560 if (vd->vdev_aux == NULL && tvd != NULL) { in vdev_get_stats_ex()
4562 vd->vdev_max_asize - vd->vdev_asize, in vdev_get_stats_ex()
4566 vs->vs_configured_ashift = vd->vdev_top != NULL in vdev_get_stats_ex()
4567 ? vd->vdev_top->vdev_ashift : vd->vdev_ashift; in vdev_get_stats_ex()
4568 vs->vs_logical_ashift = vd->vdev_logical_ashift; in vdev_get_stats_ex()
4569 if (vd->vdev_physical_ashift <= ASHIFT_MAX) in vdev_get_stats_ex()
4570 vs->vs_physical_ashift = vd->vdev_physical_ashift; in vdev_get_stats_ex()
4578 if (vd->vdev_aux == NULL && vd == vd->vdev_top && in vdev_get_stats_ex()
4579 vdev_is_concrete(vd)) { in vdev_get_stats_ex()
4586 vs->vs_fragmentation = (vd->vdev_mg != NULL) ? in vdev_get_stats_ex()
4587 vd->vdev_mg->mg_fragmentation : 0; in vdev_get_stats_ex()
4591 vdev_get_stats_ex_impl(vd, vs, vsx); in vdev_get_stats_ex()
4592 mutex_exit(&vd->vdev_stat_lock); in vdev_get_stats_ex()
4596 vdev_get_stats(vdev_t *vd, vdev_stat_t *vs) in vdev_get_stats() argument
4598 return (vdev_get_stats_ex(vd, vs, NULL)); in vdev_get_stats()
4602 vdev_clear_stats(vdev_t *vd) in vdev_clear_stats() argument
4604 mutex_enter(&vd->vdev_stat_lock); in vdev_clear_stats()
4605 vd->vdev_stat.vs_space = 0; in vdev_clear_stats()
4606 vd->vdev_stat.vs_dspace = 0; in vdev_clear_stats()
4607 vd->vdev_stat.vs_alloc = 0; in vdev_clear_stats()
4608 mutex_exit(&vd->vdev_stat_lock); in vdev_clear_stats()
4612 vdev_scan_stat_init(vdev_t *vd) in vdev_scan_stat_init() argument
4614 vdev_stat_t *vs = &vd->vdev_stat; in vdev_scan_stat_init()
4616 for (int c = 0; c < vd->vdev_children; c++) in vdev_scan_stat_init()
4617 vdev_scan_stat_init(vd->vdev_child[c]); in vdev_scan_stat_init()
4619 mutex_enter(&vd->vdev_stat_lock); in vdev_scan_stat_init()
4621 mutex_exit(&vd->vdev_stat_lock); in vdev_scan_stat_init()
4629 vdev_t *vd = zio->io_vd ? zio->io_vd : rvd; in vdev_stat_update() local
4632 vdev_stat_t *vs = &vd->vdev_stat; in vdev_stat_update()
4633 vdev_stat_ex_t *vsx = &vd->vdev_stat_ex; in vdev_stat_update()
4658 if (vd == rvd) in vdev_stat_update()
4661 ASSERT(vd == zio->io_vd); in vdev_stat_update()
4666 mutex_enter(&vd->vdev_stat_lock); in vdev_stat_update()
4678 if (vd->vdev_ops->vdev_op_leaf) in vdev_stat_update()
4690 vdev_t *tvd = vd->vdev_top; in vdev_stat_update()
4695 if (vd->vdev_ops->vdev_op_leaf && in vdev_stat_update()
4696 vd->vdev_ops != &vdev_draid_spare_ops) { in vdev_stat_update()
4710 if (vd->vdev_ops->vdev_op_leaf && in vdev_stat_update()
4769 mutex_exit(&vd->vdev_stat_lock); in vdev_stat_update()
4813 if (vd->vdev_ops->vdev_op_leaf) { in vdev_stat_update()
4818 vdev_dtl_dirty(vd, DTL_SCRUB, txg, 1); in vdev_stat_update()
4825 if (vdev_dtl_contains(vd, DTL_MISSING, txg, 1)) in vdev_stat_update()
4827 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_stat_update()
4829 vdev_dirty(vd->vdev_top, VDD_DTL, vd, commit_txg); in vdev_stat_update()
4831 if (vd != rvd) in vdev_stat_update()
4832 vdev_dtl_dirty(vd, DTL_MISSING, txg, 1); in vdev_stat_update()
4837 vdev_deflated_space(vdev_t *vd, int64_t space) in vdev_deflated_space() argument
4840 ASSERT(vd->vdev_deflate_ratio != 0 || vd->vdev_isl2cache); in vdev_deflated_space()
4842 return ((space >> SPA_MINBLOCKSHIFT) * vd->vdev_deflate_ratio); in vdev_deflated_space()
4850 vdev_space_update(vdev_t *vd, int64_t alloc_delta, int64_t defer_delta, in vdev_space_update() argument
4855 spa_t *spa = vd->vdev_spa; in vdev_space_update()
4858 ASSERT(vd == vd->vdev_top); in vdev_space_update()
4866 dspace_delta = vdev_deflated_space(vd, space_delta); in vdev_space_update()
4868 mutex_enter(&vd->vdev_stat_lock); in vdev_space_update()
4871 ASSERT3U(vd->vdev_stat.vs_alloc, >=, -alloc_delta); in vdev_space_update()
4874 vd->vdev_stat.vs_alloc += alloc_delta; in vdev_space_update()
4875 vd->vdev_stat.vs_space += space_delta; in vdev_space_update()
4876 vd->vdev_stat.vs_dspace += dspace_delta; in vdev_space_update()
4877 mutex_exit(&vd->vdev_stat_lock); in vdev_space_update()
4880 if (vd->vdev_mg != NULL && !vd->vdev_islog) { in vdev_space_update()
4881 ASSERT(!vd->vdev_isl2cache); in vdev_space_update()
4897 vdev_config_dirty(vdev_t *vd) in vdev_config_dirty() argument
4899 spa_t *spa = vd->vdev_spa; in vdev_config_dirty()
4909 if (vd->vdev_aux != NULL) { in vdev_config_dirty()
4910 spa_aux_vdev_t *sav = vd->vdev_aux; in vdev_config_dirty()
4915 if (sav->sav_vdevs[c] == vd) in vdev_config_dirty()
4942 aux[c] = vdev_config_generate(spa, vd, B_TRUE, 0); in vdev_config_dirty()
4957 if (vd == rvd) { in vdev_config_dirty()
4961 ASSERT(vd == vd->vdev_top); in vdev_config_dirty()
4963 if (!list_link_active(&vd->vdev_config_dirty_node) && in vdev_config_dirty()
4964 vdev_is_concrete(vd)) { in vdev_config_dirty()
4965 list_insert_head(&spa->spa_config_dirty_list, vd); in vdev_config_dirty()
4971 vdev_config_clean(vdev_t *vd) in vdev_config_clean() argument
4973 spa_t *spa = vd->vdev_spa; in vdev_config_clean()
4979 ASSERT(list_link_active(&vd->vdev_config_dirty_node)); in vdev_config_clean()
4980 list_remove(&spa->spa_config_dirty_list, vd); in vdev_config_clean()
4990 vdev_state_dirty(vdev_t *vd) in vdev_state_dirty() argument
4992 spa_t *spa = vd->vdev_spa; in vdev_state_dirty()
4995 ASSERT(vd == vd->vdev_top); in vdev_state_dirty()
5007 if (!list_link_active(&vd->vdev_state_dirty_node) && in vdev_state_dirty()
5008 vdev_is_concrete(vd)) in vdev_state_dirty()
5009 list_insert_head(&spa->spa_state_dirty_list, vd); in vdev_state_dirty()
5013 vdev_state_clean(vdev_t *vd) in vdev_state_clean() argument
5015 spa_t *spa = vd->vdev_spa; in vdev_state_clean()
5021 ASSERT(list_link_active(&vd->vdev_state_dirty_node)); in vdev_state_clean()
5022 list_remove(&spa->spa_state_dirty_list, vd); in vdev_state_clean()
5029 vdev_propagate_state(vdev_t *vd) in vdev_propagate_state() argument
5031 spa_t *spa = vd->vdev_spa; in vdev_propagate_state()
5037 if (vd->vdev_children > 0) { in vdev_propagate_state()
5038 for (int c = 0; c < vd->vdev_children; c++) { in vdev_propagate_state()
5039 child = vd->vdev_child[c]; in vdev_propagate_state()
5055 if (child->vdev_islog && vd == rvd) in vdev_propagate_state()
5067 vd->vdev_ops->vdev_op_state_change(vd, faulted, degraded); in vdev_propagate_state()
5075 if (corrupted && vd == rvd && in vdev_propagate_state()
5081 if (vd->vdev_parent) in vdev_propagate_state()
5082 vdev_propagate_state(vd->vdev_parent); in vdev_propagate_state()
5094 vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state, vdev_aux_t aux) in vdev_set_state() argument
5097 spa_t *spa = vd->vdev_spa; in vdev_set_state()
5099 if (state == vd->vdev_state) { in vdev_set_state()
5105 if (vd->vdev_ops->vdev_op_leaf && in vdev_set_state()
5107 (vd->vdev_prevstate >= VDEV_STATE_FAULTED)) { in vdev_set_state()
5109 zfs_post_state_change(spa, vd, vd->vdev_prevstate); in vdev_set_state()
5111 vd->vdev_stat.vs_aux = aux; in vdev_set_state()
5115 save_state = vd->vdev_state; in vdev_set_state()
5117 vd->vdev_state = state; in vdev_set_state()
5118 vd->vdev_stat.vs_aux = aux; in vdev_set_state()
5130 if (!vd->vdev_delayed_close && vdev_is_dead(vd) && in vdev_set_state()
5131 vd->vdev_ops->vdev_op_leaf) in vdev_set_state()
5132 vd->vdev_ops->vdev_op_close(vd); in vdev_set_state()
5134 if (vd->vdev_removed && in vdev_set_state()
5136 (aux == VDEV_AUX_OPEN_FAILED || vd->vdev_checkremove)) { in vdev_set_state()
5146 vd->vdev_state = VDEV_STATE_REMOVED; in vdev_set_state()
5147 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_set_state()
5149 vd->vdev_removed = B_TRUE; in vdev_set_state()
5159 vd->vdev_ops->vdev_op_leaf) in vdev_set_state()
5160 vd->vdev_not_present = 1; in vdev_set_state()
5177 if ((vd->vdev_prevstate != state || vd->vdev_forcefault) && in vdev_set_state()
5178 !vd->vdev_not_present && !vd->vdev_checkremove && in vdev_set_state()
5179 vd != spa->spa_root_vdev) { in vdev_set_state()
5208 (void) zfs_ereport_post(class, spa, vd, NULL, NULL, in vdev_set_state()
5213 vd->vdev_removed = B_FALSE; in vdev_set_state()
5215 vd->vdev_removed = B_FALSE; in vdev_set_state()
5222 if (vd->vdev_ops->vdev_op_leaf) { in vdev_set_state()
5224 if ((vd->vdev_prevstate != VDEV_STATE_UNKNOWN) && in vdev_set_state()
5225 (vd->vdev_prevstate != vd->vdev_state) && in vdev_set_state()
5227 save_state = vd->vdev_prevstate; in vdev_set_state()
5231 zfs_post_state_change(spa, vd, save_state); in vdev_set_state()
5234 if (!isopen && vd->vdev_parent) in vdev_set_state()
5235 vdev_propagate_state(vd->vdev_parent); in vdev_set_state()
5239 vdev_children_are_offline(vdev_t *vd) in vdev_children_are_offline() argument
5241 ASSERT(!vd->vdev_ops->vdev_op_leaf); in vdev_children_are_offline()
5243 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_children_are_offline()
5244 if (vd->vdev_child[i]->vdev_state != VDEV_STATE_OFFLINE) in vdev_children_are_offline()
5256 vdev_is_bootable(vdev_t *vd) in vdev_is_bootable() argument
5258 if (!vd->vdev_ops->vdev_op_leaf) { in vdev_is_bootable()
5259 const char *vdev_type = vd->vdev_ops->vdev_op_type; in vdev_is_bootable()
5265 for (int c = 0; c < vd->vdev_children; c++) { in vdev_is_bootable()
5266 if (!vdev_is_bootable(vd->vdev_child[c])) in vdev_is_bootable()
5273 vdev_is_concrete(vdev_t *vd) in vdev_is_concrete() argument
5275 vdev_ops_t *ops = vd->vdev_ops; in vdev_is_concrete()
5290 vdev_log_state_valid(vdev_t *vd) in vdev_log_state_valid() argument
5292 if (vd->vdev_ops->vdev_op_leaf && !vd->vdev_faulted && in vdev_log_state_valid()
5293 !vd->vdev_removed) in vdev_log_state_valid()
5296 for (int c = 0; c < vd->vdev_children; c++) in vdev_log_state_valid()
5297 if (vdev_log_state_valid(vd->vdev_child[c])) in vdev_log_state_valid()
5307 vdev_expand(vdev_t *vd, uint64_t txg) in vdev_expand() argument
5309 ASSERT(vd->vdev_top == vd); in vdev_expand()
5310 ASSERT(spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER) == SCL_ALL); in vdev_expand()
5311 ASSERT(vdev_is_concrete(vd)); in vdev_expand()
5313 vdev_set_deflate_ratio(vd); in vdev_expand()
5315 if ((vd->vdev_asize >> vd->vdev_ms_shift) > vd->vdev_ms_count && in vdev_expand()
5316 vdev_is_concrete(vd)) { in vdev_expand()
5317 vdev_metaslab_group_create(vd); in vdev_expand()
5318 VERIFY(vdev_metaslab_init(vd, txg) == 0); in vdev_expand()
5319 vdev_config_dirty(vd); in vdev_expand()
5327 vdev_split(vdev_t *vd) in vdev_split() argument
5329 vdev_t *cvd, *pvd = vd->vdev_parent; in vdev_split()
5331 vdev_remove_child(pvd, vd); in vdev_split()
5343 vdev_deadman(vdev_t *vd, char *tag) in vdev_deadman() argument
5345 for (int c = 0; c < vd->vdev_children; c++) { in vdev_deadman()
5346 vdev_t *cvd = vd->vdev_child[c]; in vdev_deadman()
5351 if (vd->vdev_ops->vdev_op_leaf) { in vdev_deadman()
5352 vdev_queue_t *vq = &vd->vdev_queue; in vdev_deadman()
5356 spa_t *spa = vd->vdev_spa; in vdev_deadman()
5361 vd->vdev_path, avl_numnodes(&vq->vq_active_tree)); in vdev_deadman()
5378 vdev_defer_resilver(vdev_t *vd) in vdev_defer_resilver() argument
5380 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_defer_resilver()
5382 vd->vdev_resilver_deferred = B_TRUE; in vdev_defer_resilver()
5383 vd->vdev_spa->spa_resilver_deferred = B_TRUE; in vdev_defer_resilver()
5392 vdev_clear_resilver_deferred(vdev_t *vd, dmu_tx_t *tx) in vdev_clear_resilver_deferred() argument
5395 spa_t *spa = vd->vdev_spa; in vdev_clear_resilver_deferred()
5397 for (int c = 0; c < vd->vdev_children; c++) { in vdev_clear_resilver_deferred()
5398 vdev_t *cvd = vd->vdev_child[c]; in vdev_clear_resilver_deferred()
5402 if (vd == spa->spa_root_vdev && in vdev_clear_resilver_deferred()
5405 vdev_config_dirty(vd); in vdev_clear_resilver_deferred()
5410 if (!vdev_is_concrete(vd) || vd->vdev_aux || in vdev_clear_resilver_deferred()
5411 !vd->vdev_ops->vdev_op_leaf) in vdev_clear_resilver_deferred()
5414 vd->vdev_resilver_deferred = B_FALSE; in vdev_clear_resilver_deferred()
5416 return (!vdev_is_dead(vd) && !vd->vdev_offline && in vdev_clear_resilver_deferred()
5417 vdev_resilver_needed(vd, NULL, NULL)); in vdev_clear_resilver_deferred()
5435 vdev_xlate(vdev_t *vd, const range_seg64_t *logical_rs, in vdev_xlate() argument
5441 if (vd != vd->vdev_top) { in vdev_xlate()
5442 vdev_xlate(vd->vdev_parent, logical_rs, physical_rs, in vdev_xlate()
5459 vdev_t *pvd = vd->vdev_parent; in vdev_xlate()
5469 pvd->vdev_ops->vdev_op_xlate(vd, physical_rs, &intermediate, remain_rs); in vdev_xlate()
5476 vdev_xlate_walk(vdev_t *vd, const range_seg64_t *logical_rs, in vdev_xlate_walk() argument
5485 vdev_xlate(vd, &iter_rs, &physical_rs, &remain_rs); in vdev_xlate_walk()