Lines Matching refs:vd
48 vdev_initialize_should_stop(vdev_t *vd) in vdev_initialize_should_stop() argument
50 return (vd->vdev_initialize_exit_wanted || !vdev_writeable(vd) || in vdev_initialize_should_stop()
51 vd->vdev_detached || vd->vdev_top->vdev_removing); in vdev_initialize_should_stop()
69 vdev_t *vd = spa_lookup_by_guid(tx->tx_pool->dp_spa, guid, B_FALSE); in vdev_initialize_zap_update_sync() local
70 if (vd == NULL || vd->vdev_top->vdev_removing || !vdev_is_concrete(vd)) in vdev_initialize_zap_update_sync()
73 uint64_t last_offset = vd->vdev_initialize_offset[txg & TXG_MASK]; in vdev_initialize_zap_update_sync()
74 vd->vdev_initialize_offset[txg & TXG_MASK] = 0; in vdev_initialize_zap_update_sync()
76 VERIFY(vd->vdev_leaf_zap != 0); in vdev_initialize_zap_update_sync()
78 objset_t *mos = vd->vdev_spa->spa_meta_objset; in vdev_initialize_zap_update_sync()
81 vd->vdev_initialize_last_offset = last_offset; in vdev_initialize_zap_update_sync()
82 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_update_sync()
86 if (vd->vdev_initialize_action_time > 0) { in vdev_initialize_zap_update_sync()
87 uint64_t val = (uint64_t)vd->vdev_initialize_action_time; in vdev_initialize_zap_update_sync()
88 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_update_sync()
93 uint64_t initialize_state = vd->vdev_initialize_state; in vdev_initialize_zap_update_sync()
94 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_update_sync()
106 vdev_t *vd = spa_lookup_by_guid(tx->tx_pool->dp_spa, guid, B_FALSE); in vdev_initialize_zap_remove_sync() local
107 if (vd == NULL || vd->vdev_top->vdev_removing || !vdev_is_concrete(vd)) in vdev_initialize_zap_remove_sync()
110 ASSERT3S(vd->vdev_initialize_state, ==, VDEV_INITIALIZE_NONE); in vdev_initialize_zap_remove_sync()
111 ASSERT3U(vd->vdev_leaf_zap, !=, 0); in vdev_initialize_zap_remove_sync()
113 vd->vdev_initialize_last_offset = 0; in vdev_initialize_zap_remove_sync()
114 vd->vdev_initialize_action_time = 0; in vdev_initialize_zap_remove_sync()
116 objset_t *mos = vd->vdev_spa->spa_meta_objset; in vdev_initialize_zap_remove_sync()
119 error = zap_remove(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_remove_sync()
123 error = zap_remove(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_remove_sync()
127 error = zap_remove(mos, vd->vdev_leaf_zap, in vdev_initialize_zap_remove_sync()
133 vdev_initialize_change_state(vdev_t *vd, vdev_initializing_state_t new_state) in vdev_initialize_change_state() argument
135 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize_change_state()
136 spa_t *spa = vd->vdev_spa; in vdev_initialize_change_state()
138 if (new_state == vd->vdev_initialize_state) in vdev_initialize_change_state()
145 *guid = vd->vdev_guid; in vdev_initialize_change_state()
150 if (vd->vdev_initialize_state != VDEV_INITIALIZE_SUSPENDED) { in vdev_initialize_change_state()
151 vd->vdev_initialize_action_time = gethrestime_sec(); in vdev_initialize_change_state()
154 vdev_initializing_state_t old_state = vd->vdev_initialize_state; in vdev_initialize_change_state()
155 vd->vdev_initialize_state = new_state; in vdev_initialize_change_state()
171 "vdev=%s activated", vd->vdev_path); in vdev_initialize_change_state()
175 "vdev=%s suspended", vd->vdev_path); in vdev_initialize_change_state()
181 "vdev=%s canceled", vd->vdev_path); in vdev_initialize_change_state()
185 "vdev=%s complete", vd->vdev_path); in vdev_initialize_change_state()
189 "vdev=%s", vd->vdev_path); in vdev_initialize_change_state()
204 vdev_t *vd = zio->io_vd; in vdev_initialize_cb() local
205 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_cb()
206 if (zio->io_error == ENXIO && !vdev_writeable(vd)) { in vdev_initialize_cb()
213 &vd->vdev_initialize_offset[zio->io_txg & TXG_MASK]; in vdev_initialize_cb()
222 vd->vdev_stat.vs_initialize_errors++; in vdev_initialize_cb()
224 vd->vdev_initialize_bytes_done += zio->io_orig_size; in vdev_initialize_cb()
226 ASSERT3U(vd->vdev_initialize_inflight, >, 0); in vdev_initialize_cb()
227 vd->vdev_initialize_inflight--; in vdev_initialize_cb()
228 cv_broadcast(&vd->vdev_initialize_io_cv); in vdev_initialize_cb()
229 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_cb()
231 spa_config_exit(vd->vdev_spa, SCL_STATE_ALL, vd); in vdev_initialize_cb()
236 vdev_initialize_write(vdev_t *vd, uint64_t start, uint64_t size, abd_t *data) in vdev_initialize_write() argument
238 spa_t *spa = vd->vdev_spa; in vdev_initialize_write()
241 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
242 while (vd->vdev_initialize_inflight >= zfs_initialize_limit) { in vdev_initialize_write()
243 cv_wait(&vd->vdev_initialize_io_cv, in vdev_initialize_write()
244 &vd->vdev_initialize_io_lock); in vdev_initialize_write()
246 vd->vdev_initialize_inflight++; in vdev_initialize_write()
247 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
253 spa_config_enter(spa, SCL_STATE_ALL, vd, RW_READER); in vdev_initialize_write()
254 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_write()
256 if (vd->vdev_initialize_offset[txg & TXG_MASK] == 0) { in vdev_initialize_write()
258 *guid = vd->vdev_guid; in vdev_initialize_write()
269 if (vdev_initialize_should_stop(vd)) { in vdev_initialize_write()
270 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
271 ASSERT3U(vd->vdev_initialize_inflight, >, 0); in vdev_initialize_write()
272 vd->vdev_initialize_inflight--; in vdev_initialize_write()
273 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
274 spa_config_exit(vd->vdev_spa, SCL_STATE_ALL, vd); in vdev_initialize_write()
275 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_write()
279 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_write()
281 vd->vdev_initialize_offset[txg & TXG_MASK] = start + size; in vdev_initialize_write()
282 zio_nowait(zio_write_phys(spa->spa_txg_zio[txg & TXG_MASK], vd, start, in vdev_initialize_write()
329 vdev_initialize_ranges(vdev_t *vd, abd_t *data) in vdev_initialize_ranges() argument
331 range_tree_t *rt = vd->vdev_initialize_tree; in vdev_initialize_ranges()
346 error = vdev_initialize_write(vd, in vdev_initialize_ranges()
370 vdev_t *vd = (vdev_t *)arg; in vdev_initialize_xlate_progress() local
373 vd->vdev_initialize_bytes_est += size; in vdev_initialize_xlate_progress()
375 if (vd->vdev_initialize_last_offset > physical_rs->rs_end) { in vdev_initialize_xlate_progress()
376 vd->vdev_initialize_bytes_done += size; in vdev_initialize_xlate_progress()
377 } else if (vd->vdev_initialize_last_offset > physical_rs->rs_start && in vdev_initialize_xlate_progress()
378 vd->vdev_initialize_last_offset < physical_rs->rs_end) { in vdev_initialize_xlate_progress()
379 vd->vdev_initialize_bytes_done += in vdev_initialize_xlate_progress()
380 vd->vdev_initialize_last_offset - physical_rs->rs_start; in vdev_initialize_xlate_progress()
385 vdev_initialize_calculate_progress(vdev_t *vd) in vdev_initialize_calculate_progress() argument
387 ASSERT(spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_READER) || in vdev_initialize_calculate_progress()
388 spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_WRITER)); in vdev_initialize_calculate_progress()
389 ASSERT(vd->vdev_leaf_zap != 0); in vdev_initialize_calculate_progress()
391 vd->vdev_initialize_bytes_est = 0; in vdev_initialize_calculate_progress()
392 vd->vdev_initialize_bytes_done = 0; in vdev_initialize_calculate_progress()
394 for (uint64_t i = 0; i < vd->vdev_top->vdev_ms_count; i++) { in vdev_initialize_calculate_progress()
395 metaslab_t *msp = vd->vdev_top->vdev_ms[i]; in vdev_initialize_calculate_progress()
400 vdev_get_ndisks(vd->vdev_top); in vdev_initialize_calculate_progress()
412 vdev_xlate(vd, &logical_rs, &physical_rs, &remain_rs); in vdev_initialize_calculate_progress()
413 if (vd->vdev_initialize_last_offset <= physical_rs.rs_start) { in vdev_initialize_calculate_progress()
414 vd->vdev_initialize_bytes_est += ms_free; in vdev_initialize_calculate_progress()
422 vdev_xlate_walk(vd, &remain_rs, in vdev_initialize_calculate_progress()
426 if (vd->vdev_initialize_last_offset > last_rs_end) { in vdev_initialize_calculate_progress()
427 vd->vdev_initialize_bytes_done += ms_free; in vdev_initialize_calculate_progress()
428 vd->vdev_initialize_bytes_est += ms_free; in vdev_initialize_calculate_progress()
449 vdev_xlate_walk(vd, &logical_rs, in vdev_initialize_calculate_progress()
450 vdev_initialize_xlate_progress, vd); in vdev_initialize_calculate_progress()
457 vdev_initialize_load(vdev_t *vd) in vdev_initialize_load() argument
460 ASSERT(spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_READER) || in vdev_initialize_load()
461 spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_WRITER)); in vdev_initialize_load()
462 ASSERT(vd->vdev_leaf_zap != 0); in vdev_initialize_load()
464 if (vd->vdev_initialize_state == VDEV_INITIALIZE_ACTIVE || in vdev_initialize_load()
465 vd->vdev_initialize_state == VDEV_INITIALIZE_SUSPENDED) { in vdev_initialize_load()
466 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_initialize_load()
467 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_INITIALIZE_LAST_OFFSET, in vdev_initialize_load()
468 sizeof (vd->vdev_initialize_last_offset), 1, in vdev_initialize_load()
469 &vd->vdev_initialize_last_offset); in vdev_initialize_load()
471 vd->vdev_initialize_last_offset = 0; in vdev_initialize_load()
476 vdev_initialize_calculate_progress(vd); in vdev_initialize_load()
483 vdev_t *vd = arg; in vdev_initialize_xlate_range_add() local
486 if (physical_rs->rs_end <= vd->vdev_initialize_last_offset) in vdev_initialize_xlate_range_add()
490 if (vd->vdev_initialize_last_offset > physical_rs->rs_start) { in vdev_initialize_xlate_range_add()
492 "(%llu, %llu)", vd->vdev_path, in vdev_initialize_xlate_range_add()
495 (u_longlong_t)vd->vdev_initialize_last_offset, in vdev_initialize_xlate_range_add()
498 vd->vdev_initialize_last_offset); in vdev_initialize_xlate_range_add()
499 physical_rs->rs_start = vd->vdev_initialize_last_offset; in vdev_initialize_xlate_range_add()
504 range_tree_add(vd->vdev_initialize_tree, physical_rs->rs_start, in vdev_initialize_xlate_range_add()
515 vdev_t *vd = arg; in vdev_initialize_range_add() local
520 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_initialize_range_add()
521 vdev_xlate_walk(vd, &logical_rs, vdev_initialize_xlate_range_add, arg); in vdev_initialize_range_add()
527 vdev_t *vd = arg; in vdev_initialize_thread() local
528 spa_t *spa = vd->vdev_spa; in vdev_initialize_thread()
532 ASSERT(vdev_is_concrete(vd)); in vdev_initialize_thread()
535 vd->vdev_initialize_last_offset = 0; in vdev_initialize_thread()
536 VERIFY0(vdev_initialize_load(vd)); in vdev_initialize_thread()
540 vd->vdev_initialize_tree = range_tree_create(NULL, RANGE_SEG64, NULL, in vdev_initialize_thread()
543 for (uint64_t i = 0; !vd->vdev_detached && in vdev_initialize_thread()
544 i < vd->vdev_top->vdev_ms_count; i++) { in vdev_initialize_thread()
545 metaslab_t *msp = vd->vdev_top->vdev_ms[i]; in vdev_initialize_thread()
552 if (vd->vdev_top->vdev_ms_count != ms_count) { in vdev_initialize_thread()
553 vdev_initialize_calculate_progress(vd); in vdev_initialize_thread()
554 ms_count = vd->vdev_top->vdev_ms_count; in vdev_initialize_thread()
565 vd); in vdev_initialize_thread()
568 error = vdev_initialize_ranges(vd, deadbeef); in vdev_initialize_thread()
572 range_tree_vacate(vd->vdev_initialize_tree, NULL, NULL); in vdev_initialize_thread()
578 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_thread()
579 while (vd->vdev_initialize_inflight > 0) { in vdev_initialize_thread()
580 cv_wait(&vd->vdev_initialize_io_cv, in vdev_initialize_thread()
581 &vd->vdev_initialize_io_lock); in vdev_initialize_thread()
583 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_thread()
585 range_tree_destroy(vd->vdev_initialize_tree); in vdev_initialize_thread()
587 vd->vdev_initialize_tree = NULL; in vdev_initialize_thread()
589 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_thread()
590 if (!vd->vdev_initialize_exit_wanted) { in vdev_initialize_thread()
591 if (vdev_writeable(vd)) { in vdev_initialize_thread()
592 vdev_initialize_change_state(vd, in vdev_initialize_thread()
594 } else if (vd->vdev_faulted) { in vdev_initialize_thread()
595 vdev_initialize_change_state(vd, in vdev_initialize_thread()
599 ASSERT(vd->vdev_initialize_thread != NULL || in vdev_initialize_thread()
600 vd->vdev_initialize_inflight == 0); in vdev_initialize_thread()
609 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_thread()
611 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_thread()
613 vd->vdev_initialize_thread = NULL; in vdev_initialize_thread()
614 cv_broadcast(&vd->vdev_initialize_cv); in vdev_initialize_thread()
615 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_thread()
625 vdev_initialize(vdev_t *vd) in vdev_initialize() argument
627 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize()
628 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_initialize()
629 ASSERT(vdev_is_concrete(vd)); in vdev_initialize()
630 ASSERT3P(vd->vdev_initialize_thread, ==, NULL); in vdev_initialize()
631 ASSERT(!vd->vdev_detached); in vdev_initialize()
632 ASSERT(!vd->vdev_initialize_exit_wanted); in vdev_initialize()
633 ASSERT(!vd->vdev_top->vdev_removing); in vdev_initialize()
635 vdev_initialize_change_state(vd, VDEV_INITIALIZE_ACTIVE); in vdev_initialize()
636 vd->vdev_initialize_thread = thread_create(NULL, 0, in vdev_initialize()
637 vdev_initialize_thread, vd, 0, &p0, TS_RUN, maxclsyspri); in vdev_initialize()
645 vdev_uninitialize(vdev_t *vd) in vdev_uninitialize() argument
647 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_uninitialize()
648 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_uninitialize()
649 ASSERT(vdev_is_concrete(vd)); in vdev_uninitialize()
650 ASSERT3P(vd->vdev_initialize_thread, ==, NULL); in vdev_uninitialize()
651 ASSERT(!vd->vdev_detached); in vdev_uninitialize()
652 ASSERT(!vd->vdev_initialize_exit_wanted); in vdev_uninitialize()
653 ASSERT(!vd->vdev_top->vdev_removing); in vdev_uninitialize()
655 vdev_initialize_change_state(vd, VDEV_INITIALIZE_NONE); in vdev_uninitialize()
662 vdev_initialize_stop_wait_impl(vdev_t *vd) in vdev_initialize_stop_wait_impl() argument
664 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize_stop_wait_impl()
666 while (vd->vdev_initialize_thread != NULL) in vdev_initialize_stop_wait_impl()
667 cv_wait(&vd->vdev_initialize_cv, &vd->vdev_initialize_lock); in vdev_initialize_stop_wait_impl()
669 ASSERT3P(vd->vdev_initialize_thread, ==, NULL); in vdev_initialize_stop_wait_impl()
670 vd->vdev_initialize_exit_wanted = B_FALSE; in vdev_initialize_stop_wait_impl()
680 vdev_t *vd; in vdev_initialize_stop_wait() local
684 while ((vd = list_remove_head(vd_list)) != NULL) { in vdev_initialize_stop_wait()
685 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_stop_wait()
686 vdev_initialize_stop_wait_impl(vd); in vdev_initialize_stop_wait()
687 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_stop_wait()
701 vdev_initialize_stop(vdev_t *vd, vdev_initializing_state_t tgt_state, in vdev_initialize_stop() argument
704 ASSERT(!spa_config_held(vd->vdev_spa, SCL_CONFIG|SCL_STATE, RW_WRITER)); in vdev_initialize_stop()
705 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize_stop()
706 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_initialize_stop()
707 ASSERT(vdev_is_concrete(vd)); in vdev_initialize_stop()
713 if (vd->vdev_initialize_thread == NULL && in vdev_initialize_stop()
718 vdev_initialize_change_state(vd, tgt_state); in vdev_initialize_stop()
719 vd->vdev_initialize_exit_wanted = B_TRUE; in vdev_initialize_stop()
722 vdev_initialize_stop_wait_impl(vd); in vdev_initialize_stop()
725 list_insert_tail(vd_list, vd); in vdev_initialize_stop()
730 vdev_initialize_stop_all_impl(vdev_t *vd, vdev_initializing_state_t tgt_state, in vdev_initialize_stop_all_impl() argument
733 if (vd->vdev_ops->vdev_op_leaf && vdev_is_concrete(vd)) { in vdev_initialize_stop_all_impl()
734 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_stop_all_impl()
735 vdev_initialize_stop(vd, tgt_state, vd_list); in vdev_initialize_stop_all_impl()
736 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_stop_all_impl()
740 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_initialize_stop_all_impl()
741 vdev_initialize_stop_all_impl(vd->vdev_child[i], tgt_state, in vdev_initialize_stop_all_impl()
751 vdev_initialize_stop_all(vdev_t *vd, vdev_initializing_state_t tgt_state) in vdev_initialize_stop_all() argument
753 spa_t *spa = vd->vdev_spa; in vdev_initialize_stop_all()
761 vdev_initialize_stop_all_impl(vd, tgt_state, &vd_list); in vdev_initialize_stop_all()
764 if (vd->vdev_spa->spa_sync_on) { in vdev_initialize_stop_all()
766 txg_wait_synced(spa_get_dsl(vd->vdev_spa), 0); in vdev_initialize_stop_all()
773 vdev_initialize_restart(vdev_t *vd) in vdev_initialize_restart() argument
776 ASSERT(!spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER)); in vdev_initialize_restart()
778 if (vd->vdev_leaf_zap != 0) { in vdev_initialize_restart()
779 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_restart()
781 int err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_initialize_restart()
782 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_INITIALIZE_STATE, in vdev_initialize_restart()
785 vd->vdev_initialize_state = initialize_state; in vdev_initialize_restart()
788 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_initialize_restart()
789 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_INITIALIZE_ACTION_TIME, in vdev_initialize_restart()
792 vd->vdev_initialize_action_time = timestamp; in vdev_initialize_restart()
794 if (vd->vdev_initialize_state == VDEV_INITIALIZE_SUSPENDED || in vdev_initialize_restart()
795 vd->vdev_offline) { in vdev_initialize_restart()
797 VERIFY0(vdev_initialize_load(vd)); in vdev_initialize_restart()
798 } else if (vd->vdev_initialize_state == in vdev_initialize_restart()
799 VDEV_INITIALIZE_ACTIVE && vdev_writeable(vd) && in vdev_initialize_restart()
800 !vd->vdev_top->vdev_removing && in vdev_initialize_restart()
801 vd->vdev_initialize_thread == NULL) { in vdev_initialize_restart()
802 vdev_initialize(vd); in vdev_initialize_restart()
805 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_restart()
808 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_initialize_restart()
809 vdev_initialize_restart(vd->vdev_child[i]); in vdev_initialize_restart()