Lines Matching refs:vd

169 vdev_trim_should_stop(vdev_t *vd)  in vdev_trim_should_stop()  argument
171 return (vd->vdev_trim_exit_wanted || !vdev_writeable(vd) || in vdev_trim_should_stop()
172 vd->vdev_detached || vd->vdev_top->vdev_removing); in vdev_trim_should_stop()
205 vdev_t *vd = spa_lookup_by_guid(tx->tx_pool->dp_spa, guid, B_FALSE); in vdev_trim_zap_update_sync() local
206 if (vd == NULL || vd->vdev_top->vdev_removing || !vdev_is_concrete(vd)) in vdev_trim_zap_update_sync()
209 uint64_t last_offset = vd->vdev_trim_offset[txg & TXG_MASK]; in vdev_trim_zap_update_sync()
210 vd->vdev_trim_offset[txg & TXG_MASK] = 0; in vdev_trim_zap_update_sync()
212 VERIFY3U(vd->vdev_leaf_zap, !=, 0); in vdev_trim_zap_update_sync()
214 objset_t *mos = vd->vdev_spa->spa_meta_objset; in vdev_trim_zap_update_sync()
216 if (last_offset > 0 || vd->vdev_trim_last_offset == UINT64_MAX) { in vdev_trim_zap_update_sync()
218 if (vd->vdev_trim_last_offset == UINT64_MAX) in vdev_trim_zap_update_sync()
221 vd->vdev_trim_last_offset = last_offset; in vdev_trim_zap_update_sync()
222 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, in vdev_trim_zap_update_sync()
227 if (vd->vdev_trim_action_time > 0) { in vdev_trim_zap_update_sync()
228 uint64_t val = (uint64_t)vd->vdev_trim_action_time; in vdev_trim_zap_update_sync()
229 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, in vdev_trim_zap_update_sync()
234 if (vd->vdev_trim_rate > 0) { in vdev_trim_zap_update_sync()
235 uint64_t rate = (uint64_t)vd->vdev_trim_rate; in vdev_trim_zap_update_sync()
240 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, in vdev_trim_zap_update_sync()
244 uint64_t partial = vd->vdev_trim_partial; in vdev_trim_zap_update_sync()
248 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, VDEV_LEAF_ZAP_TRIM_PARTIAL, in vdev_trim_zap_update_sync()
251 uint64_t secure = vd->vdev_trim_secure; in vdev_trim_zap_update_sync()
255 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, VDEV_LEAF_ZAP_TRIM_SECURE, in vdev_trim_zap_update_sync()
259 uint64_t trim_state = vd->vdev_trim_state; in vdev_trim_zap_update_sync()
260 VERIFY0(zap_update(mos, vd->vdev_leaf_zap, VDEV_LEAF_ZAP_TRIM_STATE, in vdev_trim_zap_update_sync()
270 vdev_trim_change_state(vdev_t *vd, vdev_trim_state_t new_state, in vdev_trim_change_state() argument
273 ASSERT(MUTEX_HELD(&vd->vdev_trim_lock)); in vdev_trim_change_state()
274 spa_t *spa = vd->vdev_spa; in vdev_trim_change_state()
276 if (new_state == vd->vdev_trim_state) in vdev_trim_change_state()
283 *guid = vd->vdev_guid; in vdev_trim_change_state()
288 if (vd->vdev_trim_state != VDEV_TRIM_SUSPENDED) { in vdev_trim_change_state()
289 vd->vdev_trim_action_time = gethrestime_sec(); in vdev_trim_change_state()
298 if (vd->vdev_trim_state == VDEV_TRIM_COMPLETE || in vdev_trim_change_state()
299 vd->vdev_trim_state == VDEV_TRIM_CANCELED) { in vdev_trim_change_state()
300 vd->vdev_trim_last_offset = UINT64_MAX; in vdev_trim_change_state()
301 vd->vdev_trim_rate = UINT64_MAX; in vdev_trim_change_state()
302 vd->vdev_trim_partial = UINT64_MAX; in vdev_trim_change_state()
303 vd->vdev_trim_secure = UINT64_MAX; in vdev_trim_change_state()
307 vd->vdev_trim_rate = rate; in vdev_trim_change_state()
310 vd->vdev_trim_partial = partial; in vdev_trim_change_state()
313 vd->vdev_trim_secure = secure; in vdev_trim_change_state()
316 boolean_t resumed = !!(vd->vdev_trim_state == VDEV_TRIM_SUSPENDED); in vdev_trim_change_state()
317 vd->vdev_trim_state = new_state; in vdev_trim_change_state()
326 spa_event_notify(spa, vd, NULL, in vdev_trim_change_state()
329 "vdev=%s activated", vd->vdev_path); in vdev_trim_change_state()
332 spa_event_notify(spa, vd, NULL, ESC_ZFS_TRIM_SUSPEND); in vdev_trim_change_state()
334 "vdev=%s suspended", vd->vdev_path); in vdev_trim_change_state()
337 spa_event_notify(spa, vd, NULL, ESC_ZFS_TRIM_CANCEL); in vdev_trim_change_state()
339 "vdev=%s canceled", vd->vdev_path); in vdev_trim_change_state()
342 spa_event_notify(spa, vd, NULL, ESC_ZFS_TRIM_FINISH); in vdev_trim_change_state()
344 "vdev=%s complete", vd->vdev_path); in vdev_trim_change_state()
361 vdev_t *vd = zio->io_vd; in vdev_trim_cb() local
363 mutex_enter(&vd->vdev_trim_io_lock); in vdev_trim_cb()
364 if (zio->io_error == ENXIO && !vdev_writeable(vd)) { in vdev_trim_cb()
371 &vd->vdev_trim_offset[zio->io_txg & TXG_MASK]; in vdev_trim_cb()
375 vd->vdev_stat.vs_trim_errors++; in vdev_trim_cb()
387 vd->vdev_trim_bytes_done += zio->io_orig_size; in vdev_trim_cb()
390 ASSERT3U(vd->vdev_trim_inflight[TRIM_TYPE_MANUAL], >, 0); in vdev_trim_cb()
391 vd->vdev_trim_inflight[TRIM_TYPE_MANUAL]--; in vdev_trim_cb()
392 cv_broadcast(&vd->vdev_trim_io_cv); in vdev_trim_cb()
393 mutex_exit(&vd->vdev_trim_io_lock); in vdev_trim_cb()
395 spa_config_exit(vd->vdev_spa, SCL_STATE_ALL, vd); in vdev_trim_cb()
407 vdev_t *vd = zio->io_vd; in vdev_autotrim_cb() local
409 mutex_enter(&vd->vdev_trim_io_lock); in vdev_autotrim_cb()
412 vd->vdev_stat.vs_trim_errors++; in vdev_autotrim_cb()
423 vd->vdev_autotrim_bytes_done += zio->io_orig_size; in vdev_autotrim_cb()
426 ASSERT3U(vd->vdev_trim_inflight[TRIM_TYPE_AUTO], >, 0); in vdev_autotrim_cb()
427 vd->vdev_trim_inflight[TRIM_TYPE_AUTO]--; in vdev_autotrim_cb()
428 cv_broadcast(&vd->vdev_trim_io_cv); in vdev_autotrim_cb()
429 mutex_exit(&vd->vdev_trim_io_lock); in vdev_autotrim_cb()
431 spa_config_exit(vd->vdev_spa, SCL_STATE_ALL, vd); in vdev_autotrim_cb()
451 vdev_t *vd = ta->trim_vdev; in vdev_trim_range() local
452 spa_t *spa = vd->vdev_spa; in vdev_trim_range()
454 mutex_enter(&vd->vdev_trim_io_lock); in vdev_trim_range()
461 while (vd->vdev_trim_rate != 0 && !vdev_trim_should_stop(vd) && in vdev_trim_range()
462 vdev_trim_calculate_rate(ta) > vd->vdev_trim_rate) { in vdev_trim_range()
463 cv_timedwait_sig(&vd->vdev_trim_io_cv, in vdev_trim_range()
464 &vd->vdev_trim_io_lock, ddi_get_lbolt() + in vdev_trim_range()
471 while (vd->vdev_trim_inflight[0] + vd->vdev_trim_inflight[1] >= in vdev_trim_range()
473 cv_wait(&vd->vdev_trim_io_cv, &vd->vdev_trim_io_lock); in vdev_trim_range()
475 vd->vdev_trim_inflight[ta->trim_type]++; in vdev_trim_range()
476 mutex_exit(&vd->vdev_trim_io_lock); in vdev_trim_range()
482 spa_config_enter(spa, SCL_STATE_ALL, vd, RW_READER); in vdev_trim_range()
483 mutex_enter(&vd->vdev_trim_lock); in vdev_trim_range()
486 vd->vdev_trim_offset[txg & TXG_MASK] == 0) { in vdev_trim_range()
488 *guid = vd->vdev_guid; in vdev_trim_range()
501 vdev_trim_should_stop(vd)) || in vdev_trim_range()
503 vdev_autotrim_should_stop(vd->vdev_top))) { in vdev_trim_range()
504 mutex_enter(&vd->vdev_trim_io_lock); in vdev_trim_range()
505 vd->vdev_trim_inflight[ta->trim_type]--; in vdev_trim_range()
506 mutex_exit(&vd->vdev_trim_io_lock); in vdev_trim_range()
507 spa_config_exit(vd->vdev_spa, SCL_STATE_ALL, vd); in vdev_trim_range()
508 mutex_exit(&vd->vdev_trim_lock); in vdev_trim_range()
512 mutex_exit(&vd->vdev_trim_lock); in vdev_trim_range()
515 vd->vdev_trim_offset[txg & TXG_MASK] = start + size; in vdev_trim_range()
517 zio_nowait(zio_trim(spa->spa_txg_zio[txg & TXG_MASK], vd, in vdev_trim_range()
537 vdev_t *vd = ta->trim_vdev; in vdev_trim_ranges() local
542 spa_t *spa = vd->vdev_spa; in vdev_trim_ranges()
584 mutex_enter(&vd->vdev_trim_io_lock); in vdev_trim_ranges()
585 while (vd->vdev_trim_inflight[TRIM_TYPE_MANUAL] > 0) { in vdev_trim_ranges()
586 cv_wait(&vd->vdev_trim_io_cv, &vd->vdev_trim_io_lock); in vdev_trim_ranges()
588 mutex_exit(&vd->vdev_trim_io_lock); in vdev_trim_ranges()
597 vdev_trim_calculate_progress(vdev_t *vd) in vdev_trim_calculate_progress() argument
599 ASSERT(spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_READER) || in vdev_trim_calculate_progress()
600 spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_WRITER)); in vdev_trim_calculate_progress()
601 ASSERT(vd->vdev_leaf_zap != 0); in vdev_trim_calculate_progress()
603 vd->vdev_trim_bytes_est = 0; in vdev_trim_calculate_progress()
604 vd->vdev_trim_bytes_done = 0; in vdev_trim_calculate_progress()
606 for (uint64_t i = 0; i < vd->vdev_top->vdev_ms_count; i++) { in vdev_trim_calculate_progress()
607 metaslab_t *msp = vd->vdev_top->vdev_ms[i]; in vdev_trim_calculate_progress()
613 if (vd->vdev_top->vdev_ops == &vdev_raidz_ops) in vdev_trim_calculate_progress()
614 ms_free /= vd->vdev_top->vdev_children; in vdev_trim_calculate_progress()
624 vdev_xlate(vd, &logical_rs, &physical_rs); in vdev_trim_calculate_progress()
626 if (vd->vdev_trim_last_offset <= physical_rs.rs_start) { in vdev_trim_calculate_progress()
627 vd->vdev_trim_bytes_est += ms_free; in vdev_trim_calculate_progress()
630 } else if (vd->vdev_trim_last_offset > physical_rs.rs_end) { in vdev_trim_calculate_progress()
631 vd->vdev_trim_bytes_done += ms_free; in vdev_trim_calculate_progress()
632 vd->vdev_trim_bytes_est += ms_free; in vdev_trim_calculate_progress()
651 vdev_xlate(vd, &logical_rs, &physical_rs); in vdev_trim_calculate_progress()
655 vd->vdev_trim_bytes_est += size; in vdev_trim_calculate_progress()
656 if (vd->vdev_trim_last_offset >= physical_rs.rs_end) { in vdev_trim_calculate_progress()
657 vd->vdev_trim_bytes_done += size; in vdev_trim_calculate_progress()
658 } else if (vd->vdev_trim_last_offset > in vdev_trim_calculate_progress()
660 vd->vdev_trim_last_offset <= in vdev_trim_calculate_progress()
662 vd->vdev_trim_bytes_done += in vdev_trim_calculate_progress()
663 vd->vdev_trim_last_offset - in vdev_trim_calculate_progress()
676 vdev_trim_load(vdev_t *vd) in vdev_trim_load() argument
679 ASSERT(spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_READER) || in vdev_trim_load()
680 spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_WRITER)); in vdev_trim_load()
681 ASSERT(vd->vdev_leaf_zap != 0); in vdev_trim_load()
683 if (vd->vdev_trim_state == VDEV_TRIM_ACTIVE || in vdev_trim_load()
684 vd->vdev_trim_state == VDEV_TRIM_SUSPENDED) { in vdev_trim_load()
685 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_trim_load()
686 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_TRIM_LAST_OFFSET, in vdev_trim_load()
687 sizeof (vd->vdev_trim_last_offset), 1, in vdev_trim_load()
688 &vd->vdev_trim_last_offset); in vdev_trim_load()
690 vd->vdev_trim_last_offset = 0; in vdev_trim_load()
695 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_trim_load()
696 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_TRIM_RATE, in vdev_trim_load()
697 sizeof (vd->vdev_trim_rate), 1, in vdev_trim_load()
698 &vd->vdev_trim_rate); in vdev_trim_load()
700 vd->vdev_trim_rate = 0; in vdev_trim_load()
706 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_trim_load()
707 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_TRIM_PARTIAL, in vdev_trim_load()
708 sizeof (vd->vdev_trim_partial), 1, in vdev_trim_load()
709 &vd->vdev_trim_partial); in vdev_trim_load()
711 vd->vdev_trim_partial = 0; in vdev_trim_load()
717 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_trim_load()
718 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_TRIM_SECURE, in vdev_trim_load()
719 sizeof (vd->vdev_trim_secure), 1, in vdev_trim_load()
720 &vd->vdev_trim_secure); in vdev_trim_load()
722 vd->vdev_trim_secure = 0; in vdev_trim_load()
728 vdev_trim_calculate_progress(vd); in vdev_trim_load()
741 vdev_t *vd = ta->trim_vdev; in vdev_trim_range_add() local
758 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_trim_range_add()
759 vdev_xlate(vd, &logical_rs, &physical_rs); in vdev_trim_range_add()
761 IMPLY(vd->vdev_top == vd, in vdev_trim_range_add()
763 IMPLY(vd->vdev_top == vd, in vdev_trim_range_add()
773 if (physical_rs.rs_end <= vd->vdev_trim_last_offset) in vdev_trim_range_add()
777 if (vd->vdev_trim_last_offset > physical_rs.rs_start) { in vdev_trim_range_add()
779 vd->vdev_trim_last_offset); in vdev_trim_range_add()
780 physical_rs.rs_start = vd->vdev_trim_last_offset; in vdev_trim_range_add()
809 vdev_t *vd = arg; in vdev_trim_thread() local
810 spa_t *spa = vd->vdev_spa; in vdev_trim_thread()
819 txg_wait_synced(spa_get_dsl(vd->vdev_spa), 0); in vdev_trim_thread()
821 ASSERT(vdev_is_concrete(vd)); in vdev_trim_thread()
824 vd->vdev_trim_last_offset = 0; in vdev_trim_thread()
825 vd->vdev_trim_rate = 0; in vdev_trim_thread()
826 vd->vdev_trim_partial = 0; in vdev_trim_thread()
827 vd->vdev_trim_secure = 0; in vdev_trim_thread()
829 VERIFY0(vdev_trim_load(vd)); in vdev_trim_thread()
831 ta.trim_vdev = vd; in vdev_trim_thread()
843 if (vd->vdev_trim_secure) { in vdev_trim_thread()
849 for (uint64_t i = 0; !vd->vdev_detached && in vdev_trim_thread()
850 i < vd->vdev_top->vdev_ms_count; i++) { in vdev_trim_thread()
851 metaslab_t *msp = vd->vdev_top->vdev_ms[i]; in vdev_trim_thread()
857 if (vd->vdev_top->vdev_ms_count != ms_count) { in vdev_trim_thread()
858 vdev_trim_calculate_progress(vd); in vdev_trim_thread()
859 ms_count = vd->vdev_top->vdev_ms_count; in vdev_trim_thread()
871 if (msp->ms_sm == NULL && vd->vdev_trim_partial) { in vdev_trim_thread()
875 vdev_trim_calculate_progress(vd); in vdev_trim_thread()
897 mutex_enter(&vd->vdev_trim_lock); in vdev_trim_thread()
898 if (!vd->vdev_trim_exit_wanted && vdev_writeable(vd)) { in vdev_trim_thread()
899 vdev_trim_change_state(vd, VDEV_TRIM_COMPLETE, in vdev_trim_thread()
900 vd->vdev_trim_rate, vd->vdev_trim_partial, in vdev_trim_thread()
901 vd->vdev_trim_secure); in vdev_trim_thread()
903 ASSERT(vd->vdev_trim_thread != NULL || vd->vdev_trim_inflight[0] == 0); in vdev_trim_thread()
912 mutex_exit(&vd->vdev_trim_lock); in vdev_trim_thread()
914 mutex_enter(&vd->vdev_trim_lock); in vdev_trim_thread()
916 vd->vdev_trim_thread = NULL; in vdev_trim_thread()
917 cv_broadcast(&vd->vdev_trim_cv); in vdev_trim_thread()
918 mutex_exit(&vd->vdev_trim_lock); in vdev_trim_thread()
926 vdev_trim(vdev_t *vd, uint64_t rate, boolean_t partial, boolean_t secure) in vdev_trim() argument
928 ASSERT(MUTEX_HELD(&vd->vdev_trim_lock)); in vdev_trim()
929 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_trim()
930 ASSERT(vdev_is_concrete(vd)); in vdev_trim()
931 ASSERT3P(vd->vdev_trim_thread, ==, NULL); in vdev_trim()
932 ASSERT(!vd->vdev_detached); in vdev_trim()
933 ASSERT(!vd->vdev_trim_exit_wanted); in vdev_trim()
934 ASSERT(!vd->vdev_top->vdev_removing); in vdev_trim()
936 vdev_trim_change_state(vd, VDEV_TRIM_ACTIVE, rate, partial, secure); in vdev_trim()
937 vd->vdev_trim_thread = thread_create(NULL, 0, in vdev_trim()
938 vdev_trim_thread, vd, 0, &p0, TS_RUN, maxclsyspri); in vdev_trim()
945 vdev_trim_stop_wait_impl(vdev_t *vd) in vdev_trim_stop_wait_impl() argument
947 ASSERT(MUTEX_HELD(&vd->vdev_trim_lock)); in vdev_trim_stop_wait_impl()
949 while (vd->vdev_trim_thread != NULL) in vdev_trim_stop_wait_impl()
950 cv_wait(&vd->vdev_trim_cv, &vd->vdev_trim_lock); in vdev_trim_stop_wait_impl()
952 ASSERT3P(vd->vdev_trim_thread, ==, NULL); in vdev_trim_stop_wait_impl()
953 vd->vdev_trim_exit_wanted = B_FALSE; in vdev_trim_stop_wait_impl()
962 vdev_t *vd; in vdev_trim_stop_wait() local
966 while ((vd = list_remove_head(vd_list)) != NULL) { in vdev_trim_stop_wait()
967 mutex_enter(&vd->vdev_trim_lock); in vdev_trim_stop_wait()
968 vdev_trim_stop_wait_impl(vd); in vdev_trim_stop_wait()
969 mutex_exit(&vd->vdev_trim_lock); in vdev_trim_stop_wait()
983 vdev_trim_stop(vdev_t *vd, vdev_trim_state_t tgt_state, list_t *vd_list) in vdev_trim_stop() argument
985 ASSERT(!spa_config_held(vd->vdev_spa, SCL_CONFIG|SCL_STATE, RW_WRITER)); in vdev_trim_stop()
986 ASSERT(MUTEX_HELD(&vd->vdev_trim_lock)); in vdev_trim_stop()
987 ASSERT(vd->vdev_ops->vdev_op_leaf); in vdev_trim_stop()
988 ASSERT(vdev_is_concrete(vd)); in vdev_trim_stop()
994 if (vd->vdev_trim_thread == NULL && tgt_state != VDEV_TRIM_CANCELED) in vdev_trim_stop()
997 vdev_trim_change_state(vd, tgt_state, 0, 0, 0); in vdev_trim_stop()
998 vd->vdev_trim_exit_wanted = B_TRUE; in vdev_trim_stop()
1001 vdev_trim_stop_wait_impl(vd); in vdev_trim_stop()
1004 list_insert_tail(vd_list, vd); in vdev_trim_stop()
1012 vdev_trim_stop_all_impl(vdev_t *vd, vdev_trim_state_t tgt_state, in vdev_trim_stop_all_impl() argument
1015 if (vd->vdev_ops->vdev_op_leaf && vdev_is_concrete(vd)) { in vdev_trim_stop_all_impl()
1016 mutex_enter(&vd->vdev_trim_lock); in vdev_trim_stop_all_impl()
1017 vdev_trim_stop(vd, tgt_state, vd_list); in vdev_trim_stop_all_impl()
1018 mutex_exit(&vd->vdev_trim_lock); in vdev_trim_stop_all_impl()
1022 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_trim_stop_all_impl()
1023 vdev_trim_stop_all_impl(vd->vdev_child[i], tgt_state, in vdev_trim_stop_all_impl()
1033 vdev_trim_stop_all(vdev_t *vd, vdev_trim_state_t tgt_state) in vdev_trim_stop_all() argument
1035 spa_t *spa = vd->vdev_spa; in vdev_trim_stop_all()
1043 vdev_trim_stop_all_impl(vd, tgt_state, &vd_list); in vdev_trim_stop_all()
1046 if (vd->vdev_spa->spa_sync_on) { in vdev_trim_stop_all()
1048 txg_wait_synced(spa_get_dsl(vd->vdev_spa), 0); in vdev_trim_stop_all()
1058 vdev_trim_restart(vdev_t *vd) in vdev_trim_restart() argument
1061 ASSERT(!spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER)); in vdev_trim_restart()
1063 if (vd->vdev_leaf_zap != 0) { in vdev_trim_restart()
1064 mutex_enter(&vd->vdev_trim_lock); in vdev_trim_restart()
1066 int err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_trim_restart()
1067 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_TRIM_STATE, in vdev_trim_restart()
1070 vd->vdev_trim_state = trim_state; in vdev_trim_restart()
1073 err = zap_lookup(vd->vdev_spa->spa_meta_objset, in vdev_trim_restart()
1074 vd->vdev_leaf_zap, VDEV_LEAF_ZAP_TRIM_ACTION_TIME, in vdev_trim_restart()
1077 vd->vdev_trim_action_time = (time_t)timestamp; in vdev_trim_restart()
1079 if (vd->vdev_trim_state == VDEV_TRIM_SUSPENDED || in vdev_trim_restart()
1080 vd->vdev_offline) { in vdev_trim_restart()
1082 VERIFY0(vdev_trim_load(vd)); in vdev_trim_restart()
1083 } else if (vd->vdev_trim_state == VDEV_TRIM_ACTIVE && in vdev_trim_restart()
1084 vdev_writeable(vd) && !vd->vdev_top->vdev_removing && in vdev_trim_restart()
1085 vd->vdev_trim_thread == NULL) { in vdev_trim_restart()
1086 VERIFY0(vdev_trim_load(vd)); in vdev_trim_restart()
1087 vdev_trim(vd, vd->vdev_trim_rate, in vdev_trim_restart()
1088 vd->vdev_trim_partial, vd->vdev_trim_secure); in vdev_trim_restart()
1091 mutex_exit(&vd->vdev_trim_lock); in vdev_trim_restart()
1094 for (uint64_t i = 0; i < vd->vdev_children; i++) { in vdev_trim_restart()
1095 vdev_trim_restart(vd->vdev_child[i]); in vdev_trim_restart()
1124 vdev_t *vd = arg; in vdev_autotrim_thread() local
1125 spa_t *spa = vd->vdev_spa; in vdev_autotrim_thread()
1128 mutex_enter(&vd->vdev_autotrim_lock); in vdev_autotrim_thread()
1129 ASSERT3P(vd->vdev_top, ==, vd); in vdev_autotrim_thread()
1130 ASSERT3P(vd->vdev_autotrim_thread, !=, NULL); in vdev_autotrim_thread()
1131 mutex_exit(&vd->vdev_autotrim_lock); in vdev_autotrim_thread()
1137 while (!vdev_autotrim_should_stop(vd)) { in vdev_autotrim_thread()
1167 for (uint64_t i = shift % txgs_per_trim; i < vd->vdev_ms_count; in vdev_autotrim_thread()
1169 metaslab_t *msp = vd->vdev_ms[i]; in vdev_autotrim_thread()
1222 uint64_t children = vd->vdev_children; in vdev_autotrim_thread()
1227 tap[0].trim_vdev = vd; in vdev_autotrim_thread()
1233 tap[c].trim_vdev = vd->vdev_child[c]; in vdev_autotrim_thread()
1351 for (uint64_t c = 0; c < vd->vdev_children; c++) { in vdev_autotrim_thread()
1352 vdev_t *cvd = vd->vdev_child[c]; in vdev_autotrim_thread()
1369 for (uint64_t i = 0; i < vd->vdev_ms_count; i++) { in vdev_autotrim_thread()
1370 metaslab_t *msp = vd->vdev_ms[i]; in vdev_autotrim_thread()
1378 mutex_enter(&vd->vdev_autotrim_lock); in vdev_autotrim_thread()
1379 ASSERT(vd->vdev_autotrim_thread != NULL); in vdev_autotrim_thread()
1380 vd->vdev_autotrim_thread = NULL; in vdev_autotrim_thread()
1381 cv_broadcast(&vd->vdev_autotrim_cv); in vdev_autotrim_thread()
1382 mutex_exit(&vd->vdev_autotrim_lock); in vdev_autotrim_thread()