Lines Matching refs:vd

94 vdev_default_asize(vdev_t *vd, uint64_t psize)  in vdev_default_asize()  argument
96 uint64_t asize = P2ROUNDUP(psize, 1ULL << vd->vdev_top->vdev_ashift); in vdev_default_asize()
99 for (int c = 0; c < vd->vdev_children; c++) { in vdev_default_asize()
100 csize = vdev_psize_to_asize(vd->vdev_child[c], psize); in vdev_default_asize()
114 vdev_get_min_asize(vdev_t *vd) in vdev_get_min_asize() argument
116 vdev_t *pvd = vd->vdev_parent; in vdev_get_min_asize()
123 return (vd->vdev_asize); in vdev_get_min_asize()
129 if (vd == vd->vdev_top) in vdev_get_min_asize()
130 return (P2ALIGN(vd->vdev_asize, 1ULL << vd->vdev_ms_shift)); in vdev_get_min_asize()
143 vdev_set_min_asize(vdev_t *vd) in vdev_set_min_asize() argument
145 vd->vdev_min_asize = vdev_get_min_asize(vd); in vdev_set_min_asize()
147 for (int c = 0; c < vd->vdev_children; c++) in vdev_set_min_asize()
148 vdev_set_min_asize(vd->vdev_child[c]); in vdev_set_min_asize()
167 vdev_lookup_by_guid(vdev_t *vd, uint64_t guid) in vdev_lookup_by_guid() argument
171 if (vd->vdev_guid == guid) in vdev_lookup_by_guid()
172 return (vd); in vdev_lookup_by_guid()
174 for (int c = 0; c < vd->vdev_children; c++) in vdev_lookup_by_guid()
175 if ((mvd = vdev_lookup_by_guid(vd->vdev_child[c], guid)) != in vdev_lookup_by_guid()
183 vdev_count_leaves_impl(vdev_t *vd) in vdev_count_leaves_impl() argument
187 if (vd->vdev_ops->vdev_op_leaf) in vdev_count_leaves_impl()
190 for (int c = 0; c < vd->vdev_children; c++) in vdev_count_leaves_impl()
191 n += vdev_count_leaves_impl(vd->vdev_child[c]); in vdev_count_leaves_impl()
313 vdev_t *vd; in vdev_alloc_common() local
315 vd = kmem_zalloc(sizeof (vdev_t), KM_SLEEP); in vdev_alloc_common()
319 spa->spa_root_vdev = vd; in vdev_alloc_common()
324 if (spa->spa_root_vdev == vd) { in vdev_alloc_common()
339 vd->vdev_spa = spa; in vdev_alloc_common()
340 vd->vdev_id = id; in vdev_alloc_common()
341 vd->vdev_guid = guid; in vdev_alloc_common()
342 vd->vdev_guid_sum = guid; in vdev_alloc_common()
343 vd->vdev_ops = ops; in vdev_alloc_common()
344 vd->vdev_state = VDEV_STATE_CLOSED; in vdev_alloc_common()
345 vd->vdev_ishole = (ops == &vdev_hole_ops); in vdev_alloc_common()
347 mutex_init(&vd->vdev_dtl_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
348 mutex_init(&vd->vdev_stat_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
349 mutex_init(&vd->vdev_probe_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
351 vd->vdev_dtl[t] = range_tree_create(NULL, NULL, in vdev_alloc_common()
352 &vd->vdev_dtl_lock); in vdev_alloc_common()
354 txg_list_create(&vd->vdev_ms_list, in vdev_alloc_common()
356 txg_list_create(&vd->vdev_dtl_list, in vdev_alloc_common()
358 vd->vdev_stat.vs_timestamp = gethrtime(); in vdev_alloc_common()
359 vdev_queue_init(vd); in vdev_alloc_common()
360 vdev_cache_init(vd); in vdev_alloc_common()
362 return (vd); in vdev_alloc_common()
377 vdev_t *vd; in vdev_alloc() local
464 vd = vdev_alloc_common(spa, id, guid, ops); in vdev_alloc()
466 vd->vdev_islog = islog; in vdev_alloc()
467 vd->vdev_nparity = nparity; in vdev_alloc()
469 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &vd->vdev_path) == 0) in vdev_alloc()
470 vd->vdev_path = spa_strdup(vd->vdev_path); in vdev_alloc()
471 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &vd->vdev_devid) == 0) in vdev_alloc()
472 vd->vdev_devid = spa_strdup(vd->vdev_devid); in vdev_alloc()
474 &vd->vdev_physpath) == 0) in vdev_alloc()
475 vd->vdev_physpath = spa_strdup(vd->vdev_physpath); in vdev_alloc()
476 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_FRU, &vd->vdev_fru) == 0) in vdev_alloc()
477 vd->vdev_fru = spa_strdup(vd->vdev_fru); in vdev_alloc()
484 &vd->vdev_wholedisk) != 0) in vdev_alloc()
485 vd->vdev_wholedisk = -1ULL; in vdev_alloc()
492 &vd->vdev_not_present); in vdev_alloc()
497 (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ASHIFT, &vd->vdev_ashift); in vdev_alloc()
503 &vd->vdev_crtxg); in vdev_alloc()
511 &vd->vdev_ms_array); in vdev_alloc()
513 &vd->vdev_ms_shift); in vdev_alloc()
515 &vd->vdev_asize); in vdev_alloc()
517 &vd->vdev_removing); in vdev_alloc()
525 vd->vdev_mg = metaslab_group_create(islog ? in vdev_alloc()
526 spa_log_class(spa) : spa_normal_class(spa), vd); in vdev_alloc()
532 if (vd->vdev_ops->vdev_op_leaf && in vdev_alloc()
537 &vd->vdev_dtl_object); in vdev_alloc()
539 &vd->vdev_unspare); in vdev_alloc()
547 spa_spare_add(vd); in vdev_alloc()
551 &vd->vdev_offline); in vdev_alloc()
554 &vd->vdev_resilver_txg); in vdev_alloc()
564 &vd->vdev_faulted); in vdev_alloc()
566 &vd->vdev_degraded); in vdev_alloc()
568 &vd->vdev_removed); in vdev_alloc()
570 if (vd->vdev_faulted || vd->vdev_degraded) { in vdev_alloc()
573 vd->vdev_label_aux = in vdev_alloc()
578 vd->vdev_label_aux = VDEV_AUX_EXTERNAL; in vdev_alloc()
586 vdev_add_child(parent, vd); in vdev_alloc()
588 *vdp = vd; in vdev_alloc()
594 vdev_free(vdev_t *vd) in vdev_free() argument
596 spa_t *spa = vd->vdev_spa; in vdev_free()
602 vdev_close(vd); in vdev_free()
604 ASSERT(!list_link_active(&vd->vdev_config_dirty_node)); in vdev_free()
605 ASSERT(!list_link_active(&vd->vdev_state_dirty_node)); in vdev_free()
610 for (int c = 0; c < vd->vdev_children; c++) in vdev_free()
611 vdev_free(vd->vdev_child[c]); in vdev_free()
613 ASSERT(vd->vdev_child == NULL); in vdev_free()
614 ASSERT(vd->vdev_guid_sum == vd->vdev_guid); in vdev_free()
619 if (vd->vdev_mg != NULL) { in vdev_free()
620 vdev_metaslab_fini(vd); in vdev_free()
621 metaslab_group_destroy(vd->vdev_mg); in vdev_free()
624 ASSERT0(vd->vdev_stat.vs_space); in vdev_free()
625 ASSERT0(vd->vdev_stat.vs_dspace); in vdev_free()
626 ASSERT0(vd->vdev_stat.vs_alloc); in vdev_free()
631 vdev_remove_child(vd->vdev_parent, vd); in vdev_free()
633 ASSERT(vd->vdev_parent == NULL); in vdev_free()
638 vdev_queue_fini(vd); in vdev_free()
639 vdev_cache_fini(vd); in vdev_free()
641 if (vd->vdev_path) in vdev_free()
642 spa_strfree(vd->vdev_path); in vdev_free()
643 if (vd->vdev_devid) in vdev_free()
644 spa_strfree(vd->vdev_devid); in vdev_free()
645 if (vd->vdev_physpath) in vdev_free()
646 spa_strfree(vd->vdev_physpath); in vdev_free()
647 if (vd->vdev_fru) in vdev_free()
648 spa_strfree(vd->vdev_fru); in vdev_free()
650 if (vd->vdev_isspare) in vdev_free()
651 spa_spare_remove(vd); in vdev_free()
652 if (vd->vdev_isl2cache) in vdev_free()
653 spa_l2cache_remove(vd); in vdev_free()
655 txg_list_destroy(&vd->vdev_ms_list); in vdev_free()
656 txg_list_destroy(&vd->vdev_dtl_list); in vdev_free()
658 mutex_enter(&vd->vdev_dtl_lock); in vdev_free()
659 space_map_close(vd->vdev_dtl_sm); in vdev_free()
661 range_tree_vacate(vd->vdev_dtl[t], NULL, NULL); in vdev_free()
662 range_tree_destroy(vd->vdev_dtl[t]); in vdev_free()
664 mutex_exit(&vd->vdev_dtl_lock); in vdev_free()
666 mutex_destroy(&vd->vdev_dtl_lock); in vdev_free()
667 mutex_destroy(&vd->vdev_stat_lock); in vdev_free()
668 mutex_destroy(&vd->vdev_probe_lock); in vdev_free()
670 if (vd == spa->spa_root_vdev) in vdev_free()
673 kmem_free(vd, sizeof (vdev_t)); in vdev_free()
684 vdev_t *vd; in vdev_top_transfer() local
719 while ((vd = txg_list_remove(&svd->vdev_dtl_list, t)) != NULL) in vdev_top_transfer()
720 (void) txg_list_add(&tvd->vdev_dtl_list, vd, t); in vdev_top_transfer()
743 vdev_top_update(vdev_t *tvd, vdev_t *vd) in vdev_top_update() argument
745 if (vd == NULL) in vdev_top_update()
748 vd->vdev_top = tvd; in vdev_top_update()
750 for (int c = 0; c < vd->vdev_children; c++) in vdev_top_update()
751 vdev_top_update(tvd, vd->vdev_child[c]); in vdev_top_update()
831 vdev_metaslab_init(vdev_t *vd, uint64_t txg) in vdev_metaslab_init() argument
833 spa_t *spa = vd->vdev_spa; in vdev_metaslab_init()
836 uint64_t oldc = vd->vdev_ms_count; in vdev_metaslab_init()
837 uint64_t newc = vd->vdev_asize >> vd->vdev_ms_shift; in vdev_metaslab_init()
846 if (vd->vdev_ms_shift == 0) in vdev_metaslab_init()
849 ASSERT(!vd->vdev_ishole); in vdev_metaslab_init()
857 vd->vdev_deflate_ratio = (1 << 17) / in vdev_metaslab_init()
858 (vdev_psize_to_asize(vd, 1 << 17) >> SPA_MINBLOCKSHIFT); in vdev_metaslab_init()
865 bcopy(vd->vdev_ms, mspp, oldc * sizeof (*mspp)); in vdev_metaslab_init()
866 kmem_free(vd->vdev_ms, oldc * sizeof (*mspp)); in vdev_metaslab_init()
869 vd->vdev_ms = mspp; in vdev_metaslab_init()
870 vd->vdev_ms_count = newc; in vdev_metaslab_init()
876 error = dmu_read(mos, vd->vdev_ms_array, in vdev_metaslab_init()
883 error = metaslab_init(vd->vdev_mg, m, object, txg, in vdev_metaslab_init()
884 &(vd->vdev_ms[m])); in vdev_metaslab_init()
897 if (oldc == 0 && !vd->vdev_removing) in vdev_metaslab_init()
898 metaslab_group_activate(vd->vdev_mg); in vdev_metaslab_init()
907 vdev_metaslab_fini(vdev_t *vd) in vdev_metaslab_fini() argument
910 uint64_t count = vd->vdev_ms_count; in vdev_metaslab_fini()
912 if (vd->vdev_ms != NULL) { in vdev_metaslab_fini()
913 metaslab_group_passivate(vd->vdev_mg); in vdev_metaslab_fini()
915 metaslab_t *msp = vd->vdev_ms[m]; in vdev_metaslab_fini()
920 kmem_free(vd->vdev_ms, count * sizeof (metaslab_t *)); in vdev_metaslab_fini()
921 vd->vdev_ms = NULL; in vdev_metaslab_fini()
935 vdev_t *vd = zio->io_vd; in vdev_probe_done() local
938 ASSERT(vd->vdev_probe_zio != NULL); in vdev_probe_done()
944 zio_nowait(zio_write_phys(vd->vdev_probe_zio, vd, in vdev_probe_done()
958 vd->vdev_cant_read |= !vps->vps_readable; in vdev_probe_done()
959 vd->vdev_cant_write |= !vps->vps_writeable; in vdev_probe_done()
961 if (vdev_readable(vd) && in vdev_probe_done()
962 (vdev_writeable(vd) || !spa_writeable(spa))) { in vdev_probe_done()
967 spa, vd, NULL, 0, 0); in vdev_probe_done()
971 mutex_enter(&vd->vdev_probe_lock); in vdev_probe_done()
972 ASSERT(vd->vdev_probe_zio == zio); in vdev_probe_done()
973 vd->vdev_probe_zio = NULL; in vdev_probe_done()
974 mutex_exit(&vd->vdev_probe_lock); in vdev_probe_done()
977 if (!vdev_accessible(vd, pio)) in vdev_probe_done()
992 vdev_probe(vdev_t *vd, zio_t *zio) in vdev_probe() argument
994 spa_t *spa = vd->vdev_spa; in vdev_probe()
998 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_probe()
1011 mutex_enter(&vd->vdev_probe_lock); in vdev_probe()
1013 if ((pio = vd->vdev_probe_zio) == NULL) { in vdev_probe()
1038 vd->vdev_cant_read = B_FALSE; in vdev_probe()
1039 vd->vdev_cant_write = B_FALSE; in vdev_probe()
1042 vd->vdev_probe_zio = pio = zio_null(NULL, spa, vd, in vdev_probe()
1051 vd->vdev_probe_wanted = B_TRUE; in vdev_probe()
1059 mutex_exit(&vd->vdev_probe_lock); in vdev_probe()
1067 zio_nowait(zio_read_phys(pio, vd, in vdev_probe()
1068 vdev_label_offset(vd->vdev_psize, l, in vdev_probe()
1085 vdev_t *vd = arg; in vdev_open_child() local
1087 vd->vdev_open_thread = curthread; in vdev_open_child()
1088 vd->vdev_open_error = vdev_open(vd); in vdev_open_child()
1089 vd->vdev_open_thread = NULL; in vdev_open_child()
1093 vdev_uses_zvols(vdev_t *vd) in vdev_uses_zvols() argument
1095 if (vd->vdev_path && strncmp(vd->vdev_path, ZVOL_DIR, in vdev_uses_zvols()
1098 for (int c = 0; c < vd->vdev_children; c++) in vdev_uses_zvols()
1099 if (vdev_uses_zvols(vd->vdev_child[c])) in vdev_uses_zvols()
1105 vdev_open_children(vdev_t *vd) in vdev_open_children() argument
1108 int children = vd->vdev_children; in vdev_open_children()
1115 if (vdev_uses_zvols(vd)) { in vdev_open_children()
1117 vd->vdev_child[c]->vdev_open_error = in vdev_open_children()
1118 vdev_open(vd->vdev_child[c]); in vdev_open_children()
1125 VERIFY(taskq_dispatch(tq, vdev_open_child, vd->vdev_child[c], in vdev_open_children()
1135 vdev_open(vdev_t *vd) in vdev_open() argument
1137 spa_t *spa = vd->vdev_spa; in vdev_open()
1144 ASSERT(vd->vdev_open_thread == curthread || in vdev_open()
1146 ASSERT(vd->vdev_state == VDEV_STATE_CLOSED || in vdev_open()
1147 vd->vdev_state == VDEV_STATE_CANT_OPEN || in vdev_open()
1148 vd->vdev_state == VDEV_STATE_OFFLINE); in vdev_open()
1150 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_open()
1151 vd->vdev_cant_read = B_FALSE; in vdev_open()
1152 vd->vdev_cant_write = B_FALSE; in vdev_open()
1153 vd->vdev_min_asize = vdev_get_min_asize(vd); in vdev_open()
1159 if (!vd->vdev_removed && vd->vdev_faulted) { in vdev_open()
1160 ASSERT(vd->vdev_children == 0); in vdev_open()
1161 ASSERT(vd->vdev_label_aux == VDEV_AUX_ERR_EXCEEDED || in vdev_open()
1162 vd->vdev_label_aux == VDEV_AUX_EXTERNAL); in vdev_open()
1163 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1164 vd->vdev_label_aux); in vdev_open()
1166 } else if (vd->vdev_offline) { in vdev_open()
1167 ASSERT(vd->vdev_children == 0); in vdev_open()
1168 vdev_set_state(vd, B_TRUE, VDEV_STATE_OFFLINE, VDEV_AUX_NONE); in vdev_open()
1172 error = vd->vdev_ops->vdev_op_open(vd, &osize, &max_osize, &ashift); in vdev_open()
1178 vd->vdev_reopening = B_FALSE; in vdev_open()
1180 error = zio_handle_device_injection(vd, NULL, ENXIO); in vdev_open()
1183 if (vd->vdev_removed && in vdev_open()
1184 vd->vdev_stat.vs_aux != VDEV_AUX_OPEN_FAILED) in vdev_open()
1185 vd->vdev_removed = B_FALSE; in vdev_open()
1187 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1188 vd->vdev_stat.vs_aux); in vdev_open()
1192 vd->vdev_removed = B_FALSE; in vdev_open()
1198 if (vd->vdev_faulted) { in vdev_open()
1199 ASSERT(vd->vdev_children == 0); in vdev_open()
1200 ASSERT(vd->vdev_label_aux == VDEV_AUX_ERR_EXCEEDED || in vdev_open()
1201 vd->vdev_label_aux == VDEV_AUX_EXTERNAL); in vdev_open()
1202 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1203 vd->vdev_label_aux); in vdev_open()
1207 if (vd->vdev_degraded) { in vdev_open()
1208 ASSERT(vd->vdev_children == 0); in vdev_open()
1209 vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED, in vdev_open()
1212 vdev_set_state(vd, B_TRUE, VDEV_STATE_HEALTHY, 0); in vdev_open()
1218 if (vd->vdev_ishole || vd->vdev_ops == &vdev_missing_ops) in vdev_open()
1221 for (int c = 0; c < vd->vdev_children; c++) { in vdev_open()
1222 if (vd->vdev_child[c]->vdev_state != VDEV_STATE_HEALTHY) { in vdev_open()
1223 vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED, in vdev_open()
1232 if (vd->vdev_children == 0) { in vdev_open()
1234 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1243 if (vd->vdev_parent != NULL && osize < SPA_MINDEVSIZE - in vdev_open()
1245 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1254 vd->vdev_psize = psize; in vdev_open()
1259 if (asize < vd->vdev_min_asize) { in vdev_open()
1260 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1265 if (vd->vdev_asize == 0) { in vdev_open()
1270 vd->vdev_asize = asize; in vdev_open()
1271 vd->vdev_max_asize = max_asize; in vdev_open()
1272 vd->vdev_ashift = MAX(ashift, vd->vdev_ashift); in vdev_open()
1279 if (ashift > vd->vdev_top->vdev_ashift && in vdev_open()
1280 vd->vdev_ops->vdev_op_leaf) { in vdev_open()
1284 vd->vdev_path); in vdev_open()
1286 vd->vdev_max_asize = max_asize; in vdev_open()
1294 if (vd->vdev_state == VDEV_STATE_HEALTHY && asize > vd->vdev_asize && in vdev_open()
1295 (vd->vdev_expanding || spa->spa_autoexpand)) in vdev_open()
1296 vd->vdev_asize = asize; in vdev_open()
1298 vdev_set_min_asize(vd); in vdev_open()
1304 if (vd->vdev_ops->vdev_op_leaf && in vdev_open()
1305 (error = zio_wait(vdev_probe(vd, NULL))) != 0) { in vdev_open()
1306 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1314 if (vd->vdev_top == vd && vd->vdev_ashift != 0 && in vdev_open()
1315 !vd->vdev_islog && vd->vdev_aux == NULL) { in vdev_open()
1316 if (vd->vdev_ashift > spa->spa_max_ashift) in vdev_open()
1317 spa->spa_max_ashift = vd->vdev_ashift; in vdev_open()
1318 if (vd->vdev_ashift < spa->spa_min_ashift) in vdev_open()
1319 spa->spa_min_ashift = vd->vdev_ashift; in vdev_open()
1327 if (vd->vdev_ops->vdev_op_leaf && !spa->spa_scrub_reopen && in vdev_open()
1328 vdev_resilver_needed(vd, NULL, NULL)) in vdev_open()
1350 vdev_validate(vdev_t *vd, boolean_t strict) in vdev_validate() argument
1352 spa_t *spa = vd->vdev_spa; in vdev_validate()
1357 for (int c = 0; c < vd->vdev_children; c++) in vdev_validate()
1358 if (vdev_validate(vd->vdev_child[c], strict) != 0) in vdev_validate()
1366 if (vd->vdev_ops->vdev_op_leaf && vdev_readable(vd)) { in vdev_validate()
1372 if ((label = vdev_label_read_config(vd, txg)) == NULL) { in vdev_validate()
1373 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1384 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1393 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1420 ((vd->vdev_guid != guid && vd->vdev_guid != aux_guid) && in vdev_validate()
1421 (vd->vdev_guid != top_guid || vd != vd->vdev_top))) { in vdev_validate()
1422 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1430 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1452 if (vd->vdev_not_present) in vdev_validate()
1453 vd->vdev_not_present = 0; in vdev_validate()
1463 vdev_close(vdev_t *vd) in vdev_close() argument
1465 spa_t *spa = vd->vdev_spa; in vdev_close()
1466 vdev_t *pvd = vd->vdev_parent; in vdev_close()
1475 vd->vdev_reopening = (pvd->vdev_reopening && !vd->vdev_offline); in vdev_close()
1477 vd->vdev_ops->vdev_op_close(vd); in vdev_close()
1479 vdev_cache_purge(vd); in vdev_close()
1486 vd->vdev_prevstate = vd->vdev_state; in vdev_close()
1488 if (vd->vdev_offline) in vdev_close()
1489 vd->vdev_state = VDEV_STATE_OFFLINE; in vdev_close()
1491 vd->vdev_state = VDEV_STATE_CLOSED; in vdev_close()
1492 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_close()
1496 vdev_hold(vdev_t *vd) in vdev_hold() argument
1498 spa_t *spa = vd->vdev_spa; in vdev_hold()
1504 for (int c = 0; c < vd->vdev_children; c++) in vdev_hold()
1505 vdev_hold(vd->vdev_child[c]); in vdev_hold()
1507 if (vd->vdev_ops->vdev_op_leaf) in vdev_hold()
1508 vd->vdev_ops->vdev_op_hold(vd); in vdev_hold()
1512 vdev_rele(vdev_t *vd) in vdev_rele() argument
1514 spa_t *spa = vd->vdev_spa; in vdev_rele()
1517 for (int c = 0; c < vd->vdev_children; c++) in vdev_rele()
1518 vdev_rele(vd->vdev_child[c]); in vdev_rele()
1520 if (vd->vdev_ops->vdev_op_leaf) in vdev_rele()
1521 vd->vdev_ops->vdev_op_rele(vd); in vdev_rele()
1531 vdev_reopen(vdev_t *vd) in vdev_reopen() argument
1533 spa_t *spa = vd->vdev_spa; in vdev_reopen()
1538 vd->vdev_reopening = !vd->vdev_offline; in vdev_reopen()
1539 vdev_close(vd); in vdev_reopen()
1540 (void) vdev_open(vd); in vdev_reopen()
1547 if (vd->vdev_aux) { in vdev_reopen()
1548 (void) vdev_validate_aux(vd); in vdev_reopen()
1549 if (vdev_readable(vd) && vdev_writeable(vd) && in vdev_reopen()
1550 vd->vdev_aux == &spa->spa_l2cache && in vdev_reopen()
1551 !l2arc_vdev_present(vd)) { in vdev_reopen()
1557 l2arc_add_vdev(spa, vd, B_TRUE); in vdev_reopen()
1560 (void) vdev_validate(vd, B_TRUE); in vdev_reopen()
1566 vdev_propagate_state(vd); in vdev_reopen()
1570 vdev_create(vdev_t *vd, uint64_t txg, boolean_t isreplacing) in vdev_create() argument
1579 error = vdev_open(vd); in vdev_create()
1581 if (error || vd->vdev_state != VDEV_STATE_HEALTHY) { in vdev_create()
1582 vdev_close(vd); in vdev_create()
1589 if ((error = vdev_dtl_load(vd)) != 0 || in vdev_create()
1590 (error = vdev_label_init(vd, txg, isreplacing ? in vdev_create()
1592 vdev_close(vd); in vdev_create()
1600 vdev_metaslab_set_size(vdev_t *vd) in vdev_metaslab_set_size() argument
1605 vd->vdev_ms_shift = highbit64(vd->vdev_asize / metaslabs_per_vdev); in vdev_metaslab_set_size()
1606 vd->vdev_ms_shift = MAX(vd->vdev_ms_shift, SPA_MAXBLOCKSHIFT); in vdev_metaslab_set_size()
1610 vdev_dirty(vdev_t *vd, int flags, void *arg, uint64_t txg) in vdev_dirty() argument
1612 ASSERT(vd == vd->vdev_top); in vdev_dirty()
1613 ASSERT(!vd->vdev_ishole); in vdev_dirty()
1615 ASSERT(spa_writeable(vd->vdev_spa)); in vdev_dirty()
1618 (void) txg_list_add(&vd->vdev_ms_list, arg, txg); in vdev_dirty()
1621 (void) txg_list_add(&vd->vdev_dtl_list, arg, txg); in vdev_dirty()
1623 (void) txg_list_add(&vd->vdev_spa->spa_vdev_txg_list, vd, txg); in vdev_dirty()
1627 vdev_dirty_leaves(vdev_t *vd, int flags, uint64_t txg) in vdev_dirty_leaves() argument
1629 for (int c = 0; c < vd->vdev_children; c++) in vdev_dirty_leaves()
1630 vdev_dirty_leaves(vd->vdev_child[c], flags, txg); in vdev_dirty_leaves()
1632 if (vd->vdev_ops->vdev_op_leaf) in vdev_dirty_leaves()
1633 vdev_dirty(vd->vdev_top, flags, vd, txg); in vdev_dirty_leaves()
1675 vdev_dtl_dirty(vdev_t *vd, vdev_dtl_type_t t, uint64_t txg, uint64_t size) in vdev_dtl_dirty() argument
1677 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_dirty()
1680 ASSERT(vd != vd->vdev_spa->spa_root_vdev); in vdev_dtl_dirty()
1681 ASSERT(spa_writeable(vd->vdev_spa)); in vdev_dtl_dirty()
1690 vdev_dtl_contains(vdev_t *vd, vdev_dtl_type_t t, uint64_t txg, uint64_t size) in vdev_dtl_contains() argument
1692 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_contains()
1696 ASSERT(vd != vd->vdev_spa->spa_root_vdev); in vdev_dtl_contains()
1707 vdev_dtl_empty(vdev_t *vd, vdev_dtl_type_t t) in vdev_dtl_empty() argument
1709 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_empty()
1723 vdev_dtl_min(vdev_t *vd) in vdev_dtl_min() argument
1727 ASSERT(MUTEX_HELD(&vd->vdev_dtl_lock)); in vdev_dtl_min()
1728 ASSERT3U(range_tree_space(vd->vdev_dtl[DTL_MISSING]), !=, 0); in vdev_dtl_min()
1729 ASSERT0(vd->vdev_children); in vdev_dtl_min()
1731 rs = avl_first(&vd->vdev_dtl[DTL_MISSING]->rt_root); in vdev_dtl_min()
1739 vdev_dtl_max(vdev_t *vd) in vdev_dtl_max() argument
1743 ASSERT(MUTEX_HELD(&vd->vdev_dtl_lock)); in vdev_dtl_max()
1744 ASSERT3U(range_tree_space(vd->vdev_dtl[DTL_MISSING]), !=, 0); in vdev_dtl_max()
1745 ASSERT0(vd->vdev_children); in vdev_dtl_max()
1747 rs = avl_last(&vd->vdev_dtl[DTL_MISSING]->rt_root); in vdev_dtl_max()
1760 vdev_dtl_should_excise(vdev_t *vd) in vdev_dtl_should_excise() argument
1762 spa_t *spa = vd->vdev_spa; in vdev_dtl_should_excise()
1766 ASSERT0(vd->vdev_children); in vdev_dtl_should_excise()
1768 if (vd->vdev_resilver_txg == 0 || in vdev_dtl_should_excise()
1769 range_tree_space(vd->vdev_dtl[DTL_MISSING]) == 0) in vdev_dtl_should_excise()
1779 if (vdev_dtl_max(vd) <= scn->scn_phys.scn_max_txg) { in vdev_dtl_should_excise()
1780 ASSERT3U(scn->scn_phys.scn_min_txg, <=, vdev_dtl_min(vd)); in vdev_dtl_should_excise()
1781 ASSERT3U(scn->scn_phys.scn_min_txg, <, vd->vdev_resilver_txg); in vdev_dtl_should_excise()
1782 ASSERT3U(vd->vdev_resilver_txg, <=, scn->scn_phys.scn_max_txg); in vdev_dtl_should_excise()
1792 vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg, int scrub_done) in vdev_dtl_reassess() argument
1794 spa_t *spa = vd->vdev_spa; in vdev_dtl_reassess()
1800 for (int c = 0; c < vd->vdev_children; c++) in vdev_dtl_reassess()
1801 vdev_dtl_reassess(vd->vdev_child[c], txg, in vdev_dtl_reassess()
1804 if (vd == spa->spa_root_vdev || vd->vdev_ishole || vd->vdev_aux) in vdev_dtl_reassess()
1807 if (vd->vdev_ops->vdev_op_leaf) { in vdev_dtl_reassess()
1810 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
1821 vdev_dtl_should_excise(vd)) { in vdev_dtl_reassess()
1841 vd->vdev_dtl[DTL_MISSING], 1); in vdev_dtl_reassess()
1844 vd->vdev_dtl[DTL_SCRUB], 2); in vdev_dtl_reassess()
1846 vd->vdev_dtl[DTL_MISSING], 1); in vdev_dtl_reassess()
1849 range_tree_vacate(vd->vdev_dtl[DTL_PARTIAL], NULL, NULL); in vdev_dtl_reassess()
1850 range_tree_walk(vd->vdev_dtl[DTL_MISSING], in vdev_dtl_reassess()
1851 range_tree_add, vd->vdev_dtl[DTL_PARTIAL]); in vdev_dtl_reassess()
1853 range_tree_vacate(vd->vdev_dtl[DTL_SCRUB], NULL, NULL); in vdev_dtl_reassess()
1854 range_tree_vacate(vd->vdev_dtl[DTL_OUTAGE], NULL, NULL); in vdev_dtl_reassess()
1855 if (!vdev_readable(vd)) in vdev_dtl_reassess()
1856 range_tree_add(vd->vdev_dtl[DTL_OUTAGE], 0, -1ULL); in vdev_dtl_reassess()
1858 range_tree_walk(vd->vdev_dtl[DTL_MISSING], in vdev_dtl_reassess()
1859 range_tree_add, vd->vdev_dtl[DTL_OUTAGE]); in vdev_dtl_reassess()
1865 if (vd->vdev_resilver_txg != 0 && in vdev_dtl_reassess()
1866 range_tree_space(vd->vdev_dtl[DTL_MISSING]) == 0 && in vdev_dtl_reassess()
1867 range_tree_space(vd->vdev_dtl[DTL_OUTAGE]) == 0) in vdev_dtl_reassess()
1868 vd->vdev_resilver_txg = 0; in vdev_dtl_reassess()
1870 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
1873 vdev_dirty(vd->vdev_top, VDD_DTL, vd, txg); in vdev_dtl_reassess()
1877 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
1885 else if (vd->vdev_nparity != 0) in vdev_dtl_reassess()
1886 minref = vd->vdev_nparity + 1; /* RAID-Z */ in vdev_dtl_reassess()
1888 minref = vd->vdev_children; /* any kind of mirror */ in vdev_dtl_reassess()
1890 for (int c = 0; c < vd->vdev_children; c++) { in vdev_dtl_reassess()
1891 vdev_t *cvd = vd->vdev_child[c]; in vdev_dtl_reassess()
1896 space_reftree_generate_map(&reftree, vd->vdev_dtl[t], minref); in vdev_dtl_reassess()
1899 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
1903 vdev_dtl_load(vdev_t *vd) in vdev_dtl_load() argument
1905 spa_t *spa = vd->vdev_spa; in vdev_dtl_load()
1909 if (vd->vdev_ops->vdev_op_leaf && vd->vdev_dtl_object != 0) { in vdev_dtl_load()
1910 ASSERT(!vd->vdev_ishole); in vdev_dtl_load()
1912 error = space_map_open(&vd->vdev_dtl_sm, mos, in vdev_dtl_load()
1913 vd->vdev_dtl_object, 0, -1ULL, 0, &vd->vdev_dtl_lock); in vdev_dtl_load()
1916 ASSERT(vd->vdev_dtl_sm != NULL); in vdev_dtl_load()
1918 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_load()
1924 space_map_update(vd->vdev_dtl_sm); in vdev_dtl_load()
1926 error = space_map_load(vd->vdev_dtl_sm, in vdev_dtl_load()
1927 vd->vdev_dtl[DTL_MISSING], SM_ALLOC); in vdev_dtl_load()
1928 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_load()
1933 for (int c = 0; c < vd->vdev_children; c++) { in vdev_dtl_load()
1934 error = vdev_dtl_load(vd->vdev_child[c]); in vdev_dtl_load()
1943 vdev_dtl_sync(vdev_t *vd, uint64_t txg) in vdev_dtl_sync() argument
1945 spa_t *spa = vd->vdev_spa; in vdev_dtl_sync()
1946 range_tree_t *rt = vd->vdev_dtl[DTL_MISSING]; in vdev_dtl_sync()
1951 uint64_t object = space_map_object(vd->vdev_dtl_sm); in vdev_dtl_sync()
1953 ASSERT(!vd->vdev_ishole); in vdev_dtl_sync()
1954 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_dtl_sync()
1958 if (vd->vdev_detached || vd->vdev_top->vdev_removing) { in vdev_dtl_sync()
1959 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_sync()
1960 space_map_free(vd->vdev_dtl_sm, tx); in vdev_dtl_sync()
1961 space_map_close(vd->vdev_dtl_sm); in vdev_dtl_sync()
1962 vd->vdev_dtl_sm = NULL; in vdev_dtl_sync()
1963 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_sync()
1968 if (vd->vdev_dtl_sm == NULL) { in vdev_dtl_sync()
1974 VERIFY0(space_map_open(&vd->vdev_dtl_sm, mos, new_object, in vdev_dtl_sync()
1975 0, -1ULL, 0, &vd->vdev_dtl_lock)); in vdev_dtl_sync()
1976 ASSERT(vd->vdev_dtl_sm != NULL); in vdev_dtl_sync()
1985 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_sync()
1987 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_sync()
1989 space_map_truncate(vd->vdev_dtl_sm, tx); in vdev_dtl_sync()
1990 space_map_write(vd->vdev_dtl_sm, rtsync, SM_ALLOC, tx); in vdev_dtl_sync()
2002 if (object != space_map_object(vd->vdev_dtl_sm)) { in vdev_dtl_sync()
2005 space_map_object(vd->vdev_dtl_sm)); in vdev_dtl_sync()
2006 vdev_config_dirty(vd->vdev_top); in vdev_dtl_sync()
2011 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_sync()
2012 space_map_update(vd->vdev_dtl_sm); in vdev_dtl_sync()
2013 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_sync()
2021 vdev_dtl_required(vdev_t *vd) in vdev_dtl_required() argument
2023 spa_t *spa = vd->vdev_spa; in vdev_dtl_required()
2024 vdev_t *tvd = vd->vdev_top; in vdev_dtl_required()
2025 uint8_t cant_read = vd->vdev_cant_read; in vdev_dtl_required()
2030 if (vd == spa->spa_root_vdev || vd == tvd) in vdev_dtl_required()
2038 vd->vdev_cant_read = B_TRUE; in vdev_dtl_required()
2041 vd->vdev_cant_read = cant_read; in vdev_dtl_required()
2045 required = !!zio_handle_device_injection(vd, NULL, ECHILD); in vdev_dtl_required()
2054 vdev_resilver_needed(vdev_t *vd, uint64_t *minp, uint64_t *maxp) in vdev_resilver_needed() argument
2060 if (vd->vdev_children == 0) { in vdev_resilver_needed()
2061 mutex_enter(&vd->vdev_dtl_lock); in vdev_resilver_needed()
2062 if (range_tree_space(vd->vdev_dtl[DTL_MISSING]) != 0 && in vdev_resilver_needed()
2063 vdev_writeable(vd)) { in vdev_resilver_needed()
2065 thismin = vdev_dtl_min(vd); in vdev_resilver_needed()
2066 thismax = vdev_dtl_max(vd); in vdev_resilver_needed()
2069 mutex_exit(&vd->vdev_dtl_lock); in vdev_resilver_needed()
2071 for (int c = 0; c < vd->vdev_children; c++) { in vdev_resilver_needed()
2072 vdev_t *cvd = vd->vdev_child[c]; in vdev_resilver_needed()
2091 vdev_load(vdev_t *vd) in vdev_load() argument
2096 for (int c = 0; c < vd->vdev_children; c++) in vdev_load()
2097 vdev_load(vd->vdev_child[c]); in vdev_load()
2102 if (vd == vd->vdev_top && !vd->vdev_ishole && in vdev_load()
2103 (vd->vdev_ashift == 0 || vd->vdev_asize == 0 || in vdev_load()
2104 vdev_metaslab_init(vd, 0) != 0)) in vdev_load()
2105 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
2111 if (vd->vdev_ops->vdev_op_leaf && vdev_dtl_load(vd) != 0) in vdev_load()
2112 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
2124 vdev_validate_aux(vdev_t *vd) in vdev_validate_aux() argument
2130 if (!vdev_readable(vd)) in vdev_validate_aux()
2133 if ((label = vdev_label_read_config(vd, -1ULL)) == NULL) { in vdev_validate_aux()
2134 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate_aux()
2142 guid != vd->vdev_guid || in vdev_validate_aux()
2144 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate_aux()
2159 vdev_remove(vdev_t *vd, uint64_t txg) in vdev_remove() argument
2161 spa_t *spa = vd->vdev_spa; in vdev_remove()
2167 if (vd->vdev_ms != NULL) { in vdev_remove()
2168 metaslab_group_t *mg = vd->vdev_mg; in vdev_remove()
2173 for (int m = 0; m < vd->vdev_ms_count; m++) { in vdev_remove()
2174 metaslab_t *msp = vd->vdev_ms[m]; in vdev_remove()
2203 if (vd->vdev_ms_array) { in vdev_remove()
2204 (void) dmu_object_free(mos, vd->vdev_ms_array, tx); in vdev_remove()
2205 vd->vdev_ms_array = 0; in vdev_remove()
2211 vdev_sync_done(vdev_t *vd, uint64_t txg) in vdev_sync_done() argument
2214 boolean_t reassess = !txg_list_empty(&vd->vdev_ms_list, TXG_CLEAN(txg)); in vdev_sync_done()
2216 ASSERT(!vd->vdev_ishole); in vdev_sync_done()
2218 while (msp = txg_list_remove(&vd->vdev_ms_list, TXG_CLEAN(txg))) in vdev_sync_done()
2222 metaslab_sync_reassess(vd->vdev_mg); in vdev_sync_done()
2226 vdev_sync(vdev_t *vd, uint64_t txg) in vdev_sync() argument
2228 spa_t *spa = vd->vdev_spa; in vdev_sync()
2233 ASSERT(!vd->vdev_ishole); in vdev_sync()
2235 if (vd->vdev_ms_array == 0 && vd->vdev_ms_shift != 0) { in vdev_sync()
2236 ASSERT(vd == vd->vdev_top); in vdev_sync()
2238 vd->vdev_ms_array = dmu_object_alloc(spa->spa_meta_objset, in vdev_sync()
2240 ASSERT(vd->vdev_ms_array != 0); in vdev_sync()
2241 vdev_config_dirty(vd); in vdev_sync()
2248 if (vd->vdev_stat.vs_alloc == 0 && vd->vdev_removing) in vdev_sync()
2249 vdev_remove(vd, txg); in vdev_sync()
2251 while ((msp = txg_list_remove(&vd->vdev_ms_list, txg)) != NULL) { in vdev_sync()
2253 (void) txg_list_add(&vd->vdev_ms_list, msp, TXG_CLEAN(txg)); in vdev_sync()
2256 while ((lvd = txg_list_remove(&vd->vdev_dtl_list, txg)) != NULL) in vdev_sync()
2259 (void) txg_list_add(&spa->spa_vdev_txg_list, vd, TXG_CLEAN(txg)); in vdev_sync()
2263 vdev_psize_to_asize(vdev_t *vd, uint64_t psize) in vdev_psize_to_asize() argument
2265 return (vd->vdev_ops->vdev_op_asize(vd, psize)); in vdev_psize_to_asize()
2275 vdev_t *vd, *tvd; in vdev_fault() local
2279 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_fault()
2282 if (!vd->vdev_ops->vdev_op_leaf) in vdev_fault()
2285 tvd = vd->vdev_top; in vdev_fault()
2292 vd->vdev_label_aux = aux; in vdev_fault()
2297 vd->vdev_delayed_close = B_FALSE; in vdev_fault()
2298 vd->vdev_faulted = 1ULL; in vdev_fault()
2299 vd->vdev_degraded = 0ULL; in vdev_fault()
2300 vdev_set_state(vd, B_FALSE, VDEV_STATE_FAULTED, aux); in vdev_fault()
2306 if (!tvd->vdev_islog && vd->vdev_aux == NULL && vdev_dtl_required(vd)) { in vdev_fault()
2307 vd->vdev_degraded = 1ULL; in vdev_fault()
2308 vd->vdev_faulted = 0ULL; in vdev_fault()
2316 if (vdev_readable(vd)) in vdev_fault()
2317 vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, aux); in vdev_fault()
2320 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_fault()
2331 vdev_t *vd; in vdev_degrade() local
2335 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_degrade()
2338 if (!vd->vdev_ops->vdev_op_leaf) in vdev_degrade()
2344 if (vd->vdev_faulted || vd->vdev_degraded) in vdev_degrade()
2347 vd->vdev_degraded = 1ULL; in vdev_degrade()
2348 if (!vdev_is_dead(vd)) in vdev_degrade()
2349 vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, in vdev_degrade()
2352 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_degrade()
2366 vdev_t *vd, *tvd, *pvd, *rvd = spa->spa_root_vdev; in vdev_online() local
2371 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_online()
2374 if (!vd->vdev_ops->vdev_op_leaf) in vdev_online()
2378 (vd->vdev_offline == B_TRUE || vd->vdev_tmpoffline == B_TRUE) ? in vdev_online()
2381 tvd = vd->vdev_top; in vdev_online()
2382 vd->vdev_offline = B_FALSE; in vdev_online()
2383 vd->vdev_tmpoffline = B_FALSE; in vdev_online()
2384 vd->vdev_checkremove = !!(flags & ZFS_ONLINE_CHECKREMOVE); in vdev_online()
2385 vd->vdev_forcefault = !!(flags & ZFS_ONLINE_FORCEFAULT); in vdev_online()
2388 if (!vd->vdev_aux) { in vdev_online()
2389 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_online()
2394 vd->vdev_checkremove = vd->vdev_forcefault = B_FALSE; in vdev_online()
2396 if (!vd->vdev_aux) { in vdev_online()
2397 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_online()
2402 *newstate = vd->vdev_state; in vdev_online()
2404 !vdev_is_dead(vd) && vd->vdev_parent && in vdev_online()
2405 vd->vdev_parent->vdev_ops == &vdev_spare_ops && in vdev_online()
2406 vd->vdev_parent->vdev_child[0] == vd) in vdev_online()
2407 vd->vdev_unspare = B_TRUE; in vdev_online()
2412 if (vd->vdev_aux) in vdev_online()
2413 return (spa_vdev_state_exit(spa, vd, ENOTSUP)); in vdev_online()
2418 spa_event_notify(spa, vd, ESC_ZFS_VDEV_ONLINE); in vdev_online()
2420 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_online()
2426 vdev_t *vd, *tvd; in vdev_offline_locked() local
2434 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_offline_locked()
2437 if (!vd->vdev_ops->vdev_op_leaf) in vdev_offline_locked()
2440 tvd = vd->vdev_top; in vdev_offline_locked()
2447 if (!vd->vdev_offline) { in vdev_offline_locked()
2453 if (!tvd->vdev_islog && vd->vdev_aux == NULL && in vdev_offline_locked()
2454 vdev_dtl_required(vd)) in vdev_offline_locked()
2468 (void) spa_vdev_state_exit(spa, vd, 0); in vdev_offline_locked()
2481 vd, error)); in vdev_offline_locked()
2482 (void) spa_vdev_state_exit(spa, vd, 0); in vdev_offline_locked()
2494 vd->vdev_offline = B_TRUE; in vdev_offline_locked()
2497 if (!tvd->vdev_islog && vd->vdev_aux == NULL && in vdev_offline_locked()
2499 vd->vdev_offline = B_FALSE; in vdev_offline_locked()
2512 vd->vdev_tmpoffline = !!(flags & ZFS_OFFLINE_TEMPORARY); in vdev_offline_locked()
2514 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_offline_locked()
2535 vdev_clear(spa_t *spa, vdev_t *vd) in vdev_clear() argument
2541 if (vd == NULL) in vdev_clear()
2542 vd = rvd; in vdev_clear()
2544 vd->vdev_stat.vs_read_errors = 0; in vdev_clear()
2545 vd->vdev_stat.vs_write_errors = 0; in vdev_clear()
2546 vd->vdev_stat.vs_checksum_errors = 0; in vdev_clear()
2548 for (int c = 0; c < vd->vdev_children; c++) in vdev_clear()
2549 vdev_clear(spa, vd->vdev_child[c]); in vdev_clear()
2557 if (vd->vdev_faulted || vd->vdev_degraded || in vdev_clear()
2558 !vdev_readable(vd) || !vdev_writeable(vd)) { in vdev_clear()
2565 vd->vdev_forcefault = B_TRUE; in vdev_clear()
2567 vd->vdev_faulted = vd->vdev_degraded = 0ULL; in vdev_clear()
2568 vd->vdev_cant_read = B_FALSE; in vdev_clear()
2569 vd->vdev_cant_write = B_FALSE; in vdev_clear()
2571 vdev_reopen(vd == rvd ? rvd : vd->vdev_top); in vdev_clear()
2573 vd->vdev_forcefault = B_FALSE; in vdev_clear()
2575 if (vd != rvd && vdev_writeable(vd->vdev_top)) in vdev_clear()
2576 vdev_state_dirty(vd->vdev_top); in vdev_clear()
2578 if (vd->vdev_aux == NULL && !vdev_is_dead(vd)) in vdev_clear()
2581 spa_event_notify(spa, vd, ESC_ZFS_VDEV_CLEAR); in vdev_clear()
2589 if (!vdev_is_dead(vd) && vd->vdev_parent != NULL && in vdev_clear()
2590 vd->vdev_parent->vdev_ops == &vdev_spare_ops && in vdev_clear()
2591 vd->vdev_parent->vdev_child[0] == vd) in vdev_clear()
2592 vd->vdev_unspare = B_TRUE; in vdev_clear()
2596 vdev_is_dead(vdev_t *vd) in vdev_is_dead() argument
2605 return (vd->vdev_state < VDEV_STATE_DEGRADED || vd->vdev_ishole || in vdev_is_dead()
2606 vd->vdev_ops == &vdev_missing_ops); in vdev_is_dead()
2610 vdev_readable(vdev_t *vd) in vdev_readable() argument
2612 return (!vdev_is_dead(vd) && !vd->vdev_cant_read); in vdev_readable()
2616 vdev_writeable(vdev_t *vd) in vdev_writeable() argument
2618 return (!vdev_is_dead(vd) && !vd->vdev_cant_write); in vdev_writeable()
2622 vdev_allocatable(vdev_t *vd) in vdev_allocatable() argument
2624 uint64_t state = vd->vdev_state; in vdev_allocatable()
2635 !vd->vdev_cant_write && !vd->vdev_ishole); in vdev_allocatable()
2639 vdev_accessible(vdev_t *vd, zio_t *zio) in vdev_accessible() argument
2641 ASSERT(zio->io_vd == vd); in vdev_accessible()
2643 if (vdev_is_dead(vd) || vd->vdev_remove_wanted) in vdev_accessible()
2647 return (!vd->vdev_cant_read); in vdev_accessible()
2650 return (!vd->vdev_cant_write); in vdev_accessible()
2659 vdev_get_stats(vdev_t *vd, vdev_stat_t *vs) in vdev_get_stats() argument
2661 spa_t *spa = vd->vdev_spa; in vdev_get_stats()
2666 mutex_enter(&vd->vdev_stat_lock); in vdev_get_stats()
2667 bcopy(&vd->vdev_stat, vs, sizeof (*vs)); in vdev_get_stats()
2669 vs->vs_state = vd->vdev_state; in vdev_get_stats()
2670 vs->vs_rsize = vdev_get_min_asize(vd); in vdev_get_stats()
2671 if (vd->vdev_ops->vdev_op_leaf) in vdev_get_stats()
2673 vs->vs_esize = vd->vdev_max_asize - vd->vdev_asize; in vdev_get_stats()
2674 if (vd->vdev_aux == NULL && vd == vd->vdev_top && !vd->vdev_ishole) { in vdev_get_stats()
2675 vs->vs_fragmentation = vd->vdev_mg->mg_fragmentation; in vdev_get_stats()
2682 if (vd == rvd) { in vdev_get_stats()
2694 mutex_exit(&vd->vdev_stat_lock); in vdev_get_stats()
2698 vdev_clear_stats(vdev_t *vd) in vdev_clear_stats() argument
2700 mutex_enter(&vd->vdev_stat_lock); in vdev_clear_stats()
2701 vd->vdev_stat.vs_space = 0; in vdev_clear_stats()
2702 vd->vdev_stat.vs_dspace = 0; in vdev_clear_stats()
2703 vd->vdev_stat.vs_alloc = 0; in vdev_clear_stats()
2704 mutex_exit(&vd->vdev_stat_lock); in vdev_clear_stats()
2708 vdev_scan_stat_init(vdev_t *vd) in vdev_scan_stat_init() argument
2710 vdev_stat_t *vs = &vd->vdev_stat; in vdev_scan_stat_init()
2712 for (int c = 0; c < vd->vdev_children; c++) in vdev_scan_stat_init()
2713 vdev_scan_stat_init(vd->vdev_child[c]); in vdev_scan_stat_init()
2715 mutex_enter(&vd->vdev_stat_lock); in vdev_scan_stat_init()
2717 mutex_exit(&vd->vdev_stat_lock); in vdev_scan_stat_init()
2725 vdev_t *vd = zio->io_vd ? zio->io_vd : rvd; in vdev_stat_update() local
2728 vdev_stat_t *vs = &vd->vdev_stat; in vdev_stat_update()
2753 if (vd == rvd) in vdev_stat_update()
2756 ASSERT(vd == zio->io_vd); in vdev_stat_update()
2761 mutex_enter(&vd->vdev_stat_lock); in vdev_stat_update()
2770 if (vd->vdev_ops->vdev_op_leaf) in vdev_stat_update()
2782 mutex_exit(&vd->vdev_stat_lock); in vdev_stat_update()
2807 mutex_enter(&vd->vdev_stat_lock); in vdev_stat_update()
2808 if (type == ZIO_TYPE_READ && !vdev_is_dead(vd)) { in vdev_stat_update()
2814 if (type == ZIO_TYPE_WRITE && !vdev_is_dead(vd)) in vdev_stat_update()
2816 mutex_exit(&vd->vdev_stat_lock); in vdev_stat_update()
2837 if (vd->vdev_ops->vdev_op_leaf) { in vdev_stat_update()
2842 vdev_dtl_dirty(vd, DTL_SCRUB, txg, 1); in vdev_stat_update()
2849 if (vdev_dtl_contains(vd, DTL_MISSING, txg, 1)) in vdev_stat_update()
2851 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_stat_update()
2853 vdev_dirty(vd->vdev_top, VDD_DTL, vd, commit_txg); in vdev_stat_update()
2855 if (vd != rvd) in vdev_stat_update()
2856 vdev_dtl_dirty(vd, DTL_MISSING, txg, 1); in vdev_stat_update()
2865 vdev_space_update(vdev_t *vd, int64_t alloc_delta, int64_t defer_delta, in vdev_space_update() argument
2869 spa_t *spa = vd->vdev_spa; in vdev_space_update()
2871 metaslab_group_t *mg = vd->vdev_mg; in vdev_space_update()
2874 ASSERT(vd == vd->vdev_top); in vdev_space_update()
2883 ASSERT(vd->vdev_deflate_ratio != 0 || vd->vdev_isl2cache); in vdev_space_update()
2885 vd->vdev_deflate_ratio; in vdev_space_update()
2887 mutex_enter(&vd->vdev_stat_lock); in vdev_space_update()
2888 vd->vdev_stat.vs_alloc += alloc_delta; in vdev_space_update()
2889 vd->vdev_stat.vs_space += space_delta; in vdev_space_update()
2890 vd->vdev_stat.vs_dspace += dspace_delta; in vdev_space_update()
2891 mutex_exit(&vd->vdev_stat_lock); in vdev_space_update()
2902 ASSERT(rvd == vd->vdev_parent); in vdev_space_update()
2903 ASSERT(vd->vdev_ms_count != 0); in vdev_space_update()
2916 vdev_config_dirty(vdev_t *vd) in vdev_config_dirty() argument
2918 spa_t *spa = vd->vdev_spa; in vdev_config_dirty()
2928 if (vd->vdev_aux != NULL) { in vdev_config_dirty()
2929 spa_aux_vdev_t *sav = vd->vdev_aux; in vdev_config_dirty()
2934 if (sav->sav_vdevs[c] == vd) in vdev_config_dirty()
2961 aux[c] = vdev_config_generate(spa, vd, B_TRUE, 0); in vdev_config_dirty()
2976 if (vd == rvd) { in vdev_config_dirty()
2980 ASSERT(vd == vd->vdev_top); in vdev_config_dirty()
2982 if (!list_link_active(&vd->vdev_config_dirty_node) && in vdev_config_dirty()
2983 !vd->vdev_ishole) in vdev_config_dirty()
2984 list_insert_head(&spa->spa_config_dirty_list, vd); in vdev_config_dirty()
2989 vdev_config_clean(vdev_t *vd) in vdev_config_clean() argument
2991 spa_t *spa = vd->vdev_spa; in vdev_config_clean()
2997 ASSERT(list_link_active(&vd->vdev_config_dirty_node)); in vdev_config_clean()
2998 list_remove(&spa->spa_config_dirty_list, vd); in vdev_config_clean()
3008 vdev_state_dirty(vdev_t *vd) in vdev_state_dirty() argument
3010 spa_t *spa = vd->vdev_spa; in vdev_state_dirty()
3013 ASSERT(vd == vd->vdev_top); in vdev_state_dirty()
3025 if (!list_link_active(&vd->vdev_state_dirty_node) && !vd->vdev_ishole) in vdev_state_dirty()
3026 list_insert_head(&spa->spa_state_dirty_list, vd); in vdev_state_dirty()
3030 vdev_state_clean(vdev_t *vd) in vdev_state_clean() argument
3032 spa_t *spa = vd->vdev_spa; in vdev_state_clean()
3038 ASSERT(list_link_active(&vd->vdev_state_dirty_node)); in vdev_state_clean()
3039 list_remove(&spa->spa_state_dirty_list, vd); in vdev_state_clean()
3046 vdev_propagate_state(vdev_t *vd) in vdev_propagate_state() argument
3048 spa_t *spa = vd->vdev_spa; in vdev_propagate_state()
3054 if (vd->vdev_children > 0) { in vdev_propagate_state()
3055 for (int c = 0; c < vd->vdev_children; c++) { in vdev_propagate_state()
3056 child = vd->vdev_child[c]; in vdev_propagate_state()
3071 if (child->vdev_islog && vd == rvd) in vdev_propagate_state()
3083 vd->vdev_ops->vdev_op_state_change(vd, faulted, degraded); in vdev_propagate_state()
3091 if (corrupted && vd == rvd && in vdev_propagate_state()
3097 if (vd->vdev_parent) in vdev_propagate_state()
3098 vdev_propagate_state(vd->vdev_parent); in vdev_propagate_state()
3110 vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state, vdev_aux_t aux) in vdev_set_state() argument
3113 spa_t *spa = vd->vdev_spa; in vdev_set_state()
3115 if (state == vd->vdev_state) { in vdev_set_state()
3116 vd->vdev_stat.vs_aux = aux; in vdev_set_state()
3120 save_state = vd->vdev_state; in vdev_set_state()
3122 vd->vdev_state = state; in vdev_set_state()
3123 vd->vdev_stat.vs_aux = aux; in vdev_set_state()
3135 if (!vd->vdev_delayed_close && vdev_is_dead(vd) && in vdev_set_state()
3136 vd->vdev_ops->vdev_op_leaf) in vdev_set_state()
3137 vd->vdev_ops->vdev_op_close(vd); in vdev_set_state()
3148 if (state == VDEV_STATE_HEALTHY && vd->vdev_ops->vdev_op_leaf && in vdev_set_state()
3149 vd->vdev_prevstate != state) in vdev_set_state()
3150 zfs_post_state_change(spa, vd); in vdev_set_state()
3152 if (vd->vdev_removed && in vdev_set_state()
3154 (aux == VDEV_AUX_OPEN_FAILED || vd->vdev_checkremove)) { in vdev_set_state()
3164 vd->vdev_state = VDEV_STATE_REMOVED; in vdev_set_state()
3165 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_set_state()
3167 vd->vdev_removed = B_TRUE; in vdev_set_state()
3177 vd->vdev_ops->vdev_op_leaf) in vdev_set_state()
3178 vd->vdev_not_present = 1; in vdev_set_state()
3195 if ((vd->vdev_prevstate != state || vd->vdev_forcefault) && in vdev_set_state()
3196 !vd->vdev_not_present && !vd->vdev_checkremove && in vdev_set_state()
3197 vd != spa->spa_root_vdev) { in vdev_set_state()
3223 zfs_ereport_post(class, spa, vd, NULL, save_state, 0); in vdev_set_state()
3227 vd->vdev_removed = B_FALSE; in vdev_set_state()
3229 vd->vdev_removed = B_FALSE; in vdev_set_state()
3232 if (!isopen && vd->vdev_parent) in vdev_set_state()
3233 vdev_propagate_state(vd->vdev_parent); in vdev_set_state()
3243 vdev_is_bootable(vdev_t *vd) in vdev_is_bootable() argument
3245 if (!vd->vdev_ops->vdev_op_leaf) { in vdev_is_bootable()
3246 char *vdev_type = vd->vdev_ops->vdev_op_type; in vdev_is_bootable()
3249 vd->vdev_children > 1) { in vdev_is_bootable()
3257 for (int c = 0; c < vd->vdev_children; c++) { in vdev_is_bootable()
3258 if (!vdev_is_bootable(vd->vdev_child[c])) in vdev_is_bootable()
3299 vdev_log_state_valid(vdev_t *vd) in vdev_log_state_valid() argument
3301 if (vd->vdev_ops->vdev_op_leaf && !vd->vdev_faulted && in vdev_log_state_valid()
3302 !vd->vdev_removed) in vdev_log_state_valid()
3305 for (int c = 0; c < vd->vdev_children; c++) in vdev_log_state_valid()
3306 if (vdev_log_state_valid(vd->vdev_child[c])) in vdev_log_state_valid()
3316 vdev_expand(vdev_t *vd, uint64_t txg) in vdev_expand() argument
3318 ASSERT(vd->vdev_top == vd); in vdev_expand()
3319 ASSERT(spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER) == SCL_ALL); in vdev_expand()
3321 if ((vd->vdev_asize >> vd->vdev_ms_shift) > vd->vdev_ms_count) { in vdev_expand()
3322 VERIFY(vdev_metaslab_init(vd, txg) == 0); in vdev_expand()
3323 vdev_config_dirty(vd); in vdev_expand()
3331 vdev_split(vdev_t *vd) in vdev_split() argument
3333 vdev_t *cvd, *pvd = vd->vdev_parent; in vdev_split()
3335 vdev_remove_child(pvd, vd); in vdev_split()
3347 vdev_deadman(vdev_t *vd) in vdev_deadman() argument
3349 for (int c = 0; c < vd->vdev_children; c++) { in vdev_deadman()
3350 vdev_t *cvd = vd->vdev_child[c]; in vdev_deadman()
3355 if (vd->vdev_ops->vdev_op_leaf) { in vdev_deadman()
3356 vdev_queue_t *vq = &vd->vdev_queue; in vdev_deadman()
3360 spa_t *spa = vd->vdev_spa; in vdev_deadman()