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()
100 vdev_initialize_change_state(vdev_t *vd, vdev_initializing_state_t new_state) in vdev_initialize_change_state() argument
102 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize_change_state()
103 spa_t *spa = vd->vdev_spa; in vdev_initialize_change_state()
105 if (new_state == vd->vdev_initialize_state) in vdev_initialize_change_state()
112 *guid = vd->vdev_guid; in vdev_initialize_change_state()
117 if (vd->vdev_initialize_state != VDEV_INITIALIZE_SUSPENDED) { in vdev_initialize_change_state()
118 vd->vdev_initialize_action_time = gethrestime_sec(); in vdev_initialize_change_state()
120 vd->vdev_initialize_state = new_state; in vdev_initialize_change_state()
130 "vdev=%s activated", vd->vdev_path); in vdev_initialize_change_state()
134 "vdev=%s suspended", vd->vdev_path); in vdev_initialize_change_state()
138 "vdev=%s canceled", vd->vdev_path); in vdev_initialize_change_state()
142 "vdev=%s complete", vd->vdev_path); in vdev_initialize_change_state()
154 vdev_t *vd = zio->io_vd; in vdev_initialize_cb() local
155 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_cb()
156 if (zio->io_error == ENXIO && !vdev_writeable(vd)) { in vdev_initialize_cb()
163 &vd->vdev_initialize_offset[zio->io_txg & TXG_MASK]; in vdev_initialize_cb()
172 vd->vdev_stat.vs_initialize_errors++; in vdev_initialize_cb()
174 vd->vdev_initialize_bytes_done += zio->io_orig_size; in vdev_initialize_cb()
176 ASSERT3U(vd->vdev_initialize_inflight, >, 0); in vdev_initialize_cb()
177 vd->vdev_initialize_inflight--; in vdev_initialize_cb()
178 cv_broadcast(&vd->vdev_initialize_io_cv); in vdev_initialize_cb()
179 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_cb()
181 spa_config_exit(vd->vdev_spa, SCL_STATE_ALL, vd); in vdev_initialize_cb()
186 vdev_initialize_write(vdev_t *vd, uint64_t start, uint64_t size, abd_t *data) in vdev_initialize_write() argument
188 spa_t *spa = vd->vdev_spa; in vdev_initialize_write()
191 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
192 while (vd->vdev_initialize_inflight >= zfs_initialize_limit) { in vdev_initialize_write()
193 cv_wait(&vd->vdev_initialize_io_cv, in vdev_initialize_write()
194 &vd->vdev_initialize_io_lock); in vdev_initialize_write()
196 vd->vdev_initialize_inflight++; in vdev_initialize_write()
197 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
203 spa_config_enter(spa, SCL_STATE_ALL, vd, RW_READER); in vdev_initialize_write()
204 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_write()
206 if (vd->vdev_initialize_offset[txg & TXG_MASK] == 0) { in vdev_initialize_write()
208 *guid = vd->vdev_guid; in vdev_initialize_write()
220 if (vdev_initialize_should_stop(vd)) { in vdev_initialize_write()
221 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
222 ASSERT3U(vd->vdev_initialize_inflight, >, 0); in vdev_initialize_write()
223 vd->vdev_initialize_inflight--; in vdev_initialize_write()
224 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_write()
225 spa_config_exit(vd->vdev_spa, SCL_STATE_ALL, vd); in vdev_initialize_write()
226 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_write()
230 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_write()
232 vd->vdev_initialize_offset[txg & TXG_MASK] = start + size; in vdev_initialize_write()
233 zio_nowait(zio_write_phys(spa->spa_txg_zio[txg & TXG_MASK], vd, start, in vdev_initialize_write()
279 vdev_initialize_ranges(vdev_t *vd, abd_t *data) in vdev_initialize_ranges() argument
281 range_tree_t *rt = vd->vdev_initialize_tree; in vdev_initialize_ranges()
296 error = vdev_initialize_write(vd, in vdev_initialize_ranges()
309 vdev_initialize_calculate_progress(vdev_t *vd) in vdev_initialize_calculate_progress() argument
311 ASSERT(spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_READER) || in vdev_initialize_calculate_progress()
312 spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_WRITER)); in vdev_initialize_calculate_progress()
313 ASSERT(vd->vdev_leaf_zap != 0); in vdev_initialize_calculate_progress()
315 vd->vdev_initialize_bytes_est = 0; in vdev_initialize_calculate_progress()
316 vd->vdev_initialize_bytes_done = 0; in vdev_initialize_calculate_progress()
318 for (uint64_t i = 0; i < vd->vdev_top->vdev_ms_count; i++) { in vdev_initialize_calculate_progress()
319 metaslab_t *msp = vd->vdev_top->vdev_ms[i]; in vdev_initialize_calculate_progress()
325 if (vd->vdev_top->vdev_ops == &vdev_raidz_ops) in vdev_initialize_calculate_progress()
326 ms_free /= vd->vdev_top->vdev_children; in vdev_initialize_calculate_progress()
336 vdev_xlate(vd, &logical_rs, &physical_rs); in vdev_initialize_calculate_progress()
338 if (vd->vdev_initialize_last_offset <= physical_rs.rs_start) { in vdev_initialize_calculate_progress()
339 vd->vdev_initialize_bytes_est += ms_free; in vdev_initialize_calculate_progress()
342 } else if (vd->vdev_initialize_last_offset > in vdev_initialize_calculate_progress()
344 vd->vdev_initialize_bytes_done += ms_free; in vdev_initialize_calculate_progress()
345 vd->vdev_initialize_bytes_est += ms_free; in vdev_initialize_calculate_progress()
365 vdev_xlate(vd, &logical_rs, &physical_rs); in vdev_initialize_calculate_progress()
369 vd->vdev_initialize_bytes_est += size; in vdev_initialize_calculate_progress()
370 if (vd->vdev_initialize_last_offset > in vdev_initialize_calculate_progress()
372 vd->vdev_initialize_bytes_done += size; in vdev_initialize_calculate_progress()
373 } else if (vd->vdev_initialize_last_offset > in vdev_initialize_calculate_progress()
375 vd->vdev_initialize_last_offset < in vdev_initialize_calculate_progress()
377 vd->vdev_initialize_bytes_done += in vdev_initialize_calculate_progress()
378 vd->vdev_initialize_last_offset - in vdev_initialize_calculate_progress()
387 vdev_initialize_load(vdev_t *vd) in vdev_initialize_load() argument
390 ASSERT(spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_READER) || in vdev_initialize_load()
391 spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_WRITER)); in vdev_initialize_load()
392 ASSERT(vd->vdev_leaf_zap != 0); in vdev_initialize_load()
394 if (vd->vdev_initialize_state == VDEV_INITIALIZE_ACTIVE || in vdev_initialize_load()
395 vd->vdev_initialize_state == VDEV_INITIALIZE_SUSPENDED) { in vdev_initialize_load()
396 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_initialize_load()
397 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_INITIALIZE_LAST_OFFSET, in vdev_initialize_load()
398 sizeof (vd->vdev_initialize_last_offset), 1, in vdev_initialize_load()
399 &vd->vdev_initialize_last_offset); in vdev_initialize_load()
401 vd->vdev_initialize_last_offset = 0; in vdev_initialize_load()
406 vdev_initialize_calculate_progress(vd); in vdev_initialize_load()
418 vdev_t *vd = arg; in vdev_initialize_range_add() local
423 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_initialize_range_add()
424 vdev_xlate(vd, &logical_rs, &physical_rs); in vdev_initialize_range_add()
426 IMPLY(vd->vdev_top == vd, in vdev_initialize_range_add()
428 IMPLY(vd->vdev_top == vd, in vdev_initialize_range_add()
432 if (physical_rs.rs_end <= vd->vdev_initialize_last_offset) in vdev_initialize_range_add()
436 if (vd->vdev_initialize_last_offset > physical_rs.rs_start) { in vdev_initialize_range_add()
438 "(%llu, %llu)", vd->vdev_path, in vdev_initialize_range_add()
441 (u_longlong_t)vd->vdev_initialize_last_offset, in vdev_initialize_range_add()
444 vd->vdev_initialize_last_offset); in vdev_initialize_range_add()
445 physical_rs.rs_start = vd->vdev_initialize_last_offset; in vdev_initialize_range_add()
455 range_tree_add(vd->vdev_initialize_tree, physical_rs.rs_start, in vdev_initialize_range_add()
465 vdev_t *vd = arg; in vdev_initialize_thread() local
466 spa_t *spa = vd->vdev_spa; in vdev_initialize_thread()
470 ASSERT(vdev_is_concrete(vd)); in vdev_initialize_thread()
473 vd->vdev_initialize_last_offset = 0; in vdev_initialize_thread()
474 VERIFY0(vdev_initialize_load(vd)); in vdev_initialize_thread()
478 vd->vdev_initialize_tree = range_tree_create(NULL, RANGE_SEG64, NULL, in vdev_initialize_thread()
481 for (uint64_t i = 0; !vd->vdev_detached && in vdev_initialize_thread()
482 i < vd->vdev_top->vdev_ms_count; i++) { in vdev_initialize_thread()
483 metaslab_t *msp = vd->vdev_top->vdev_ms[i]; in vdev_initialize_thread()
490 if (vd->vdev_top->vdev_ms_count != ms_count) { in vdev_initialize_thread()
491 vdev_initialize_calculate_progress(vd); in vdev_initialize_thread()
492 ms_count = vd->vdev_top->vdev_ms_count; in vdev_initialize_thread()
503 vd); in vdev_initialize_thread()
506 error = vdev_initialize_ranges(vd, deadbeef); in vdev_initialize_thread()
510 range_tree_vacate(vd->vdev_initialize_tree, NULL, NULL); in vdev_initialize_thread()
516 mutex_enter(&vd->vdev_initialize_io_lock); in vdev_initialize_thread()
517 while (vd->vdev_initialize_inflight > 0) { in vdev_initialize_thread()
518 cv_wait(&vd->vdev_initialize_io_cv, in vdev_initialize_thread()
519 &vd->vdev_initialize_io_lock); in vdev_initialize_thread()
521 mutex_exit(&vd->vdev_initialize_io_lock); in vdev_initialize_thread()
523 range_tree_destroy(vd->vdev_initialize_tree); in vdev_initialize_thread()
525 vd->vdev_initialize_tree = NULL; in vdev_initialize_thread()
527 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_thread()
528 if (!vd->vdev_initialize_exit_wanted && vdev_writeable(vd)) { in vdev_initialize_thread()
529 vdev_initialize_change_state(vd, VDEV_INITIALIZE_COMPLETE); in vdev_initialize_thread()
531 ASSERT(vd->vdev_initialize_thread != NULL || in vdev_initialize_thread()
532 vd->vdev_initialize_inflight == 0); in vdev_initialize_thread()
541 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_thread()
543 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_thread()
545 vd->vdev_initialize_thread = NULL; in vdev_initialize_thread()
546 cv_broadcast(&vd->vdev_initialize_cv); in vdev_initialize_thread()
547 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_thread()
555 vdev_initialize(vdev_t *vd) in vdev_initialize() argument
557 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize()
558 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_initialize()
559 ASSERT(vdev_is_concrete(vd)); in vdev_initialize()
560 ASSERT3P(vd->vdev_initialize_thread, ==, NULL); in vdev_initialize()
561 ASSERT(!vd->vdev_detached); in vdev_initialize()
562 ASSERT(!vd->vdev_initialize_exit_wanted); in vdev_initialize()
563 ASSERT(!vd->vdev_top->vdev_removing); in vdev_initialize()
565 vdev_initialize_change_state(vd, VDEV_INITIALIZE_ACTIVE); in vdev_initialize()
566 vd->vdev_initialize_thread = thread_create(NULL, 0, in vdev_initialize()
567 vdev_initialize_thread, vd, 0, &p0, TS_RUN, maxclsyspri); in vdev_initialize()
574 vdev_initialize_stop_wait_impl(vdev_t *vd) in vdev_initialize_stop_wait_impl() argument
576 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize_stop_wait_impl()
578 while (vd->vdev_initialize_thread != NULL) in vdev_initialize_stop_wait_impl()
579 cv_wait(&vd->vdev_initialize_cv, &vd->vdev_initialize_lock); in vdev_initialize_stop_wait_impl()
581 ASSERT3P(vd->vdev_initialize_thread, ==, NULL); in vdev_initialize_stop_wait_impl()
582 vd->vdev_initialize_exit_wanted = B_FALSE; in vdev_initialize_stop_wait_impl()
591 vdev_t *vd; in vdev_initialize_stop_wait() local
595 while ((vd = list_remove_head(vd_list)) != NULL) { in vdev_initialize_stop_wait()
596 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_stop_wait()
597 vdev_initialize_stop_wait_impl(vd); in vdev_initialize_stop_wait()
598 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_stop_wait()
612 vdev_initialize_stop(vdev_t *vd, vdev_initializing_state_t tgt_state, in vdev_initialize_stop() argument
615 ASSERT(!spa_config_held(vd->vdev_spa, SCL_CONFIG|SCL_STATE, RW_WRITER)); in vdev_initialize_stop()
616 ASSERT(MUTEX_HELD(&vd->vdev_initialize_lock)); in vdev_initialize_stop()
617 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_initialize_stop()
618 ASSERT(vdev_is_concrete(vd)); in vdev_initialize_stop()
624 if (vd->vdev_initialize_thread == NULL && in vdev_initialize_stop()
629 vdev_initialize_change_state(vd, tgt_state); in vdev_initialize_stop()
630 vd->vdev_initialize_exit_wanted = B_TRUE; in vdev_initialize_stop()
633 vdev_initialize_stop_wait_impl(vd); in vdev_initialize_stop()
636 list_insert_tail(vd_list, vd); in vdev_initialize_stop()
641 vdev_initialize_stop_all_impl(vdev_t *vd, vdev_initializing_state_t tgt_state, in vdev_initialize_stop_all_impl() argument
644 if (vd->vdev_ops->vdev_op_leaf && vdev_is_concrete(vd)) { in vdev_initialize_stop_all_impl()
645 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_stop_all_impl()
646 vdev_initialize_stop(vd, tgt_state, vd_list); in vdev_initialize_stop_all_impl()
647 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_stop_all_impl()
651 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_initialize_stop_all_impl()
652 vdev_initialize_stop_all_impl(vd->vdev_child[i], tgt_state, in vdev_initialize_stop_all_impl()
662 vdev_initialize_stop_all(vdev_t *vd, vdev_initializing_state_t tgt_state) in vdev_initialize_stop_all() argument
664 spa_t *spa = vd->vdev_spa; in vdev_initialize_stop_all()
672 vdev_initialize_stop_all_impl(vd, tgt_state, &vd_list); in vdev_initialize_stop_all()
675 if (vd->vdev_spa->spa_sync_on) { in vdev_initialize_stop_all()
677 txg_wait_synced(spa_get_dsl(vd->vdev_spa), 0); in vdev_initialize_stop_all()
684 vdev_initialize_restart(vdev_t *vd) in vdev_initialize_restart() argument
687 ASSERT(!spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER)); in vdev_initialize_restart()
689 if (vd->vdev_leaf_zap != 0) { in vdev_initialize_restart()
690 mutex_enter(&vd->vdev_initialize_lock); in vdev_initialize_restart()
692 int err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_initialize_restart()
693 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_INITIALIZE_STATE, in vdev_initialize_restart()
696 vd->vdev_initialize_state = initialize_state; in vdev_initialize_restart()
699 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_initialize_restart()
700 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_INITIALIZE_ACTION_TIME, in vdev_initialize_restart()
703 vd->vdev_initialize_action_time = (time_t)timestamp; in vdev_initialize_restart()
705 if (vd->vdev_initialize_state == VDEV_INITIALIZE_SUSPENDED || in vdev_initialize_restart()
706 vd->vdev_offline) { in vdev_initialize_restart()
708 VERIFY0(vdev_initialize_load(vd)); in vdev_initialize_restart()
709 } else if (vd->vdev_initialize_state == in vdev_initialize_restart()
710 VDEV_INITIALIZE_ACTIVE && vdev_writeable(vd) && in vdev_initialize_restart()
711 !vd->vdev_top->vdev_removing && in vdev_initialize_restart()
712 vd->vdev_initialize_thread == NULL) { in vdev_initialize_restart()
713 vdev_initialize(vd); in vdev_initialize_restart()
716 mutex_exit(&vd->vdev_initialize_lock); in vdev_initialize_restart()
719 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_initialize_restart()
720 vdev_initialize_restart(vd->vdev_child[i]); in vdev_initialize_restart()