Lines Matching refs:vd

118 vdev_dbgmsg(vdev_t *vd, const char *fmt, ...)  in vdev_dbgmsg()  argument
127 if (vd->vdev_path != NULL) { in vdev_dbgmsg()
128 zfs_dbgmsg("%s vdev '%s': %s", vd->vdev_ops->vdev_op_type, in vdev_dbgmsg()
129 vd->vdev_path, buf); in vdev_dbgmsg()
132 vd->vdev_ops->vdev_op_type, in vdev_dbgmsg()
133 (u_longlong_t)vd->vdev_id, in vdev_dbgmsg()
134 (u_longlong_t)vd->vdev_guid, buf); in vdev_dbgmsg()
139 vdev_dbgmsg_print_tree(vdev_t *vd, int indent) in vdev_dbgmsg_print_tree() argument
143 if (vd->vdev_ishole || vd->vdev_ops == &vdev_missing_ops) { in vdev_dbgmsg_print_tree()
144 zfs_dbgmsg("%*svdev %u: %s", indent, "", vd->vdev_id, in vdev_dbgmsg_print_tree()
145 vd->vdev_ops->vdev_op_type); in vdev_dbgmsg_print_tree()
149 switch (vd->vdev_state) { in vdev_dbgmsg_print_tree()
176 (uint_t)vd->vdev_state); in vdev_dbgmsg_print_tree()
180 "", (int)vd->vdev_id, vd->vdev_ops->vdev_op_type, in vdev_dbgmsg_print_tree()
181 vd->vdev_islog ? " (log)" : "", in vdev_dbgmsg_print_tree()
182 (u_longlong_t)vd->vdev_guid, in vdev_dbgmsg_print_tree()
183 vd->vdev_path ? vd->vdev_path : "N/A", state); in vdev_dbgmsg_print_tree()
185 for (uint64_t i = 0; i < vd->vdev_children; i++) in vdev_dbgmsg_print_tree()
186 vdev_dbgmsg_print_tree(vd->vdev_child[i], indent + 2); in vdev_dbgmsg_print_tree()
225 vdev_default_xlate(vdev_t *vd, const range_seg64_t *in, range_seg64_t *res) in vdev_default_xlate() argument
236 vdev_default_asize(vdev_t *vd, uint64_t psize) in vdev_default_asize() argument
238 uint64_t asize = P2ROUNDUP(psize, 1ULL << vd->vdev_top->vdev_ashift); in vdev_default_asize()
241 for (int c = 0; c < vd->vdev_children; c++) { in vdev_default_asize()
242 csize = vdev_psize_to_asize(vd->vdev_child[c], psize); in vdev_default_asize()
256 vdev_get_min_asize(vdev_t *vd) in vdev_get_min_asize() argument
258 vdev_t *pvd = vd->vdev_parent; in vdev_get_min_asize()
265 return (vd->vdev_asize); in vdev_get_min_asize()
271 if (vd == vd->vdev_top) in vdev_get_min_asize()
272 return (P2ALIGN(vd->vdev_asize, 1ULL << vd->vdev_ms_shift)); in vdev_get_min_asize()
286 vdev_set_min_asize(vdev_t *vd) in vdev_set_min_asize() argument
288 vd->vdev_min_asize = vdev_get_min_asize(vd); in vdev_set_min_asize()
290 for (int c = 0; c < vd->vdev_children; c++) in vdev_set_min_asize()
291 vdev_set_min_asize(vd->vdev_child[c]); in vdev_set_min_asize()
310 vdev_lookup_by_guid(vdev_t *vd, uint64_t guid) in vdev_lookup_by_guid() argument
314 if (vd->vdev_guid == guid) in vdev_lookup_by_guid()
315 return (vd); in vdev_lookup_by_guid()
317 for (int c = 0; c < vd->vdev_children; c++) in vdev_lookup_by_guid()
318 if ((mvd = vdev_lookup_by_guid(vd->vdev_child[c], guid)) != in vdev_lookup_by_guid()
326 vdev_count_leaves_impl(vdev_t *vd) in vdev_count_leaves_impl() argument
330 if (vd->vdev_ops->vdev_op_leaf) in vdev_count_leaves_impl()
333 for (int c = 0; c < vd->vdev_children; c++) in vdev_count_leaves_impl()
334 n += vdev_count_leaves_impl(vd->vdev_child[c]); in vdev_count_leaves_impl()
485 vdev_t *vd; in vdev_alloc_common() local
488 vd = kmem_zalloc(sizeof (vdev_t), KM_SLEEP); in vdev_alloc_common()
489 vic = &vd->vdev_indirect_config; in vdev_alloc_common()
493 spa->spa_root_vdev = vd; in vdev_alloc_common()
498 if (spa->spa_root_vdev == vd) { in vdev_alloc_common()
513 vd->vdev_spa = spa; in vdev_alloc_common()
514 vd->vdev_id = id; in vdev_alloc_common()
515 vd->vdev_guid = guid; in vdev_alloc_common()
516 vd->vdev_guid_sum = guid; in vdev_alloc_common()
517 vd->vdev_ops = ops; in vdev_alloc_common()
518 vd->vdev_state = VDEV_STATE_CLOSED; in vdev_alloc_common()
519 vd->vdev_ishole = (ops == &vdev_hole_ops); in vdev_alloc_common()
522 rw_init(&vd->vdev_indirect_rwlock, NULL, RW_DEFAULT, NULL); in vdev_alloc_common()
523 mutex_init(&vd->vdev_obsolete_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
524 vd->vdev_obsolete_segments = range_tree_create(NULL, RANGE_SEG64, NULL, in vdev_alloc_common()
527 list_link_init(&vd->vdev_initialize_node); in vdev_alloc_common()
528 list_link_init(&vd->vdev_leaf_node); in vdev_alloc_common()
529 list_link_init(&vd->vdev_trim_node); in vdev_alloc_common()
530 mutex_init(&vd->vdev_dtl_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
531 mutex_init(&vd->vdev_stat_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
532 mutex_init(&vd->vdev_probe_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
533 mutex_init(&vd->vdev_scan_io_queue_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
534 mutex_init(&vd->vdev_initialize_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
535 mutex_init(&vd->vdev_initialize_io_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
536 cv_init(&vd->vdev_initialize_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
537 cv_init(&vd->vdev_initialize_io_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
538 mutex_init(&vd->vdev_trim_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
539 mutex_init(&vd->vdev_autotrim_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
540 mutex_init(&vd->vdev_trim_io_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
541 cv_init(&vd->vdev_trim_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
542 cv_init(&vd->vdev_autotrim_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
543 cv_init(&vd->vdev_trim_io_cv, NULL, CV_DEFAULT, NULL); in vdev_alloc_common()
546 vd->vdev_dtl[t] = range_tree_create(NULL, RANGE_SEG64, NULL, 0, in vdev_alloc_common()
549 txg_list_create(&vd->vdev_ms_list, spa, in vdev_alloc_common()
551 txg_list_create(&vd->vdev_dtl_list, spa, in vdev_alloc_common()
553 vd->vdev_stat.vs_timestamp = gethrtime(); in vdev_alloc_common()
554 vdev_queue_init(vd); in vdev_alloc_common()
555 vdev_cache_init(vd); in vdev_alloc_common()
557 return (vd); in vdev_alloc_common()
572 vdev_t *vd; in vdev_alloc() local
682 vd = vdev_alloc_common(spa, id, guid, ops); in vdev_alloc()
683 vic = &vd->vdev_indirect_config; in vdev_alloc()
685 vd->vdev_islog = islog; in vdev_alloc()
686 vd->vdev_nparity = nparity; in vdev_alloc()
688 vd->vdev_alloc_bias = alloc_bias; in vdev_alloc()
690 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &vd->vdev_path) == 0) in vdev_alloc()
691 vd->vdev_path = spa_strdup(vd->vdev_path); in vdev_alloc()
692 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &vd->vdev_devid) == 0) in vdev_alloc()
693 vd->vdev_devid = spa_strdup(vd->vdev_devid); in vdev_alloc()
695 &vd->vdev_physpath) == 0) in vdev_alloc()
696 vd->vdev_physpath = spa_strdup(vd->vdev_physpath); in vdev_alloc()
697 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_FRU, &vd->vdev_fru) == 0) in vdev_alloc()
698 vd->vdev_fru = spa_strdup(vd->vdev_fru); in vdev_alloc()
705 &vd->vdev_wholedisk) != 0) in vdev_alloc()
706 vd->vdev_wholedisk = -1ULL; in vdev_alloc()
723 &vd->vdev_not_present); in vdev_alloc()
728 (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ASHIFT, &vd->vdev_ashift); in vdev_alloc()
734 &vd->vdev_crtxg); in vdev_alloc()
742 &vd->vdev_ms_array); in vdev_alloc()
744 &vd->vdev_ms_shift); in vdev_alloc()
746 &vd->vdev_asize); in vdev_alloc()
748 &vd->vdev_removing); in vdev_alloc()
750 &vd->vdev_top_zap); in vdev_alloc()
752 ASSERT0(vd->vdev_top_zap); in vdev_alloc()
763 if (vd->vdev_ops->vdev_op_leaf && in vdev_alloc()
766 ZPOOL_CONFIG_VDEV_LEAF_ZAP, &vd->vdev_leaf_zap); in vdev_alloc()
768 ASSERT0(vd->vdev_leaf_zap); in vdev_alloc()
775 if (vd->vdev_ops->vdev_op_leaf && in vdev_alloc()
780 &vd->vdev_dtl_object); in vdev_alloc()
782 &vd->vdev_unspare); in vdev_alloc()
790 spa_spare_add(vd); in vdev_alloc()
794 &vd->vdev_offline); in vdev_alloc()
797 &vd->vdev_resilver_txg); in vdev_alloc()
800 vdev_defer_resilver(vd); in vdev_alloc()
810 &vd->vdev_faulted); in vdev_alloc()
812 &vd->vdev_degraded); in vdev_alloc()
814 &vd->vdev_removed); in vdev_alloc()
816 if (vd->vdev_faulted || vd->vdev_degraded) { in vdev_alloc()
819 vd->vdev_label_aux = in vdev_alloc()
824 vd->vdev_label_aux = VDEV_AUX_EXTERNAL; in vdev_alloc()
832 vdev_add_child(parent, vd); in vdev_alloc()
834 *vdp = vd; in vdev_alloc()
840 vdev_free(vdev_t *vd) in vdev_free() argument
842 spa_t *spa = vd->vdev_spa; in vdev_free()
844 ASSERT3P(vd->vdev_initialize_thread, ==, NULL); in vdev_free()
845 ASSERT3P(vd->vdev_trim_thread, ==, NULL); in vdev_free()
846 ASSERT3P(vd->vdev_autotrim_thread, ==, NULL); in vdev_free()
853 if (vd->vdev_scan_io_queue != NULL) { in vdev_free()
854 mutex_enter(&vd->vdev_scan_io_queue_lock); in vdev_free()
855 dsl_scan_io_queue_destroy(vd->vdev_scan_io_queue); in vdev_free()
856 vd->vdev_scan_io_queue = NULL; in vdev_free()
857 mutex_exit(&vd->vdev_scan_io_queue_lock); in vdev_free()
864 vdev_close(vd); in vdev_free()
866 ASSERT(!list_link_active(&vd->vdev_config_dirty_node)); in vdev_free()
867 ASSERT(!list_link_active(&vd->vdev_state_dirty_node)); in vdev_free()
872 for (int c = 0; c < vd->vdev_children; c++) in vdev_free()
873 vdev_free(vd->vdev_child[c]); in vdev_free()
875 ASSERT(vd->vdev_child == NULL); in vdev_free()
876 ASSERT(vd->vdev_guid_sum == vd->vdev_guid); in vdev_free()
881 if (vd->vdev_mg != NULL) { in vdev_free()
882 vdev_metaslab_fini(vd); in vdev_free()
883 metaslab_group_destroy(vd->vdev_mg); in vdev_free()
884 vd->vdev_mg = NULL; in vdev_free()
887 ASSERT0(vd->vdev_stat.vs_space); in vdev_free()
888 ASSERT0(vd->vdev_stat.vs_dspace); in vdev_free()
889 ASSERT0(vd->vdev_stat.vs_alloc); in vdev_free()
894 vdev_remove_child(vd->vdev_parent, vd); in vdev_free()
896 ASSERT(vd->vdev_parent == NULL); in vdev_free()
897 ASSERT(!list_link_active(&vd->vdev_leaf_node)); in vdev_free()
902 vdev_queue_fini(vd); in vdev_free()
903 vdev_cache_fini(vd); in vdev_free()
905 if (vd->vdev_path) in vdev_free()
906 spa_strfree(vd->vdev_path); in vdev_free()
907 if (vd->vdev_devid) in vdev_free()
908 spa_strfree(vd->vdev_devid); in vdev_free()
909 if (vd->vdev_physpath) in vdev_free()
910 spa_strfree(vd->vdev_physpath); in vdev_free()
911 if (vd->vdev_fru) in vdev_free()
912 spa_strfree(vd->vdev_fru); in vdev_free()
914 if (vd->vdev_isspare) in vdev_free()
915 spa_spare_remove(vd); in vdev_free()
916 if (vd->vdev_isl2cache) in vdev_free()
917 spa_l2cache_remove(vd); in vdev_free()
919 txg_list_destroy(&vd->vdev_ms_list); in vdev_free()
920 txg_list_destroy(&vd->vdev_dtl_list); in vdev_free()
922 mutex_enter(&vd->vdev_dtl_lock); in vdev_free()
923 space_map_close(vd->vdev_dtl_sm); in vdev_free()
925 range_tree_vacate(vd->vdev_dtl[t], NULL, NULL); in vdev_free()
926 range_tree_destroy(vd->vdev_dtl[t]); in vdev_free()
928 mutex_exit(&vd->vdev_dtl_lock); in vdev_free()
930 EQUIV(vd->vdev_indirect_births != NULL, in vdev_free()
931 vd->vdev_indirect_mapping != NULL); in vdev_free()
932 if (vd->vdev_indirect_births != NULL) { in vdev_free()
933 vdev_indirect_mapping_close(vd->vdev_indirect_mapping); in vdev_free()
934 vdev_indirect_births_close(vd->vdev_indirect_births); in vdev_free()
937 if (vd->vdev_obsolete_sm != NULL) { in vdev_free()
938 ASSERT(vd->vdev_removing || in vdev_free()
939 vd->vdev_ops == &vdev_indirect_ops); in vdev_free()
940 space_map_close(vd->vdev_obsolete_sm); in vdev_free()
941 vd->vdev_obsolete_sm = NULL; in vdev_free()
943 range_tree_destroy(vd->vdev_obsolete_segments); in vdev_free()
944 rw_destroy(&vd->vdev_indirect_rwlock); in vdev_free()
945 mutex_destroy(&vd->vdev_obsolete_lock); in vdev_free()
947 mutex_destroy(&vd->vdev_dtl_lock); in vdev_free()
948 mutex_destroy(&vd->vdev_stat_lock); in vdev_free()
949 mutex_destroy(&vd->vdev_probe_lock); in vdev_free()
950 mutex_destroy(&vd->vdev_scan_io_queue_lock); in vdev_free()
951 mutex_destroy(&vd->vdev_initialize_lock); in vdev_free()
952 mutex_destroy(&vd->vdev_initialize_io_lock); in vdev_free()
953 cv_destroy(&vd->vdev_initialize_io_cv); in vdev_free()
954 cv_destroy(&vd->vdev_initialize_cv); in vdev_free()
955 mutex_destroy(&vd->vdev_trim_lock); in vdev_free()
956 mutex_destroy(&vd->vdev_autotrim_lock); in vdev_free()
957 mutex_destroy(&vd->vdev_trim_io_lock); in vdev_free()
958 cv_destroy(&vd->vdev_trim_cv); in vdev_free()
959 cv_destroy(&vd->vdev_autotrim_cv); in vdev_free()
960 cv_destroy(&vd->vdev_trim_io_cv); in vdev_free()
962 if (vd == spa->spa_root_vdev) in vdev_free()
965 kmem_free(vd, sizeof (vdev_t)); in vdev_free()
976 vdev_t *vd; in vdev_top_transfer() local
1045 while ((vd = txg_list_remove(&svd->vdev_dtl_list, t)) != NULL) in vdev_top_transfer()
1046 (void) txg_list_add(&tvd->vdev_dtl_list, vd, t); in vdev_top_transfer()
1071 vdev_top_update(vdev_t *tvd, vdev_t *vd) in vdev_top_update() argument
1073 if (vd == NULL) in vdev_top_update()
1076 vd->vdev_top = tvd; in vdev_top_update()
1078 for (int c = 0; c < vd->vdev_children; c++) in vdev_top_update()
1079 vdev_top_update(tvd, vd->vdev_child[c]); in vdev_top_update()
1160 vdev_metaslab_group_create(vdev_t *vd) in vdev_metaslab_group_create() argument
1162 spa_t *spa = vd->vdev_spa; in vdev_metaslab_group_create()
1167 if (vd->vdev_mg == NULL) { in vdev_metaslab_group_create()
1170 if (vd->vdev_islog && vd->vdev_alloc_bias == VDEV_BIAS_NONE) in vdev_metaslab_group_create()
1171 vd->vdev_alloc_bias = VDEV_BIAS_LOG; in vdev_metaslab_group_create()
1173 ASSERT3U(vd->vdev_islog, ==, in vdev_metaslab_group_create()
1174 (vd->vdev_alloc_bias == VDEV_BIAS_LOG)); in vdev_metaslab_group_create()
1176 switch (vd->vdev_alloc_bias) { in vdev_metaslab_group_create()
1190 vd->vdev_mg = metaslab_group_create(mc, vd, in vdev_metaslab_group_create()
1198 if (vd->vdev_top == vd && vd->vdev_ashift != 0 && in vdev_metaslab_group_create()
1199 mc == spa_normal_class(spa) && vd->vdev_aux == NULL) { in vdev_metaslab_group_create()
1200 if (vd->vdev_ashift > spa->spa_max_ashift) in vdev_metaslab_group_create()
1201 spa->spa_max_ashift = vd->vdev_ashift; in vdev_metaslab_group_create()
1202 if (vd->vdev_ashift < spa->spa_min_ashift) in vdev_metaslab_group_create()
1203 spa->spa_min_ashift = vd->vdev_ashift; in vdev_metaslab_group_create()
1209 vdev_metaslab_init(vdev_t *vd, uint64_t txg) in vdev_metaslab_init() argument
1211 spa_t *spa = vd->vdev_spa; in vdev_metaslab_init()
1214 uint64_t oldc = vd->vdev_ms_count; in vdev_metaslab_init()
1215 uint64_t newc = vd->vdev_asize >> vd->vdev_ms_shift; in vdev_metaslab_init()
1225 if (vd->vdev_ms_shift == 0) in vdev_metaslab_init()
1228 ASSERT(!vd->vdev_ishole); in vdev_metaslab_init()
1235 bcopy(vd->vdev_ms, mspp, oldc * sizeof (*mspp)); in vdev_metaslab_init()
1236 kmem_free(vd->vdev_ms, oldc * sizeof (*mspp)); in vdev_metaslab_init()
1239 vd->vdev_ms = mspp; in vdev_metaslab_init()
1240 vd->vdev_ms_count = newc; in vdev_metaslab_init()
1249 if (txg == 0 && vd->vdev_ms_array != 0) { in vdev_metaslab_init()
1250 error = dmu_read(mos, vd->vdev_ms_array, in vdev_metaslab_init()
1254 vdev_dbgmsg(vd, "unable to read the metaslab " in vdev_metaslab_init()
1266 if (vd->vdev_mg == NULL) { in vdev_metaslab_init()
1267 ASSERT0(vdev_is_concrete(vd)); in vdev_metaslab_init()
1268 vdev_metaslab_group_create(vd); in vdev_metaslab_init()
1271 error = metaslab_init(vd->vdev_mg, m, object, txg, in vdev_metaslab_init()
1272 &(vd->vdev_ms[m])); in vdev_metaslab_init()
1274 vdev_dbgmsg(vd, "metaslab_init failed [error=%d]", in vdev_metaslab_init()
1288 if (!expanding && !vd->vdev_removing) { in vdev_metaslab_init()
1289 metaslab_group_activate(vd->vdev_mg); in vdev_metaslab_init()
1306 vdev_metaslab_fini(vdev_t *vd) in vdev_metaslab_fini() argument
1308 if (vd->vdev_checkpoint_sm != NULL) { in vdev_metaslab_fini()
1309 ASSERT(spa_feature_is_active(vd->vdev_spa, in vdev_metaslab_fini()
1311 space_map_close(vd->vdev_checkpoint_sm); in vdev_metaslab_fini()
1320 vd->vdev_checkpoint_sm = NULL; in vdev_metaslab_fini()
1323 if (vd->vdev_ms != NULL) { in vdev_metaslab_fini()
1324 metaslab_group_t *mg = vd->vdev_mg; in vdev_metaslab_fini()
1327 uint64_t count = vd->vdev_ms_count; in vdev_metaslab_fini()
1329 metaslab_t *msp = vd->vdev_ms[m]; in vdev_metaslab_fini()
1333 kmem_free(vd->vdev_ms, count * sizeof (metaslab_t *)); in vdev_metaslab_fini()
1334 vd->vdev_ms = NULL; in vdev_metaslab_fini()
1336 vd->vdev_ms_count = 0; in vdev_metaslab_fini()
1341 ASSERT0(vd->vdev_ms_count); in vdev_metaslab_fini()
1354 vdev_t *vd = zio->io_vd; in vdev_probe_done() local
1357 ASSERT(vd->vdev_probe_zio != NULL); in vdev_probe_done()
1363 zio_nowait(zio_write_phys(vd->vdev_probe_zio, vd, in vdev_probe_done()
1377 vd->vdev_cant_read |= !vps->vps_readable; in vdev_probe_done()
1378 vd->vdev_cant_write |= !vps->vps_writeable; in vdev_probe_done()
1380 if (vdev_readable(vd) && in vdev_probe_done()
1381 (vdev_writeable(vd) || !spa_writeable(spa))) { in vdev_probe_done()
1385 vdev_dbgmsg(vd, "failed probe"); in vdev_probe_done()
1387 spa, vd, NULL, NULL, 0, 0); in vdev_probe_done()
1391 mutex_enter(&vd->vdev_probe_lock); in vdev_probe_done()
1392 ASSERT(vd->vdev_probe_zio == zio); in vdev_probe_done()
1393 vd->vdev_probe_zio = NULL; in vdev_probe_done()
1394 mutex_exit(&vd->vdev_probe_lock); in vdev_probe_done()
1398 if (!vdev_accessible(vd, pio)) in vdev_probe_done()
1413 vdev_probe(vdev_t *vd, zio_t *zio) in vdev_probe() argument
1415 spa_t *spa = vd->vdev_spa; in vdev_probe()
1419 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_probe()
1432 mutex_enter(&vd->vdev_probe_lock); in vdev_probe()
1434 if ((pio = vd->vdev_probe_zio) == NULL) { in vdev_probe()
1459 vd->vdev_cant_read = B_FALSE; in vdev_probe()
1460 vd->vdev_cant_write = B_FALSE; in vdev_probe()
1463 vd->vdev_probe_zio = pio = zio_null(NULL, spa, vd, in vdev_probe()
1472 vd->vdev_probe_wanted = B_TRUE; in vdev_probe()
1480 mutex_exit(&vd->vdev_probe_lock); in vdev_probe()
1488 zio_nowait(zio_read_phys(pio, vd, in vdev_probe()
1489 vdev_label_offset(vd->vdev_psize, l, in vdev_probe()
1506 vdev_t *vd = arg; in vdev_open_child() local
1508 vd->vdev_open_thread = curthread; in vdev_open_child()
1509 vd->vdev_open_error = vdev_open(vd); in vdev_open_child()
1510 vd->vdev_open_thread = NULL; in vdev_open_child()
1514 vdev_uses_zvols(vdev_t *vd) in vdev_uses_zvols() argument
1516 if (vd->vdev_path && strncmp(vd->vdev_path, ZVOL_DIR, in vdev_uses_zvols()
1519 for (int c = 0; c < vd->vdev_children; c++) in vdev_uses_zvols()
1520 if (vdev_uses_zvols(vd->vdev_child[c])) in vdev_uses_zvols()
1526 vdev_open_children(vdev_t *vd) in vdev_open_children() argument
1529 int children = vd->vdev_children; in vdev_open_children()
1536 if (vdev_uses_zvols(vd)) { in vdev_open_children()
1539 vd->vdev_child[c]->vdev_open_error = in vdev_open_children()
1540 vdev_open(vd->vdev_child[c]); in vdev_open_children()
1549 vd->vdev_child[c], TQ_SLEEP) != TASKQID_INVALID); in vdev_open_children()
1554 vd->vdev_nonrot = B_TRUE; in vdev_open_children()
1557 vd->vdev_nonrot &= vd->vdev_child[c]->vdev_nonrot; in vdev_open_children()
1567 vdev_set_deflate_ratio(vdev_t *vd) in vdev_set_deflate_ratio() argument
1569 if (vd == vd->vdev_top && !vd->vdev_ishole && vd->vdev_ashift != 0) { in vdev_set_deflate_ratio()
1570 vd->vdev_deflate_ratio = (1 << 17) / in vdev_set_deflate_ratio()
1571 (vdev_psize_to_asize(vd, 1 << 17) >> SPA_MINBLOCKSHIFT); in vdev_set_deflate_ratio()
1579 vdev_open(vdev_t *vd) in vdev_open() argument
1581 spa_t *spa = vd->vdev_spa; in vdev_open()
1588 ASSERT(vd->vdev_open_thread == curthread || in vdev_open()
1590 ASSERT(vd->vdev_state == VDEV_STATE_CLOSED || in vdev_open()
1591 vd->vdev_state == VDEV_STATE_CANT_OPEN || in vdev_open()
1592 vd->vdev_state == VDEV_STATE_OFFLINE); in vdev_open()
1594 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_open()
1595 vd->vdev_cant_read = B_FALSE; in vdev_open()
1596 vd->vdev_cant_write = B_FALSE; in vdev_open()
1597 vd->vdev_min_asize = vdev_get_min_asize(vd); in vdev_open()
1603 if (!vd->vdev_removed && vd->vdev_faulted) { in vdev_open()
1604 ASSERT(vd->vdev_children == 0); in vdev_open()
1605 ASSERT(vd->vdev_label_aux == VDEV_AUX_ERR_EXCEEDED || in vdev_open()
1606 vd->vdev_label_aux == VDEV_AUX_EXTERNAL); in vdev_open()
1607 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1608 vd->vdev_label_aux); in vdev_open()
1610 } else if (vd->vdev_offline) { in vdev_open()
1611 ASSERT(vd->vdev_children == 0); in vdev_open()
1612 vdev_set_state(vd, B_TRUE, VDEV_STATE_OFFLINE, VDEV_AUX_NONE); in vdev_open()
1616 error = vd->vdev_ops->vdev_op_open(vd, &osize, &max_osize, &ashift); in vdev_open()
1622 vd->vdev_reopening = B_FALSE; in vdev_open()
1624 error = zio_handle_device_injection(vd, NULL, ENXIO); in vdev_open()
1627 if (vd->vdev_removed && in vdev_open()
1628 vd->vdev_stat.vs_aux != VDEV_AUX_OPEN_FAILED) in vdev_open()
1629 vd->vdev_removed = B_FALSE; in vdev_open()
1631 if (vd->vdev_stat.vs_aux == VDEV_AUX_CHILDREN_OFFLINE) { in vdev_open()
1632 vdev_set_state(vd, B_TRUE, VDEV_STATE_OFFLINE, in vdev_open()
1633 vd->vdev_stat.vs_aux); in vdev_open()
1635 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1636 vd->vdev_stat.vs_aux); in vdev_open()
1641 vd->vdev_removed = B_FALSE; in vdev_open()
1647 if (vd->vdev_faulted) { in vdev_open()
1648 ASSERT(vd->vdev_children == 0); in vdev_open()
1649 ASSERT(vd->vdev_label_aux == VDEV_AUX_ERR_EXCEEDED || in vdev_open()
1650 vd->vdev_label_aux == VDEV_AUX_EXTERNAL); in vdev_open()
1651 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1652 vd->vdev_label_aux); in vdev_open()
1656 if (vd->vdev_degraded) { in vdev_open()
1657 ASSERT(vd->vdev_children == 0); in vdev_open()
1658 vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED, in vdev_open()
1661 vdev_set_state(vd, B_TRUE, VDEV_STATE_HEALTHY, 0); in vdev_open()
1667 if (vd->vdev_ishole || vd->vdev_ops == &vdev_missing_ops) in vdev_open()
1670 for (int c = 0; c < vd->vdev_children; c++) { in vdev_open()
1671 if (vd->vdev_child[c]->vdev_state != VDEV_STATE_HEALTHY) { in vdev_open()
1672 vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED, in vdev_open()
1681 if (vd->vdev_children == 0) { in vdev_open()
1683 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1692 if (vd->vdev_parent != NULL && osize < SPA_MINDEVSIZE - in vdev_open()
1694 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1703 vd->vdev_psize = psize; in vdev_open()
1708 if (asize < vd->vdev_min_asize) { in vdev_open()
1709 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1714 if (vd->vdev_asize == 0) { in vdev_open()
1719 vd->vdev_asize = asize; in vdev_open()
1720 vd->vdev_max_asize = max_asize; in vdev_open()
1721 if (vd->vdev_ashift == 0) { in vdev_open()
1722 vd->vdev_ashift = ashift; /* use detected value */ in vdev_open()
1724 if (vd->vdev_ashift != 0 && (vd->vdev_ashift < ASHIFT_MIN || in vdev_open()
1725 vd->vdev_ashift > ASHIFT_MAX)) { in vdev_open()
1726 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1736 if (ashift > vd->vdev_top->vdev_ashift && in vdev_open()
1737 vd->vdev_ops->vdev_op_leaf) { in vdev_open()
1740 spa, vd, NULL, NULL, 0, 0); in vdev_open()
1743 vd->vdev_max_asize = max_asize; in vdev_open()
1758 if (vd->vdev_state == VDEV_STATE_HEALTHY && in vdev_open()
1759 ((asize > vd->vdev_asize && in vdev_open()
1760 (vd->vdev_expanding || spa->spa_autoexpand)) || in vdev_open()
1761 (asize < vd->vdev_asize))) in vdev_open()
1762 vd->vdev_asize = asize; in vdev_open()
1764 vdev_set_min_asize(vd); in vdev_open()
1770 if (vd->vdev_ops->vdev_op_leaf && in vdev_open()
1771 (error = zio_wait(vdev_probe(vd, NULL))) != 0) { in vdev_open()
1772 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1783 if (vd->vdev_top == vd && vd->vdev_ashift != 0 && in vdev_open()
1784 vd->vdev_alloc_bias == VDEV_BIAS_NONE && in vdev_open()
1785 vd->vdev_aux == NULL) { in vdev_open()
1786 if (vd->vdev_ashift > spa->spa_max_ashift) in vdev_open()
1787 spa->spa_max_ashift = vd->vdev_ashift; in vdev_open()
1788 if (vd->vdev_ashift < spa->spa_min_ashift) in vdev_open()
1789 spa->spa_min_ashift = vd->vdev_ashift; in vdev_open()
1797 if (vd->vdev_ops->vdev_op_leaf && !spa->spa_scrub_reopen) in vdev_open()
1798 dsl_scan_assess_vdev(spa->spa_dsl_pool, vd); in vdev_open()
1814 vdev_validate(vdev_t *vd) in vdev_validate() argument
1816 spa_t *spa = vd->vdev_spa; in vdev_validate()
1826 for (uint64_t c = 0; c < vd->vdev_children; c++) in vdev_validate()
1827 if (vdev_validate(vd->vdev_child[c]) != 0) in vdev_validate()
1835 if (!vd->vdev_ops->vdev_op_leaf || !vdev_readable(vd)) in vdev_validate()
1850 if ((label = vdev_label_read_config(vd, txg)) == NULL) { in vdev_validate()
1851 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1853 vdev_dbgmsg(vd, "vdev_validate: failed reading config for " in vdev_validate()
1864 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1867 vdev_dbgmsg(vd, "vdev_validate: vdev split into other pool"); in vdev_validate()
1872 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1875 vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", in vdev_validate()
1888 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1891 vdev_dbgmsg(vd, "vdev_validate: vdev label pool_guid doesn't " in vdev_validate()
1903 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1906 vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", in vdev_validate()
1913 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1916 vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", in vdev_validate()
1936 if (vd->vdev_guid != guid && vd->vdev_guid != aux_guid) { in vdev_validate()
1939 if (vd != vd->vdev_top || vd->vdev_guid != top_guid) in vdev_validate()
1942 if (vd->vdev_guid != top_guid && in vdev_validate()
1943 vd->vdev_top->vdev_guid != guid) in vdev_validate()
1948 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1951 vdev_dbgmsg(vd, "vdev_validate: config guid " in vdev_validate()
1953 vdev_dbgmsg(vd, "CONFIG: guid %llu, top_guid %llu", in vdev_validate()
1954 (u_longlong_t)vd->vdev_guid, in vdev_validate()
1955 (u_longlong_t)vd->vdev_top->vdev_guid); in vdev_validate()
1956 vdev_dbgmsg(vd, "LABEL: guid %llu, top_guid %llu, " in vdev_validate()
1965 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1968 vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", in vdev_validate()
1982 vdev_dbgmsg(vd, "vdev_validate: invalid pool state (%llu) " in vdev_validate()
1992 if (vd->vdev_not_present) in vdev_validate()
1993 vd->vdev_not_present = 0; in vdev_validate()
2080 vdev_t *vd = vdev_lookup_by_guid(stvd, dvd->vdev_guid); in vdev_copy_path_search() local
2082 if (vd == NULL || vd->vdev_ops != dvd->vdev_ops) in vdev_copy_path_search()
2085 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_copy_path_search()
2087 vdev_copy_path_impl(vd, dvd); in vdev_copy_path_search()
2113 vdev_close(vdev_t *vd) in vdev_close() argument
2115 spa_t *spa = vd->vdev_spa; in vdev_close()
2116 vdev_t *pvd = vd->vdev_parent; in vdev_close()
2125 vd->vdev_reopening = (pvd->vdev_reopening && !vd->vdev_offline); in vdev_close()
2127 vd->vdev_ops->vdev_op_close(vd); in vdev_close()
2129 vdev_cache_purge(vd); in vdev_close()
2136 vd->vdev_prevstate = vd->vdev_state; in vdev_close()
2138 if (vd->vdev_offline) in vdev_close()
2139 vd->vdev_state = VDEV_STATE_OFFLINE; in vdev_close()
2141 vd->vdev_state = VDEV_STATE_CLOSED; in vdev_close()
2142 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_close()
2146 vdev_hold(vdev_t *vd) in vdev_hold() argument
2148 spa_t *spa = vd->vdev_spa; in vdev_hold()
2154 for (int c = 0; c < vd->vdev_children; c++) in vdev_hold()
2155 vdev_hold(vd->vdev_child[c]); in vdev_hold()
2157 if (vd->vdev_ops->vdev_op_leaf && vd->vdev_ops->vdev_op_hold != NULL) in vdev_hold()
2158 vd->vdev_ops->vdev_op_hold(vd); in vdev_hold()
2162 vdev_rele(vdev_t *vd) in vdev_rele() argument
2164 spa_t *spa = vd->vdev_spa; in vdev_rele()
2167 for (int c = 0; c < vd->vdev_children; c++) in vdev_rele()
2168 vdev_rele(vd->vdev_child[c]); in vdev_rele()
2170 if (vd->vdev_ops->vdev_op_leaf && vd->vdev_ops->vdev_op_rele != NULL) in vdev_rele()
2171 vd->vdev_ops->vdev_op_rele(vd); in vdev_rele()
2181 vdev_reopen(vdev_t *vd) in vdev_reopen() argument
2183 spa_t *spa = vd->vdev_spa; in vdev_reopen()
2188 vd->vdev_reopening = !vd->vdev_offline; in vdev_reopen()
2189 vdev_close(vd); in vdev_reopen()
2190 (void) vdev_open(vd); in vdev_reopen()
2197 if (vd->vdev_aux) { in vdev_reopen()
2198 (void) vdev_validate_aux(vd); in vdev_reopen()
2199 if (vdev_readable(vd) && vdev_writeable(vd) && in vdev_reopen()
2200 vd->vdev_aux == &spa->spa_l2cache) { in vdev_reopen()
2209 if (l2arc_vdev_present(vd)) { in vdev_reopen()
2210 l2arc_rebuild_vdev(vd, B_TRUE); in vdev_reopen()
2212 l2arc_add_vdev(spa, vd); in vdev_reopen()
2217 (void) vdev_validate(vd); in vdev_reopen()
2223 vdev_propagate_state(vd); in vdev_reopen()
2227 vdev_create(vdev_t *vd, uint64_t txg, boolean_t isreplacing) in vdev_create() argument
2236 error = vdev_open(vd); in vdev_create()
2238 if (error || vd->vdev_state != VDEV_STATE_HEALTHY) { in vdev_create()
2239 vdev_close(vd); in vdev_create()
2246 if ((error = vdev_dtl_load(vd)) != 0 || in vdev_create()
2247 (error = vdev_label_init(vd, txg, isreplacing ? in vdev_create()
2249 vdev_close(vd); in vdev_create()
2257 vdev_metaslab_set_size(vdev_t *vd) in vdev_metaslab_set_size() argument
2259 uint64_t asize = vd->vdev_asize; in vdev_metaslab_set_size()
2325 vd->vdev_ms_shift = ms_shift; in vdev_metaslab_set_size()
2326 ASSERT3U(vd->vdev_ms_shift, >=, SPA_MAXBLOCKSHIFT); in vdev_metaslab_set_size()
2330 vdev_dirty(vdev_t *vd, int flags, void *arg, uint64_t txg) in vdev_dirty() argument
2332 ASSERT(vd == vd->vdev_top); in vdev_dirty()
2334 ASSERT(vdev_is_concrete(vd) || flags == 0); in vdev_dirty()
2336 ASSERT(spa_writeable(vd->vdev_spa)); in vdev_dirty()
2339 (void) txg_list_add(&vd->vdev_ms_list, arg, txg); in vdev_dirty()
2342 (void) txg_list_add(&vd->vdev_dtl_list, arg, txg); in vdev_dirty()
2344 (void) txg_list_add(&vd->vdev_spa->spa_vdev_txg_list, vd, txg); in vdev_dirty()
2348 vdev_dirty_leaves(vdev_t *vd, int flags, uint64_t txg) in vdev_dirty_leaves() argument
2350 for (int c = 0; c < vd->vdev_children; c++) in vdev_dirty_leaves()
2351 vdev_dirty_leaves(vd->vdev_child[c], flags, txg); in vdev_dirty_leaves()
2353 if (vd->vdev_ops->vdev_op_leaf) in vdev_dirty_leaves()
2354 vdev_dirty(vd->vdev_top, flags, vd, txg); in vdev_dirty_leaves()
2396 vdev_dtl_dirty(vdev_t *vd, vdev_dtl_type_t t, uint64_t txg, uint64_t size) in vdev_dtl_dirty() argument
2398 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_dirty()
2401 ASSERT(vd != vd->vdev_spa->spa_root_vdev); in vdev_dtl_dirty()
2402 ASSERT(spa_writeable(vd->vdev_spa)); in vdev_dtl_dirty()
2404 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_dirty()
2407 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_dirty()
2411 vdev_dtl_contains(vdev_t *vd, vdev_dtl_type_t t, uint64_t txg, uint64_t size) in vdev_dtl_contains() argument
2413 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_contains()
2417 ASSERT(vd != vd->vdev_spa->spa_root_vdev); in vdev_dtl_contains()
2427 if (vd->vdev_spa->spa_load_state != SPA_LOAD_NONE) in vdev_dtl_contains()
2430 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_contains()
2433 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_contains()
2439 vdev_dtl_empty(vdev_t *vd, vdev_dtl_type_t t) in vdev_dtl_empty() argument
2441 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_empty()
2444 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_empty()
2446 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_empty()
2455 vdev_dtl_need_resilver(vdev_t *vd, uint64_t offset, size_t psize) in vdev_dtl_need_resilver() argument
2457 ASSERT(vd != vd->vdev_spa->spa_root_vdev); in vdev_dtl_need_resilver()
2459 if (vd->vdev_ops->vdev_op_need_resilver == NULL || in vdev_dtl_need_resilver()
2460 vd->vdev_ops->vdev_op_leaf) in vdev_dtl_need_resilver()
2463 return (vd->vdev_ops->vdev_op_need_resilver(vd, offset, psize)); in vdev_dtl_need_resilver()
2470 vdev_dtl_min(vdev_t *vd) in vdev_dtl_min() argument
2472 ASSERT(MUTEX_HELD(&vd->vdev_dtl_lock)); in vdev_dtl_min()
2473 ASSERT3U(range_tree_space(vd->vdev_dtl[DTL_MISSING]), !=, 0); in vdev_dtl_min()
2474 ASSERT0(vd->vdev_children); in vdev_dtl_min()
2476 return (range_tree_min(vd->vdev_dtl[DTL_MISSING]) - 1); in vdev_dtl_min()
2483 vdev_dtl_max(vdev_t *vd) in vdev_dtl_max() argument
2485 ASSERT(MUTEX_HELD(&vd->vdev_dtl_lock)); in vdev_dtl_max()
2486 ASSERT3U(range_tree_space(vd->vdev_dtl[DTL_MISSING]), !=, 0); in vdev_dtl_max()
2487 ASSERT0(vd->vdev_children); in vdev_dtl_max()
2489 return (range_tree_max(vd->vdev_dtl[DTL_MISSING])); in vdev_dtl_max()
2501 vdev_dtl_should_excise(vdev_t *vd) in vdev_dtl_should_excise() argument
2503 spa_t *spa = vd->vdev_spa; in vdev_dtl_should_excise()
2506 ASSERT0(vd->vdev_children); in vdev_dtl_should_excise()
2508 if (vd->vdev_state < VDEV_STATE_DEGRADED) in vdev_dtl_should_excise()
2511 if (vd->vdev_resilver_deferred) in vdev_dtl_should_excise()
2514 if (vd->vdev_resilver_txg == 0 || in vdev_dtl_should_excise()
2515 range_tree_is_empty(vd->vdev_dtl[DTL_MISSING])) in vdev_dtl_should_excise()
2525 if (vdev_dtl_max(vd) <= scn->scn_phys.scn_max_txg) { in vdev_dtl_should_excise()
2526 ASSERT3U(scn->scn_phys.scn_min_txg, <=, vdev_dtl_min(vd)); in vdev_dtl_should_excise()
2527 ASSERT3U(scn->scn_phys.scn_min_txg, <, vd->vdev_resilver_txg); in vdev_dtl_should_excise()
2528 ASSERT3U(vd->vdev_resilver_txg, <=, scn->scn_phys.scn_max_txg); in vdev_dtl_should_excise()
2538 vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg, int scrub_done) in vdev_dtl_reassess() argument
2540 spa_t *spa = vd->vdev_spa; in vdev_dtl_reassess()
2546 for (int c = 0; c < vd->vdev_children; c++) in vdev_dtl_reassess()
2547 vdev_dtl_reassess(vd->vdev_child[c], txg, in vdev_dtl_reassess()
2550 if (vd == spa->spa_root_vdev || !vdev_is_concrete(vd) || vd->vdev_aux) in vdev_dtl_reassess()
2553 if (vd->vdev_ops->vdev_op_leaf) { in vdev_dtl_reassess()
2557 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
2566 !range_tree_is_empty(vd->vdev_dtl[DTL_MISSING])) { in vdev_dtl_reassess()
2570 (u_longlong_t)vd->vdev_guid, (u_longlong_t)txg, in vdev_dtl_reassess()
2572 (u_longlong_t)vdev_dtl_min(vd), in vdev_dtl_reassess()
2573 (u_longlong_t)vdev_dtl_max(vd), in vdev_dtl_reassess()
2586 vdev_dtl_should_excise(vd)) { in vdev_dtl_reassess()
2606 vd->vdev_dtl[DTL_MISSING], 1); in vdev_dtl_reassess()
2609 vd->vdev_dtl[DTL_SCRUB], 2); in vdev_dtl_reassess()
2611 vd->vdev_dtl[DTL_MISSING], 1); in vdev_dtl_reassess()
2614 if (!range_tree_is_empty(vd->vdev_dtl[DTL_MISSING])) { in vdev_dtl_reassess()
2616 (u_longlong_t)vdev_dtl_min(vd), in vdev_dtl_reassess()
2617 (u_longlong_t)vdev_dtl_max(vd)); in vdev_dtl_reassess()
2622 range_tree_vacate(vd->vdev_dtl[DTL_PARTIAL], NULL, NULL); in vdev_dtl_reassess()
2623 range_tree_walk(vd->vdev_dtl[DTL_MISSING], in vdev_dtl_reassess()
2624 range_tree_add, vd->vdev_dtl[DTL_PARTIAL]); in vdev_dtl_reassess()
2626 range_tree_vacate(vd->vdev_dtl[DTL_SCRUB], NULL, NULL); in vdev_dtl_reassess()
2627 range_tree_vacate(vd->vdev_dtl[DTL_OUTAGE], NULL, NULL); in vdev_dtl_reassess()
2628 if (!vdev_readable(vd)) in vdev_dtl_reassess()
2629 range_tree_add(vd->vdev_dtl[DTL_OUTAGE], 0, -1ULL); in vdev_dtl_reassess()
2631 range_tree_walk(vd->vdev_dtl[DTL_MISSING], in vdev_dtl_reassess()
2632 range_tree_add, vd->vdev_dtl[DTL_OUTAGE]); in vdev_dtl_reassess()
2638 if (vd->vdev_resilver_txg != 0 && in vdev_dtl_reassess()
2639 range_tree_is_empty(vd->vdev_dtl[DTL_MISSING]) && in vdev_dtl_reassess()
2640 range_tree_is_empty(vd->vdev_dtl[DTL_OUTAGE])) in vdev_dtl_reassess()
2641 vd->vdev_resilver_txg = 0; in vdev_dtl_reassess()
2643 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
2646 vdev_dirty(vd->vdev_top, VDD_DTL, vd, txg); in vdev_dtl_reassess()
2650 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
2658 else if (vd->vdev_nparity != 0) in vdev_dtl_reassess()
2659 minref = vd->vdev_nparity + 1; /* RAID-Z */ in vdev_dtl_reassess()
2661 minref = vd->vdev_children; /* any kind of mirror */ in vdev_dtl_reassess()
2663 for (int c = 0; c < vd->vdev_children; c++) { in vdev_dtl_reassess()
2664 vdev_t *cvd = vd->vdev_child[c]; in vdev_dtl_reassess()
2669 space_reftree_generate_map(&reftree, vd->vdev_dtl[t], minref); in vdev_dtl_reassess()
2672 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
2676 vdev_dtl_load(vdev_t *vd) in vdev_dtl_load() argument
2678 spa_t *spa = vd->vdev_spa; in vdev_dtl_load()
2682 if (vd->vdev_ops->vdev_op_leaf && vd->vdev_dtl_object != 0) { in vdev_dtl_load()
2683 ASSERT(vdev_is_concrete(vd)); in vdev_dtl_load()
2685 error = space_map_open(&vd->vdev_dtl_sm, mos, in vdev_dtl_load()
2686 vd->vdev_dtl_object, 0, -1ULL, 0); in vdev_dtl_load()
2689 ASSERT(vd->vdev_dtl_sm != NULL); in vdev_dtl_load()
2691 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_load()
2692 error = space_map_load(vd->vdev_dtl_sm, in vdev_dtl_load()
2693 vd->vdev_dtl[DTL_MISSING], SM_ALLOC); in vdev_dtl_load()
2694 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_load()
2699 for (int c = 0; c < vd->vdev_children; c++) { in vdev_dtl_load()
2700 error = vdev_dtl_load(vd->vdev_child[c]); in vdev_dtl_load()
2709 vdev_zap_allocation_data(vdev_t *vd, dmu_tx_t *tx) in vdev_zap_allocation_data() argument
2711 spa_t *spa = vd->vdev_spa; in vdev_zap_allocation_data()
2713 vdev_alloc_bias_t alloc_bias = vd->vdev_alloc_bias; in vdev_zap_allocation_data()
2724 VERIFY0(zap_add(mos, vd->vdev_top_zap, VDEV_TOP_ZAP_ALLOCATION_BIAS, in vdev_zap_allocation_data()
2733 vdev_destroy_unlink_zap(vdev_t *vd, uint64_t zapobj, dmu_tx_t *tx) in vdev_destroy_unlink_zap() argument
2735 spa_t *spa = vd->vdev_spa; in vdev_destroy_unlink_zap()
2743 vdev_create_link_zap(vdev_t *vd, dmu_tx_t *tx) in vdev_create_link_zap() argument
2745 spa_t *spa = vd->vdev_spa; in vdev_create_link_zap()
2757 vdev_construct_zaps(vdev_t *vd, dmu_tx_t *tx) in vdev_construct_zaps() argument
2759 if (vd->vdev_ops != &vdev_hole_ops && in vdev_construct_zaps()
2760 vd->vdev_ops != &vdev_missing_ops && in vdev_construct_zaps()
2761 vd->vdev_ops != &vdev_root_ops && in vdev_construct_zaps()
2762 !vd->vdev_top->vdev_removing) { in vdev_construct_zaps()
2763 if (vd->vdev_ops->vdev_op_leaf && vd->vdev_leaf_zap == 0) { in vdev_construct_zaps()
2764 vd->vdev_leaf_zap = vdev_create_link_zap(vd, tx); in vdev_construct_zaps()
2766 if (vd == vd->vdev_top && vd->vdev_top_zap == 0) { in vdev_construct_zaps()
2767 vd->vdev_top_zap = vdev_create_link_zap(vd, tx); in vdev_construct_zaps()
2768 if (vd->vdev_alloc_bias != VDEV_BIAS_NONE) in vdev_construct_zaps()
2769 vdev_zap_allocation_data(vd, tx); in vdev_construct_zaps()
2773 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_construct_zaps()
2774 vdev_construct_zaps(vd->vdev_child[i], tx); in vdev_construct_zaps()
2779 vdev_dtl_sync(vdev_t *vd, uint64_t txg) in vdev_dtl_sync() argument
2781 spa_t *spa = vd->vdev_spa; in vdev_dtl_sync()
2782 range_tree_t *rt = vd->vdev_dtl[DTL_MISSING]; in vdev_dtl_sync()
2786 uint64_t object = space_map_object(vd->vdev_dtl_sm); in vdev_dtl_sync()
2788 ASSERT(vdev_is_concrete(vd)); in vdev_dtl_sync()
2789 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_dtl_sync()
2793 if (vd->vdev_detached || vd->vdev_top->vdev_removing) { in vdev_dtl_sync()
2794 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_sync()
2795 space_map_free(vd->vdev_dtl_sm, tx); in vdev_dtl_sync()
2796 space_map_close(vd->vdev_dtl_sm); in vdev_dtl_sync()
2797 vd->vdev_dtl_sm = NULL; in vdev_dtl_sync()
2798 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_sync()
2805 if (vd->vdev_leaf_zap != 0 && (vd->vdev_detached || in vdev_dtl_sync()
2806 vd->vdev_top->vdev_islog)) { in vdev_dtl_sync()
2807 vdev_destroy_unlink_zap(vd, vd->vdev_leaf_zap, tx); in vdev_dtl_sync()
2808 vd->vdev_leaf_zap = 0; in vdev_dtl_sync()
2815 if (vd->vdev_dtl_sm == NULL) { in vdev_dtl_sync()
2821 VERIFY0(space_map_open(&vd->vdev_dtl_sm, mos, new_object, in vdev_dtl_sync()
2823 ASSERT(vd->vdev_dtl_sm != NULL); in vdev_dtl_sync()
2828 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_sync()
2830 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_sync()
2832 space_map_truncate(vd->vdev_dtl_sm, zfs_vdev_dtl_sm_blksz, tx); in vdev_dtl_sync()
2833 space_map_write(vd->vdev_dtl_sm, rtsync, SM_ALLOC, SM_NO_VDEVID, tx); in vdev_dtl_sync()
2842 if (object != space_map_object(vd->vdev_dtl_sm)) { in vdev_dtl_sync()
2843 vdev_dbgmsg(vd, "txg %llu, spa %s, DTL old object %llu, " in vdev_dtl_sync()
2846 (u_longlong_t)space_map_object(vd->vdev_dtl_sm)); in vdev_dtl_sync()
2847 vdev_config_dirty(vd->vdev_top); in vdev_dtl_sync()
2858 vdev_dtl_required(vdev_t *vd) in vdev_dtl_required() argument
2860 spa_t *spa = vd->vdev_spa; in vdev_dtl_required()
2861 vdev_t *tvd = vd->vdev_top; in vdev_dtl_required()
2862 uint8_t cant_read = vd->vdev_cant_read; in vdev_dtl_required()
2867 if (vd == spa->spa_root_vdev || vd == tvd) in vdev_dtl_required()
2875 vd->vdev_cant_read = B_TRUE; in vdev_dtl_required()
2878 vd->vdev_cant_read = cant_read; in vdev_dtl_required()
2882 required = !!zio_handle_device_injection(vd, NULL, ECHILD); in vdev_dtl_required()
2891 vdev_resilver_needed(vdev_t *vd, uint64_t *minp, uint64_t *maxp) in vdev_resilver_needed() argument
2897 if (vd->vdev_children == 0) { in vdev_resilver_needed()
2898 mutex_enter(&vd->vdev_dtl_lock); in vdev_resilver_needed()
2899 if (!range_tree_is_empty(vd->vdev_dtl[DTL_MISSING]) && in vdev_resilver_needed()
2900 vdev_writeable(vd)) { in vdev_resilver_needed()
2902 thismin = vdev_dtl_min(vd); in vdev_resilver_needed()
2903 thismax = vdev_dtl_max(vd); in vdev_resilver_needed()
2906 mutex_exit(&vd->vdev_dtl_lock); in vdev_resilver_needed()
2908 for (int c = 0; c < vd->vdev_children; c++) { in vdev_resilver_needed()
2909 vdev_t *cvd = vd->vdev_child[c]; in vdev_resilver_needed()
2933 vdev_checkpoint_sm_object(vdev_t *vd) in vdev_checkpoint_sm_object() argument
2935 ASSERT0(spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER)); in vdev_checkpoint_sm_object()
2936 if (vd->vdev_top_zap == 0) { in vdev_checkpoint_sm_object()
2941 int err = zap_lookup(spa_meta_objset(vd->vdev_spa), vd->vdev_top_zap, in vdev_checkpoint_sm_object()
2950 vdev_load(vdev_t *vd) in vdev_load() argument
2956 for (int c = 0; c < vd->vdev_children; c++) { in vdev_load()
2957 error = vdev_load(vd->vdev_child[c]); in vdev_load()
2963 vdev_set_deflate_ratio(vd); in vdev_load()
2968 if (vd == vd->vdev_top && vd->vdev_top_zap != 0) { in vdev_load()
2969 spa_t *spa = vd->vdev_spa; in vdev_load()
2972 if (zap_lookup(spa->spa_meta_objset, vd->vdev_top_zap, in vdev_load()
2975 ASSERT(vd->vdev_alloc_bias == VDEV_BIAS_NONE); in vdev_load()
2976 vd->vdev_alloc_bias = vdev_derive_alloc_bias(bias_str); in vdev_load()
2983 if (vd == vd->vdev_top && vdev_is_concrete(vd)) { in vdev_load()
2984 vdev_metaslab_group_create(vd); in vdev_load()
2986 if (vd->vdev_ashift == 0 || vd->vdev_asize == 0) { in vdev_load()
2987 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
2989 vdev_dbgmsg(vd, "vdev_load: invalid size. ashift=%llu, " in vdev_load()
2990 "asize=%llu", (u_longlong_t)vd->vdev_ashift, in vdev_load()
2991 (u_longlong_t)vd->vdev_asize); in vdev_load()
2995 error = vdev_metaslab_init(vd, 0); in vdev_load()
2997 vdev_dbgmsg(vd, "vdev_load: metaslab_init failed " in vdev_load()
2999 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
3004 uint64_t checkpoint_sm_obj = vdev_checkpoint_sm_object(vd); in vdev_load()
3006 objset_t *mos = spa_meta_objset(vd->vdev_spa); in vdev_load()
3007 ASSERT(vd->vdev_asize != 0); in vdev_load()
3008 ASSERT3P(vd->vdev_checkpoint_sm, ==, NULL); in vdev_load()
3010 error = space_map_open(&vd->vdev_checkpoint_sm, in vdev_load()
3011 mos, checkpoint_sm_obj, 0, vd->vdev_asize, in vdev_load()
3012 vd->vdev_ashift); in vdev_load()
3014 vdev_dbgmsg(vd, "vdev_load: space_map_open " in vdev_load()
3020 ASSERT3P(vd->vdev_checkpoint_sm, !=, NULL); in vdev_load()
3028 vd->vdev_stat.vs_checkpoint_space = in vdev_load()
3029 -space_map_allocated(vd->vdev_checkpoint_sm); in vdev_load()
3030 vd->vdev_spa->spa_checkpoint_info.sci_dspace += in vdev_load()
3031 vd->vdev_stat.vs_checkpoint_space; in vdev_load()
3038 if (vd->vdev_ops->vdev_op_leaf && (error = vdev_dtl_load(vd)) != 0) { in vdev_load()
3039 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
3041 vdev_dbgmsg(vd, "vdev_load: vdev_dtl_load failed " in vdev_load()
3046 uint64_t obsolete_sm_object = vdev_obsolete_sm_object(vd); in vdev_load()
3048 objset_t *mos = vd->vdev_spa->spa_meta_objset; in vdev_load()
3049 ASSERT(vd->vdev_asize != 0); in vdev_load()
3050 ASSERT3P(vd->vdev_obsolete_sm, ==, NULL); in vdev_load()
3052 if ((error = space_map_open(&vd->vdev_obsolete_sm, mos, in vdev_load()
3053 obsolete_sm_object, 0, vd->vdev_asize, 0))) { in vdev_load()
3054 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
3056 vdev_dbgmsg(vd, "vdev_load: space_map_open failed for " in vdev_load()
3074 vdev_validate_aux(vdev_t *vd) in vdev_validate_aux() argument
3080 if (!vdev_readable(vd)) in vdev_validate_aux()
3083 if ((label = vdev_label_read_config(vd, -1ULL)) == NULL) { in vdev_validate_aux()
3084 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate_aux()
3092 guid != vd->vdev_guid || in vdev_validate_aux()
3094 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate_aux()
3109 vdev_destroy_ms_flush_data(vdev_t *vd, dmu_tx_t *tx) in vdev_destroy_ms_flush_data() argument
3111 objset_t *mos = spa_meta_objset(vd->vdev_spa); in vdev_destroy_ms_flush_data()
3113 if (vd->vdev_top_zap == 0) in vdev_destroy_ms_flush_data()
3117 int err = zap_lookup(mos, vd->vdev_top_zap, in vdev_destroy_ms_flush_data()
3123 VERIFY0(zap_remove(mos, vd->vdev_top_zap, in vdev_destroy_ms_flush_data()
3132 vdev_destroy_spacemaps(vdev_t *vd, dmu_tx_t *tx) in vdev_destroy_spacemaps() argument
3134 if (vd->vdev_ms_array == 0) in vdev_destroy_spacemaps()
3137 objset_t *mos = vd->vdev_spa->spa_meta_objset; in vdev_destroy_spacemaps()
3138 uint64_t array_count = vd->vdev_asize >> vd->vdev_ms_shift; in vdev_destroy_spacemaps()
3141 VERIFY0(dmu_read(mos, vd->vdev_ms_array, 0, in vdev_destroy_spacemaps()
3153 VERIFY0(dmu_object_free(mos, vd->vdev_ms_array, tx)); in vdev_destroy_spacemaps()
3154 vdev_destroy_ms_flush_data(vd, tx); in vdev_destroy_spacemaps()
3155 vd->vdev_ms_array = 0; in vdev_destroy_spacemaps()
3159 vdev_remove_empty_log(vdev_t *vd, uint64_t txg) in vdev_remove_empty_log() argument
3161 spa_t *spa = vd->vdev_spa; in vdev_remove_empty_log()
3163 ASSERT(vd->vdev_islog); in vdev_remove_empty_log()
3164 ASSERT(vd == vd->vdev_top); in vdev_remove_empty_log()
3169 vdev_destroy_spacemaps(vd, tx); in vdev_remove_empty_log()
3170 if (vd->vdev_top_zap != 0) { in vdev_remove_empty_log()
3171 vdev_destroy_unlink_zap(vd, vd->vdev_top_zap, tx); in vdev_remove_empty_log()
3172 vd->vdev_top_zap = 0; in vdev_remove_empty_log()
3179 vdev_sync_done(vdev_t *vd, uint64_t txg) in vdev_sync_done() argument
3182 boolean_t reassess = !txg_list_empty(&vd->vdev_ms_list, TXG_CLEAN(txg)); in vdev_sync_done()
3184 ASSERT(vdev_is_concrete(vd)); in vdev_sync_done()
3186 while ((msp = txg_list_remove(&vd->vdev_ms_list, TXG_CLEAN(txg))) in vdev_sync_done()
3191 metaslab_sync_reassess(vd->vdev_mg); in vdev_sync_done()
3195 vdev_sync(vdev_t *vd, uint64_t txg) in vdev_sync() argument
3197 spa_t *spa = vd->vdev_spa; in vdev_sync()
3203 if (range_tree_space(vd->vdev_obsolete_segments) > 0) { in vdev_sync()
3204 ASSERT(vd->vdev_removing || in vdev_sync()
3205 vd->vdev_ops == &vdev_indirect_ops); in vdev_sync()
3207 vdev_indirect_sync_obsolete(vd, tx); in vdev_sync()
3213 if (vd->vdev_ops == &vdev_indirect_ops) { in vdev_sync()
3214 ASSERT(txg_list_empty(&vd->vdev_ms_list, txg)); in vdev_sync()
3215 ASSERT(txg_list_empty(&vd->vdev_dtl_list, txg)); in vdev_sync()
3221 ASSERT(vdev_is_concrete(vd)); in vdev_sync()
3223 if (vd->vdev_ms_array == 0 && vd->vdev_ms_shift != 0 && in vdev_sync()
3224 !vd->vdev_removing) { in vdev_sync()
3225 ASSERT(vd == vd->vdev_top); in vdev_sync()
3226 ASSERT0(vd->vdev_indirect_config.vic_mapping_object); in vdev_sync()
3227 vd->vdev_ms_array = dmu_object_alloc(spa->spa_meta_objset, in vdev_sync()
3229 ASSERT(vd->vdev_ms_array != 0); in vdev_sync()
3230 vdev_config_dirty(vd); in vdev_sync()
3233 while ((msp = txg_list_remove(&vd->vdev_ms_list, txg)) != NULL) { in vdev_sync()
3235 (void) txg_list_add(&vd->vdev_ms_list, msp, TXG_CLEAN(txg)); in vdev_sync()
3238 while ((lvd = txg_list_remove(&vd->vdev_dtl_list, txg)) != NULL) in vdev_sync()
3245 if (vd->vdev_islog && vd->vdev_stat.vs_alloc == 0 && vd->vdev_removing) in vdev_sync()
3246 vdev_remove_empty_log(vd, txg); in vdev_sync()
3248 (void) txg_list_add(&spa->spa_vdev_txg_list, vd, TXG_CLEAN(txg)); in vdev_sync()
3253 vdev_psize_to_asize(vdev_t *vd, uint64_t psize) in vdev_psize_to_asize() argument
3255 return (vd->vdev_ops->vdev_op_asize(vd, psize)); in vdev_psize_to_asize()
3265 vdev_t *vd, *tvd; in vdev_fault() local
3269 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_fault()
3272 if (!vd->vdev_ops->vdev_op_leaf) in vdev_fault()
3275 tvd = vd->vdev_top; in vdev_fault()
3282 vd->vdev_label_aux = aux; in vdev_fault()
3287 vd->vdev_delayed_close = B_FALSE; in vdev_fault()
3288 vd->vdev_faulted = 1ULL; in vdev_fault()
3289 vd->vdev_degraded = 0ULL; in vdev_fault()
3290 vdev_set_state(vd, B_FALSE, VDEV_STATE_FAULTED, aux); in vdev_fault()
3296 if (!tvd->vdev_islog && vd->vdev_aux == NULL && vdev_dtl_required(vd)) { in vdev_fault()
3297 vd->vdev_degraded = 1ULL; in vdev_fault()
3298 vd->vdev_faulted = 0ULL; in vdev_fault()
3306 if (vdev_readable(vd)) in vdev_fault()
3307 vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, aux); in vdev_fault()
3310 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_fault()
3321 vdev_t *vd; in vdev_degrade() local
3325 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_degrade()
3328 if (!vd->vdev_ops->vdev_op_leaf) in vdev_degrade()
3334 if (vd->vdev_faulted || vd->vdev_degraded) in vdev_degrade()
3337 vd->vdev_degraded = 1ULL; in vdev_degrade()
3338 if (!vdev_is_dead(vd)) in vdev_degrade()
3339 vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, in vdev_degrade()
3342 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_degrade()
3356 vdev_t *vd, *tvd, *pvd, *rvd = spa->spa_root_vdev; in vdev_online() local
3362 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_online()
3365 if (!vd->vdev_ops->vdev_op_leaf) in vdev_online()
3368 wasoffline = (vd->vdev_offline || vd->vdev_tmpoffline); in vdev_online()
3369 oldstate = vd->vdev_state; in vdev_online()
3371 tvd = vd->vdev_top; in vdev_online()
3372 vd->vdev_offline = B_FALSE; in vdev_online()
3373 vd->vdev_tmpoffline = B_FALSE; in vdev_online()
3374 vd->vdev_checkremove = !!(flags & ZFS_ONLINE_CHECKREMOVE); in vdev_online()
3375 vd->vdev_forcefault = !!(flags & ZFS_ONLINE_FORCEFAULT); in vdev_online()
3378 if (!vd->vdev_aux) { in vdev_online()
3379 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_online()
3384 vd->vdev_checkremove = vd->vdev_forcefault = B_FALSE; in vdev_online()
3386 if (!vd->vdev_aux) { in vdev_online()
3387 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_online()
3392 *newstate = vd->vdev_state; in vdev_online()
3394 !vdev_is_dead(vd) && vd->vdev_parent && in vdev_online()
3395 vd->vdev_parent->vdev_ops == &vdev_spare_ops && in vdev_online()
3396 vd->vdev_parent->vdev_child[0] == vd) in vdev_online()
3397 vd->vdev_unspare = B_TRUE; in vdev_online()
3402 if (vd->vdev_aux) in vdev_online()
3403 return (spa_vdev_state_exit(spa, vd, ENOTSUP)); in vdev_online()
3408 mutex_enter(&vd->vdev_initialize_lock); in vdev_online()
3409 if (vdev_writeable(vd) && in vdev_online()
3410 vd->vdev_initialize_thread == NULL && in vdev_online()
3411 vd->vdev_initialize_state == VDEV_INITIALIZE_ACTIVE) { in vdev_online()
3412 (void) vdev_initialize(vd); in vdev_online()
3414 mutex_exit(&vd->vdev_initialize_lock); in vdev_online()
3417 mutex_enter(&vd->vdev_trim_lock); in vdev_online()
3418 if (vdev_writeable(vd) && in vdev_online()
3419 vd->vdev_trim_thread == NULL && in vdev_online()
3420 vd->vdev_trim_state == VDEV_TRIM_ACTIVE) { in vdev_online()
3421 (void) vdev_trim(vd, vd->vdev_trim_rate, vd->vdev_trim_partial, in vdev_online()
3422 vd->vdev_trim_secure); in vdev_online()
3424 mutex_exit(&vd->vdev_trim_lock); in vdev_online()
3428 vd->vdev_state >= VDEV_STATE_DEGRADED)) in vdev_online()
3429 spa_event_notify(spa, vd, NULL, ESC_ZFS_VDEV_ONLINE); in vdev_online()
3431 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_online()
3437 vdev_t *vd, *tvd; in vdev_offline_locked() local
3445 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_offline_locked()
3448 if (!vd->vdev_ops->vdev_op_leaf) in vdev_offline_locked()
3451 tvd = vd->vdev_top; in vdev_offline_locked()
3458 if (!vd->vdev_offline) { in vdev_offline_locked()
3464 if (!tvd->vdev_islog && vd->vdev_aux == NULL && in vdev_offline_locked()
3465 vdev_dtl_required(vd)) in vdev_offline_locked()
3479 (void) spa_vdev_state_exit(spa, vd, 0); in vdev_offline_locked()
3501 vd, error)); in vdev_offline_locked()
3502 (void) spa_vdev_state_exit(spa, vd, 0); in vdev_offline_locked()
3514 vd->vdev_offline = B_TRUE; in vdev_offline_locked()
3517 if (!tvd->vdev_islog && vd->vdev_aux == NULL && in vdev_offline_locked()
3519 vd->vdev_offline = B_FALSE; in vdev_offline_locked()
3532 vd->vdev_tmpoffline = !!(flags & ZFS_OFFLINE_TEMPORARY); in vdev_offline_locked()
3534 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_offline_locked()
3555 vdev_clear(spa_t *spa, vdev_t *vd) in vdev_clear() argument
3561 if (vd == NULL) in vdev_clear()
3562 vd = rvd; in vdev_clear()
3564 vd->vdev_stat.vs_read_errors = 0; in vdev_clear()
3565 vd->vdev_stat.vs_write_errors = 0; in vdev_clear()
3566 vd->vdev_stat.vs_checksum_errors = 0; in vdev_clear()
3567 vd->vdev_stat.vs_slow_ios = 0; in vdev_clear()
3569 for (int c = 0; c < vd->vdev_children; c++) in vdev_clear()
3570 vdev_clear(spa, vd->vdev_child[c]); in vdev_clear()
3575 if (!vdev_is_concrete(vd)) in vdev_clear()
3584 if (vd->vdev_faulted || vd->vdev_degraded || in vdev_clear()
3585 !vdev_readable(vd) || !vdev_writeable(vd)) { in vdev_clear()
3592 vd->vdev_forcefault = B_TRUE; in vdev_clear()
3594 vd->vdev_faulted = vd->vdev_degraded = 0ULL; in vdev_clear()
3595 vd->vdev_cant_read = B_FALSE; in vdev_clear()
3596 vd->vdev_cant_write = B_FALSE; in vdev_clear()
3598 vdev_reopen(vd == rvd ? rvd : vd->vdev_top); in vdev_clear()
3600 vd->vdev_forcefault = B_FALSE; in vdev_clear()
3602 if (vd != rvd && vdev_writeable(vd->vdev_top)) in vdev_clear()
3603 vdev_state_dirty(vd->vdev_top); in vdev_clear()
3606 if (vd->vdev_aux == NULL && !vdev_is_dead(vd) && in vdev_clear()
3611 spa_event_notify(spa, vd, NULL, ESC_ZFS_VDEV_CLEAR); in vdev_clear()
3619 if (!vdev_is_dead(vd) && vd->vdev_parent != NULL && in vdev_clear()
3620 vd->vdev_parent->vdev_ops == &vdev_spare_ops && in vdev_clear()
3621 vd->vdev_parent->vdev_child[0] == vd) in vdev_clear()
3622 vd->vdev_unspare = B_TRUE; in vdev_clear()
3626 vdev_is_dead(vdev_t *vd) in vdev_is_dead() argument
3635 return (vd->vdev_state < VDEV_STATE_DEGRADED || in vdev_is_dead()
3636 vd->vdev_ops == &vdev_hole_ops || in vdev_is_dead()
3637 vd->vdev_ops == &vdev_missing_ops); in vdev_is_dead()
3641 vdev_readable(vdev_t *vd) in vdev_readable() argument
3643 return (!vdev_is_dead(vd) && !vd->vdev_cant_read); in vdev_readable()
3647 vdev_writeable(vdev_t *vd) in vdev_writeable() argument
3649 return (!vdev_is_dead(vd) && !vd->vdev_cant_write && in vdev_writeable()
3650 vdev_is_concrete(vd)); in vdev_writeable()
3654 vdev_allocatable(vdev_t *vd) in vdev_allocatable() argument
3656 uint64_t state = vd->vdev_state; in vdev_allocatable()
3667 !vd->vdev_cant_write && vdev_is_concrete(vd) && in vdev_allocatable()
3668 vd->vdev_mg->mg_initialized); in vdev_allocatable()
3672 vdev_accessible(vdev_t *vd, zio_t *zio) in vdev_accessible() argument
3674 ASSERT(zio->io_vd == vd); in vdev_accessible()
3676 if (vdev_is_dead(vd) || vd->vdev_remove_wanted) in vdev_accessible()
3680 return (!vd->vdev_cant_read); in vdev_accessible()
3683 return (!vd->vdev_cant_write); in vdev_accessible()
3734 vdev_is_spacemap_addressable(vdev_t *vd) in vdev_is_spacemap_addressable() argument
3736 if (spa_feature_is_active(vd->vdev_spa, SPA_FEATURE_SPACEMAP_V2)) in vdev_is_spacemap_addressable()
3746 uint64_t shift = vd->vdev_ashift + SM_OFFSET_BITS; in vdev_is_spacemap_addressable()
3751 return (vd->vdev_asize < (1ULL << shift)); in vdev_is_spacemap_addressable()
3758 vdev_get_stats_ex_impl(vdev_t *vd, vdev_stat_t *vs, vdev_stat_ex_t *vsx) in vdev_get_stats_ex_impl() argument
3765 if (!vd->vdev_ops->vdev_op_leaf) { in vdev_get_stats_ex_impl()
3773 for (int c = 0; c < vd->vdev_children; c++) { in vdev_get_stats_ex_impl()
3774 vdev_t *cvd = vd->vdev_child[c]; in vdev_get_stats_ex_impl()
3793 memcpy(vsx, &vd->vdev_stat_ex, sizeof (vd->vdev_stat_ex)); in vdev_get_stats_ex_impl()
3795 for (t = 0; t < ARRAY_SIZE(vd->vdev_queue.vq_class); t++) { in vdev_get_stats_ex_impl()
3797 vd->vdev_queue.vq_class[t].vqc_active; in vdev_get_stats_ex_impl()
3799 &vd->vdev_queue.vq_class[t].vqc_queued_tree); in vdev_get_stats_ex_impl()
3805 vdev_get_stats_ex(vdev_t *vd, vdev_stat_t *vs, vdev_stat_ex_t *vsx) in vdev_get_stats_ex() argument
3807 vdev_t *tvd = vd->vdev_top; in vdev_get_stats_ex()
3808 spa_t *spa = vd->vdev_spa; in vdev_get_stats_ex()
3810 mutex_enter(&vd->vdev_stat_lock); in vdev_get_stats_ex()
3812 bcopy(&vd->vdev_stat, vs, sizeof (*vs)); in vdev_get_stats_ex()
3814 vs->vs_state = vd->vdev_state; in vdev_get_stats_ex()
3815 vs->vs_rsize = vdev_get_min_asize(vd); in vdev_get_stats_ex()
3816 if (vd->vdev_ops->vdev_op_leaf) { in vdev_get_stats_ex()
3825 vd->vdev_initialize_bytes_done; in vdev_get_stats_ex()
3827 vd->vdev_initialize_bytes_est; in vdev_get_stats_ex()
3828 vs->vs_initialize_state = vd->vdev_initialize_state; in vdev_get_stats_ex()
3830 vd->vdev_initialize_action_time; in vdev_get_stats_ex()
3837 vs->vs_trim_notsup = !vd->vdev_has_trim; in vdev_get_stats_ex()
3838 vs->vs_trim_bytes_done = vd->vdev_trim_bytes_done; in vdev_get_stats_ex()
3839 vs->vs_trim_bytes_est = vd->vdev_trim_bytes_est; in vdev_get_stats_ex()
3840 vs->vs_trim_state = vd->vdev_trim_state; in vdev_get_stats_ex()
3841 vs->vs_trim_action_time = vd->vdev_trim_action_time; in vdev_get_stats_ex()
3849 if (vd->vdev_aux == NULL && tvd != NULL) { in vdev_get_stats_ex()
3851 vd->vdev_max_asize - vd->vdev_asize - in vdev_get_stats_ex()
3854 if (vd->vdev_aux == NULL && vd == vd->vdev_top && in vdev_get_stats_ex()
3855 vdev_is_concrete(vd)) { in vdev_get_stats_ex()
3856 vs->vs_fragmentation = (vd->vdev_mg != NULL) ? in vdev_get_stats_ex()
3857 vd->vdev_mg->mg_fragmentation : 0; in vdev_get_stats_ex()
3859 if (vd->vdev_ops->vdev_op_leaf) in vdev_get_stats_ex()
3860 vs->vs_resilver_deferred = vd->vdev_resilver_deferred; in vdev_get_stats_ex()
3863 vdev_get_stats_ex_impl(vd, vs, vsx); in vdev_get_stats_ex()
3864 mutex_exit(&vd->vdev_stat_lock); in vdev_get_stats_ex()
3868 vdev_get_stats(vdev_t *vd, vdev_stat_t *vs) in vdev_get_stats() argument
3870 return (vdev_get_stats_ex(vd, vs, NULL)); in vdev_get_stats()
3874 vdev_clear_stats(vdev_t *vd) in vdev_clear_stats() argument
3876 mutex_enter(&vd->vdev_stat_lock); in vdev_clear_stats()
3877 vd->vdev_stat.vs_space = 0; in vdev_clear_stats()
3878 vd->vdev_stat.vs_dspace = 0; in vdev_clear_stats()
3879 vd->vdev_stat.vs_alloc = 0; in vdev_clear_stats()
3880 mutex_exit(&vd->vdev_stat_lock); in vdev_clear_stats()
3884 vdev_scan_stat_init(vdev_t *vd) in vdev_scan_stat_init() argument
3886 vdev_stat_t *vs = &vd->vdev_stat; in vdev_scan_stat_init()
3888 for (int c = 0; c < vd->vdev_children; c++) in vdev_scan_stat_init()
3889 vdev_scan_stat_init(vd->vdev_child[c]); in vdev_scan_stat_init()
3891 mutex_enter(&vd->vdev_stat_lock); in vdev_scan_stat_init()
3893 mutex_exit(&vd->vdev_stat_lock); in vdev_scan_stat_init()
3901 vdev_t *vd = zio->io_vd ? zio->io_vd : rvd; in vdev_stat_update() local
3904 vdev_stat_t *vs = &vd->vdev_stat; in vdev_stat_update()
3905 vdev_stat_ex_t *vsx = &vd->vdev_stat_ex; in vdev_stat_update()
3930 if (vd == rvd) in vdev_stat_update()
3933 ASSERT(vd == zio->io_vd); in vdev_stat_update()
3938 mutex_enter(&vd->vdev_stat_lock); in vdev_stat_update()
3947 if (vd->vdev_ops->vdev_op_leaf) in vdev_stat_update()
3960 if (vd->vdev_ops->vdev_op_leaf && in vdev_stat_update()
3993 mutex_exit(&vd->vdev_stat_lock); in vdev_stat_update()
4018 mutex_enter(&vd->vdev_stat_lock); in vdev_stat_update()
4019 if (type == ZIO_TYPE_READ && !vdev_is_dead(vd)) { in vdev_stat_update()
4025 if (type == ZIO_TYPE_WRITE && !vdev_is_dead(vd)) in vdev_stat_update()
4027 mutex_exit(&vd->vdev_stat_lock); in vdev_stat_update()
4049 if (vd->vdev_ops->vdev_op_leaf) { in vdev_stat_update()
4054 vdev_dtl_dirty(vd, DTL_SCRUB, txg, 1); in vdev_stat_update()
4061 if (vdev_dtl_contains(vd, DTL_MISSING, txg, 1)) in vdev_stat_update()
4063 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_stat_update()
4065 vdev_dirty(vd->vdev_top, VDD_DTL, vd, commit_txg); in vdev_stat_update()
4067 if (vd != rvd) in vdev_stat_update()
4068 vdev_dtl_dirty(vd, DTL_MISSING, txg, 1); in vdev_stat_update()
4073 vdev_deflated_space(vdev_t *vd, int64_t space) in vdev_deflated_space() argument
4076 ASSERT(vd->vdev_deflate_ratio != 0 || vd->vdev_isl2cache); in vdev_deflated_space()
4078 return ((space >> SPA_MINBLOCKSHIFT) * vd->vdev_deflate_ratio); in vdev_deflated_space()
4086 vdev_space_update(vdev_t *vd, int64_t alloc_delta, int64_t defer_delta, in vdev_space_update() argument
4090 spa_t *spa = vd->vdev_spa; in vdev_space_update()
4093 ASSERT(vd == vd->vdev_top); in vdev_space_update()
4101 dspace_delta = vdev_deflated_space(vd, space_delta); in vdev_space_update()
4103 mutex_enter(&vd->vdev_stat_lock); in vdev_space_update()
4106 ASSERT3U(vd->vdev_stat.vs_alloc, >=, -alloc_delta); in vdev_space_update()
4109 vd->vdev_stat.vs_alloc += alloc_delta; in vdev_space_update()
4110 vd->vdev_stat.vs_space += space_delta; in vdev_space_update()
4111 vd->vdev_stat.vs_dspace += dspace_delta; in vdev_space_update()
4112 mutex_exit(&vd->vdev_stat_lock); in vdev_space_update()
4115 if (vd->vdev_mg != NULL && !vd->vdev_islog) { in vdev_space_update()
4116 ASSERT(!vd->vdev_isl2cache); in vdev_space_update()
4132 vdev_config_dirty(vdev_t *vd) in vdev_config_dirty() argument
4134 spa_t *spa = vd->vdev_spa; in vdev_config_dirty()
4144 if (vd->vdev_aux != NULL) { in vdev_config_dirty()
4145 spa_aux_vdev_t *sav = vd->vdev_aux; in vdev_config_dirty()
4150 if (sav->sav_vdevs[c] == vd) in vdev_config_dirty()
4177 aux[c] = vdev_config_generate(spa, vd, B_TRUE, 0); in vdev_config_dirty()
4192 if (vd == rvd) { in vdev_config_dirty()
4196 ASSERT(vd == vd->vdev_top); in vdev_config_dirty()
4198 if (!list_link_active(&vd->vdev_config_dirty_node) && in vdev_config_dirty()
4199 vdev_is_concrete(vd)) { in vdev_config_dirty()
4200 list_insert_head(&spa->spa_config_dirty_list, vd); in vdev_config_dirty()
4206 vdev_config_clean(vdev_t *vd) in vdev_config_clean() argument
4208 spa_t *spa = vd->vdev_spa; in vdev_config_clean()
4214 ASSERT(list_link_active(&vd->vdev_config_dirty_node)); in vdev_config_clean()
4215 list_remove(&spa->spa_config_dirty_list, vd); in vdev_config_clean()
4225 vdev_state_dirty(vdev_t *vd) in vdev_state_dirty() argument
4227 spa_t *spa = vd->vdev_spa; in vdev_state_dirty()
4230 ASSERT(vd == vd->vdev_top); in vdev_state_dirty()
4242 if (!list_link_active(&vd->vdev_state_dirty_node) && in vdev_state_dirty()
4243 vdev_is_concrete(vd)) in vdev_state_dirty()
4244 list_insert_head(&spa->spa_state_dirty_list, vd); in vdev_state_dirty()
4248 vdev_state_clean(vdev_t *vd) in vdev_state_clean() argument
4250 spa_t *spa = vd->vdev_spa; in vdev_state_clean()
4256 ASSERT(list_link_active(&vd->vdev_state_dirty_node)); in vdev_state_clean()
4257 list_remove(&spa->spa_state_dirty_list, vd); in vdev_state_clean()
4264 vdev_propagate_state(vdev_t *vd) in vdev_propagate_state() argument
4266 spa_t *spa = vd->vdev_spa; in vdev_propagate_state()
4272 if (vd->vdev_children > 0) { in vdev_propagate_state()
4273 for (int c = 0; c < vd->vdev_children; c++) { in vdev_propagate_state()
4274 child = vd->vdev_child[c]; in vdev_propagate_state()
4290 if (child->vdev_islog && vd == rvd) in vdev_propagate_state()
4302 vd->vdev_ops->vdev_op_state_change(vd, faulted, degraded); in vdev_propagate_state()
4310 if (corrupted && vd == rvd && in vdev_propagate_state()
4316 if (vd->vdev_parent) in vdev_propagate_state()
4317 vdev_propagate_state(vd->vdev_parent); in vdev_propagate_state()
4329 vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state, vdev_aux_t aux) in vdev_set_state() argument
4332 spa_t *spa = vd->vdev_spa; in vdev_set_state()
4334 if (state == vd->vdev_state) { in vdev_set_state()
4335 vd->vdev_stat.vs_aux = aux; in vdev_set_state()
4339 save_state = vd->vdev_state; in vdev_set_state()
4341 vd->vdev_state = state; in vdev_set_state()
4342 vd->vdev_stat.vs_aux = aux; in vdev_set_state()
4354 if (!vd->vdev_delayed_close && vdev_is_dead(vd) && in vdev_set_state()
4355 vd->vdev_ops->vdev_op_leaf) in vdev_set_state()
4356 vd->vdev_ops->vdev_op_close(vd); in vdev_set_state()
4367 if (state == VDEV_STATE_HEALTHY && vd->vdev_ops->vdev_op_leaf && in vdev_set_state()
4368 vd->vdev_prevstate != state) in vdev_set_state()
4369 zfs_post_state_change(spa, vd); in vdev_set_state()
4371 if (vd->vdev_removed && in vdev_set_state()
4373 (aux == VDEV_AUX_OPEN_FAILED || vd->vdev_checkremove)) { in vdev_set_state()
4383 vd->vdev_state = VDEV_STATE_REMOVED; in vdev_set_state()
4384 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_set_state()
4386 vd->vdev_removed = B_TRUE; in vdev_set_state()
4396 vd->vdev_ops->vdev_op_leaf) in vdev_set_state()
4397 vd->vdev_not_present = 1; in vdev_set_state()
4414 if ((vd->vdev_prevstate != state || vd->vdev_forcefault) && in vdev_set_state()
4415 !vd->vdev_not_present && !vd->vdev_checkremove && in vdev_set_state()
4416 vd != spa->spa_root_vdev) { in vdev_set_state()
4445 (void) zfs_ereport_post(class, spa, vd, NULL, NULL, in vdev_set_state()
4450 vd->vdev_removed = B_FALSE; in vdev_set_state()
4452 vd->vdev_removed = B_FALSE; in vdev_set_state()
4455 if (!isopen && vd->vdev_parent) in vdev_set_state()
4456 vdev_propagate_state(vd->vdev_parent); in vdev_set_state()
4460 vdev_children_are_offline(vdev_t *vd) in vdev_children_are_offline() argument
4462 ASSERT(!vd->vdev_ops->vdev_op_leaf); in vdev_children_are_offline()
4464 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_children_are_offline()
4465 if (vd->vdev_child[i]->vdev_state != VDEV_STATE_OFFLINE) in vdev_children_are_offline()
4477 vdev_is_bootable(vdev_t *vd) in vdev_is_bootable() argument
4479 if (!vd->vdev_ops->vdev_op_leaf) { in vdev_is_bootable()
4480 char *vdev_type = vd->vdev_ops->vdev_op_type; in vdev_is_bootable()
4487 for (int c = 0; c < vd->vdev_children; c++) { in vdev_is_bootable()
4488 if (!vdev_is_bootable(vd->vdev_child[c])) in vdev_is_bootable()
4495 vdev_is_concrete(vdev_t *vd) in vdev_is_concrete() argument
4497 vdev_ops_t *ops = vd->vdev_ops; in vdev_is_concrete()
4512 vdev_log_state_valid(vdev_t *vd) in vdev_log_state_valid() argument
4514 if (vd->vdev_ops->vdev_op_leaf && !vd->vdev_faulted && in vdev_log_state_valid()
4515 !vd->vdev_removed) in vdev_log_state_valid()
4518 for (int c = 0; c < vd->vdev_children; c++) in vdev_log_state_valid()
4519 if (vdev_log_state_valid(vd->vdev_child[c])) in vdev_log_state_valid()
4529 vdev_expand(vdev_t *vd, uint64_t txg) in vdev_expand() argument
4531 ASSERT(vd->vdev_top == vd); in vdev_expand()
4532 ASSERT(spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER) == SCL_ALL); in vdev_expand()
4533 ASSERT(vdev_is_concrete(vd)); in vdev_expand()
4535 vdev_set_deflate_ratio(vd); in vdev_expand()
4537 if ((vd->vdev_asize >> vd->vdev_ms_shift) > vd->vdev_ms_count && in vdev_expand()
4538 vdev_is_concrete(vd)) { in vdev_expand()
4539 vdev_metaslab_group_create(vd); in vdev_expand()
4540 VERIFY(vdev_metaslab_init(vd, txg) == 0); in vdev_expand()
4541 vdev_config_dirty(vd); in vdev_expand()
4549 vdev_split(vdev_t *vd) in vdev_split() argument
4551 vdev_t *cvd, *pvd = vd->vdev_parent; in vdev_split()
4553 vdev_remove_child(pvd, vd); in vdev_split()
4565 vdev_deadman(vdev_t *vd) in vdev_deadman() argument
4567 for (int c = 0; c < vd->vdev_children; c++) { in vdev_deadman()
4568 vdev_t *cvd = vd->vdev_child[c]; in vdev_deadman()
4573 if (vd->vdev_ops->vdev_op_leaf) { in vdev_deadman()
4574 vdev_queue_t *vq = &vd->vdev_queue; in vdev_deadman()
4578 spa_t *spa = vd->vdev_spa; in vdev_deadman()
4590 vdev_dbgmsg(vd, "SLOW IO: zio timestamp " in vdev_deadman()
4603 vdev_defer_resilver(vdev_t *vd) in vdev_defer_resilver() argument
4605 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_defer_resilver()
4607 vd->vdev_resilver_deferred = B_TRUE; in vdev_defer_resilver()
4608 vd->vdev_spa->spa_resilver_deferred = B_TRUE; in vdev_defer_resilver()
4617 vdev_clear_resilver_deferred(vdev_t *vd, dmu_tx_t *tx) in vdev_clear_resilver_deferred() argument
4620 spa_t *spa = vd->vdev_spa; in vdev_clear_resilver_deferred()
4622 for (int c = 0; c < vd->vdev_children; c++) { in vdev_clear_resilver_deferred()
4623 vdev_t *cvd = vd->vdev_child[c]; in vdev_clear_resilver_deferred()
4627 if (vd == spa->spa_root_vdev && in vdev_clear_resilver_deferred()
4630 vdev_config_dirty(vd); in vdev_clear_resilver_deferred()
4635 if (!vdev_is_concrete(vd) || vd->vdev_aux || in vdev_clear_resilver_deferred()
4636 !vd->vdev_ops->vdev_op_leaf) in vdev_clear_resilver_deferred()
4639 vd->vdev_resilver_deferred = B_FALSE; in vdev_clear_resilver_deferred()
4641 return (!vdev_is_dead(vd) && !vd->vdev_offline && in vdev_clear_resilver_deferred()
4642 vdev_resilver_needed(vd, NULL, NULL)); in vdev_clear_resilver_deferred()
4654 vdev_xlate(vdev_t *vd, const range_seg64_t *logical_rs, in vdev_xlate() argument
4660 if (vd != vd->vdev_top) { in vdev_xlate()
4661 vdev_xlate(vd->vdev_parent, logical_rs, physical_rs); in vdev_xlate()
4673 vdev_t *pvd = vd->vdev_parent; in vdev_xlate()
4683 pvd->vdev_ops->vdev_op_xlate(vd, physical_rs, &intermediate); in vdev_xlate()