Lines Matching refs:vd
93 vdev_default_asize(vdev_t *vd, uint64_t psize) in vdev_default_asize() argument
95 uint64_t asize = P2ROUNDUP(psize, 1ULL << vd->vdev_top->vdev_ashift); in vdev_default_asize()
98 for (int c = 0; c < vd->vdev_children; c++) { in vdev_default_asize()
99 csize = vdev_psize_to_asize(vd->vdev_child[c], psize); in vdev_default_asize()
113 vdev_get_min_asize(vdev_t *vd) in vdev_get_min_asize() argument
115 vdev_t *pvd = vd->vdev_parent; in vdev_get_min_asize()
122 return (vd->vdev_asize); in vdev_get_min_asize()
128 if (vd == vd->vdev_top) in vdev_get_min_asize()
129 return (P2ALIGN(vd->vdev_asize, 1ULL << vd->vdev_ms_shift)); in vdev_get_min_asize()
142 vdev_set_min_asize(vdev_t *vd) in vdev_set_min_asize() argument
144 vd->vdev_min_asize = vdev_get_min_asize(vd); in vdev_set_min_asize()
146 for (int c = 0; c < vd->vdev_children; c++) in vdev_set_min_asize()
147 vdev_set_min_asize(vd->vdev_child[c]); in vdev_set_min_asize()
166 vdev_lookup_by_guid(vdev_t *vd, uint64_t guid) in vdev_lookup_by_guid() argument
170 if (vd->vdev_guid == guid) in vdev_lookup_by_guid()
171 return (vd); in vdev_lookup_by_guid()
173 for (int c = 0; c < vd->vdev_children; c++) in vdev_lookup_by_guid()
174 if ((mvd = vdev_lookup_by_guid(vd->vdev_child[c], guid)) != in vdev_lookup_by_guid()
182 vdev_count_leaves_impl(vdev_t *vd) in vdev_count_leaves_impl() argument
186 if (vd->vdev_ops->vdev_op_leaf) in vdev_count_leaves_impl()
189 for (int c = 0; c < vd->vdev_children; c++) in vdev_count_leaves_impl()
190 n += vdev_count_leaves_impl(vd->vdev_child[c]); in vdev_count_leaves_impl()
312 vdev_t *vd; in vdev_alloc_common() local
314 vd = kmem_zalloc(sizeof (vdev_t), KM_SLEEP); in vdev_alloc_common()
318 spa->spa_root_vdev = vd; in vdev_alloc_common()
323 if (spa->spa_root_vdev == vd) { in vdev_alloc_common()
338 vd->vdev_spa = spa; in vdev_alloc_common()
339 vd->vdev_id = id; in vdev_alloc_common()
340 vd->vdev_guid = guid; in vdev_alloc_common()
341 vd->vdev_guid_sum = guid; in vdev_alloc_common()
342 vd->vdev_ops = ops; in vdev_alloc_common()
343 vd->vdev_state = VDEV_STATE_CLOSED; in vdev_alloc_common()
344 vd->vdev_ishole = (ops == &vdev_hole_ops); in vdev_alloc_common()
346 mutex_init(&vd->vdev_dtl_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
347 mutex_init(&vd->vdev_stat_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
348 mutex_init(&vd->vdev_probe_lock, NULL, MUTEX_DEFAULT, NULL); in vdev_alloc_common()
350 vd->vdev_dtl[t] = range_tree_create(NULL, NULL, in vdev_alloc_common()
351 &vd->vdev_dtl_lock); in vdev_alloc_common()
353 txg_list_create(&vd->vdev_ms_list, in vdev_alloc_common()
355 txg_list_create(&vd->vdev_dtl_list, in vdev_alloc_common()
357 vd->vdev_stat.vs_timestamp = gethrtime(); in vdev_alloc_common()
358 vdev_queue_init(vd); in vdev_alloc_common()
359 vdev_cache_init(vd); in vdev_alloc_common()
361 return (vd); in vdev_alloc_common()
376 vdev_t *vd; in vdev_alloc() local
463 vd = vdev_alloc_common(spa, id, guid, ops); in vdev_alloc()
465 vd->vdev_islog = islog; in vdev_alloc()
466 vd->vdev_nparity = nparity; in vdev_alloc()
468 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &vd->vdev_path) == 0) in vdev_alloc()
469 vd->vdev_path = spa_strdup(vd->vdev_path); in vdev_alloc()
470 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &vd->vdev_devid) == 0) in vdev_alloc()
471 vd->vdev_devid = spa_strdup(vd->vdev_devid); in vdev_alloc()
473 &vd->vdev_physpath) == 0) in vdev_alloc()
474 vd->vdev_physpath = spa_strdup(vd->vdev_physpath); in vdev_alloc()
475 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_FRU, &vd->vdev_fru) == 0) in vdev_alloc()
476 vd->vdev_fru = spa_strdup(vd->vdev_fru); in vdev_alloc()
483 &vd->vdev_wholedisk) != 0) in vdev_alloc()
484 vd->vdev_wholedisk = -1ULL; in vdev_alloc()
491 &vd->vdev_not_present); in vdev_alloc()
496 (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ASHIFT, &vd->vdev_ashift); in vdev_alloc()
502 &vd->vdev_crtxg); in vdev_alloc()
510 &vd->vdev_ms_array); in vdev_alloc()
512 &vd->vdev_ms_shift); in vdev_alloc()
514 &vd->vdev_asize); in vdev_alloc()
516 &vd->vdev_removing); in vdev_alloc()
524 vd->vdev_mg = metaslab_group_create(islog ? in vdev_alloc()
525 spa_log_class(spa) : spa_normal_class(spa), vd); in vdev_alloc()
531 if (vd->vdev_ops->vdev_op_leaf && in vdev_alloc()
536 &vd->vdev_dtl_object); in vdev_alloc()
538 &vd->vdev_unspare); in vdev_alloc()
546 spa_spare_add(vd); in vdev_alloc()
550 &vd->vdev_offline); in vdev_alloc()
553 &vd->vdev_resilver_txg); in vdev_alloc()
563 &vd->vdev_faulted); in vdev_alloc()
565 &vd->vdev_degraded); in vdev_alloc()
567 &vd->vdev_removed); in vdev_alloc()
569 if (vd->vdev_faulted || vd->vdev_degraded) { in vdev_alloc()
572 vd->vdev_label_aux = in vdev_alloc()
577 vd->vdev_label_aux = VDEV_AUX_EXTERNAL; in vdev_alloc()
585 vdev_add_child(parent, vd); in vdev_alloc()
587 *vdp = vd; in vdev_alloc()
593 vdev_free(vdev_t *vd) in vdev_free() argument
595 spa_t *spa = vd->vdev_spa; in vdev_free()
601 vdev_close(vd); in vdev_free()
603 ASSERT(!list_link_active(&vd->vdev_config_dirty_node)); in vdev_free()
604 ASSERT(!list_link_active(&vd->vdev_state_dirty_node)); in vdev_free()
609 for (int c = 0; c < vd->vdev_children; c++) in vdev_free()
610 vdev_free(vd->vdev_child[c]); in vdev_free()
612 ASSERT(vd->vdev_child == NULL); in vdev_free()
613 ASSERT(vd->vdev_guid_sum == vd->vdev_guid); in vdev_free()
618 if (vd->vdev_mg != NULL) { in vdev_free()
619 vdev_metaslab_fini(vd); in vdev_free()
620 metaslab_group_destroy(vd->vdev_mg); in vdev_free()
623 ASSERT0(vd->vdev_stat.vs_space); in vdev_free()
624 ASSERT0(vd->vdev_stat.vs_dspace); in vdev_free()
625 ASSERT0(vd->vdev_stat.vs_alloc); in vdev_free()
630 vdev_remove_child(vd->vdev_parent, vd); in vdev_free()
632 ASSERT(vd->vdev_parent == NULL); in vdev_free()
637 vdev_queue_fini(vd); in vdev_free()
638 vdev_cache_fini(vd); in vdev_free()
640 if (vd->vdev_path) in vdev_free()
641 spa_strfree(vd->vdev_path); in vdev_free()
642 if (vd->vdev_devid) in vdev_free()
643 spa_strfree(vd->vdev_devid); in vdev_free()
644 if (vd->vdev_physpath) in vdev_free()
645 spa_strfree(vd->vdev_physpath); in vdev_free()
646 if (vd->vdev_fru) in vdev_free()
647 spa_strfree(vd->vdev_fru); in vdev_free()
649 if (vd->vdev_isspare) in vdev_free()
650 spa_spare_remove(vd); in vdev_free()
651 if (vd->vdev_isl2cache) in vdev_free()
652 spa_l2cache_remove(vd); in vdev_free()
654 txg_list_destroy(&vd->vdev_ms_list); in vdev_free()
655 txg_list_destroy(&vd->vdev_dtl_list); in vdev_free()
657 mutex_enter(&vd->vdev_dtl_lock); in vdev_free()
658 space_map_close(vd->vdev_dtl_sm); in vdev_free()
660 range_tree_vacate(vd->vdev_dtl[t], NULL, NULL); in vdev_free()
661 range_tree_destroy(vd->vdev_dtl[t]); in vdev_free()
663 mutex_exit(&vd->vdev_dtl_lock); in vdev_free()
665 mutex_destroy(&vd->vdev_dtl_lock); in vdev_free()
666 mutex_destroy(&vd->vdev_stat_lock); in vdev_free()
667 mutex_destroy(&vd->vdev_probe_lock); in vdev_free()
669 if (vd == spa->spa_root_vdev) in vdev_free()
672 kmem_free(vd, sizeof (vdev_t)); in vdev_free()
683 vdev_t *vd; in vdev_top_transfer() local
718 while ((vd = txg_list_remove(&svd->vdev_dtl_list, t)) != NULL) in vdev_top_transfer()
719 (void) txg_list_add(&tvd->vdev_dtl_list, vd, t); in vdev_top_transfer()
742 vdev_top_update(vdev_t *tvd, vdev_t *vd) in vdev_top_update() argument
744 if (vd == NULL) in vdev_top_update()
747 vd->vdev_top = tvd; in vdev_top_update()
749 for (int c = 0; c < vd->vdev_children; c++) in vdev_top_update()
750 vdev_top_update(tvd, vd->vdev_child[c]); in vdev_top_update()
830 vdev_metaslab_init(vdev_t *vd, uint64_t txg) in vdev_metaslab_init() argument
832 spa_t *spa = vd->vdev_spa; in vdev_metaslab_init()
835 uint64_t oldc = vd->vdev_ms_count; in vdev_metaslab_init()
836 uint64_t newc = vd->vdev_asize >> vd->vdev_ms_shift; in vdev_metaslab_init()
845 if (vd->vdev_ms_shift == 0) in vdev_metaslab_init()
848 ASSERT(!vd->vdev_ishole); in vdev_metaslab_init()
856 vd->vdev_deflate_ratio = (1 << 17) / in vdev_metaslab_init()
857 (vdev_psize_to_asize(vd, 1 << 17) >> SPA_MINBLOCKSHIFT); in vdev_metaslab_init()
864 bcopy(vd->vdev_ms, mspp, oldc * sizeof (*mspp)); in vdev_metaslab_init()
865 kmem_free(vd->vdev_ms, oldc * sizeof (*mspp)); in vdev_metaslab_init()
868 vd->vdev_ms = mspp; in vdev_metaslab_init()
869 vd->vdev_ms_count = newc; in vdev_metaslab_init()
875 error = dmu_read(mos, vd->vdev_ms_array, in vdev_metaslab_init()
882 error = metaslab_init(vd->vdev_mg, m, object, txg, in vdev_metaslab_init()
883 &(vd->vdev_ms[m])); in vdev_metaslab_init()
896 if (oldc == 0 && !vd->vdev_removing) in vdev_metaslab_init()
897 metaslab_group_activate(vd->vdev_mg); in vdev_metaslab_init()
906 vdev_metaslab_fini(vdev_t *vd) in vdev_metaslab_fini() argument
909 uint64_t count = vd->vdev_ms_count; in vdev_metaslab_fini()
911 if (vd->vdev_ms != NULL) { in vdev_metaslab_fini()
912 metaslab_group_passivate(vd->vdev_mg); in vdev_metaslab_fini()
914 metaslab_t *msp = vd->vdev_ms[m]; in vdev_metaslab_fini()
919 kmem_free(vd->vdev_ms, count * sizeof (metaslab_t *)); in vdev_metaslab_fini()
920 vd->vdev_ms = NULL; in vdev_metaslab_fini()
934 vdev_t *vd = zio->io_vd; in vdev_probe_done() local
937 ASSERT(vd->vdev_probe_zio != NULL); in vdev_probe_done()
943 zio_nowait(zio_write_phys(vd->vdev_probe_zio, vd, in vdev_probe_done()
957 vd->vdev_cant_read |= !vps->vps_readable; in vdev_probe_done()
958 vd->vdev_cant_write |= !vps->vps_writeable; in vdev_probe_done()
960 if (vdev_readable(vd) && in vdev_probe_done()
961 (vdev_writeable(vd) || !spa_writeable(spa))) { in vdev_probe_done()
966 spa, vd, NULL, 0, 0); in vdev_probe_done()
970 mutex_enter(&vd->vdev_probe_lock); in vdev_probe_done()
971 ASSERT(vd->vdev_probe_zio == zio); in vdev_probe_done()
972 vd->vdev_probe_zio = NULL; in vdev_probe_done()
973 mutex_exit(&vd->vdev_probe_lock); in vdev_probe_done()
976 if (!vdev_accessible(vd, pio)) in vdev_probe_done()
991 vdev_probe(vdev_t *vd, zio_t *zio) in vdev_probe() argument
993 spa_t *spa = vd->vdev_spa; in vdev_probe()
997 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_probe()
1010 mutex_enter(&vd->vdev_probe_lock); in vdev_probe()
1012 if ((pio = vd->vdev_probe_zio) == NULL) { in vdev_probe()
1037 vd->vdev_cant_read = B_FALSE; in vdev_probe()
1038 vd->vdev_cant_write = B_FALSE; in vdev_probe()
1041 vd->vdev_probe_zio = pio = zio_null(NULL, spa, vd, in vdev_probe()
1050 vd->vdev_probe_wanted = B_TRUE; in vdev_probe()
1058 mutex_exit(&vd->vdev_probe_lock); in vdev_probe()
1066 zio_nowait(zio_read_phys(pio, vd, in vdev_probe()
1067 vdev_label_offset(vd->vdev_psize, l, in vdev_probe()
1084 vdev_t *vd = arg; in vdev_open_child() local
1086 vd->vdev_open_thread = curthread; in vdev_open_child()
1087 vd->vdev_open_error = vdev_open(vd); in vdev_open_child()
1088 vd->vdev_open_thread = NULL; in vdev_open_child()
1092 vdev_uses_zvols(vdev_t *vd) in vdev_uses_zvols() argument
1094 if (vd->vdev_path && strncmp(vd->vdev_path, ZVOL_DIR, in vdev_uses_zvols()
1097 for (int c = 0; c < vd->vdev_children; c++) in vdev_uses_zvols()
1098 if (vdev_uses_zvols(vd->vdev_child[c])) in vdev_uses_zvols()
1104 vdev_open_children(vdev_t *vd) in vdev_open_children() argument
1107 int children = vd->vdev_children; in vdev_open_children()
1114 if (vdev_uses_zvols(vd)) { in vdev_open_children()
1116 vd->vdev_child[c]->vdev_open_error = in vdev_open_children()
1117 vdev_open(vd->vdev_child[c]); in vdev_open_children()
1124 VERIFY(taskq_dispatch(tq, vdev_open_child, vd->vdev_child[c], in vdev_open_children()
1134 vdev_open(vdev_t *vd) in vdev_open() argument
1136 spa_t *spa = vd->vdev_spa; in vdev_open()
1143 ASSERT(vd->vdev_open_thread == curthread || in vdev_open()
1145 ASSERT(vd->vdev_state == VDEV_STATE_CLOSED || in vdev_open()
1146 vd->vdev_state == VDEV_STATE_CANT_OPEN || in vdev_open()
1147 vd->vdev_state == VDEV_STATE_OFFLINE); in vdev_open()
1149 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_open()
1150 vd->vdev_cant_read = B_FALSE; in vdev_open()
1151 vd->vdev_cant_write = B_FALSE; in vdev_open()
1152 vd->vdev_min_asize = vdev_get_min_asize(vd); in vdev_open()
1158 if (!vd->vdev_removed && vd->vdev_faulted) { in vdev_open()
1159 ASSERT(vd->vdev_children == 0); in vdev_open()
1160 ASSERT(vd->vdev_label_aux == VDEV_AUX_ERR_EXCEEDED || in vdev_open()
1161 vd->vdev_label_aux == VDEV_AUX_EXTERNAL); in vdev_open()
1162 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1163 vd->vdev_label_aux); in vdev_open()
1165 } else if (vd->vdev_offline) { in vdev_open()
1166 ASSERT(vd->vdev_children == 0); in vdev_open()
1167 vdev_set_state(vd, B_TRUE, VDEV_STATE_OFFLINE, VDEV_AUX_NONE); in vdev_open()
1171 error = vd->vdev_ops->vdev_op_open(vd, &osize, &max_osize, &ashift); in vdev_open()
1177 vd->vdev_reopening = B_FALSE; in vdev_open()
1179 error = zio_handle_device_injection(vd, NULL, ENXIO); in vdev_open()
1182 if (vd->vdev_removed && in vdev_open()
1183 vd->vdev_stat.vs_aux != VDEV_AUX_OPEN_FAILED) in vdev_open()
1184 vd->vdev_removed = B_FALSE; in vdev_open()
1186 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1187 vd->vdev_stat.vs_aux); in vdev_open()
1191 vd->vdev_removed = B_FALSE; in vdev_open()
1197 if (vd->vdev_faulted) { in vdev_open()
1198 ASSERT(vd->vdev_children == 0); in vdev_open()
1199 ASSERT(vd->vdev_label_aux == VDEV_AUX_ERR_EXCEEDED || in vdev_open()
1200 vd->vdev_label_aux == VDEV_AUX_EXTERNAL); in vdev_open()
1201 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1202 vd->vdev_label_aux); in vdev_open()
1206 if (vd->vdev_degraded) { in vdev_open()
1207 ASSERT(vd->vdev_children == 0); in vdev_open()
1208 vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED, in vdev_open()
1211 vdev_set_state(vd, B_TRUE, VDEV_STATE_HEALTHY, 0); in vdev_open()
1217 if (vd->vdev_ishole || vd->vdev_ops == &vdev_missing_ops) in vdev_open()
1220 for (int c = 0; c < vd->vdev_children; c++) { in vdev_open()
1221 if (vd->vdev_child[c]->vdev_state != VDEV_STATE_HEALTHY) { in vdev_open()
1222 vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED, in vdev_open()
1231 if (vd->vdev_children == 0) { in vdev_open()
1233 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1242 if (vd->vdev_parent != NULL && osize < SPA_MINDEVSIZE - in vdev_open()
1244 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1253 vd->vdev_psize = psize; in vdev_open()
1258 if (asize < vd->vdev_min_asize) { in vdev_open()
1259 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_open()
1264 if (vd->vdev_asize == 0) { in vdev_open()
1269 vd->vdev_asize = asize; in vdev_open()
1270 vd->vdev_max_asize = max_asize; in vdev_open()
1271 vd->vdev_ashift = MAX(ashift, vd->vdev_ashift); in vdev_open()
1278 if (ashift > vd->vdev_top->vdev_ashift && in vdev_open()
1279 vd->vdev_ops->vdev_op_leaf) { in vdev_open()
1283 vd->vdev_path); in vdev_open()
1285 vd->vdev_max_asize = max_asize; in vdev_open()
1293 if (vd->vdev_state == VDEV_STATE_HEALTHY && asize > vd->vdev_asize && in vdev_open()
1294 (vd->vdev_expanding || spa->spa_autoexpand)) in vdev_open()
1295 vd->vdev_asize = asize; in vdev_open()
1297 vdev_set_min_asize(vd); in vdev_open()
1303 if (vd->vdev_ops->vdev_op_leaf && in vdev_open()
1304 (error = zio_wait(vdev_probe(vd, NULL))) != 0) { in vdev_open()
1305 vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED, in vdev_open()
1313 if (vd->vdev_top == vd && vd->vdev_ashift != 0 && in vdev_open()
1314 !vd->vdev_islog && vd->vdev_aux == NULL) { in vdev_open()
1315 if (vd->vdev_ashift > spa->spa_max_ashift) in vdev_open()
1316 spa->spa_max_ashift = vd->vdev_ashift; in vdev_open()
1317 if (vd->vdev_ashift < spa->spa_min_ashift) in vdev_open()
1318 spa->spa_min_ashift = vd->vdev_ashift; in vdev_open()
1326 if (vd->vdev_ops->vdev_op_leaf && !spa->spa_scrub_reopen && in vdev_open()
1327 vdev_resilver_needed(vd, NULL, NULL)) in vdev_open()
1349 vdev_validate(vdev_t *vd, boolean_t strict) in vdev_validate() argument
1351 spa_t *spa = vd->vdev_spa; in vdev_validate()
1356 for (int c = 0; c < vd->vdev_children; c++) in vdev_validate()
1357 if (vdev_validate(vd->vdev_child[c], strict) != 0) in vdev_validate()
1365 if (vd->vdev_ops->vdev_op_leaf && vdev_readable(vd)) { in vdev_validate()
1371 if ((label = vdev_label_read_config(vd, txg)) == NULL) { in vdev_validate()
1372 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1383 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1392 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1419 ((vd->vdev_guid != guid && vd->vdev_guid != aux_guid) && in vdev_validate()
1420 (vd->vdev_guid != top_guid || vd != vd->vdev_top))) { in vdev_validate()
1421 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1429 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_validate()
1451 if (vd->vdev_not_present) in vdev_validate()
1452 vd->vdev_not_present = 0; in vdev_validate()
1462 vdev_close(vdev_t *vd) in vdev_close() argument
1464 spa_t *spa = vd->vdev_spa; in vdev_close()
1465 vdev_t *pvd = vd->vdev_parent; in vdev_close()
1474 vd->vdev_reopening = (pvd->vdev_reopening && !vd->vdev_offline); in vdev_close()
1476 vd->vdev_ops->vdev_op_close(vd); in vdev_close()
1478 vdev_cache_purge(vd); in vdev_close()
1485 vd->vdev_prevstate = vd->vdev_state; in vdev_close()
1487 if (vd->vdev_offline) in vdev_close()
1488 vd->vdev_state = VDEV_STATE_OFFLINE; in vdev_close()
1490 vd->vdev_state = VDEV_STATE_CLOSED; in vdev_close()
1491 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_close()
1495 vdev_hold(vdev_t *vd) in vdev_hold() argument
1497 spa_t *spa = vd->vdev_spa; in vdev_hold()
1503 for (int c = 0; c < vd->vdev_children; c++) in vdev_hold()
1504 vdev_hold(vd->vdev_child[c]); in vdev_hold()
1506 if (vd->vdev_ops->vdev_op_leaf) in vdev_hold()
1507 vd->vdev_ops->vdev_op_hold(vd); in vdev_hold()
1511 vdev_rele(vdev_t *vd) in vdev_rele() argument
1513 spa_t *spa = vd->vdev_spa; in vdev_rele()
1516 for (int c = 0; c < vd->vdev_children; c++) in vdev_rele()
1517 vdev_rele(vd->vdev_child[c]); in vdev_rele()
1519 if (vd->vdev_ops->vdev_op_leaf) in vdev_rele()
1520 vd->vdev_ops->vdev_op_rele(vd); in vdev_rele()
1530 vdev_reopen(vdev_t *vd) in vdev_reopen() argument
1532 spa_t *spa = vd->vdev_spa; in vdev_reopen()
1537 vd->vdev_reopening = !vd->vdev_offline; in vdev_reopen()
1538 vdev_close(vd); in vdev_reopen()
1539 (void) vdev_open(vd); in vdev_reopen()
1546 if (vd->vdev_aux) { in vdev_reopen()
1547 (void) vdev_validate_aux(vd); in vdev_reopen()
1548 if (vdev_readable(vd) && vdev_writeable(vd) && in vdev_reopen()
1549 vd->vdev_aux == &spa->spa_l2cache && in vdev_reopen()
1550 !l2arc_vdev_present(vd)) { in vdev_reopen()
1556 l2arc_add_vdev(spa, vd, B_TRUE); in vdev_reopen()
1559 (void) vdev_validate(vd, B_TRUE); in vdev_reopen()
1565 vdev_propagate_state(vd); in vdev_reopen()
1569 vdev_create(vdev_t *vd, uint64_t txg, boolean_t isreplacing) in vdev_create() argument
1578 error = vdev_open(vd); in vdev_create()
1580 if (error || vd->vdev_state != VDEV_STATE_HEALTHY) { in vdev_create()
1581 vdev_close(vd); in vdev_create()
1588 if ((error = vdev_dtl_load(vd)) != 0 || in vdev_create()
1589 (error = vdev_label_init(vd, txg, isreplacing ? in vdev_create()
1591 vdev_close(vd); in vdev_create()
1599 vdev_metaslab_set_size(vdev_t *vd) in vdev_metaslab_set_size() argument
1604 vd->vdev_ms_shift = highbit64(vd->vdev_asize / metaslabs_per_vdev); in vdev_metaslab_set_size()
1605 vd->vdev_ms_shift = MAX(vd->vdev_ms_shift, SPA_MAXBLOCKSHIFT); in vdev_metaslab_set_size()
1609 vdev_dirty(vdev_t *vd, int flags, void *arg, uint64_t txg) in vdev_dirty() argument
1611 ASSERT(vd == vd->vdev_top); in vdev_dirty()
1612 ASSERT(!vd->vdev_ishole); in vdev_dirty()
1614 ASSERT(spa_writeable(vd->vdev_spa)); in vdev_dirty()
1617 (void) txg_list_add(&vd->vdev_ms_list, arg, txg); in vdev_dirty()
1620 (void) txg_list_add(&vd->vdev_dtl_list, arg, txg); in vdev_dirty()
1622 (void) txg_list_add(&vd->vdev_spa->spa_vdev_txg_list, vd, txg); in vdev_dirty()
1626 vdev_dirty_leaves(vdev_t *vd, int flags, uint64_t txg) in vdev_dirty_leaves() argument
1628 for (int c = 0; c < vd->vdev_children; c++) in vdev_dirty_leaves()
1629 vdev_dirty_leaves(vd->vdev_child[c], flags, txg); in vdev_dirty_leaves()
1631 if (vd->vdev_ops->vdev_op_leaf) in vdev_dirty_leaves()
1632 vdev_dirty(vd->vdev_top, flags, vd, txg); in vdev_dirty_leaves()
1674 vdev_dtl_dirty(vdev_t *vd, vdev_dtl_type_t t, uint64_t txg, uint64_t size) in vdev_dtl_dirty() argument
1676 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_dirty()
1679 ASSERT(vd != vd->vdev_spa->spa_root_vdev); in vdev_dtl_dirty()
1680 ASSERT(spa_writeable(vd->vdev_spa)); in vdev_dtl_dirty()
1689 vdev_dtl_contains(vdev_t *vd, vdev_dtl_type_t t, uint64_t txg, uint64_t size) in vdev_dtl_contains() argument
1691 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_contains()
1695 ASSERT(vd != vd->vdev_spa->spa_root_vdev); in vdev_dtl_contains()
1706 vdev_dtl_empty(vdev_t *vd, vdev_dtl_type_t t) in vdev_dtl_empty() argument
1708 range_tree_t *rt = vd->vdev_dtl[t]; in vdev_dtl_empty()
1722 vdev_dtl_min(vdev_t *vd) in vdev_dtl_min() argument
1726 ASSERT(MUTEX_HELD(&vd->vdev_dtl_lock)); in vdev_dtl_min()
1727 ASSERT3U(range_tree_space(vd->vdev_dtl[DTL_MISSING]), !=, 0); in vdev_dtl_min()
1728 ASSERT0(vd->vdev_children); in vdev_dtl_min()
1730 rs = avl_first(&vd->vdev_dtl[DTL_MISSING]->rt_root); in vdev_dtl_min()
1738 vdev_dtl_max(vdev_t *vd) in vdev_dtl_max() argument
1742 ASSERT(MUTEX_HELD(&vd->vdev_dtl_lock)); in vdev_dtl_max()
1743 ASSERT3U(range_tree_space(vd->vdev_dtl[DTL_MISSING]), !=, 0); in vdev_dtl_max()
1744 ASSERT0(vd->vdev_children); in vdev_dtl_max()
1746 rs = avl_last(&vd->vdev_dtl[DTL_MISSING]->rt_root); in vdev_dtl_max()
1759 vdev_dtl_should_excise(vdev_t *vd) in vdev_dtl_should_excise() argument
1761 spa_t *spa = vd->vdev_spa; in vdev_dtl_should_excise()
1765 ASSERT0(vd->vdev_children); in vdev_dtl_should_excise()
1767 if (vd->vdev_resilver_txg == 0 || in vdev_dtl_should_excise()
1768 range_tree_space(vd->vdev_dtl[DTL_MISSING]) == 0) in vdev_dtl_should_excise()
1778 if (vdev_dtl_max(vd) <= scn->scn_phys.scn_max_txg) { in vdev_dtl_should_excise()
1779 ASSERT3U(scn->scn_phys.scn_min_txg, <=, vdev_dtl_min(vd)); in vdev_dtl_should_excise()
1780 ASSERT3U(scn->scn_phys.scn_min_txg, <, vd->vdev_resilver_txg); in vdev_dtl_should_excise()
1781 ASSERT3U(vd->vdev_resilver_txg, <=, scn->scn_phys.scn_max_txg); in vdev_dtl_should_excise()
1791 vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg, int scrub_done) in vdev_dtl_reassess() argument
1793 spa_t *spa = vd->vdev_spa; in vdev_dtl_reassess()
1799 for (int c = 0; c < vd->vdev_children; c++) in vdev_dtl_reassess()
1800 vdev_dtl_reassess(vd->vdev_child[c], txg, in vdev_dtl_reassess()
1803 if (vd == spa->spa_root_vdev || vd->vdev_ishole || vd->vdev_aux) in vdev_dtl_reassess()
1806 if (vd->vdev_ops->vdev_op_leaf) { in vdev_dtl_reassess()
1809 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
1820 vdev_dtl_should_excise(vd)) { in vdev_dtl_reassess()
1840 vd->vdev_dtl[DTL_MISSING], 1); in vdev_dtl_reassess()
1843 vd->vdev_dtl[DTL_SCRUB], 2); in vdev_dtl_reassess()
1845 vd->vdev_dtl[DTL_MISSING], 1); in vdev_dtl_reassess()
1848 range_tree_vacate(vd->vdev_dtl[DTL_PARTIAL], NULL, NULL); in vdev_dtl_reassess()
1849 range_tree_walk(vd->vdev_dtl[DTL_MISSING], in vdev_dtl_reassess()
1850 range_tree_add, vd->vdev_dtl[DTL_PARTIAL]); in vdev_dtl_reassess()
1852 range_tree_vacate(vd->vdev_dtl[DTL_SCRUB], NULL, NULL); in vdev_dtl_reassess()
1853 range_tree_vacate(vd->vdev_dtl[DTL_OUTAGE], NULL, NULL); in vdev_dtl_reassess()
1854 if (!vdev_readable(vd)) in vdev_dtl_reassess()
1855 range_tree_add(vd->vdev_dtl[DTL_OUTAGE], 0, -1ULL); in vdev_dtl_reassess()
1857 range_tree_walk(vd->vdev_dtl[DTL_MISSING], in vdev_dtl_reassess()
1858 range_tree_add, vd->vdev_dtl[DTL_OUTAGE]); in vdev_dtl_reassess()
1864 if (vd->vdev_resilver_txg != 0 && in vdev_dtl_reassess()
1865 range_tree_space(vd->vdev_dtl[DTL_MISSING]) == 0 && in vdev_dtl_reassess()
1866 range_tree_space(vd->vdev_dtl[DTL_OUTAGE]) == 0) in vdev_dtl_reassess()
1867 vd->vdev_resilver_txg = 0; in vdev_dtl_reassess()
1869 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
1872 vdev_dirty(vd->vdev_top, VDD_DTL, vd, txg); in vdev_dtl_reassess()
1876 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
1884 else if (vd->vdev_nparity != 0) in vdev_dtl_reassess()
1885 minref = vd->vdev_nparity + 1; /* RAID-Z */ in vdev_dtl_reassess()
1887 minref = vd->vdev_children; /* any kind of mirror */ in vdev_dtl_reassess()
1889 for (int c = 0; c < vd->vdev_children; c++) { in vdev_dtl_reassess()
1890 vdev_t *cvd = vd->vdev_child[c]; in vdev_dtl_reassess()
1895 space_reftree_generate_map(&reftree, vd->vdev_dtl[t], minref); in vdev_dtl_reassess()
1898 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_reassess()
1902 vdev_dtl_load(vdev_t *vd) in vdev_dtl_load() argument
1904 spa_t *spa = vd->vdev_spa; in vdev_dtl_load()
1908 if (vd->vdev_ops->vdev_op_leaf && vd->vdev_dtl_object != 0) { in vdev_dtl_load()
1909 ASSERT(!vd->vdev_ishole); in vdev_dtl_load()
1911 error = space_map_open(&vd->vdev_dtl_sm, mos, in vdev_dtl_load()
1912 vd->vdev_dtl_object, 0, -1ULL, 0, &vd->vdev_dtl_lock); in vdev_dtl_load()
1915 ASSERT(vd->vdev_dtl_sm != NULL); in vdev_dtl_load()
1917 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_load()
1923 space_map_update(vd->vdev_dtl_sm); in vdev_dtl_load()
1925 error = space_map_load(vd->vdev_dtl_sm, in vdev_dtl_load()
1926 vd->vdev_dtl[DTL_MISSING], SM_ALLOC); in vdev_dtl_load()
1927 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_load()
1932 for (int c = 0; c < vd->vdev_children; c++) { in vdev_dtl_load()
1933 error = vdev_dtl_load(vd->vdev_child[c]); in vdev_dtl_load()
1942 vdev_dtl_sync(vdev_t *vd, uint64_t txg) in vdev_dtl_sync() argument
1944 spa_t *spa = vd->vdev_spa; in vdev_dtl_sync()
1945 range_tree_t *rt = vd->vdev_dtl[DTL_MISSING]; in vdev_dtl_sync()
1950 uint64_t object = space_map_object(vd->vdev_dtl_sm); in vdev_dtl_sync()
1952 ASSERT(!vd->vdev_ishole); in vdev_dtl_sync()
1953 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_dtl_sync()
1957 if (vd->vdev_detached || vd->vdev_top->vdev_removing) { in vdev_dtl_sync()
1958 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_sync()
1959 space_map_free(vd->vdev_dtl_sm, tx); in vdev_dtl_sync()
1960 space_map_close(vd->vdev_dtl_sm); in vdev_dtl_sync()
1961 vd->vdev_dtl_sm = NULL; in vdev_dtl_sync()
1962 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_sync()
1967 if (vd->vdev_dtl_sm == NULL) { in vdev_dtl_sync()
1973 VERIFY0(space_map_open(&vd->vdev_dtl_sm, mos, new_object, in vdev_dtl_sync()
1974 0, -1ULL, 0, &vd->vdev_dtl_lock)); in vdev_dtl_sync()
1975 ASSERT(vd->vdev_dtl_sm != NULL); in vdev_dtl_sync()
1984 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_sync()
1986 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_sync()
1988 space_map_truncate(vd->vdev_dtl_sm, tx); in vdev_dtl_sync()
1989 space_map_write(vd->vdev_dtl_sm, rtsync, SM_ALLOC, tx); in vdev_dtl_sync()
2001 if (object != space_map_object(vd->vdev_dtl_sm)) { in vdev_dtl_sync()
2004 space_map_object(vd->vdev_dtl_sm)); in vdev_dtl_sync()
2005 vdev_config_dirty(vd->vdev_top); in vdev_dtl_sync()
2010 mutex_enter(&vd->vdev_dtl_lock); in vdev_dtl_sync()
2011 space_map_update(vd->vdev_dtl_sm); in vdev_dtl_sync()
2012 mutex_exit(&vd->vdev_dtl_lock); in vdev_dtl_sync()
2020 vdev_dtl_required(vdev_t *vd) in vdev_dtl_required() argument
2022 spa_t *spa = vd->vdev_spa; in vdev_dtl_required()
2023 vdev_t *tvd = vd->vdev_top; in vdev_dtl_required()
2024 uint8_t cant_read = vd->vdev_cant_read; in vdev_dtl_required()
2029 if (vd == spa->spa_root_vdev || vd == tvd) in vdev_dtl_required()
2037 vd->vdev_cant_read = B_TRUE; in vdev_dtl_required()
2040 vd->vdev_cant_read = cant_read; in vdev_dtl_required()
2044 required = !!zio_handle_device_injection(vd, NULL, ECHILD); in vdev_dtl_required()
2053 vdev_resilver_needed(vdev_t *vd, uint64_t *minp, uint64_t *maxp) in vdev_resilver_needed() argument
2059 if (vd->vdev_children == 0) { in vdev_resilver_needed()
2060 mutex_enter(&vd->vdev_dtl_lock); in vdev_resilver_needed()
2061 if (range_tree_space(vd->vdev_dtl[DTL_MISSING]) != 0 && in vdev_resilver_needed()
2062 vdev_writeable(vd)) { in vdev_resilver_needed()
2064 thismin = vdev_dtl_min(vd); in vdev_resilver_needed()
2065 thismax = vdev_dtl_max(vd); in vdev_resilver_needed()
2068 mutex_exit(&vd->vdev_dtl_lock); in vdev_resilver_needed()
2070 for (int c = 0; c < vd->vdev_children; c++) { in vdev_resilver_needed()
2071 vdev_t *cvd = vd->vdev_child[c]; in vdev_resilver_needed()
2090 vdev_load(vdev_t *vd) in vdev_load() argument
2095 for (int c = 0; c < vd->vdev_children; c++) in vdev_load()
2096 vdev_load(vd->vdev_child[c]); in vdev_load()
2101 if (vd == vd->vdev_top && !vd->vdev_ishole && in vdev_load()
2102 (vd->vdev_ashift == 0 || vd->vdev_asize == 0 || in vdev_load()
2103 vdev_metaslab_init(vd, 0) != 0)) in vdev_load()
2104 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
2110 if (vd->vdev_ops->vdev_op_leaf && vdev_dtl_load(vd) != 0) in vdev_load()
2111 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, in vdev_load()
2123 vdev_validate_aux(vdev_t *vd) in vdev_validate_aux() argument
2129 if (!vdev_readable(vd)) in vdev_validate_aux()
2132 if ((label = vdev_label_read_config(vd, -1ULL)) == NULL) { in vdev_validate_aux()
2133 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate_aux()
2141 guid != vd->vdev_guid || in vdev_validate_aux()
2143 vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, in vdev_validate_aux()
2158 vdev_remove(vdev_t *vd, uint64_t txg) in vdev_remove() argument
2160 spa_t *spa = vd->vdev_spa; in vdev_remove()
2166 if (vd->vdev_ms != NULL) { in vdev_remove()
2167 metaslab_group_t *mg = vd->vdev_mg; in vdev_remove()
2172 for (int m = 0; m < vd->vdev_ms_count; m++) { in vdev_remove()
2173 metaslab_t *msp = vd->vdev_ms[m]; in vdev_remove()
2202 if (vd->vdev_ms_array) { in vdev_remove()
2203 (void) dmu_object_free(mos, vd->vdev_ms_array, tx); in vdev_remove()
2204 vd->vdev_ms_array = 0; in vdev_remove()
2210 vdev_sync_done(vdev_t *vd, uint64_t txg) in vdev_sync_done() argument
2213 boolean_t reassess = !txg_list_empty(&vd->vdev_ms_list, TXG_CLEAN(txg)); in vdev_sync_done()
2215 ASSERT(!vd->vdev_ishole); in vdev_sync_done()
2217 while (msp = txg_list_remove(&vd->vdev_ms_list, TXG_CLEAN(txg))) in vdev_sync_done()
2221 metaslab_sync_reassess(vd->vdev_mg); in vdev_sync_done()
2225 vdev_sync(vdev_t *vd, uint64_t txg) in vdev_sync() argument
2227 spa_t *spa = vd->vdev_spa; in vdev_sync()
2232 ASSERT(!vd->vdev_ishole); in vdev_sync()
2234 if (vd->vdev_ms_array == 0 && vd->vdev_ms_shift != 0) { in vdev_sync()
2235 ASSERT(vd == vd->vdev_top); in vdev_sync()
2237 vd->vdev_ms_array = dmu_object_alloc(spa->spa_meta_objset, in vdev_sync()
2239 ASSERT(vd->vdev_ms_array != 0); in vdev_sync()
2240 vdev_config_dirty(vd); in vdev_sync()
2247 if (vd->vdev_stat.vs_alloc == 0 && vd->vdev_removing) in vdev_sync()
2248 vdev_remove(vd, txg); in vdev_sync()
2250 while ((msp = txg_list_remove(&vd->vdev_ms_list, txg)) != NULL) { in vdev_sync()
2252 (void) txg_list_add(&vd->vdev_ms_list, msp, TXG_CLEAN(txg)); in vdev_sync()
2255 while ((lvd = txg_list_remove(&vd->vdev_dtl_list, txg)) != NULL) in vdev_sync()
2258 (void) txg_list_add(&spa->spa_vdev_txg_list, vd, TXG_CLEAN(txg)); in vdev_sync()
2262 vdev_psize_to_asize(vdev_t *vd, uint64_t psize) in vdev_psize_to_asize() argument
2264 return (vd->vdev_ops->vdev_op_asize(vd, psize)); in vdev_psize_to_asize()
2274 vdev_t *vd, *tvd; in vdev_fault() local
2278 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_fault()
2281 if (!vd->vdev_ops->vdev_op_leaf) in vdev_fault()
2284 tvd = vd->vdev_top; in vdev_fault()
2291 vd->vdev_label_aux = aux; in vdev_fault()
2296 vd->vdev_delayed_close = B_FALSE; in vdev_fault()
2297 vd->vdev_faulted = 1ULL; in vdev_fault()
2298 vd->vdev_degraded = 0ULL; in vdev_fault()
2299 vdev_set_state(vd, B_FALSE, VDEV_STATE_FAULTED, aux); in vdev_fault()
2305 if (!tvd->vdev_islog && vd->vdev_aux == NULL && vdev_dtl_required(vd)) { in vdev_fault()
2306 vd->vdev_degraded = 1ULL; in vdev_fault()
2307 vd->vdev_faulted = 0ULL; in vdev_fault()
2315 if (vdev_readable(vd)) in vdev_fault()
2316 vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, aux); in vdev_fault()
2319 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_fault()
2330 vdev_t *vd; in vdev_degrade() local
2334 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_degrade()
2337 if (!vd->vdev_ops->vdev_op_leaf) in vdev_degrade()
2343 if (vd->vdev_faulted || vd->vdev_degraded) in vdev_degrade()
2346 vd->vdev_degraded = 1ULL; in vdev_degrade()
2347 if (!vdev_is_dead(vd)) in vdev_degrade()
2348 vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, in vdev_degrade()
2351 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_degrade()
2365 vdev_t *vd, *tvd, *pvd, *rvd = spa->spa_root_vdev; in vdev_online() local
2369 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_online()
2372 if (!vd->vdev_ops->vdev_op_leaf) in vdev_online()
2375 tvd = vd->vdev_top; in vdev_online()
2376 vd->vdev_offline = B_FALSE; in vdev_online()
2377 vd->vdev_tmpoffline = B_FALSE; in vdev_online()
2378 vd->vdev_checkremove = !!(flags & ZFS_ONLINE_CHECKREMOVE); in vdev_online()
2379 vd->vdev_forcefault = !!(flags & ZFS_ONLINE_FORCEFAULT); in vdev_online()
2382 if (!vd->vdev_aux) { in vdev_online()
2383 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_online()
2388 vd->vdev_checkremove = vd->vdev_forcefault = B_FALSE; in vdev_online()
2390 if (!vd->vdev_aux) { in vdev_online()
2391 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_online()
2396 *newstate = vd->vdev_state; in vdev_online()
2398 !vdev_is_dead(vd) && vd->vdev_parent && in vdev_online()
2399 vd->vdev_parent->vdev_ops == &vdev_spare_ops && in vdev_online()
2400 vd->vdev_parent->vdev_child[0] == vd) in vdev_online()
2401 vd->vdev_unspare = B_TRUE; in vdev_online()
2406 if (vd->vdev_aux) in vdev_online()
2407 return (spa_vdev_state_exit(spa, vd, ENOTSUP)); in vdev_online()
2410 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_online()
2416 vdev_t *vd, *tvd; in vdev_offline_locked() local
2424 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in vdev_offline_locked()
2427 if (!vd->vdev_ops->vdev_op_leaf) in vdev_offline_locked()
2430 tvd = vd->vdev_top; in vdev_offline_locked()
2437 if (!vd->vdev_offline) { in vdev_offline_locked()
2443 if (!tvd->vdev_islog && vd->vdev_aux == NULL && in vdev_offline_locked()
2444 vdev_dtl_required(vd)) in vdev_offline_locked()
2458 (void) spa_vdev_state_exit(spa, vd, 0); in vdev_offline_locked()
2471 vd, error)); in vdev_offline_locked()
2472 (void) spa_vdev_state_exit(spa, vd, 0); in vdev_offline_locked()
2484 vd->vdev_offline = B_TRUE; in vdev_offline_locked()
2487 if (!tvd->vdev_islog && vd->vdev_aux == NULL && in vdev_offline_locked()
2489 vd->vdev_offline = B_FALSE; in vdev_offline_locked()
2502 vd->vdev_tmpoffline = !!(flags & ZFS_OFFLINE_TEMPORARY); in vdev_offline_locked()
2504 return (spa_vdev_state_exit(spa, vd, 0)); in vdev_offline_locked()
2525 vdev_clear(spa_t *spa, vdev_t *vd) in vdev_clear() argument
2531 if (vd == NULL) in vdev_clear()
2532 vd = rvd; in vdev_clear()
2534 vd->vdev_stat.vs_read_errors = 0; in vdev_clear()
2535 vd->vdev_stat.vs_write_errors = 0; in vdev_clear()
2536 vd->vdev_stat.vs_checksum_errors = 0; in vdev_clear()
2538 for (int c = 0; c < vd->vdev_children; c++) in vdev_clear()
2539 vdev_clear(spa, vd->vdev_child[c]); in vdev_clear()
2547 if (vd->vdev_faulted || vd->vdev_degraded || in vdev_clear()
2548 !vdev_readable(vd) || !vdev_writeable(vd)) { in vdev_clear()
2555 vd->vdev_forcefault = B_TRUE; in vdev_clear()
2557 vd->vdev_faulted = vd->vdev_degraded = 0ULL; in vdev_clear()
2558 vd->vdev_cant_read = B_FALSE; in vdev_clear()
2559 vd->vdev_cant_write = B_FALSE; in vdev_clear()
2561 vdev_reopen(vd == rvd ? rvd : vd->vdev_top); in vdev_clear()
2563 vd->vdev_forcefault = B_FALSE; in vdev_clear()
2565 if (vd != rvd && vdev_writeable(vd->vdev_top)) in vdev_clear()
2566 vdev_state_dirty(vd->vdev_top); in vdev_clear()
2568 if (vd->vdev_aux == NULL && !vdev_is_dead(vd)) in vdev_clear()
2571 spa_event_notify(spa, vd, ESC_ZFS_VDEV_CLEAR); in vdev_clear()
2579 if (!vdev_is_dead(vd) && vd->vdev_parent != NULL && in vdev_clear()
2580 vd->vdev_parent->vdev_ops == &vdev_spare_ops && in vdev_clear()
2581 vd->vdev_parent->vdev_child[0] == vd) in vdev_clear()
2582 vd->vdev_unspare = B_TRUE; in vdev_clear()
2586 vdev_is_dead(vdev_t *vd) in vdev_is_dead() argument
2595 return (vd->vdev_state < VDEV_STATE_DEGRADED || vd->vdev_ishole || in vdev_is_dead()
2596 vd->vdev_ops == &vdev_missing_ops); in vdev_is_dead()
2600 vdev_readable(vdev_t *vd) in vdev_readable() argument
2602 return (!vdev_is_dead(vd) && !vd->vdev_cant_read); in vdev_readable()
2606 vdev_writeable(vdev_t *vd) in vdev_writeable() argument
2608 return (!vdev_is_dead(vd) && !vd->vdev_cant_write); in vdev_writeable()
2612 vdev_allocatable(vdev_t *vd) in vdev_allocatable() argument
2614 uint64_t state = vd->vdev_state; in vdev_allocatable()
2625 !vd->vdev_cant_write && !vd->vdev_ishole); in vdev_allocatable()
2629 vdev_accessible(vdev_t *vd, zio_t *zio) in vdev_accessible() argument
2631 ASSERT(zio->io_vd == vd); in vdev_accessible()
2633 if (vdev_is_dead(vd) || vd->vdev_remove_wanted) in vdev_accessible()
2637 return (!vd->vdev_cant_read); in vdev_accessible()
2640 return (!vd->vdev_cant_write); in vdev_accessible()
2649 vdev_get_stats(vdev_t *vd, vdev_stat_t *vs) in vdev_get_stats() argument
2651 spa_t *spa = vd->vdev_spa; in vdev_get_stats()
2656 mutex_enter(&vd->vdev_stat_lock); in vdev_get_stats()
2657 bcopy(&vd->vdev_stat, vs, sizeof (*vs)); in vdev_get_stats()
2659 vs->vs_state = vd->vdev_state; in vdev_get_stats()
2660 vs->vs_rsize = vdev_get_min_asize(vd); in vdev_get_stats()
2661 if (vd->vdev_ops->vdev_op_leaf) in vdev_get_stats()
2663 vs->vs_esize = vd->vdev_max_asize - vd->vdev_asize; in vdev_get_stats()
2664 if (vd->vdev_aux == NULL && vd == vd->vdev_top && !vd->vdev_ishole) { in vdev_get_stats()
2665 vs->vs_fragmentation = vd->vdev_mg->mg_fragmentation; in vdev_get_stats()
2672 if (vd == rvd) { in vdev_get_stats()
2684 mutex_exit(&vd->vdev_stat_lock); in vdev_get_stats()
2688 vdev_clear_stats(vdev_t *vd) in vdev_clear_stats() argument
2690 mutex_enter(&vd->vdev_stat_lock); in vdev_clear_stats()
2691 vd->vdev_stat.vs_space = 0; in vdev_clear_stats()
2692 vd->vdev_stat.vs_dspace = 0; in vdev_clear_stats()
2693 vd->vdev_stat.vs_alloc = 0; in vdev_clear_stats()
2694 mutex_exit(&vd->vdev_stat_lock); in vdev_clear_stats()
2698 vdev_scan_stat_init(vdev_t *vd) in vdev_scan_stat_init() argument
2700 vdev_stat_t *vs = &vd->vdev_stat; in vdev_scan_stat_init()
2702 for (int c = 0; c < vd->vdev_children; c++) in vdev_scan_stat_init()
2703 vdev_scan_stat_init(vd->vdev_child[c]); in vdev_scan_stat_init()
2705 mutex_enter(&vd->vdev_stat_lock); in vdev_scan_stat_init()
2707 mutex_exit(&vd->vdev_stat_lock); in vdev_scan_stat_init()
2715 vdev_t *vd = zio->io_vd ? zio->io_vd : rvd; in vdev_stat_update() local
2718 vdev_stat_t *vs = &vd->vdev_stat; in vdev_stat_update()
2743 if (vd == rvd) in vdev_stat_update()
2746 ASSERT(vd == zio->io_vd); in vdev_stat_update()
2751 mutex_enter(&vd->vdev_stat_lock); in vdev_stat_update()
2760 if (vd->vdev_ops->vdev_op_leaf) in vdev_stat_update()
2772 mutex_exit(&vd->vdev_stat_lock); in vdev_stat_update()
2797 mutex_enter(&vd->vdev_stat_lock); in vdev_stat_update()
2798 if (type == ZIO_TYPE_READ && !vdev_is_dead(vd)) { in vdev_stat_update()
2804 if (type == ZIO_TYPE_WRITE && !vdev_is_dead(vd)) in vdev_stat_update()
2806 mutex_exit(&vd->vdev_stat_lock); in vdev_stat_update()
2827 if (vd->vdev_ops->vdev_op_leaf) { in vdev_stat_update()
2832 vdev_dtl_dirty(vd, DTL_SCRUB, txg, 1); in vdev_stat_update()
2839 if (vdev_dtl_contains(vd, DTL_MISSING, txg, 1)) in vdev_stat_update()
2841 for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent) in vdev_stat_update()
2843 vdev_dirty(vd->vdev_top, VDD_DTL, vd, commit_txg); in vdev_stat_update()
2845 if (vd != rvd) in vdev_stat_update()
2846 vdev_dtl_dirty(vd, DTL_MISSING, txg, 1); in vdev_stat_update()
2855 vdev_space_update(vdev_t *vd, int64_t alloc_delta, int64_t defer_delta, in vdev_space_update() argument
2859 spa_t *spa = vd->vdev_spa; in vdev_space_update()
2861 metaslab_group_t *mg = vd->vdev_mg; in vdev_space_update()
2864 ASSERT(vd == vd->vdev_top); in vdev_space_update()
2873 ASSERT(vd->vdev_deflate_ratio != 0 || vd->vdev_isl2cache); in vdev_space_update()
2875 vd->vdev_deflate_ratio; in vdev_space_update()
2877 mutex_enter(&vd->vdev_stat_lock); in vdev_space_update()
2878 vd->vdev_stat.vs_alloc += alloc_delta; in vdev_space_update()
2879 vd->vdev_stat.vs_space += space_delta; in vdev_space_update()
2880 vd->vdev_stat.vs_dspace += dspace_delta; in vdev_space_update()
2881 mutex_exit(&vd->vdev_stat_lock); in vdev_space_update()
2892 ASSERT(rvd == vd->vdev_parent); in vdev_space_update()
2893 ASSERT(vd->vdev_ms_count != 0); in vdev_space_update()
2906 vdev_config_dirty(vdev_t *vd) in vdev_config_dirty() argument
2908 spa_t *spa = vd->vdev_spa; in vdev_config_dirty()
2918 if (vd->vdev_aux != NULL) { in vdev_config_dirty()
2919 spa_aux_vdev_t *sav = vd->vdev_aux; in vdev_config_dirty()
2924 if (sav->sav_vdevs[c] == vd) in vdev_config_dirty()
2951 aux[c] = vdev_config_generate(spa, vd, B_TRUE, 0); in vdev_config_dirty()
2966 if (vd == rvd) { in vdev_config_dirty()
2970 ASSERT(vd == vd->vdev_top); in vdev_config_dirty()
2972 if (!list_link_active(&vd->vdev_config_dirty_node) && in vdev_config_dirty()
2973 !vd->vdev_ishole) in vdev_config_dirty()
2974 list_insert_head(&spa->spa_config_dirty_list, vd); in vdev_config_dirty()
2979 vdev_config_clean(vdev_t *vd) in vdev_config_clean() argument
2981 spa_t *spa = vd->vdev_spa; in vdev_config_clean()
2987 ASSERT(list_link_active(&vd->vdev_config_dirty_node)); in vdev_config_clean()
2988 list_remove(&spa->spa_config_dirty_list, vd); in vdev_config_clean()
2998 vdev_state_dirty(vdev_t *vd) in vdev_state_dirty() argument
3000 spa_t *spa = vd->vdev_spa; in vdev_state_dirty()
3003 ASSERT(vd == vd->vdev_top); in vdev_state_dirty()
3015 if (!list_link_active(&vd->vdev_state_dirty_node) && !vd->vdev_ishole) in vdev_state_dirty()
3016 list_insert_head(&spa->spa_state_dirty_list, vd); in vdev_state_dirty()
3020 vdev_state_clean(vdev_t *vd) in vdev_state_clean() argument
3022 spa_t *spa = vd->vdev_spa; in vdev_state_clean()
3028 ASSERT(list_link_active(&vd->vdev_state_dirty_node)); in vdev_state_clean()
3029 list_remove(&spa->spa_state_dirty_list, vd); in vdev_state_clean()
3036 vdev_propagate_state(vdev_t *vd) in vdev_propagate_state() argument
3038 spa_t *spa = vd->vdev_spa; in vdev_propagate_state()
3044 if (vd->vdev_children > 0) { in vdev_propagate_state()
3045 for (int c = 0; c < vd->vdev_children; c++) { in vdev_propagate_state()
3046 child = vd->vdev_child[c]; in vdev_propagate_state()
3061 if (child->vdev_islog && vd == rvd) in vdev_propagate_state()
3073 vd->vdev_ops->vdev_op_state_change(vd, faulted, degraded); in vdev_propagate_state()
3081 if (corrupted && vd == rvd && in vdev_propagate_state()
3087 if (vd->vdev_parent) in vdev_propagate_state()
3088 vdev_propagate_state(vd->vdev_parent); in vdev_propagate_state()
3100 vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state, vdev_aux_t aux) in vdev_set_state() argument
3103 spa_t *spa = vd->vdev_spa; in vdev_set_state()
3105 if (state == vd->vdev_state) { in vdev_set_state()
3106 vd->vdev_stat.vs_aux = aux; in vdev_set_state()
3110 save_state = vd->vdev_state; in vdev_set_state()
3112 vd->vdev_state = state; in vdev_set_state()
3113 vd->vdev_stat.vs_aux = aux; in vdev_set_state()
3125 if (!vd->vdev_delayed_close && vdev_is_dead(vd) && in vdev_set_state()
3126 vd->vdev_ops->vdev_op_leaf) in vdev_set_state()
3127 vd->vdev_ops->vdev_op_close(vd); in vdev_set_state()
3138 if (state == VDEV_STATE_HEALTHY && vd->vdev_ops->vdev_op_leaf && in vdev_set_state()
3139 vd->vdev_prevstate != state) in vdev_set_state()
3140 zfs_post_state_change(spa, vd); in vdev_set_state()
3142 if (vd->vdev_removed && in vdev_set_state()
3144 (aux == VDEV_AUX_OPEN_FAILED || vd->vdev_checkremove)) { in vdev_set_state()
3154 vd->vdev_state = VDEV_STATE_REMOVED; in vdev_set_state()
3155 vd->vdev_stat.vs_aux = VDEV_AUX_NONE; in vdev_set_state()
3157 vd->vdev_removed = B_TRUE; in vdev_set_state()
3167 vd->vdev_ops->vdev_op_leaf) in vdev_set_state()
3168 vd->vdev_not_present = 1; in vdev_set_state()
3185 if ((vd->vdev_prevstate != state || vd->vdev_forcefault) && in vdev_set_state()
3186 !vd->vdev_not_present && !vd->vdev_checkremove && in vdev_set_state()
3187 vd != spa->spa_root_vdev) { in vdev_set_state()
3213 zfs_ereport_post(class, spa, vd, NULL, save_state, 0); in vdev_set_state()
3217 vd->vdev_removed = B_FALSE; in vdev_set_state()
3219 vd->vdev_removed = B_FALSE; in vdev_set_state()
3222 if (!isopen && vd->vdev_parent) in vdev_set_state()
3223 vdev_propagate_state(vd->vdev_parent); in vdev_set_state()
3233 vdev_is_bootable(vdev_t *vd) in vdev_is_bootable() argument
3235 if (!vd->vdev_ops->vdev_op_leaf) { in vdev_is_bootable()
3236 char *vdev_type = vd->vdev_ops->vdev_op_type; in vdev_is_bootable()
3239 vd->vdev_children > 1) { in vdev_is_bootable()
3247 for (int c = 0; c < vd->vdev_children; c++) { in vdev_is_bootable()
3248 if (!vdev_is_bootable(vd->vdev_child[c])) in vdev_is_bootable()
3289 vdev_log_state_valid(vdev_t *vd) in vdev_log_state_valid() argument
3291 if (vd->vdev_ops->vdev_op_leaf && !vd->vdev_faulted && in vdev_log_state_valid()
3292 !vd->vdev_removed) in vdev_log_state_valid()
3295 for (int c = 0; c < vd->vdev_children; c++) in vdev_log_state_valid()
3296 if (vdev_log_state_valid(vd->vdev_child[c])) in vdev_log_state_valid()
3306 vdev_expand(vdev_t *vd, uint64_t txg) in vdev_expand() argument
3308 ASSERT(vd->vdev_top == vd); in vdev_expand()
3309 ASSERT(spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER) == SCL_ALL); in vdev_expand()
3311 if ((vd->vdev_asize >> vd->vdev_ms_shift) > vd->vdev_ms_count) { in vdev_expand()
3312 VERIFY(vdev_metaslab_init(vd, txg) == 0); in vdev_expand()
3313 vdev_config_dirty(vd); in vdev_expand()
3321 vdev_split(vdev_t *vd) in vdev_split() argument
3323 vdev_t *cvd, *pvd = vd->vdev_parent; in vdev_split()
3325 vdev_remove_child(pvd, vd); in vdev_split()
3337 vdev_deadman(vdev_t *vd) in vdev_deadman() argument
3339 for (int c = 0; c < vd->vdev_children; c++) { in vdev_deadman()
3340 vdev_t *cvd = vd->vdev_child[c]; in vdev_deadman()
3345 if (vd->vdev_ops->vdev_op_leaf) { in vdev_deadman()
3346 vdev_queue_t *vq = &vd->vdev_queue; in vdev_deadman()
3350 spa_t *spa = vd->vdev_spa; in vdev_deadman()