Lines Matching refs:vd
49 vdev_initialize_should_stop(vdev_t *vd) in vdev_initialize_should_stop() argument
51 return (vd->vdev_initialize_exit_wanted || !vdev_writeable(vd) || in vdev_initialize_should_stop()
52 vd->vdev_detached || vd->vdev_top->vdev_removing || in vdev_initialize_should_stop()
53 vd->vdev_top->vdev_rz_expanding); in vdev_initialize_should_stop()
71 vdev_t *vd = spa_lookup_by_guid(tx->tx_pool->dp_spa, guid, B_FALSE); in vdev_initialize_zap_update_sync() local
72 if (vd == NULL || vd->vdev_top->vdev_removing || in vdev_initialize_zap_update_sync()
73 !vdev_is_concrete(vd) || vd->vdev_top->vdev_rz_expanding) in vdev_initialize_zap_update_sync()
76 uint64_t last_offset = vd->vdev_initialize_offset[txg & TXG_MASK]; in vdev_initialize_zap_update_sync()
77 vd->vdev_initialize_offset[txg & TXG_MASK] = 0; in vdev_initialize_zap_update_sync()
79 VERIFY(vd->vdev_leaf_zap != 0); in vdev_initialize_zap_update_sync()
81 objset_t *mos = vd->vdev_spa->spa_meta_objset; in vdev_initialize_zap_update_sync()
84 vd->vdev_initialize_last_offset = last_offset; in vdev_initialize_zap_update_sync()
85 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_update_sync()
89 if (vd->vdev_initialize_action_time > 0) { in vdev_initialize_zap_update_sync()
90 uint64_t val = (uint64_t)vd->vdev_initialize_action_time; in vdev_initialize_zap_update_sync()
91 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_update_sync()
96 uint64_t initialize_state = vd->vdev_initialize_state; in vdev_initialize_zap_update_sync()
97 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_update_sync()
109 vdev_t *vd = spa_lookup_by_guid(tx->tx_pool->dp_spa, guid, B_FALSE); in vdev_initialize_zap_remove_sync() local
110 if (vd == NULL || vd->vdev_top->vdev_removing || !vdev_is_concrete(vd)) in vdev_initialize_zap_remove_sync()
113 ASSERT3S(vd->vdev_initialize_state, ==, VDEV_INITIALIZE_NONE); in vdev_initialize_zap_remove_sync()
114 ASSERT3U(vd->vdev_leaf_zap, !=, 0); in vdev_initialize_zap_remove_sync()
116 vd->vdev_initialize_last_offset = 0; in vdev_initialize_zap_remove_sync()
117 vd->vdev_initialize_action_time = 0; in vdev_initialize_zap_remove_sync()
119 objset_t *mos = vd->vdev_spa->spa_meta_objset; in vdev_initialize_zap_remove_sync()
122 error = zap_remove(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_remove_sync()
126 error = zap_remove(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_remove_sync()
130 error = zap_remove(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_remove_sync()
136 vdev_initialize_change_state(vdev_t *vd, vdev_initializing_state_t new_state) in vdev_initialize_change_state() argument
138 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize_change_state()
139 spa_t *spa = vd->vdev_spa; in vdev_initialize_change_state()
141 if (new_state == vd->vdev_initialize_state) in vdev_initialize_change_state()
148 *guid = vd->vdev_guid; in vdev_initialize_change_state()
153 if (vd->vdev_initialize_state != VDEV_INITIALIZE_SUSPENDED) { in vdev_initialize_change_state()
154 vd->vdev_initialize_action_time = gethrestime_sec(); in vdev_initialize_change_state()
157 vdev_initializing_state_t old_state = vd->vdev_initialize_state; in vdev_initialize_change_state()
158 vd->vdev_initialize_state = new_state; in vdev_initialize_change_state()
174 "vdev=%s activated", vd->vdev_path); in vdev_initialize_change_state()
178 "vdev=%s suspended", vd->vdev_path); in vdev_initialize_change_state()
184 "vdev=%s canceled", vd->vdev_path); in vdev_initialize_change_state()
188 "vdev=%s complete", vd->vdev_path); in vdev_initialize_change_state()
192 "vdev=%s", vd->vdev_path); in vdev_initialize_change_state()
207 vdev_t *vd = zio->io_vd; in vdev_initialize_cb() local
208 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_cb()
209 if (zio->io_error == ENXIO && !vdev_writeable(vd)) { in vdev_initialize_cb()
216 &vd->vdev_initialize_offset[zio->io_txg & TXG_MASK]; in vdev_initialize_cb()
225 vd->vdev_stat.vs_initialize_errors++; in vdev_initialize_cb()
227 vd->vdev_initialize_bytes_done += zio->io_orig_size; in vdev_initialize_cb()
229 ASSERT3U(vd->vdev_initialize_inflight, >, 0); in vdev_initialize_cb()
230 vd->vdev_initialize_inflight--; in vdev_initialize_cb()
231 cv_broadcast(&vd->vdev_initialize_io_cv); in vdev_initialize_cb()
232 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_cb()
234 spa_config_exit(vd->vdev_spa, SCL_STATE_ALL, vd); in vdev_initialize_cb()
239 vdev_initialize_write(vdev_t *vd, uint64_t start, uint64_t size, abd_t *data) in vdev_initialize_write() argument
241 spa_t *spa = vd->vdev_spa; in vdev_initialize_write()
244 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
245 while (vd->vdev_initialize_inflight >= zfs_initialize_limit) { in vdev_initialize_write()
246 cv_wait(&vd->vdev_initialize_io_cv, in vdev_initialize_write()
247 &vd->vdev_initialize_io_lock); in vdev_initialize_write()
249 vd->vdev_initialize_inflight++; in vdev_initialize_write()
250 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
256 spa_config_enter(spa, SCL_STATE_ALL, vd, RW_READER); in vdev_initialize_write()
257 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_write()
259 if (vd->vdev_initialize_offset[txg & TXG_MASK] == 0) { in vdev_initialize_write()
261 *guid = vd->vdev_guid; in vdev_initialize_write()
272 if (vdev_initialize_should_stop(vd)) { in vdev_initialize_write()
273 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
274 ASSERT3U(vd->vdev_initialize_inflight, >, 0); in vdev_initialize_write()
275 vd->vdev_initialize_inflight--; in vdev_initialize_write()
276 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
277 spa_config_exit(vd->vdev_spa, SCL_STATE_ALL, vd); in vdev_initialize_write()
278 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_write()
282 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_write()
284 vd->vdev_initialize_offset[txg & TXG_MASK] = start + size; in vdev_initialize_write()
285 zio_nowait(zio_write_phys(spa->spa_txg_zio[txg & TXG_MASK], vd, start, in vdev_initialize_write()
332 vdev_initialize_ranges(vdev_t *vd, abd_t *data) in vdev_initialize_ranges() argument
334 zfs_range_tree_t *rt = vd->vdev_initialize_tree; in vdev_initialize_ranges()
350 error = vdev_initialize_write(vd, in vdev_initialize_ranges()
374 vdev_t *vd = (vdev_t *)arg; in vdev_initialize_xlate_progress() local
377 vd->vdev_initialize_bytes_est += size; in vdev_initialize_xlate_progress()
379 if (vd->vdev_initialize_last_offset > physical_rs->rs_end) { in vdev_initialize_xlate_progress()
380 vd->vdev_initialize_bytes_done += size; in vdev_initialize_xlate_progress()
381 } else if (vd->vdev_initialize_last_offset > physical_rs->rs_start && in vdev_initialize_xlate_progress()
382 vd->vdev_initialize_last_offset < physical_rs->rs_end) { in vdev_initialize_xlate_progress()
383 vd->vdev_initialize_bytes_done += in vdev_initialize_xlate_progress()
384 vd->vdev_initialize_last_offset - physical_rs->rs_start; in vdev_initialize_xlate_progress()
389 vdev_initialize_calculate_progress(vdev_t *vd) in vdev_initialize_calculate_progress() argument
391 ASSERT(spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_READER) || in vdev_initialize_calculate_progress()
392 spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_WRITER)); in vdev_initialize_calculate_progress()
393 ASSERT(vd->vdev_leaf_zap != 0); in vdev_initialize_calculate_progress()
395 vd->vdev_initialize_bytes_est = 0; in vdev_initialize_calculate_progress()
396 vd->vdev_initialize_bytes_done = 0; in vdev_initialize_calculate_progress()
398 for (uint64_t i = 0; i < vd->vdev_top->vdev_ms_count; i++) { in vdev_initialize_calculate_progress()
399 metaslab_t *msp = vd->vdev_top->vdev_ms[i]; in vdev_initialize_calculate_progress()
404 vdev_get_ndisks(vd->vdev_top); in vdev_initialize_calculate_progress()
416 vdev_xlate(vd, &logical_rs, &physical_rs, &remain_rs); in vdev_initialize_calculate_progress()
417 if (vd->vdev_initialize_last_offset <= physical_rs.rs_start) { in vdev_initialize_calculate_progress()
418 vd->vdev_initialize_bytes_est += ms_free; in vdev_initialize_calculate_progress()
426 vdev_xlate_walk(vd, &remain_rs, in vdev_initialize_calculate_progress()
430 if (vd->vdev_initialize_last_offset > last_rs_end) { in vdev_initialize_calculate_progress()
431 vd->vdev_initialize_bytes_done += ms_free; in vdev_initialize_calculate_progress()
432 vd->vdev_initialize_bytes_est += ms_free; in vdev_initialize_calculate_progress()
453 vdev_xlate_walk(vd, &logical_rs, in vdev_initialize_calculate_progress()
454 vdev_initialize_xlate_progress, vd); in vdev_initialize_calculate_progress()
461 vdev_initialize_load(vdev_t *vd) in vdev_initialize_load() argument
464 ASSERT(spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_READER) || in vdev_initialize_load()
465 spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_WRITER)); in vdev_initialize_load()
466 ASSERT(vd->vdev_leaf_zap != 0); in vdev_initialize_load()
468 if (vd->vdev_initialize_state == VDEV_INITIALIZE_ACTIVE || in vdev_initialize_load()
469 vd->vdev_initialize_state == VDEV_INITIALIZE_SUSPENDED) { in vdev_initialize_load()
470 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_initialize_load()
471 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_INITIALIZE_LAST_OFFSET, in vdev_initialize_load()
472 sizeof (vd->vdev_initialize_last_offset), 1, in vdev_initialize_load()
473 &vd->vdev_initialize_last_offset); in vdev_initialize_load()
475 vd->vdev_initialize_last_offset = 0; in vdev_initialize_load()
480 vdev_initialize_calculate_progress(vd); in vdev_initialize_load()
487 vdev_t *vd = arg; in vdev_initialize_xlate_range_add() local
490 if (physical_rs->rs_end <= vd->vdev_initialize_last_offset) in vdev_initialize_xlate_range_add()
494 if (vd->vdev_initialize_last_offset > physical_rs->rs_start) { in vdev_initialize_xlate_range_add()
496 "(%llu, %llu)", vd->vdev_path, in vdev_initialize_xlate_range_add()
499 (u_longlong_t)vd->vdev_initialize_last_offset, in vdev_initialize_xlate_range_add()
502 vd->vdev_initialize_last_offset); in vdev_initialize_xlate_range_add()
503 physical_rs->rs_start = vd->vdev_initialize_last_offset; in vdev_initialize_xlate_range_add()
508 zfs_range_tree_add(vd->vdev_initialize_tree, physical_rs->rs_start, in vdev_initialize_xlate_range_add()
519 vdev_t *vd = arg; in vdev_initialize_range_add() local
524 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_initialize_range_add()
525 vdev_xlate_walk(vd, &logical_rs, vdev_initialize_xlate_range_add, arg); in vdev_initialize_range_add()
531 vdev_t *vd = arg; in vdev_initialize_thread() local
532 spa_t *spa = vd->vdev_spa; in vdev_initialize_thread()
536 ASSERT(vdev_is_concrete(vd)); in vdev_initialize_thread()
539 vd->vdev_initialize_last_offset = 0; in vdev_initialize_thread()
540 VERIFY0(vdev_initialize_load(vd)); in vdev_initialize_thread()
544 vd->vdev_initialize_tree = zfs_range_tree_create_flags( in vdev_initialize_thread()
546 ZFS_RT_F_DYN_NAME, vdev_rt_name(vd, "vdev_initialize_tree")); in vdev_initialize_thread()
548 for (uint64_t i = 0; !vd->vdev_detached && in vdev_initialize_thread()
549 i < vd->vdev_top->vdev_ms_count; i++) { in vdev_initialize_thread()
550 metaslab_t *msp = vd->vdev_top->vdev_ms[i]; in vdev_initialize_thread()
557 if (vd->vdev_top->vdev_ms_count != ms_count) { in vdev_initialize_thread()
558 vdev_initialize_calculate_progress(vd); in vdev_initialize_thread()
559 ms_count = vd->vdev_top->vdev_ms_count; in vdev_initialize_thread()
570 vdev_initialize_range_add, vd); in vdev_initialize_thread()
573 error = vdev_initialize_ranges(vd, deadbeef); in vdev_initialize_thread()
577 zfs_range_tree_vacate(vd->vdev_initialize_tree, NULL, NULL); in vdev_initialize_thread()
583 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_thread()
584 while (vd->vdev_initialize_inflight > 0) { in vdev_initialize_thread()
585 cv_wait(&vd->vdev_initialize_io_cv, in vdev_initialize_thread()
586 &vd->vdev_initialize_io_lock); in vdev_initialize_thread()
588 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_thread()
590 zfs_range_tree_destroy(vd->vdev_initialize_tree); in vdev_initialize_thread()
592 vd->vdev_initialize_tree = NULL; in vdev_initialize_thread()
594 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_thread()
595 if (!vd->vdev_initialize_exit_wanted) { in vdev_initialize_thread()
596 if (vdev_writeable(vd)) { in vdev_initialize_thread()
597 vdev_initialize_change_state(vd, in vdev_initialize_thread()
599 } else if (vd->vdev_faulted) { in vdev_initialize_thread()
600 vdev_initialize_change_state(vd, in vdev_initialize_thread()
604 ASSERT(vd->vdev_initialize_thread != NULL || in vdev_initialize_thread()
605 vd->vdev_initialize_inflight == 0); in vdev_initialize_thread()
614 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_thread()
616 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_thread()
618 vd->vdev_initialize_thread = NULL; in vdev_initialize_thread()
619 cv_broadcast(&vd->vdev_initialize_cv); in vdev_initialize_thread()
620 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_thread()
630 vdev_initialize(vdev_t *vd) in vdev_initialize() argument
632 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize()
633 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_initialize()
634 ASSERT(vdev_is_concrete(vd)); in vdev_initialize()
635 ASSERT0P(vd->vdev_initialize_thread); in vdev_initialize()
636 ASSERT(!vd->vdev_detached); in vdev_initialize()
637 ASSERT(!vd->vdev_initialize_exit_wanted); in vdev_initialize()
638 ASSERT(!vd->vdev_top->vdev_removing); in vdev_initialize()
639 ASSERT(!vd->vdev_top->vdev_rz_expanding); in vdev_initialize()
641 vdev_initialize_change_state(vd, VDEV_INITIALIZE_ACTIVE); in vdev_initialize()
642 vd->vdev_initialize_thread = thread_create(NULL, 0, in vdev_initialize()
643 vdev_initialize_thread, vd, 0, &p0, TS_RUN, maxclsyspri); in vdev_initialize()
651 vdev_uninitialize(vdev_t *vd) in vdev_uninitialize() argument
653 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_uninitialize()
654 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_uninitialize()
655 ASSERT(vdev_is_concrete(vd)); in vdev_uninitialize()
656 ASSERT0P(vd->vdev_initialize_thread); in vdev_uninitialize()
657 ASSERT(!vd->vdev_detached); in vdev_uninitialize()
658 ASSERT(!vd->vdev_initialize_exit_wanted); in vdev_uninitialize()
659 ASSERT(!vd->vdev_top->vdev_removing); in vdev_uninitialize()
661 vdev_initialize_change_state(vd, VDEV_INITIALIZE_NONE); in vdev_uninitialize()
668 vdev_initialize_stop_wait_impl(vdev_t *vd) in vdev_initialize_stop_wait_impl() argument
670 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize_stop_wait_impl()
672 while (vd->vdev_initialize_thread != NULL) in vdev_initialize_stop_wait_impl()
673 cv_wait(&vd->vdev_initialize_cv, &vd->vdev_initialize_lock); in vdev_initialize_stop_wait_impl()
675 ASSERT0P(vd->vdev_initialize_thread); in vdev_initialize_stop_wait_impl()
676 vd->vdev_initialize_exit_wanted = B_FALSE; in vdev_initialize_stop_wait_impl()
686 vdev_t *vd; in vdev_initialize_stop_wait() local
691 while ((vd = list_remove_head(vd_list)) != NULL) { in vdev_initialize_stop_wait()
692 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_stop_wait()
693 vdev_initialize_stop_wait_impl(vd); in vdev_initialize_stop_wait()
694 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_stop_wait()
708 vdev_initialize_stop(vdev_t *vd, vdev_initializing_state_t tgt_state, in vdev_initialize_stop() argument
711 ASSERT(!spa_config_held(vd->vdev_spa, SCL_CONFIG|SCL_STATE, RW_WRITER)); in vdev_initialize_stop()
712 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize_stop()
713 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_initialize_stop()
714 ASSERT(vdev_is_concrete(vd)); in vdev_initialize_stop()
720 if (vd->vdev_initialize_thread == NULL && in vdev_initialize_stop()
725 vdev_initialize_change_state(vd, tgt_state); in vdev_initialize_stop()
726 vd->vdev_initialize_exit_wanted = B_TRUE; in vdev_initialize_stop()
729 vdev_initialize_stop_wait_impl(vd); in vdev_initialize_stop()
732 vd->vdev_spa->spa_export_thread == curthread); in vdev_initialize_stop()
733 list_insert_tail(vd_list, vd); in vdev_initialize_stop()
738 vdev_initialize_stop_all_impl(vdev_t *vd, vdev_initializing_state_t tgt_state, in vdev_initialize_stop_all_impl() argument
741 if (vd->vdev_ops->vdev_op_leaf && vdev_is_concrete(vd)) { in vdev_initialize_stop_all_impl()
742 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_stop_all_impl()
743 vdev_initialize_stop(vd, tgt_state, vd_list); in vdev_initialize_stop_all_impl()
744 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_stop_all_impl()
748 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_initialize_stop_all_impl()
749 vdev_initialize_stop_all_impl(vd->vdev_child[i], tgt_state, in vdev_initialize_stop_all_impl()
759 vdev_initialize_stop_all(vdev_t *vd, vdev_initializing_state_t tgt_state) in vdev_initialize_stop_all() argument
761 spa_t *spa = vd->vdev_spa; in vdev_initialize_stop_all()
770 vdev_initialize_stop_all_impl(vd, tgt_state, &vd_list); in vdev_initialize_stop_all()
773 if (vd->vdev_spa->spa_sync_on) { in vdev_initialize_stop_all()
775 txg_wait_synced(spa_get_dsl(vd->vdev_spa), 0); in vdev_initialize_stop_all()
782 vdev_initialize_restart(vdev_t *vd) in vdev_initialize_restart() argument
785 vd->vdev_spa->spa_load_thread == curthread); in vdev_initialize_restart()
786 ASSERT(!spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER)); in vdev_initialize_restart()
788 if (vd->vdev_leaf_zap != 0) { in vdev_initialize_restart()
789 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_restart()
791 int err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_initialize_restart()
792 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_INITIALIZE_STATE, in vdev_initialize_restart()
795 vd->vdev_initialize_state = initialize_state; in vdev_initialize_restart()
798 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_initialize_restart()
799 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_INITIALIZE_ACTION_TIME, in vdev_initialize_restart()
802 vd->vdev_initialize_action_time = timestamp; in vdev_initialize_restart()
804 if ((vd->vdev_initialize_state == VDEV_INITIALIZE_SUSPENDED || in vdev_initialize_restart()
805 vd->vdev_offline) && !vd->vdev_top->vdev_rz_expanding) { in vdev_initialize_restart()
807 VERIFY0(vdev_initialize_load(vd)); in vdev_initialize_restart()
808 } else if (vd->vdev_initialize_state == in vdev_initialize_restart()
809 VDEV_INITIALIZE_ACTIVE && vdev_writeable(vd) && in vdev_initialize_restart()
810 !vd->vdev_top->vdev_removing && in vdev_initialize_restart()
811 !vd->vdev_top->vdev_rz_expanding && in vdev_initialize_restart()
812 vd->vdev_initialize_thread == NULL) { in vdev_initialize_restart()
813 vdev_initialize(vd); in vdev_initialize_restart()
816 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_restart()
819 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_initialize_restart()
820 vdev_initialize_restart(vd->vdev_child[i]); in vdev_initialize_restart()