Lines Matching refs:spa
142 static boolean_t spa_has_active_shared_spare(spa_t *spa);
143 static int spa_load_impl(spa_t *spa, uint64_t, nvlist_t *config,
146 static void spa_vdev_resilver_done(spa_t *spa);
194 spa_prop_get_config(spa_t *spa, nvlist_t **nvp) in spa_prop_get_config() argument
196 vdev_t *rvd = spa->spa_root_vdev; in spa_prop_get_config()
197 dsl_pool_t *pool = spa->spa_dsl_pool; in spa_prop_get_config()
201 metaslab_class_t *mc = spa_normal_class(spa); in spa_prop_get_config()
203 ASSERT(MUTEX_HELD(&spa->spa_props_lock)); in spa_prop_get_config()
206 alloc = metaslab_class_get_alloc(spa_normal_class(spa)); in spa_prop_get_config()
207 size = metaslab_class_get_space(spa_normal_class(spa)); in spa_prop_get_config()
208 spa_prop_add_list(*nvp, ZPOOL_PROP_NAME, spa_name(spa), 0, src); in spa_prop_get_config()
219 (spa_mode(spa) == FREAD), src); in spa_prop_get_config()
225 ddt_get_pool_dedup_ratio(spa), src); in spa_prop_get_config()
230 version = spa_version(spa); in spa_prop_get_config()
262 spa_prop_add_list(*nvp, ZPOOL_PROP_GUID, NULL, spa_guid(spa), src); in spa_prop_get_config()
264 if (spa->spa_comment != NULL) { in spa_prop_get_config()
265 spa_prop_add_list(*nvp, ZPOOL_PROP_COMMENT, spa->spa_comment, in spa_prop_get_config()
269 if (spa->spa_root != NULL) in spa_prop_get_config()
270 spa_prop_add_list(*nvp, ZPOOL_PROP_ALTROOT, spa->spa_root, in spa_prop_get_config()
273 if (spa_feature_is_enabled(spa, SPA_FEATURE_LARGE_BLOCKS)) { in spa_prop_get_config()
281 if ((dp = list_head(&spa->spa_config_list)) != NULL) { in spa_prop_get_config()
296 spa_prop_get(spa_t *spa, nvlist_t **nvp) in spa_prop_get() argument
298 objset_t *mos = spa->spa_meta_objset; in spa_prop_get()
305 mutex_enter(&spa->spa_props_lock); in spa_prop_get()
310 spa_prop_get_config(spa, nvp); in spa_prop_get()
313 if (mos == NULL || spa->spa_pool_props_object == 0) { in spa_prop_get()
314 mutex_exit(&spa->spa_props_lock); in spa_prop_get()
321 for (zap_cursor_init(&zc, mos, spa->spa_pool_props_object); in spa_prop_get()
343 dp = spa_get_dsl(spa); in spa_prop_get()
371 err = zap_lookup(mos, spa->spa_pool_props_object, in spa_prop_get()
386 mutex_exit(&spa->spa_props_lock); in spa_prop_get()
402 spa_prop_validate(spa_t *spa, nvlist_t *props) in spa_prop_validate() argument
453 (intval < spa_version(spa) || in spa_prop_validate()
474 if (spa_version(spa) < SPA_VERSION_BOOTFS) { in spa_prop_validate()
482 if (!vdev_is_bootable(spa->spa_root_vdev)) { in spa_prop_validate()
547 if (!error && spa_suspended(spa)) { in spa_prop_validate()
548 spa->spa_failmode = intval; in spa_prop_validate()
597 if (spa_version(spa) < SPA_VERSION_DEDUP) in spa_prop_validate()
625 spa_configfile_set(spa_t *spa, nvlist_t *nvp, boolean_t need_sync) in spa_configfile_set() argument
644 list_insert_head(&spa->spa_config_list, dp); in spa_configfile_set()
646 spa_async_request(spa, SPA_ASYNC_CONFIG_UPDATE); in spa_configfile_set()
650 spa_prop_set(spa_t *spa, nvlist_t *nvp) in spa_prop_set() argument
656 if ((error = spa_prop_validate(spa, nvp)) != 0) in spa_prop_set()
679 if (ver == spa_version(spa)) in spa_prop_set()
688 error = dsl_sync_task(spa->spa_name, NULL, in spa_prop_set()
701 return (dsl_sync_task(spa->spa_name, NULL, spa_sync_props, in spa_prop_set()
712 spa_prop_clear_bootfs(spa_t *spa, uint64_t dsobj, dmu_tx_t *tx) in spa_prop_clear_bootfs() argument
714 if (spa->spa_bootfs == dsobj && spa->spa_pool_props_object != 0) { in spa_prop_clear_bootfs()
715 VERIFY(zap_remove(spa->spa_meta_objset, in spa_prop_clear_bootfs()
716 spa->spa_pool_props_object, in spa_prop_clear_bootfs()
718 spa->spa_bootfs = 0; in spa_prop_clear_bootfs()
727 spa_t *spa = dmu_tx_pool(tx)->dp_spa; in spa_change_guid_check() local
728 vdev_t *rvd = spa->spa_root_vdev; in spa_change_guid_check()
731 spa_config_enter(spa, SCL_STATE, FTAG, RW_READER); in spa_change_guid_check()
733 spa_config_exit(spa, SCL_STATE, FTAG); in spa_change_guid_check()
738 ASSERT3U(spa_guid(spa), !=, *newguid); in spa_change_guid_check()
747 spa_t *spa = dmu_tx_pool(tx)->dp_spa; in spa_change_guid_sync() local
749 vdev_t *rvd = spa->spa_root_vdev; in spa_change_guid_sync()
751 oldguid = spa_guid(spa); in spa_change_guid_sync()
753 spa_config_enter(spa, SCL_STATE, FTAG, RW_READER); in spa_change_guid_sync()
757 spa_config_exit(spa, SCL_STATE, FTAG); in spa_change_guid_sync()
759 spa_history_log_internal(spa, "guid change", tx, "old=%llu new=%llu", in spa_change_guid_sync()
773 spa_change_guid(spa_t *spa) in spa_change_guid() argument
778 mutex_enter(&spa->spa_vdev_top_lock); in spa_change_guid()
782 error = dsl_sync_task(spa->spa_name, spa_change_guid_check, in spa_change_guid()
786 spa_config_sync(spa, B_FALSE, B_TRUE); in spa_change_guid()
787 spa_event_notify(spa, NULL, ESC_ZFS_POOL_REGUID); in spa_change_guid()
791 mutex_exit(&spa->spa_vdev_top_lock); in spa_change_guid()
825 spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub) in spa_get_errlists() argument
827 ASSERT(MUTEX_HELD(&spa->spa_errlist_lock)); in spa_get_errlists()
829 bcopy(&spa->spa_errlist_last, last, sizeof (avl_tree_t)); in spa_get_errlists()
830 bcopy(&spa->spa_errlist_scrub, scrub, sizeof (avl_tree_t)); in spa_get_errlists()
832 avl_create(&spa->spa_errlist_scrub, in spa_get_errlists()
835 avl_create(&spa->spa_errlist_last, in spa_get_errlists()
841 spa_taskqs_init(spa_t *spa, zio_type_t t, zio_taskq_type_t q) in spa_taskqs_init() argument
847 spa_taskqs_t *tqs = &spa->spa_zio_taskq[t][q]; in spa_taskqs_init()
893 if (zio_taskq_sysdc && spa->spa_proc != &p0) { in spa_taskqs_init()
898 spa->spa_proc, zio_taskq_basedc, flags); in spa_taskqs_init()
910 INT_MAX, spa->spa_proc, flags); in spa_taskqs_init()
918 spa_taskqs_fini(spa_t *spa, zio_type_t t, zio_taskq_type_t q) in spa_taskqs_fini() argument
920 spa_taskqs_t *tqs = &spa->spa_zio_taskq[t][q]; in spa_taskqs_fini()
943 spa_taskq_dispatch_ent(spa_t *spa, zio_type_t t, zio_taskq_type_t q, in spa_taskq_dispatch_ent() argument
946 spa_taskqs_t *tqs = &spa->spa_zio_taskq[t][q]; in spa_taskq_dispatch_ent()
962 spa_create_zio_taskqs(spa_t *spa) in spa_create_zio_taskqs() argument
966 spa_taskqs_init(spa, t, q); in spa_create_zio_taskqs()
977 spa_t *spa = arg; in spa_thread() local
980 CALLB_CPR_INIT(&cprinfo, &spa->spa_proc_lock, callb_generic_cpr, in spa_thread()
981 spa->spa_name); in spa_thread()
985 "zpool-%s", spa->spa_name); in spa_thread()
1001 "pset %d\n", spa->spa_name, zio_taskq_psrset_bind); in spa_thread()
1014 spa->spa_proc = curproc; in spa_thread()
1015 spa->spa_did = curthread->t_did; in spa_thread()
1017 spa_create_zio_taskqs(spa); in spa_thread()
1019 mutex_enter(&spa->spa_proc_lock); in spa_thread()
1020 ASSERT(spa->spa_proc_state == SPA_PROC_CREATED); in spa_thread()
1022 spa->spa_proc_state = SPA_PROC_ACTIVE; in spa_thread()
1023 cv_broadcast(&spa->spa_proc_cv); in spa_thread()
1026 while (spa->spa_proc_state == SPA_PROC_ACTIVE) in spa_thread()
1027 cv_wait(&spa->spa_proc_cv, &spa->spa_proc_lock); in spa_thread()
1028 CALLB_CPR_SAFE_END(&cprinfo, &spa->spa_proc_lock); in spa_thread()
1030 ASSERT(spa->spa_proc_state == SPA_PROC_DEACTIVATE); in spa_thread()
1031 spa->spa_proc_state = SPA_PROC_GONE; in spa_thread()
1032 spa->spa_proc = &p0; in spa_thread()
1033 cv_broadcast(&spa->spa_proc_cv); in spa_thread()
1045 spa_activate(spa_t *spa, int mode) in spa_activate() argument
1047 ASSERT(spa->spa_state == POOL_STATE_UNINITIALIZED); in spa_activate()
1049 spa->spa_state = POOL_STATE_ACTIVE; in spa_activate()
1050 spa->spa_mode = mode; in spa_activate()
1052 spa->spa_normal_class = metaslab_class_create(spa, zfs_metaslab_ops); in spa_activate()
1053 spa->spa_log_class = metaslab_class_create(spa, zfs_metaslab_ops); in spa_activate()
1056 mutex_enter(&spa->spa_proc_lock); in spa_activate()
1057 ASSERT(spa->spa_proc_state == SPA_PROC_NONE); in spa_activate()
1058 ASSERT(spa->spa_proc == &p0); in spa_activate()
1059 spa->spa_did = 0; in spa_activate()
1062 if (spa_create_process && strcmp(spa->spa_name, TRYIMPORT_NAME) != 0) { in spa_activate()
1063 if (newproc(spa_thread, (caddr_t)spa, syscid, maxclsyspri, in spa_activate()
1065 spa->spa_proc_state = SPA_PROC_CREATED; in spa_activate()
1066 while (spa->spa_proc_state == SPA_PROC_CREATED) { in spa_activate()
1067 cv_wait(&spa->spa_proc_cv, in spa_activate()
1068 &spa->spa_proc_lock); in spa_activate()
1070 ASSERT(spa->spa_proc_state == SPA_PROC_ACTIVE); in spa_activate()
1071 ASSERT(spa->spa_proc != &p0); in spa_activate()
1072 ASSERT(spa->spa_did != 0); in spa_activate()
1077 spa->spa_name); in spa_activate()
1081 mutex_exit(&spa->spa_proc_lock); in spa_activate()
1084 if (spa->spa_proc == &p0) { in spa_activate()
1085 spa_create_zio_taskqs(spa); in spa_activate()
1088 list_create(&spa->spa_config_dirty_list, sizeof (vdev_t), in spa_activate()
1090 list_create(&spa->spa_evicting_os_list, sizeof (objset_t), in spa_activate()
1092 list_create(&spa->spa_state_dirty_list, sizeof (vdev_t), in spa_activate()
1095 txg_list_create(&spa->spa_vdev_txg_list, in spa_activate()
1098 avl_create(&spa->spa_errlist_scrub, in spa_activate()
1101 avl_create(&spa->spa_errlist_last, in spa_activate()
1110 spa_deactivate(spa_t *spa) in spa_deactivate() argument
1112 ASSERT(spa->spa_sync_on == B_FALSE); in spa_deactivate()
1113 ASSERT(spa->spa_dsl_pool == NULL); in spa_deactivate()
1114 ASSERT(spa->spa_root_vdev == NULL); in spa_deactivate()
1115 ASSERT(spa->spa_async_zio_root == NULL); in spa_deactivate()
1116 ASSERT(spa->spa_state != POOL_STATE_UNINITIALIZED); in spa_deactivate()
1118 spa_evicting_os_wait(spa); in spa_deactivate()
1120 txg_list_destroy(&spa->spa_vdev_txg_list); in spa_deactivate()
1122 list_destroy(&spa->spa_config_dirty_list); in spa_deactivate()
1123 list_destroy(&spa->spa_evicting_os_list); in spa_deactivate()
1124 list_destroy(&spa->spa_state_dirty_list); in spa_deactivate()
1128 spa_taskqs_fini(spa, t, q); in spa_deactivate()
1132 metaslab_class_destroy(spa->spa_normal_class); in spa_deactivate()
1133 spa->spa_normal_class = NULL; in spa_deactivate()
1135 metaslab_class_destroy(spa->spa_log_class); in spa_deactivate()
1136 spa->spa_log_class = NULL; in spa_deactivate()
1142 spa_errlog_drain(spa); in spa_deactivate()
1144 avl_destroy(&spa->spa_errlist_scrub); in spa_deactivate()
1145 avl_destroy(&spa->spa_errlist_last); in spa_deactivate()
1147 spa->spa_state = POOL_STATE_UNINITIALIZED; in spa_deactivate()
1149 mutex_enter(&spa->spa_proc_lock); in spa_deactivate()
1150 if (spa->spa_proc_state != SPA_PROC_NONE) { in spa_deactivate()
1151 ASSERT(spa->spa_proc_state == SPA_PROC_ACTIVE); in spa_deactivate()
1152 spa->spa_proc_state = SPA_PROC_DEACTIVATE; in spa_deactivate()
1153 cv_broadcast(&spa->spa_proc_cv); in spa_deactivate()
1154 while (spa->spa_proc_state == SPA_PROC_DEACTIVATE) { in spa_deactivate()
1155 ASSERT(spa->spa_proc != &p0); in spa_deactivate()
1156 cv_wait(&spa->spa_proc_cv, &spa->spa_proc_lock); in spa_deactivate()
1158 ASSERT(spa->spa_proc_state == SPA_PROC_GONE); in spa_deactivate()
1159 spa->spa_proc_state = SPA_PROC_NONE; in spa_deactivate()
1161 ASSERT(spa->spa_proc == &p0); in spa_deactivate()
1162 mutex_exit(&spa->spa_proc_lock); in spa_deactivate()
1169 if (spa->spa_did != 0) { in spa_deactivate()
1170 thread_join(spa->spa_did); in spa_deactivate()
1171 spa->spa_did = 0; in spa_deactivate()
1182 spa_config_parse(spa_t *spa, vdev_t **vdp, nvlist_t *nv, vdev_t *parent, in spa_config_parse() argument
1189 if ((error = vdev_alloc(spa, vdp, nv, parent, id, atype)) != 0) in spa_config_parse()
1209 if ((error = spa_config_parse(spa, &vd, child[c], *vdp, c, in spa_config_parse()
1226 spa_unload(spa_t *spa) in spa_unload() argument
1235 spa_async_suspend(spa); in spa_unload()
1240 if (spa->spa_sync_on) { in spa_unload()
1241 txg_sync_stop(spa->spa_dsl_pool); in spa_unload()
1242 spa->spa_sync_on = B_FALSE; in spa_unload()
1248 if (spa->spa_async_zio_root != NULL) { in spa_unload()
1250 (void) zio_wait(spa->spa_async_zio_root[i]); in spa_unload()
1251 kmem_free(spa->spa_async_zio_root, max_ncpus * sizeof (void *)); in spa_unload()
1252 spa->spa_async_zio_root = NULL; in spa_unload()
1255 bpobj_close(&spa->spa_deferred_bpobj); in spa_unload()
1257 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_unload()
1262 if (spa->spa_root_vdev) in spa_unload()
1263 vdev_free(spa->spa_root_vdev); in spa_unload()
1264 ASSERT(spa->spa_root_vdev == NULL); in spa_unload()
1269 if (spa->spa_dsl_pool) { in spa_unload()
1270 dsl_pool_close(spa->spa_dsl_pool); in spa_unload()
1271 spa->spa_dsl_pool = NULL; in spa_unload()
1272 spa->spa_meta_objset = NULL; in spa_unload()
1275 ddt_unload(spa); in spa_unload()
1281 spa_l2cache_drop(spa); in spa_unload()
1283 for (i = 0; i < spa->spa_spares.sav_count; i++) in spa_unload()
1284 vdev_free(spa->spa_spares.sav_vdevs[i]); in spa_unload()
1285 if (spa->spa_spares.sav_vdevs) { in spa_unload()
1286 kmem_free(spa->spa_spares.sav_vdevs, in spa_unload()
1287 spa->spa_spares.sav_count * sizeof (void *)); in spa_unload()
1288 spa->spa_spares.sav_vdevs = NULL; in spa_unload()
1290 if (spa->spa_spares.sav_config) { in spa_unload()
1291 nvlist_free(spa->spa_spares.sav_config); in spa_unload()
1292 spa->spa_spares.sav_config = NULL; in spa_unload()
1294 spa->spa_spares.sav_count = 0; in spa_unload()
1296 for (i = 0; i < spa->spa_l2cache.sav_count; i++) { in spa_unload()
1297 vdev_clear_stats(spa->spa_l2cache.sav_vdevs[i]); in spa_unload()
1298 vdev_free(spa->spa_l2cache.sav_vdevs[i]); in spa_unload()
1300 if (spa->spa_l2cache.sav_vdevs) { in spa_unload()
1301 kmem_free(spa->spa_l2cache.sav_vdevs, in spa_unload()
1302 spa->spa_l2cache.sav_count * sizeof (void *)); in spa_unload()
1303 spa->spa_l2cache.sav_vdevs = NULL; in spa_unload()
1305 if (spa->spa_l2cache.sav_config) { in spa_unload()
1306 nvlist_free(spa->spa_l2cache.sav_config); in spa_unload()
1307 spa->spa_l2cache.sav_config = NULL; in spa_unload()
1309 spa->spa_l2cache.sav_count = 0; in spa_unload()
1311 spa->spa_async_suspended = 0; in spa_unload()
1313 if (spa->spa_comment != NULL) { in spa_unload()
1314 spa_strfree(spa->spa_comment); in spa_unload()
1315 spa->spa_comment = NULL; in spa_unload()
1318 spa_config_exit(spa, SCL_ALL, FTAG); in spa_unload()
1328 spa_load_spares(spa_t *spa) in spa_load_spares() argument
1335 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL); in spa_load_spares()
1340 for (i = 0; i < spa->spa_spares.sav_count; i++) { in spa_load_spares()
1341 vd = spa->spa_spares.sav_vdevs[i]; in spa_load_spares()
1344 if ((tvd = spa_lookup_by_guid(spa, vd->vdev_guid, in spa_load_spares()
1351 if (spa->spa_spares.sav_vdevs) in spa_load_spares()
1352 kmem_free(spa->spa_spares.sav_vdevs, in spa_load_spares()
1353 spa->spa_spares.sav_count * sizeof (void *)); in spa_load_spares()
1355 if (spa->spa_spares.sav_config == NULL) in spa_load_spares()
1358 VERIFY(nvlist_lookup_nvlist_array(spa->spa_spares.sav_config, in spa_load_spares()
1361 spa->spa_spares.sav_count = (int)nspares; in spa_load_spares()
1362 spa->spa_spares.sav_vdevs = NULL; in spa_load_spares()
1376 spa->spa_spares.sav_vdevs = kmem_alloc(nspares * sizeof (void *), in spa_load_spares()
1378 for (i = 0; i < spa->spa_spares.sav_count; i++) { in spa_load_spares()
1379 VERIFY(spa_config_parse(spa, &vd, spares[i], NULL, 0, in spa_load_spares()
1383 spa->spa_spares.sav_vdevs[i] = vd; in spa_load_spares()
1385 if ((tvd = spa_lookup_by_guid(spa, vd->vdev_guid, in spa_load_spares()
1408 vd->vdev_aux = &spa->spa_spares; in spa_load_spares()
1421 VERIFY(nvlist_remove(spa->spa_spares.sav_config, ZPOOL_CONFIG_SPARES, in spa_load_spares()
1424 spares = kmem_alloc(spa->spa_spares.sav_count * sizeof (void *), in spa_load_spares()
1426 for (i = 0; i < spa->spa_spares.sav_count; i++) in spa_load_spares()
1427 spares[i] = vdev_config_generate(spa, in spa_load_spares()
1428 spa->spa_spares.sav_vdevs[i], B_TRUE, VDEV_CONFIG_SPARE); in spa_load_spares()
1429 VERIFY(nvlist_add_nvlist_array(spa->spa_spares.sav_config, in spa_load_spares()
1430 ZPOOL_CONFIG_SPARES, spares, spa->spa_spares.sav_count) == 0); in spa_load_spares()
1431 for (i = 0; i < spa->spa_spares.sav_count; i++) in spa_load_spares()
1433 kmem_free(spares, spa->spa_spares.sav_count * sizeof (void *)); in spa_load_spares()
1445 spa_load_l2cache(spa_t *spa) in spa_load_l2cache() argument
1452 spa_aux_vdev_t *sav = &spa->spa_l2cache; in spa_load_l2cache()
1454 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL); in spa_load_l2cache()
1494 VERIFY(spa_config_parse(spa, &vd, l2cache[i], NULL, 0, in spa_load_l2cache()
1521 l2arc_add_vdev(spa, vd, do_rebuild); in spa_load_l2cache()
1562 l2cache[i] = vdev_config_generate(spa, in spa_load_l2cache()
1574 load_nvlist(spa_t *spa, uint64_t obj, nvlist_t **value) in load_nvlist() argument
1582 error = dmu_bonus_hold(spa->spa_meta_objset, obj, FTAG, &db); in load_nvlist()
1590 error = dmu_read(spa->spa_meta_objset, obj, 0, nvsize, packed, in load_nvlist()
1620 spa_config_valid(spa_t *spa, nvlist_t *config) in spa_config_valid() argument
1622 vdev_t *mrvd, *rvd = spa->spa_root_vdev; in spa_config_valid()
1627 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_config_valid()
1628 VERIFY(spa_config_parse(spa, &mrvd, nv, NULL, 0, VDEV_ALLOC_LOAD) == 0); in spa_config_valid()
1637 if (!(spa->spa_import_flags & ZFS_IMPORT_MISSING_LOG)) { in spa_config_valid()
1652 child[idx++] = vdev_config_generate(spa, mtvd, in spa_config_valid()
1659 VERIFY(nvlist_add_nvlist(spa->spa_load_info, in spa_config_valid()
1686 if (!(spa->spa_import_flags & ZFS_IMPORT_MISSING_LOG)) in spa_config_valid()
1693 spa_set_log_state(spa, SPA_LOG_CLEAR); in spa_config_valid()
1714 spa_config_exit(spa, SCL_ALL, FTAG); in spa_config_valid()
1716 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_config_valid()
1730 spa_config_exit(spa, SCL_ALL, FTAG); in spa_config_valid()
1735 return (rvd->vdev_guid_sum == spa->spa_uberblock.ub_guid_sum); in spa_config_valid()
1742 spa_check_logs(spa_t *spa) in spa_check_logs() argument
1745 dsl_pool_t *dp = spa_get_dsl(spa); in spa_check_logs()
1747 switch (spa->spa_log_state) { in spa_check_logs()
1754 spa_set_log_state(spa, SPA_LOG_MISSING); in spa_check_logs()
1761 spa_passivate_log(spa_t *spa) in spa_passivate_log() argument
1763 vdev_t *rvd = spa->spa_root_vdev; in spa_passivate_log()
1766 ASSERT(spa_config_held(spa, SCL_ALLOC, RW_WRITER)); in spa_passivate_log()
1768 if (!spa_has_slogs(spa)) in spa_passivate_log()
1785 spa_activate_log(spa_t *spa) in spa_activate_log() argument
1787 vdev_t *rvd = spa->spa_root_vdev; in spa_activate_log()
1789 ASSERT(spa_config_held(spa, SCL_ALLOC, RW_WRITER)); in spa_activate_log()
1801 spa_offline_log(spa_t *spa) in spa_offline_log() argument
1805 error = dmu_objset_find(spa_name(spa), zil_vdev_offline, in spa_offline_log()
1813 txg_wait_synced(spa->spa_dsl_pool, 0); in spa_offline_log()
1828 spa_t *spa = zio->io_spa; in spa_claim_notify() local
1833 mutex_enter(&spa->spa_props_lock); /* any mutex will do */ in spa_claim_notify()
1834 if (spa->spa_claim_max_txg < zio->io_bp->blk_birth) in spa_claim_notify()
1835 spa->spa_claim_max_txg = zio->io_bp->blk_birth; in spa_claim_notify()
1836 mutex_exit(&spa->spa_props_lock); in spa_claim_notify()
1851 spa_t *spa = zio->io_spa; in spa_load_verify_done() local
1862 mutex_enter(&spa->spa_scrub_lock); in spa_load_verify_done()
1863 spa->spa_scrub_inflight--; in spa_load_verify_done()
1864 cv_broadcast(&spa->spa_scrub_io_cv); in spa_load_verify_done()
1865 mutex_exit(&spa->spa_scrub_lock); in spa_load_verify_done()
1878 spa_load_verify_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, in spa_load_verify_cb() argument
1897 mutex_enter(&spa->spa_scrub_lock); in spa_load_verify_cb()
1898 while (spa->spa_scrub_inflight >= spa_load_verify_maxinflight) in spa_load_verify_cb()
1899 cv_wait(&spa->spa_scrub_io_cv, &spa->spa_scrub_lock); in spa_load_verify_cb()
1900 spa->spa_scrub_inflight++; in spa_load_verify_cb()
1901 mutex_exit(&spa->spa_scrub_lock); in spa_load_verify_cb()
1903 zio_nowait(zio_read(rio, spa, bp, data, size, in spa_load_verify_cb()
1911 spa_load_verify(spa_t *spa) in spa_load_verify() argument
1919 zpool_get_rewind_policy(spa->spa_config, &policy); in spa_load_verify()
1924 rio = zio_root(spa, NULL, &sle, in spa_load_verify()
1928 error = traverse_pool(spa, spa->spa_verify_min_txg, in spa_load_verify()
1935 spa->spa_load_meta_errors = sle.sle_meta_count; in spa_load_verify()
1936 spa->spa_load_data_errors = sle.sle_data_count; in spa_load_verify()
1943 spa->spa_load_txg = spa->spa_uberblock.ub_txg; in spa_load_verify()
1944 spa->spa_load_txg_ts = spa->spa_uberblock.ub_timestamp; in spa_load_verify()
1946 loss = spa->spa_last_ubsync_txg_ts - spa->spa_load_txg_ts; in spa_load_verify()
1947 VERIFY(nvlist_add_uint64(spa->spa_load_info, in spa_load_verify()
1948 ZPOOL_CONFIG_LOAD_TIME, spa->spa_load_txg_ts) == 0); in spa_load_verify()
1949 VERIFY(nvlist_add_int64(spa->spa_load_info, in spa_load_verify()
1951 VERIFY(nvlist_add_uint64(spa->spa_load_info, in spa_load_verify()
1954 spa->spa_load_max_txg = spa->spa_uberblock.ub_txg; in spa_load_verify()
1970 spa_prop_find(spa_t *spa, zpool_prop_t prop, uint64_t *val) in spa_prop_find() argument
1972 (void) zap_lookup(spa->spa_meta_objset, spa->spa_pool_props_object, in spa_prop_find()
1980 spa_dir_prop(spa_t *spa, const char *name, uint64_t *val) in spa_dir_prop() argument
1982 return (zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in spa_dir_prop()
2010 spa_try_repair(spa_t *spa, nvlist_t *config) in spa_try_repair() argument
2035 vd[i] = spa_lookup_by_guid(spa, glist[i], B_FALSE); in spa_try_repair()
2049 vdev_reopen(spa->spa_root_vdev); in spa_try_repair()
2069 vdev_reopen(spa->spa_root_vdev); in spa_try_repair()
2076 spa_load(spa_t *spa, spa_load_state_t state, spa_import_type_t type, in spa_load() argument
2079 nvlist_t *config = spa->spa_config; in spa_load()
2089 ASSERT(spa->spa_comment == NULL); in spa_load()
2091 spa->spa_comment = spa_strdup(comment); in spa_load()
2098 &spa->spa_ubsync.ub_version) != 0) in spa_load()
2099 spa->spa_ubsync.ub_version = SPA_VERSION_INITIAL; in spa_load()
2102 &spa->spa_config_txg); in spa_load()
2108 spa->spa_config_guid = pool_guid; in spa_load()
2112 VERIFY(nvlist_dup(nvl, &spa->spa_config_splitting, in spa_load()
2116 nvlist_free(spa->spa_load_info); in spa_load()
2117 spa->spa_load_info = fnvlist_alloc(); in spa_load()
2119 gethrestime(&spa->spa_loaded_ts); in spa_load()
2120 error = spa_load_impl(spa, pool_guid, config, state, type, in spa_load()
2128 spa_evicting_os_wait(spa); in spa_load()
2129 spa->spa_minref = refcount_count(&spa->spa_refcount); in spa_load()
2132 spa->spa_loaded_ts.tv_sec = 0; in spa_load()
2133 spa->spa_loaded_ts.tv_nsec = 0; in spa_load()
2136 zfs_ereport_post(ereport, spa, NULL, NULL, 0, 0); in spa_load()
2139 spa->spa_load_state = error ? SPA_LOAD_ERROR : SPA_LOAD_NONE; in spa_load()
2140 spa->spa_ena = 0; in spa_load()
2150 spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, in spa_load_impl() argument
2158 uberblock_t *ub = &spa->spa_uberblock; in spa_load_impl()
2159 uint64_t children, config_cache_txg = spa->spa_config_txg; in spa_load_impl()
2160 int orig_mode = spa->spa_mode; in spa_load_impl()
2170 spa->spa_mode = FREAD; in spa_load_impl()
2174 spa->spa_load_state = state; in spa_load_impl()
2185 spa->spa_async_zio_root = kmem_alloc(max_ncpus * sizeof (void *), in spa_load_impl()
2188 spa->spa_async_zio_root[i] = zio_root(spa, NULL, NULL, in spa_load_impl()
2198 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_load_impl()
2199 error = spa_config_parse(spa, &rvd, nvroot, NULL, 0, parse); in spa_load_impl()
2200 spa_config_exit(spa, SCL_ALL, FTAG); in spa_load_impl()
2205 ASSERT(spa->spa_root_vdev == rvd); in spa_load_impl()
2206 ASSERT3U(spa->spa_min_ashift, >=, SPA_MINBLOCKSHIFT); in spa_load_impl()
2207 ASSERT3U(spa->spa_max_ashift, <=, SPA_MAXBLOCKSHIFT); in spa_load_impl()
2210 ASSERT(spa_guid(spa) == pool_guid); in spa_load_impl()
2216 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_load_impl()
2218 spa_config_exit(spa, SCL_ALL, FTAG); in spa_load_impl()
2236 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_load_impl()
2238 spa_config_exit(spa, SCL_ALL, FTAG); in spa_load_impl()
2286 nvlist_free(spa->spa_label_features); in spa_load_impl()
2287 VERIFY(nvlist_dup(features, &spa->spa_label_features, 0) == 0); in spa_load_impl()
2303 for (nvpair_t *nvp = nvlist_next_nvpair(spa->spa_label_features, in spa_load_impl()
2305 nvp = nvlist_next_nvpair(spa->spa_label_features, nvp)) { in spa_load_impl()
2313 VERIFY(nvlist_add_nvlist(spa->spa_load_info, in spa_load_impl()
2335 if (type != SPA_IMPORT_ASSEMBLE && spa->spa_config_splitting) { in spa_load_impl()
2336 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_load_impl()
2337 spa_try_repair(spa, config); in spa_load_impl()
2338 spa_config_exit(spa, SCL_ALL, FTAG); in spa_load_impl()
2339 nvlist_free(spa->spa_config_splitting); in spa_load_impl()
2340 spa->spa_config_splitting = NULL; in spa_load_impl()
2346 spa->spa_state = POOL_STATE_ACTIVE; in spa_load_impl()
2347 spa->spa_ubsync = spa->spa_uberblock; in spa_load_impl()
2348 spa->spa_verify_min_txg = spa->spa_extreme_rewind ? in spa_load_impl()
2349 TXG_INITIAL - 1 : spa_last_synced_txg(spa) - TXG_DEFER_SIZE - 1; in spa_load_impl()
2350 spa->spa_first_txg = spa->spa_last_ubsync_txg ? in spa_load_impl()
2351 spa->spa_last_ubsync_txg : spa_last_synced_txg(spa) + 1; in spa_load_impl()
2352 spa->spa_claim_max_txg = spa->spa_first_txg; in spa_load_impl()
2353 spa->spa_prev_software_version = ub->ub_software_version; in spa_load_impl()
2355 error = dsl_pool_init(spa, spa->spa_first_txg, &spa->spa_dsl_pool); in spa_load_impl()
2358 spa->spa_meta_objset = spa->spa_dsl_pool->dp_meta_objset; in spa_load_impl()
2360 if (spa_dir_prop(spa, DMU_POOL_CONFIG, &spa->spa_config_object) != 0) in spa_load_impl()
2363 if (spa_version(spa) >= SPA_VERSION_FEATURES) { in spa_load_impl()
2367 if (spa_dir_prop(spa, DMU_POOL_FEATURES_FOR_READ, in spa_load_impl()
2368 &spa->spa_feat_for_read_obj) != 0) { in spa_load_impl()
2372 if (spa_dir_prop(spa, DMU_POOL_FEATURES_FOR_WRITE, in spa_load_impl()
2373 &spa->spa_feat_for_write_obj) != 0) { in spa_load_impl()
2377 if (spa_dir_prop(spa, DMU_POOL_FEATURE_DESCRIPTIONS, in spa_load_impl()
2378 &spa->spa_feat_desc_obj) != 0) { in spa_load_impl()
2385 if (!spa_features_check(spa, B_FALSE, in spa_load_impl()
2389 if (spa_writeable(spa) || state == SPA_LOAD_TRYIMPORT) { in spa_load_impl()
2390 if (!spa_features_check(spa, B_TRUE, in spa_load_impl()
2396 fnvlist_add_nvlist(spa->spa_load_info, in spa_load_impl()
2400 fnvlist_add_nvlist(spa->spa_load_info, in spa_load_impl()
2408 fnvlist_add_boolean(spa->spa_load_info, in spa_load_impl()
2432 spa_writeable(spa))) { in spa_load_impl()
2444 error = feature_get_refcount_from_disk(spa, in spa_load_impl()
2447 spa->spa_feat_refcount_cache[i] = refcount; in spa_load_impl()
2449 spa->spa_feat_refcount_cache[i] = in spa_load_impl()
2458 if (spa_feature_is_active(spa, SPA_FEATURE_ENABLED_TXG)) { in spa_load_impl()
2459 if (spa_dir_prop(spa, DMU_POOL_FEATURE_ENABLED_TXG, in spa_load_impl()
2460 &spa->spa_feat_enabled_txg_obj) != 0) in spa_load_impl()
2464 spa->spa_is_initializing = B_TRUE; in spa_load_impl()
2465 error = dsl_pool_open(spa->spa_dsl_pool); in spa_load_impl()
2466 spa->spa_is_initializing = B_FALSE; in spa_load_impl()
2474 if (load_nvlist(spa, spa->spa_config_object, &nvconfig) != 0) in spa_load_impl()
2477 if (!spa_is_root(spa) && nvlist_lookup_uint64(nvconfig, in spa_load_impl()
2501 spa_name(spa), hostname, in spa_load_impl()
2506 if (nvlist_lookup_nvlist(spa->spa_config, in spa_load_impl()
2511 spa_config_set(spa, nvconfig); in spa_load_impl()
2512 spa_unload(spa); in spa_load_impl()
2513 spa_deactivate(spa); in spa_load_impl()
2514 spa_activate(spa, orig_mode); in spa_load_impl()
2516 return (spa_load(spa, state, SPA_IMPORT_EXISTING, B_TRUE)); in spa_load_impl()
2519 if (spa_dir_prop(spa, DMU_POOL_SYNC_BPOBJ, &obj) != 0) in spa_load_impl()
2521 error = bpobj_open(&spa->spa_deferred_bpobj, spa->spa_meta_objset, obj); in spa_load_impl()
2530 error = spa_dir_prop(spa, DMU_POOL_DEFLATE, &spa->spa_deflate); in spa_load_impl()
2534 error = spa_dir_prop(spa, DMU_POOL_CREATION_VERSION, in spa_load_impl()
2535 &spa->spa_creation_version); in spa_load_impl()
2543 error = spa_dir_prop(spa, DMU_POOL_ERRLOG_LAST, &spa->spa_errlog_last); in spa_load_impl()
2547 error = spa_dir_prop(spa, DMU_POOL_ERRLOG_SCRUB, in spa_load_impl()
2548 &spa->spa_errlog_scrub); in spa_load_impl()
2556 error = spa_dir_prop(spa, DMU_POOL_HISTORY, &spa->spa_history); in spa_load_impl()
2569 error = spa_dir_prop(spa, DMU_POOL_SPARES, &spa->spa_spares.sav_object); in spa_load_impl()
2573 ASSERT(spa_version(spa) >= SPA_VERSION_SPARES); in spa_load_impl()
2574 if (load_nvlist(spa, spa->spa_spares.sav_object, in spa_load_impl()
2575 &spa->spa_spares.sav_config) != 0) in spa_load_impl()
2578 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_load_impl()
2579 spa_load_spares(spa); in spa_load_impl()
2580 spa_config_exit(spa, SCL_ALL, FTAG); in spa_load_impl()
2582 spa->spa_spares.sav_sync = B_TRUE; in spa_load_impl()
2588 error = spa_dir_prop(spa, DMU_POOL_L2CACHE, in spa_load_impl()
2589 &spa->spa_l2cache.sav_object); in spa_load_impl()
2593 ASSERT(spa_version(spa) >= SPA_VERSION_L2CACHE); in spa_load_impl()
2594 if (load_nvlist(spa, spa->spa_l2cache.sav_object, in spa_load_impl()
2595 &spa->spa_l2cache.sav_config) != 0) in spa_load_impl()
2598 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_load_impl()
2599 spa_load_l2cache(spa); in spa_load_impl()
2600 spa_config_exit(spa, SCL_ALL, FTAG); in spa_load_impl()
2602 spa->spa_l2cache.sav_sync = B_TRUE; in spa_load_impl()
2605 spa->spa_delegation = zpool_prop_default_numeric(ZPOOL_PROP_DELEGATION); in spa_load_impl()
2607 error = spa_dir_prop(spa, DMU_POOL_PROPS, &spa->spa_pool_props_object); in spa_load_impl()
2614 spa_prop_find(spa, ZPOOL_PROP_BOOTFS, &spa->spa_bootfs); in spa_load_impl()
2615 spa_prop_find(spa, ZPOOL_PROP_AUTOREPLACE, &autoreplace); in spa_load_impl()
2616 spa_prop_find(spa, ZPOOL_PROP_DELEGATION, &spa->spa_delegation); in spa_load_impl()
2617 spa_prop_find(spa, ZPOOL_PROP_FAILUREMODE, &spa->spa_failmode); in spa_load_impl()
2618 spa_prop_find(spa, ZPOOL_PROP_AUTOEXPAND, &spa->spa_autoexpand); in spa_load_impl()
2619 spa_prop_find(spa, ZPOOL_PROP_DEDUPDITTO, in spa_load_impl()
2620 &spa->spa_dedup_ditto); in spa_load_impl()
2622 spa->spa_autoreplace = (autoreplace != 0); in spa_load_impl()
2632 if (spa->spa_autoreplace && state != SPA_LOAD_TRYIMPORT) { in spa_load_impl()
2633 spa_check_removed(spa->spa_root_vdev); in spa_load_impl()
2640 spa_aux_check_removed(&spa->spa_spares); in spa_load_impl()
2641 spa_aux_check_removed(&spa->spa_l2cache); in spa_load_impl()
2653 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_load_impl()
2655 spa_config_exit(spa, SCL_ALL, FTAG); in spa_load_impl()
2660 error = ddt_load(spa); in spa_load_impl()
2664 spa_update_dspace(spa); in spa_load_impl()
2676 if (load_nvlist(spa, spa->spa_config_object, &nvconfig) != 0) in spa_load_impl()
2679 if (!spa_config_valid(spa, nvconfig)) { in spa_load_impl()
2694 if (spa_writeable(spa) && spa_check_logs(spa)) { in spa_load_impl()
2716 if (error = spa_load_verify(spa)) in spa_load_impl()
2721 if (spa_writeable(spa) && (state == SPA_LOAD_RECOVER || in spa_load_impl()
2722 spa->spa_load_max_txg == UINT64_MAX)) { in spa_load_impl()
2725 dsl_pool_t *dp = spa_get_dsl(spa); in spa_load_impl()
2736 spa->spa_claiming = B_TRUE; in spa_load_impl()
2738 tx = dmu_tx_create_assigned(dp, spa_first_txg(spa)); in spa_load_impl()
2743 spa->spa_claiming = B_FALSE; in spa_load_impl()
2745 spa_set_log_state(spa, SPA_LOG_GOOD); in spa_load_impl()
2746 spa->spa_sync_on = B_TRUE; in spa_load_impl()
2747 txg_sync_start(spa->spa_dsl_pool); in spa_load_impl()
2756 txg_wait_synced(spa->spa_dsl_pool, spa->spa_claim_max_txg); in spa_load_impl()
2765 if (config_cache_txg != spa->spa_config_txg || in spa_load_impl()
2768 (spa->spa_import_flags & ZFS_IMPORT_VERBATIM)) in spa_load_impl()
2780 spa_async_request(spa, SPA_ASYNC_CONFIG_UPDATE); in spa_load_impl()
2785 if (!dsl_scan_resilvering(spa->spa_dsl_pool) && in spa_load_impl()
2787 spa_async_request(spa, SPA_ASYNC_RESILVER); in spa_load_impl()
2793 spa_history_log_version(spa, "open"); in spa_load_impl()
2798 (void) dmu_objset_find(spa_name(spa), in spa_load_impl()
2804 dsl_pool_clean_tmp_userrefs(spa->spa_dsl_pool); in spa_load_impl()
2807 spa_async_request(spa, SPA_ASYNC_L2CACHE_REBUILD); in spa_load_impl()
2813 spa_load_retry(spa_t *spa, spa_load_state_t state, int mosconfig) in spa_load_retry() argument
2815 int mode = spa->spa_mode; in spa_load_retry()
2817 spa_unload(spa); in spa_load_retry()
2818 spa_deactivate(spa); in spa_load_retry()
2820 spa->spa_load_max_txg = spa->spa_uberblock.ub_txg - 1; in spa_load_retry()
2822 spa_activate(spa, mode); in spa_load_retry()
2823 spa_async_suspend(spa); in spa_load_retry()
2825 return (spa_load(spa, state, SPA_IMPORT_EXISTING, mosconfig)); in spa_load_retry()
2836 spa_load_best(spa_t *spa, spa_load_state_t state, int mosconfig, in spa_load_best() argument
2845 if (spa->spa_load_txg && state == SPA_LOAD_RECOVER) { in spa_load_best()
2846 spa->spa_load_max_txg = spa->spa_load_txg; in spa_load_best()
2847 spa_set_log_state(spa, SPA_LOG_CLEAR); in spa_load_best()
2849 spa->spa_load_max_txg = max_request; in spa_load_best()
2851 spa->spa_extreme_rewind = B_TRUE; in spa_load_best()
2854 load_error = rewind_error = spa_load(spa, state, SPA_IMPORT_EXISTING, in spa_load_best()
2859 if (spa->spa_root_vdev != NULL) in spa_load_best()
2860 config = spa_config_generate(spa, NULL, -1ULL, B_TRUE); in spa_load_best()
2862 spa->spa_last_ubsync_txg = spa->spa_uberblock.ub_txg; in spa_load_best()
2863 spa->spa_last_ubsync_txg_ts = spa->spa_uberblock.ub_timestamp; in spa_load_best()
2872 spa_set_log_state(spa, SPA_LOG_CLEAR); in spa_load_best()
2879 loadinfo = spa->spa_load_info; in spa_load_best()
2880 spa->spa_load_info = fnvlist_alloc(); in spa_load_best()
2883 spa->spa_load_max_txg = spa->spa_last_ubsync_txg; in spa_load_best()
2884 safe_rewind_txg = spa->spa_last_ubsync_txg - TXG_DEFER_SIZE; in spa_load_best()
2892 while (rewind_error && spa->spa_uberblock.ub_txg >= min_txg && in spa_load_best()
2893 spa->spa_uberblock.ub_txg <= spa->spa_load_max_txg) { in spa_load_best()
2894 if (spa->spa_load_max_txg < safe_rewind_txg) in spa_load_best()
2895 spa->spa_extreme_rewind = B_TRUE; in spa_load_best()
2896 rewind_error = spa_load_retry(spa, state, mosconfig); in spa_load_best()
2899 spa->spa_extreme_rewind = B_FALSE; in spa_load_best()
2900 spa->spa_load_max_txg = UINT64_MAX; in spa_load_best()
2903 spa_config_set(spa, config); in spa_load_best()
2911 spa->spa_load_info); in spa_load_best()
2914 fnvlist_free(spa->spa_load_info); in spa_load_best()
2915 spa->spa_load_info = loadinfo; in spa_load_best()
2937 spa_t *spa; in spa_open_common() local
2955 if ((spa = spa_lookup(pool)) == NULL) { in spa_open_common()
2961 if (spa->spa_state == POOL_STATE_UNINITIALIZED) { in spa_open_common()
2964 zpool_get_rewind_policy(nvpolicy ? nvpolicy : spa->spa_config, in spa_open_common()
2969 spa_activate(spa, spa_mode_global); in spa_open_common()
2972 spa->spa_last_ubsync_txg = spa->spa_load_txg = 0; in spa_open_common()
2974 error = spa_load_best(spa, state, B_FALSE, policy.zrp_txg, in spa_open_common()
2985 spa_unload(spa); in spa_open_common()
2986 spa_deactivate(spa); in spa_open_common()
2987 spa_config_sync(spa, B_TRUE, B_TRUE); in spa_open_common()
2988 spa_remove(spa); in spa_open_common()
3000 if (config != NULL && spa->spa_config) { in spa_open_common()
3001 VERIFY(nvlist_dup(spa->spa_config, config, in spa_open_common()
3005 spa->spa_load_info) == 0); in spa_open_common()
3007 spa_unload(spa); in spa_open_common()
3008 spa_deactivate(spa); in spa_open_common()
3009 spa->spa_last_open_failed = error; in spa_open_common()
3017 spa_open_ref(spa, tag); in spa_open_common()
3020 *config = spa_config_generate(spa, NULL, -1ULL, B_TRUE); in spa_open_common()
3028 spa->spa_load_info) == 0); in spa_open_common()
3032 spa->spa_last_open_failed = 0; in spa_open_common()
3033 spa->spa_last_ubsync_txg = 0; in spa_open_common()
3034 spa->spa_load_txg = 0; in spa_open_common()
3038 *spapp = spa; in spa_open_common()
3063 spa_t *spa; in spa_inject_addref() local
3066 if ((spa = spa_lookup(name)) == NULL) { in spa_inject_addref()
3070 spa->spa_inject_ref++; in spa_inject_addref()
3073 return (spa); in spa_inject_addref()
3077 spa_inject_delref(spa_t *spa) in spa_inject_delref() argument
3080 spa->spa_inject_ref--; in spa_inject_delref()
3088 spa_add_spares(spa_t *spa, nvlist_t *config) in spa_add_spares() argument
3098 ASSERT(spa_config_held(spa, SCL_CONFIG, RW_READER)); in spa_add_spares()
3100 if (spa->spa_spares.sav_count == 0) in spa_add_spares()
3105 VERIFY(nvlist_lookup_nvlist_array(spa->spa_spares.sav_config, in spa_add_spares()
3137 spa_add_l2cache(spa_t *spa, nvlist_t *config) in spa_add_l2cache() argument
3147 ASSERT(spa_config_held(spa, SCL_CONFIG, RW_READER)); in spa_add_l2cache()
3149 if (spa->spa_l2cache.sav_count == 0) in spa_add_l2cache()
3154 VERIFY(nvlist_lookup_nvlist_array(spa->spa_l2cache.sav_config, in spa_add_l2cache()
3171 for (j = 0; j < spa->spa_l2cache.sav_count; j++) { in spa_add_l2cache()
3173 spa->spa_l2cache.sav_vdevs[j]->vdev_guid) { in spa_add_l2cache()
3174 vd = spa->spa_l2cache.sav_vdevs[j]; in spa_add_l2cache()
3189 spa_add_feature_stats(spa_t *spa, nvlist_t *config) in spa_add_feature_stats() argument
3195 ASSERT(spa_config_held(spa, SCL_CONFIG, RW_READER)); in spa_add_feature_stats()
3198 if (spa->spa_feat_for_read_obj != 0) { in spa_add_feature_stats()
3199 for (zap_cursor_init(&zc, spa->spa_meta_objset, in spa_add_feature_stats()
3200 spa->spa_feat_for_read_obj); in spa_add_feature_stats()
3211 if (spa->spa_feat_for_write_obj != 0) { in spa_add_feature_stats()
3212 for (zap_cursor_init(&zc, spa->spa_meta_objset, in spa_add_feature_stats()
3213 spa->spa_feat_for_write_obj); in spa_add_feature_stats()
3234 spa_t *spa; in spa_get_stats() local
3237 error = spa_open_common(name, &spa, FTAG, NULL, config); in spa_get_stats()
3239 if (spa != NULL) { in spa_get_stats()
3245 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER); in spa_get_stats()
3250 loadtimes[0] = spa->spa_loaded_ts.tv_sec; in spa_get_stats()
3251 loadtimes[1] = spa->spa_loaded_ts.tv_nsec; in spa_get_stats()
3257 spa_get_errlog_size(spa)) == 0); in spa_get_stats()
3259 if (spa_suspended(spa)) in spa_get_stats()
3262 spa->spa_failmode) == 0); in spa_get_stats()
3264 spa_add_spares(spa, *config); in spa_get_stats()
3265 spa_add_l2cache(spa, *config); in spa_get_stats()
3266 spa_add_feature_stats(spa, *config); in spa_get_stats()
3275 if (spa == NULL) { in spa_get_stats()
3277 spa = spa_lookup(name); in spa_get_stats()
3278 if (spa) in spa_get_stats()
3279 spa_altroot(spa, altroot, buflen); in spa_get_stats()
3282 spa = NULL; in spa_get_stats()
3285 spa_altroot(spa, altroot, buflen); in spa_get_stats()
3289 if (spa != NULL) { in spa_get_stats()
3290 spa_config_exit(spa, SCL_CONFIG, FTAG); in spa_get_stats()
3291 spa_close(spa, FTAG); in spa_get_stats()
3304 spa_validate_aux_devs(spa_t *spa, nvlist_t *nvroot, uint64_t crtxg, int mode, in spa_validate_aux_devs() argument
3313 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL); in spa_validate_aux_devs()
3328 if (spa_version(spa) < version) in spa_validate_aux_devs()
3339 if ((error = spa_config_parse(spa, &vd, dev[i], NULL, 0, in spa_validate_aux_devs()
3385 spa_validate_aux(spa_t *spa, nvlist_t *nvroot, uint64_t crtxg, int mode) in spa_validate_aux() argument
3389 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL); in spa_validate_aux()
3391 if ((error = spa_validate_aux_devs(spa, nvroot, crtxg, mode, in spa_validate_aux()
3392 &spa->spa_spares, ZPOOL_CONFIG_SPARES, SPA_VERSION_SPARES, in spa_validate_aux()
3397 return (spa_validate_aux_devs(spa, nvroot, crtxg, mode, in spa_validate_aux()
3398 &spa->spa_l2cache, ZPOOL_CONFIG_L2CACHE, SPA_VERSION_L2CACHE, in spa_validate_aux()
3452 spa_l2cache_drop(spa_t *spa) in spa_l2cache_drop() argument
3456 spa_aux_vdev_t *sav = &spa->spa_l2cache; in spa_l2cache_drop()
3477 spa_t *spa; in spa_create() local
3503 spa = spa_add(pool, NULL, altroot); in spa_create()
3504 spa_activate(spa, spa_mode_global); in spa_create()
3506 if (props && (error = spa_prop_validate(spa, props))) { in spa_create()
3507 spa_deactivate(spa); in spa_create()
3508 spa_remove(spa); in spa_create()
3526 spa->spa_first_txg = txg; in spa_create()
3527 spa->spa_uberblock.ub_txg = txg - 1; in spa_create()
3528 spa->spa_uberblock.ub_version = version; in spa_create()
3529 spa->spa_ubsync = spa->spa_uberblock; in spa_create()
3534 spa->spa_async_zio_root = kmem_alloc(max_ncpus * sizeof (void *), in spa_create()
3537 spa->spa_async_zio_root[i] = zio_root(spa, NULL, NULL, in spa_create()
3545 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_create()
3547 error = spa_config_parse(spa, &rvd, nvroot, NULL, 0, VDEV_ALLOC_ADD); in spa_create()
3550 ASSERT(error != 0 || spa->spa_root_vdev == rvd); in spa_create()
3557 (error = spa_validate_aux(spa, nvroot, txg, in spa_create()
3565 spa_config_exit(spa, SCL_ALL, FTAG); in spa_create()
3568 spa_unload(spa); in spa_create()
3569 spa_deactivate(spa); in spa_create()
3570 spa_remove(spa); in spa_create()
3580 VERIFY(nvlist_alloc(&spa->spa_spares.sav_config, NV_UNIQUE_NAME, in spa_create()
3582 VERIFY(nvlist_add_nvlist_array(spa->spa_spares.sav_config, in spa_create()
3584 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_create()
3585 spa_load_spares(spa); in spa_create()
3586 spa_config_exit(spa, SCL_ALL, FTAG); in spa_create()
3587 spa->spa_spares.sav_sync = B_TRUE; in spa_create()
3595 VERIFY(nvlist_alloc(&spa->spa_l2cache.sav_config, in spa_create()
3597 VERIFY(nvlist_add_nvlist_array(spa->spa_l2cache.sav_config, in spa_create()
3599 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_create()
3600 spa_load_l2cache(spa); in spa_create()
3601 spa_config_exit(spa, SCL_ALL, FTAG); in spa_create()
3602 spa->spa_l2cache.sav_sync = B_TRUE; in spa_create()
3605 spa->spa_is_initializing = B_TRUE; in spa_create()
3606 spa->spa_dsl_pool = dp = dsl_pool_create(spa, zplprops, txg); in spa_create()
3607 spa->spa_meta_objset = dp->dp_meta_objset; in spa_create()
3608 spa->spa_is_initializing = B_FALSE; in spa_create()
3613 ddt_create(spa); in spa_create()
3615 spa_update_dspace(spa); in spa_create()
3622 spa->spa_config_object = dmu_object_alloc(spa->spa_meta_objset, in spa_create()
3626 if (zap_add(spa->spa_meta_objset, in spa_create()
3628 sizeof (uint64_t), 1, &spa->spa_config_object, tx) != 0) { in spa_create()
3632 if (spa_version(spa) >= SPA_VERSION_FEATURES) in spa_create()
3633 spa_feature_create_zap_objects(spa, tx); in spa_create()
3635 if (zap_add(spa->spa_meta_objset, in spa_create()
3643 spa->spa_deflate = TRUE; in spa_create()
3644 if (zap_add(spa->spa_meta_objset, in spa_create()
3646 sizeof (uint64_t), 1, &spa->spa_deflate, tx) != 0) { in spa_create()
3656 obj = bpobj_alloc(spa->spa_meta_objset, 1 << 14, tx); in spa_create()
3657 dmu_object_set_compress(spa->spa_meta_objset, obj, in spa_create()
3659 if (zap_add(spa->spa_meta_objset, in spa_create()
3664 VERIFY3U(0, ==, bpobj_open(&spa->spa_deferred_bpobj, in spa_create()
3665 spa->spa_meta_objset, obj)); in spa_create()
3671 spa_history_create_obj(spa, tx); in spa_create()
3676 spa->spa_bootfs = zpool_prop_default_numeric(ZPOOL_PROP_BOOTFS); in spa_create()
3677 spa->spa_delegation = zpool_prop_default_numeric(ZPOOL_PROP_DELEGATION); in spa_create()
3678 spa->spa_failmode = zpool_prop_default_numeric(ZPOOL_PROP_FAILUREMODE); in spa_create()
3679 spa->spa_autoexpand = zpool_prop_default_numeric(ZPOOL_PROP_AUTOEXPAND); in spa_create()
3682 spa_configfile_set(spa, props, B_FALSE); in spa_create()
3688 spa->spa_sync_on = B_TRUE; in spa_create()
3689 txg_sync_start(spa->spa_dsl_pool); in spa_create()
3695 txg_wait_synced(spa->spa_dsl_pool, txg); in spa_create()
3697 spa_config_sync(spa, B_FALSE, B_TRUE); in spa_create()
3699 spa_history_log_version(spa, "create"); in spa_create()
3705 spa_evicting_os_wait(spa); in spa_create()
3706 spa->spa_minref = refcount_count(&spa->spa_refcount); in spa_create()
3807 spa_t *spa; in spa_import_rootpool() local
3838 if ((spa = spa_lookup(pname)) != NULL) { in spa_import_rootpool()
3843 spa_remove(spa); in spa_import_rootpool()
3846 spa = spa_add(pname, config, NULL); in spa_import_rootpool()
3847 spa->spa_is_root = B_TRUE; in spa_import_rootpool()
3848 spa->spa_import_flags = ZFS_IMPORT_VERBATIM; in spa_import_rootpool()
3855 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_import_rootpool()
3856 error = spa_config_parse(spa, &rvd, nvtop, NULL, 0, in spa_import_rootpool()
3858 spa_config_exit(spa, SCL_ALL, FTAG); in spa_import_rootpool()
3905 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_import_rootpool()
3907 spa_config_exit(spa, SCL_ALL, FTAG); in spa_import_rootpool()
3922 spa_t *spa; in spa_import() local
3951 spa = spa_add(pool, config, altroot); in spa_import()
3952 spa->spa_import_flags = flags; in spa_import()
3958 if (spa->spa_import_flags & ZFS_IMPORT_VERBATIM) { in spa_import()
3960 spa_configfile_set(spa, props, B_FALSE); in spa_import()
3962 spa_config_sync(spa, B_FALSE, B_TRUE); in spa_import()
3968 spa_activate(spa, mode); in spa_import()
3973 spa_async_suspend(spa); in spa_import()
3985 spa->spa_last_ubsync_txg = spa->spa_load_txg = 0; in spa_import()
3987 error = spa_load_best(spa, state, B_TRUE, policy.zrp_txg, in spa_import()
3995 spa->spa_load_info) == 0); in spa_import()
3997 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_import()
4002 if (spa->spa_spares.sav_config) { in spa_import()
4003 nvlist_free(spa->spa_spares.sav_config); in spa_import()
4004 spa->spa_spares.sav_config = NULL; in spa_import()
4005 spa_load_spares(spa); in spa_import()
4007 if (spa->spa_l2cache.sav_config) { in spa_import()
4008 nvlist_free(spa->spa_l2cache.sav_config); in spa_import()
4009 spa->spa_l2cache.sav_config = NULL; in spa_import()
4010 spa_load_l2cache(spa); in spa_import()
4016 error = spa_validate_aux(spa, nvroot, -1ULL, in spa_import()
4019 error = spa_validate_aux(spa, nvroot, -1ULL, in spa_import()
4021 spa_config_exit(spa, SCL_ALL, FTAG); in spa_import()
4024 spa_configfile_set(spa, props, B_FALSE); in spa_import()
4026 if (error != 0 || (props && spa_writeable(spa) && in spa_import()
4027 (error = spa_prop_set(spa, props)))) { in spa_import()
4028 spa_unload(spa); in spa_import()
4029 spa_deactivate(spa); in spa_import()
4030 spa_remove(spa); in spa_import()
4035 spa_async_resume(spa); in spa_import()
4043 if (spa->spa_spares.sav_config) in spa_import()
4044 VERIFY(nvlist_remove(spa->spa_spares.sav_config, in spa_import()
4047 VERIFY(nvlist_alloc(&spa->spa_spares.sav_config, in spa_import()
4049 VERIFY(nvlist_add_nvlist_array(spa->spa_spares.sav_config, in spa_import()
4051 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_import()
4052 spa_load_spares(spa); in spa_import()
4053 spa_config_exit(spa, SCL_ALL, FTAG); in spa_import()
4054 spa->spa_spares.sav_sync = B_TRUE; in spa_import()
4058 if (spa->spa_l2cache.sav_config) in spa_import()
4059 VERIFY(nvlist_remove(spa->spa_l2cache.sav_config, in spa_import()
4062 VERIFY(nvlist_alloc(&spa->spa_l2cache.sav_config, in spa_import()
4064 VERIFY(nvlist_add_nvlist_array(spa->spa_l2cache.sav_config, in spa_import()
4066 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_import()
4067 spa_load_l2cache(spa); in spa_import()
4068 spa_config_exit(spa, SCL_ALL, FTAG); in spa_import()
4069 spa->spa_l2cache.sav_sync = B_TRUE; in spa_import()
4075 if (spa->spa_autoreplace) { in spa_import()
4076 spa_aux_check_removed(&spa->spa_spares); in spa_import()
4077 spa_aux_check_removed(&spa->spa_l2cache); in spa_import()
4080 if (spa_writeable(spa)) { in spa_import()
4084 spa_config_update(spa, SPA_CONFIG_UPDATE_POOL); in spa_import()
4091 spa_async_request(spa, SPA_ASYNC_AUTOEXPAND); in spa_import()
4094 spa_history_log_version(spa, "import"); in spa_import()
4104 spa_t *spa; in spa_tryimport() local
4118 spa = spa_add(TRYIMPORT_NAME, tryconfig, NULL); in spa_tryimport()
4119 spa_activate(spa, FREAD); in spa_tryimport()
4126 error = spa_load(spa, SPA_LOAD_TRYIMPORT, SPA_IMPORT_EXISTING, B_TRUE); in spa_tryimport()
4131 if (spa->spa_root_vdev != NULL) { in spa_tryimport()
4132 config = spa_config_generate(spa, NULL, -1ULL, B_TRUE); in spa_tryimport()
4138 spa->spa_uberblock.ub_timestamp) == 0); in spa_tryimport()
4140 spa->spa_load_info) == 0); in spa_tryimport()
4147 if ((!error || error == EEXIST) && spa->spa_bootfs) { in spa_tryimport()
4154 if (dsl_dsobj_to_dsname(spa_name(spa), in spa_tryimport()
4155 spa->spa_bootfs, tmpname) == 0) { in spa_tryimport()
4177 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER); in spa_tryimport()
4178 spa_add_spares(spa, config); in spa_tryimport()
4179 spa_add_l2cache(spa, config); in spa_tryimport()
4180 spa_config_exit(spa, SCL_CONFIG, FTAG); in spa_tryimport()
4183 spa_unload(spa); in spa_tryimport()
4184 spa_deactivate(spa); in spa_tryimport()
4185 spa_remove(spa); in spa_tryimport()
4204 spa_t *spa; in spa_export_common() local
4213 if ((spa = spa_lookup(pool)) == NULL) { in spa_export_common()
4222 spa_open_ref(spa, FTAG); in spa_export_common()
4224 spa_async_suspend(spa); in spa_export_common()
4226 spa_close(spa, FTAG); in spa_export_common()
4232 if (spa->spa_state != POOL_STATE_UNINITIALIZED && spa->spa_sync_on) { in spa_export_common()
4237 txg_wait_synced(spa->spa_dsl_pool, 0); in spa_export_common()
4238 spa_evicting_os_wait(spa); in spa_export_common()
4245 if (!spa_refcount_zero(spa) || in spa_export_common()
4246 (spa->spa_inject_ref != 0 && in spa_export_common()
4248 spa_async_resume(spa); in spa_export_common()
4260 spa_has_active_shared_spare(spa)) { in spa_export_common()
4261 spa_async_resume(spa); in spa_export_common()
4272 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_export_common()
4273 spa->spa_state = new_state; in spa_export_common()
4274 spa->spa_final_txg = spa_last_synced_txg(spa) + in spa_export_common()
4276 vdev_config_dirty(spa->spa_root_vdev); in spa_export_common()
4277 spa_config_exit(spa, SCL_ALL, FTAG); in spa_export_common()
4281 spa_event_notify(spa, NULL, ESC_ZFS_POOL_DESTROY); in spa_export_common()
4283 if (spa->spa_state != POOL_STATE_UNINITIALIZED) { in spa_export_common()
4284 spa_unload(spa); in spa_export_common()
4285 spa_deactivate(spa); in spa_export_common()
4288 if (oldconfig && spa->spa_config) in spa_export_common()
4289 VERIFY(nvlist_dup(spa->spa_config, oldconfig, 0) == 0); in spa_export_common()
4293 spa_config_sync(spa, B_TRUE, B_TRUE); in spa_export_common()
4294 spa_remove(spa); in spa_export_common()
4343 spa_vdev_add(spa_t *spa, nvlist_t *nvroot) in spa_vdev_add() argument
4347 vdev_t *rvd = spa->spa_root_vdev; in spa_vdev_add()
4352 ASSERT(spa_writeable(spa)); in spa_vdev_add()
4354 txg = spa_vdev_enter(spa); in spa_vdev_add()
4356 if ((error = spa_config_parse(spa, &vd, nvroot, NULL, 0, in spa_vdev_add()
4358 return (spa_vdev_exit(spa, NULL, txg, error)); in spa_vdev_add()
4360 spa->spa_pending_vdev = vd; /* spa_vdev_exit() will clear this */ in spa_vdev_add()
4371 return (spa_vdev_exit(spa, vd, txg, EINVAL)); in spa_vdev_add()
4375 return (spa_vdev_exit(spa, vd, txg, error)); in spa_vdev_add()
4381 if ((error = spa_validate_aux(spa, nvroot, txg, VDEV_ALLOC_ADD)) != 0) in spa_vdev_add()
4382 return (spa_vdev_exit(spa, vd, txg, error)); in spa_vdev_add()
4406 spa_set_aux_vdevs(&spa->spa_spares, spares, nspares, in spa_vdev_add()
4408 spa_load_spares(spa); in spa_vdev_add()
4409 spa->spa_spares.sav_sync = B_TRUE; in spa_vdev_add()
4413 spa_set_aux_vdevs(&spa->spa_l2cache, l2cache, nl2cache, in spa_vdev_add()
4415 spa_load_l2cache(spa); in spa_vdev_add()
4416 spa->spa_l2cache.sav_sync = B_TRUE; in spa_vdev_add()
4432 (void) spa_vdev_exit(spa, vd, txg, 0); in spa_vdev_add()
4435 spa_config_update(spa, SPA_CONFIG_UPDATE_POOL); in spa_vdev_add()
4455 spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot, int replacing) in spa_vdev_attach() argument
4458 vdev_t *rvd = spa->spa_root_vdev; in spa_vdev_attach()
4465 ASSERT(spa_writeable(spa)); in spa_vdev_attach()
4467 txg = spa_vdev_enter(spa); in spa_vdev_attach()
4469 oldvd = spa_lookup_by_guid(spa, guid, B_FALSE); in spa_vdev_attach()
4472 return (spa_vdev_exit(spa, NULL, txg, ENODEV)); in spa_vdev_attach()
4475 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP)); in spa_vdev_attach()
4479 if ((error = spa_config_parse(spa, &newrootvd, nvroot, NULL, 0, in spa_vdev_attach()
4481 return (spa_vdev_exit(spa, NULL, txg, EINVAL)); in spa_vdev_attach()
4484 return (spa_vdev_exit(spa, newrootvd, txg, EINVAL)); in spa_vdev_attach()
4489 return (spa_vdev_exit(spa, newrootvd, txg, EINVAL)); in spa_vdev_attach()
4492 return (spa_vdev_exit(spa, newrootvd, txg, error)); in spa_vdev_attach()
4498 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP)); in spa_vdev_attach()
4507 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP)); in spa_vdev_attach()
4517 !spa_has_spare(spa, newvd->vdev_guid)) in spa_vdev_attach()
4518 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP)); in spa_vdev_attach()
4529 spa_version(spa) < SPA_VERSION_MULTI_REPLACE) { in spa_vdev_attach()
4530 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP)); in spa_vdev_attach()
4533 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP)); in spa_vdev_attach()
4546 return (spa_vdev_exit(spa, newrootvd, txg, EOVERFLOW)); in spa_vdev_attach()
4553 return (spa_vdev_exit(spa, newrootvd, txg, EDOM)); in spa_vdev_attach()
4611 spa_event_notify(spa, newvd, ESC_ZFS_VDEV_SPARE); in spa_vdev_attach()
4628 dsl_resilver_restart(spa->spa_dsl_pool, dtl_max_txg); in spa_vdev_attach()
4633 (void) spa_vdev_exit(spa, newrootvd, dtl_max_txg, 0); in spa_vdev_attach()
4635 spa_history_log_internal(spa, "vdev attach", NULL, in spa_vdev_attach()
4644 if (spa->spa_bootfs) in spa_vdev_attach()
4645 spa_event_notify(spa, newvd, ESC_ZFS_BOOTFS_VDEV_ATTACH); in spa_vdev_attach()
4657 spa_vdev_detach(spa_t *spa, uint64_t guid, uint64_t pguid, int replace_done) in spa_vdev_detach() argument
4661 vdev_t *rvd = spa->spa_root_vdev; in spa_vdev_detach()
4667 ASSERT(spa_writeable(spa)); in spa_vdev_detach()
4669 txg = spa_vdev_enter(spa); in spa_vdev_detach()
4671 vd = spa_lookup_by_guid(spa, guid, B_FALSE); in spa_vdev_detach()
4674 return (spa_vdev_exit(spa, NULL, txg, ENODEV)); in spa_vdev_detach()
4677 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP)); in spa_vdev_detach()
4695 return (spa_vdev_exit(spa, NULL, txg, EBUSY)); in spa_vdev_detach()
4702 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP)); in spa_vdev_detach()
4705 spa_version(spa) >= SPA_VERSION_SPARES); in spa_vdev_detach()
4713 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP)); in spa_vdev_detach()
4720 return (spa_vdev_exit(spa, NULL, txg, EBUSY)); in spa_vdev_detach()
4792 (void) spa_vdev_remove(spa, unspare_guid, B_TRUE); in spa_vdev_detach()
4826 if (spa->spa_autoexpand) { in spa_vdev_detach()
4845 spa_event_notify(spa, vd, ESC_ZFS_VDEV_REMOVE); in spa_vdev_detach()
4848 spa_open_ref(spa, FTAG); in spa_vdev_detach()
4850 error = spa_vdev_exit(spa, vd, txg, 0); in spa_vdev_detach()
4852 spa_history_log_internal(spa, "detach", NULL, in spa_vdev_detach()
4867 altspa == spa) in spa_vdev_detach()
4879 spa_vdev_resilver_done(spa); in spa_vdev_detach()
4884 spa_close(spa, FTAG); in spa_vdev_detach()
4894 spa_vdev_split_mirror(spa_t *spa, char *newname, nvlist_t *config, in spa_vdev_split_mirror() argument
4907 ASSERT(spa_writeable(spa)); in spa_vdev_split_mirror()
4909 txg = spa_vdev_enter(spa); in spa_vdev_split_mirror()
4912 activate_slog = spa_passivate_log(spa); in spa_vdev_split_mirror()
4913 (void) spa_vdev_config_exit(spa, NULL, txg, 0, FTAG); in spa_vdev_split_mirror()
4914 error = spa_offline_log(spa); in spa_vdev_split_mirror()
4915 txg = spa_vdev_config_enter(spa); in spa_vdev_split_mirror()
4918 spa_activate_log(spa); in spa_vdev_split_mirror()
4921 return (spa_vdev_exit(spa, NULL, txg, error)); in spa_vdev_split_mirror()
4925 return (spa_vdev_exit(spa, NULL, txg, EEXIST)); in spa_vdev_split_mirror()
4933 return (spa_vdev_exit(spa, NULL, txg, EINVAL)); in spa_vdev_split_mirror()
4936 rvd = spa->spa_root_vdev; in spa_vdev_split_mirror()
4951 return (spa_vdev_exit(spa, NULL, txg, EINVAL)); in spa_vdev_split_mirror()
4956 return (spa_vdev_exit(spa, NULL, txg, EINVAL)); in spa_vdev_split_mirror()
4969 if (spa->spa_root_vdev->vdev_child[c]->vdev_ishole || in spa_vdev_split_mirror()
4970 spa->spa_root_vdev->vdev_child[c]->vdev_islog) { in spa_vdev_split_mirror()
4986 vml[c] = spa_lookup_by_guid(spa, glist[c], B_FALSE); in spa_vdev_split_mirror()
5001 c != spa->spa_root_vdev->vdev_child[c]->vdev_id) { in spa_vdev_split_mirror()
5025 return (spa_vdev_exit(spa, NULL, txg, error)); in spa_vdev_split_mirror()
5033 vdev_reopen(spa->spa_root_vdev); in spa_vdev_split_mirror()
5044 mutex_enter(&spa->spa_props_lock); in spa_vdev_split_mirror()
5045 VERIFY(nvlist_add_nvlist(spa->spa_config, ZPOOL_CONFIG_SPLIT, in spa_vdev_split_mirror()
5047 mutex_exit(&spa->spa_props_lock); in spa_vdev_split_mirror()
5048 spa->spa_config_splitting = nvl; in spa_vdev_split_mirror()
5049 vdev_config_dirty(spa->spa_root_vdev); in spa_vdev_split_mirror()
5056 spa_version(spa)) == 0); in spa_vdev_split_mirror()
5058 spa->spa_config_txg) == 0); in spa_vdev_split_mirror()
5066 newspa->spa_config_txg = spa->spa_config_txg; in spa_vdev_split_mirror()
5070 spa_vdev_config_exit(spa, NULL, txg, 0, FTAG); in spa_vdev_split_mirror()
5073 zio_handle_panic_injection(spa, FTAG, 1); in spa_vdev_split_mirror()
5088 ZPOOL_CONFIG_SPLIT_GUID, spa_guid(spa)) == 0); in spa_vdev_split_mirror()
5107 zio_handle_panic_injection(spa, FTAG, 2); in spa_vdev_split_mirror()
5112 txg = spa_vdev_config_enter(spa); in spa_vdev_split_mirror()
5113 tx = dmu_tx_create_dd(spa_get_dsl(spa)->dp_mos_dir); in spa_vdev_split_mirror()
5121 spa_history_log_internal(spa, "detach", tx, in spa_vdev_split_mirror()
5126 vdev_config_dirty(spa->spa_root_vdev); in spa_vdev_split_mirror()
5127 spa->spa_config_splitting = NULL; in spa_vdev_split_mirror()
5131 (void) spa_vdev_exit(spa, NULL, txg, 0); in spa_vdev_split_mirror()
5134 zio_handle_panic_injection(spa, FTAG, 3); in spa_vdev_split_mirror()
5138 "from pool %s", spa_name(spa)); in spa_vdev_split_mirror()
5154 txg = spa_vdev_config_enter(spa); in spa_vdev_split_mirror()
5161 vdev_reopen(spa->spa_root_vdev); in spa_vdev_split_mirror()
5163 nvlist_free(spa->spa_config_splitting); in spa_vdev_split_mirror()
5164 spa->spa_config_splitting = NULL; in spa_vdev_split_mirror()
5165 (void) spa_vdev_exit(spa, NULL, txg, error); in spa_vdev_split_mirror()
5216 spa_vdev_remove_evacuate(spa_t *spa, vdev_t *vd) in spa_vdev_remove_evacuate() argument
5222 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == 0); in spa_vdev_remove_evacuate()
5233 error = spa_offline_log(spa); in spa_vdev_remove_evacuate()
5246 txg = spa_vdev_config_enter(spa); in spa_vdev_remove_evacuate()
5250 spa_vdev_config_exit(spa, NULL, txg, 0, FTAG); in spa_vdev_remove_evacuate()
5259 spa_vdev_remove_from_namespace(spa_t *spa, vdev_t *vd) in spa_vdev_remove_from_namespace() argument
5261 vdev_t *rvd = spa->spa_root_vdev; in spa_vdev_remove_from_namespace()
5266 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL); in spa_vdev_remove_from_namespace()
5287 vd = vdev_alloc_common(spa, id, 0, &vdev_hole_ops); in spa_vdev_remove_from_namespace()
5311 spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare) in spa_vdev_remove() argument
5321 ASSERT(spa_writeable(spa)); in spa_vdev_remove()
5324 txg = spa_vdev_enter(spa); in spa_vdev_remove()
5326 vd = spa_lookup_by_guid(spa, guid, B_FALSE); in spa_vdev_remove()
5328 if (spa->spa_spares.sav_vdevs != NULL && in spa_vdev_remove()
5329 nvlist_lookup_nvlist_array(spa->spa_spares.sav_config, in spa_vdev_remove()
5337 spa_vdev_remove_aux(spa->spa_spares.sav_config, in spa_vdev_remove()
5339 spa_load_spares(spa); in spa_vdev_remove()
5340 spa->spa_spares.sav_sync = B_TRUE; in spa_vdev_remove()
5344 } else if (spa->spa_l2cache.sav_vdevs != NULL && in spa_vdev_remove()
5345 nvlist_lookup_nvlist_array(spa->spa_l2cache.sav_config, in spa_vdev_remove()
5351 spa_vdev_remove_aux(spa->spa_l2cache.sav_config, in spa_vdev_remove()
5353 spa_load_l2cache(spa); in spa_vdev_remove()
5354 spa->spa_l2cache.sav_sync = B_TRUE; in spa_vdev_remove()
5370 spa_vdev_config_exit(spa, NULL, in spa_vdev_remove()
5376 error = spa_vdev_remove_evacuate(spa, vd); in spa_vdev_remove()
5378 txg = spa_vdev_config_enter(spa); in spa_vdev_remove()
5385 return (spa_vdev_exit(spa, NULL, txg, error)); in spa_vdev_remove()
5391 spa_vdev_remove_from_namespace(spa, vd); in spa_vdev_remove()
5406 return (spa_vdev_exit(spa, NULL, txg, error)); in spa_vdev_remove()
5491 spa_vdev_resilver_done(spa_t *spa) in spa_vdev_resilver_done() argument
5496 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_vdev_resilver_done()
5498 while ((vd = spa_vdev_resilver_done_hunt(spa->spa_root_vdev)) != NULL) { in spa_vdev_resilver_done()
5517 spa_config_exit(spa, SCL_ALL, FTAG); in spa_vdev_resilver_done()
5518 if (spa_vdev_detach(spa, guid, pguid, B_TRUE) != 0) in spa_vdev_resilver_done()
5520 if (sguid && spa_vdev_detach(spa, sguid, ppguid, B_TRUE) != 0) in spa_vdev_resilver_done()
5522 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_vdev_resilver_done()
5525 spa_config_exit(spa, SCL_ALL, FTAG); in spa_vdev_resilver_done()
5532 spa_vdev_set_common(spa_t *spa, uint64_t guid, const char *value, in spa_vdev_set_common() argument
5538 ASSERT(spa_writeable(spa)); in spa_vdev_set_common()
5540 spa_vdev_state_enter(spa, SCL_ALL); in spa_vdev_set_common()
5542 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) in spa_vdev_set_common()
5543 return (spa_vdev_state_exit(spa, NULL, ENOENT)); in spa_vdev_set_common()
5546 return (spa_vdev_state_exit(spa, NULL, ENOTSUP)); in spa_vdev_set_common()
5565 return (spa_vdev_state_exit(spa, sync ? vd : NULL, 0)); in spa_vdev_set_common()
5569 spa_vdev_setpath(spa_t *spa, uint64_t guid, const char *newpath) in spa_vdev_setpath() argument
5571 return (spa_vdev_set_common(spa, guid, newpath, B_TRUE)); in spa_vdev_setpath()
5575 spa_vdev_setfru(spa_t *spa, uint64_t guid, const char *newfru) in spa_vdev_setfru() argument
5577 return (spa_vdev_set_common(spa, guid, newfru, B_FALSE)); in spa_vdev_setfru()
5587 spa_scan_stop(spa_t *spa) in spa_scan_stop() argument
5589 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == 0); in spa_scan_stop()
5590 if (dsl_scan_resilvering(spa->spa_dsl_pool)) in spa_scan_stop()
5592 return (dsl_scan_cancel(spa->spa_dsl_pool)); in spa_scan_stop()
5596 spa_scan(spa_t *spa, pool_scan_func_t func) in spa_scan() argument
5598 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == 0); in spa_scan()
5608 !vdev_resilver_needed(spa->spa_root_vdev, NULL, NULL)) { in spa_scan()
5609 spa_async_request(spa, SPA_ASYNC_RESILVER_DONE); in spa_scan()
5613 return (dsl_scan(spa->spa_dsl_pool, func)); in spa_scan()
5623 spa_async_remove(spa_t *spa, vdev_t *vd) in spa_async_remove() argument
5644 spa_async_remove(spa, vd->vdev_child[c]); in spa_async_remove()
5648 spa_async_probe(spa_t *spa, vdev_t *vd) in spa_async_probe() argument
5656 spa_async_probe(spa, vd->vdev_child[c]); in spa_async_probe()
5660 spa_async_autoexpand(spa_t *spa, vdev_t *vd) in spa_async_autoexpand() argument
5666 if (!spa->spa_autoexpand) in spa_async_autoexpand()
5671 spa_async_autoexpand(spa, cvd); in spa_async_autoexpand()
5691 spa_async_thread(spa_t *spa) in spa_async_thread() argument
5695 ASSERT(spa->spa_sync_on); in spa_async_thread()
5697 mutex_enter(&spa->spa_async_lock); in spa_async_thread()
5698 tasks = spa->spa_async_tasks; in spa_async_thread()
5699 spa->spa_async_tasks = 0; in spa_async_thread()
5700 mutex_exit(&spa->spa_async_lock); in spa_async_thread()
5709 old_space = metaslab_class_get_space(spa_normal_class(spa)); in spa_async_thread()
5710 spa_config_update(spa, SPA_CONFIG_UPDATE_POOL); in spa_async_thread()
5711 new_space = metaslab_class_get_space(spa_normal_class(spa)); in spa_async_thread()
5719 spa_history_log_internal(spa, "vdev online", NULL, in spa_async_thread()
5721 spa_name(spa), new_space, new_space - old_space); in spa_async_thread()
5729 spa_vdev_state_enter(spa, SCL_NONE); in spa_async_thread()
5730 spa_async_remove(spa, spa->spa_root_vdev); in spa_async_thread()
5731 for (int i = 0; i < spa->spa_l2cache.sav_count; i++) in spa_async_thread()
5732 spa_async_remove(spa, spa->spa_l2cache.sav_vdevs[i]); in spa_async_thread()
5733 for (int i = 0; i < spa->spa_spares.sav_count; i++) in spa_async_thread()
5734 spa_async_remove(spa, spa->spa_spares.sav_vdevs[i]); in spa_async_thread()
5735 (void) spa_vdev_state_exit(spa, NULL, 0); in spa_async_thread()
5738 if ((tasks & SPA_ASYNC_AUTOEXPAND) && !spa_suspended(spa)) { in spa_async_thread()
5739 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER); in spa_async_thread()
5740 spa_async_autoexpand(spa, spa->spa_root_vdev); in spa_async_thread()
5741 spa_config_exit(spa, SCL_CONFIG, FTAG); in spa_async_thread()
5748 spa_vdev_state_enter(spa, SCL_NONE); in spa_async_thread()
5749 spa_async_probe(spa, spa->spa_root_vdev); in spa_async_thread()
5750 (void) spa_vdev_state_exit(spa, NULL, 0); in spa_async_thread()
5757 spa_vdev_resilver_done(spa); in spa_async_thread()
5763 dsl_resilver_restart(spa->spa_dsl_pool, 0); in spa_async_thread()
5769 l2arc_spa_rebuild_start(spa); in spa_async_thread()
5774 mutex_enter(&spa->spa_async_lock); in spa_async_thread()
5775 spa->spa_async_thread = NULL; in spa_async_thread()
5776 cv_broadcast(&spa->spa_async_cv); in spa_async_thread()
5777 mutex_exit(&spa->spa_async_lock); in spa_async_thread()
5782 spa_async_suspend(spa_t *spa) in spa_async_suspend() argument
5784 mutex_enter(&spa->spa_async_lock); in spa_async_suspend()
5785 spa->spa_async_suspended++; in spa_async_suspend()
5786 while (spa->spa_async_thread != NULL) in spa_async_suspend()
5787 cv_wait(&spa->spa_async_cv, &spa->spa_async_lock); in spa_async_suspend()
5788 mutex_exit(&spa->spa_async_lock); in spa_async_suspend()
5792 spa_async_resume(spa_t *spa) in spa_async_resume() argument
5794 mutex_enter(&spa->spa_async_lock); in spa_async_resume()
5795 ASSERT(spa->spa_async_suspended != 0); in spa_async_resume()
5796 spa->spa_async_suspended--; in spa_async_resume()
5797 mutex_exit(&spa->spa_async_lock); in spa_async_resume()
5801 spa_async_tasks_pending(spa_t *spa) in spa_async_tasks_pending() argument
5807 non_config_tasks = spa->spa_async_tasks & ~SPA_ASYNC_CONFIG_UPDATE; in spa_async_tasks_pending()
5808 config_task = spa->spa_async_tasks & SPA_ASYNC_CONFIG_UPDATE; in spa_async_tasks_pending()
5809 if (spa->spa_ccw_fail_time == 0) { in spa_async_tasks_pending()
5813 (gethrtime() - spa->spa_ccw_fail_time) < in spa_async_tasks_pending()
5821 spa_async_dispatch(spa_t *spa) in spa_async_dispatch() argument
5823 mutex_enter(&spa->spa_async_lock); in spa_async_dispatch()
5824 if (spa_async_tasks_pending(spa) && in spa_async_dispatch()
5825 !spa->spa_async_suspended && in spa_async_dispatch()
5826 spa->spa_async_thread == NULL && in spa_async_dispatch()
5828 spa->spa_async_thread = thread_create(NULL, 0, in spa_async_dispatch()
5829 spa_async_thread, spa, 0, &p0, TS_RUN, maxclsyspri); in spa_async_dispatch()
5830 mutex_exit(&spa->spa_async_lock); in spa_async_dispatch()
5834 spa_async_request(spa_t *spa, int task) in spa_async_request() argument
5836 zfs_dbgmsg("spa=%s async request task=%u", spa->spa_name, task); in spa_async_request()
5837 mutex_enter(&spa->spa_async_lock); in spa_async_request()
5838 spa->spa_async_tasks |= task; in spa_async_request()
5839 mutex_exit(&spa->spa_async_lock); in spa_async_request()
5871 spa_sync_frees(spa_t *spa, bplist_t *bpl, dmu_tx_t *tx) in spa_sync_frees() argument
5873 zio_t *zio = zio_root(spa, NULL, NULL, 0); in spa_sync_frees()
5883 spa_sync_deferred_frees(spa_t *spa, dmu_tx_t *tx) in spa_sync_deferred_frees() argument
5885 zio_t *zio = zio_root(spa, NULL, NULL, 0); in spa_sync_deferred_frees()
5886 VERIFY3U(bpobj_iterate(&spa->spa_deferred_bpobj, in spa_sync_deferred_frees()
5893 spa_sync_nvlist(spa_t *spa, uint64_t obj, nvlist_t *nv, dmu_tx_t *tx) in spa_sync_nvlist() argument
5914 dmu_write(spa->spa_meta_objset, obj, 0, bufsize, packed, tx); in spa_sync_nvlist()
5918 VERIFY(0 == dmu_bonus_hold(spa->spa_meta_objset, obj, FTAG, &db)); in spa_sync_nvlist()
5925 spa_sync_aux_dev(spa_t *spa, spa_aux_vdev_t *sav, dmu_tx_t *tx, in spa_sync_aux_dev() argument
5941 sav->sav_object = dmu_object_alloc(spa->spa_meta_objset, in spa_sync_aux_dev()
5944 VERIFY(zap_update(spa->spa_meta_objset, in spa_sync_aux_dev()
5955 list[i] = vdev_config_generate(spa, sav->sav_vdevs[i], in spa_sync_aux_dev()
5964 spa_sync_nvlist(spa, sav->sav_object, nvroot, tx); in spa_sync_aux_dev()
5971 spa_sync_config_object(spa_t *spa, dmu_tx_t *tx) in spa_sync_config_object() argument
5975 if (list_is_empty(&spa->spa_config_dirty_list)) in spa_sync_config_object()
5978 spa_config_enter(spa, SCL_STATE, FTAG, RW_READER); in spa_sync_config_object()
5980 config = spa_config_generate(spa, spa->spa_root_vdev, in spa_sync_config_object()
5987 if (spa->spa_ubsync.ub_version < spa->spa_uberblock.ub_version) in spa_sync_config_object()
5989 spa->spa_uberblock.ub_version); in spa_sync_config_object()
5991 spa_config_exit(spa, SCL_STATE, FTAG); in spa_sync_config_object()
5993 nvlist_free(spa->spa_config_syncing); in spa_sync_config_object()
5994 spa->spa_config_syncing = config; in spa_sync_config_object()
5996 spa_sync_nvlist(spa, spa->spa_config_object, config, tx); in spa_sync_config_object()
6004 spa_t *spa = dmu_tx_pool(tx)->dp_spa; in spa_sync_version() local
6012 ASSERT(version >= spa_version(spa)); in spa_sync_version()
6014 spa->spa_uberblock.ub_version = version; in spa_sync_version()
6015 vdev_config_dirty(spa->spa_root_vdev); in spa_sync_version()
6016 spa_history_log_internal(spa, "set", tx, "version=%lld", version); in spa_sync_version()
6026 spa_t *spa = dmu_tx_pool(tx)->dp_spa; in spa_sync_props() local
6027 objset_t *mos = spa->spa_meta_objset; in spa_sync_props()
6030 mutex_enter(&spa->spa_props_lock); in spa_sync_props()
6050 spa_feature_enable(spa, fid, tx); in spa_sync_props()
6051 spa_history_log_internal(spa, "set", tx, in spa_sync_props()
6061 ASSERT3U(spa_version(spa), >=, intval); in spa_sync_props()
6069 ASSERT(spa->spa_root != NULL); in spa_sync_props()
6081 if (spa->spa_comment != NULL) in spa_sync_props()
6082 spa_strfree(spa->spa_comment); in spa_sync_props()
6083 spa->spa_comment = spa_strdup(strval); in spa_sync_props()
6091 vdev_config_dirty(spa->spa_root_vdev); in spa_sync_props()
6092 spa_history_log_internal(spa, "set", tx, in spa_sync_props()
6099 if (spa->spa_pool_props_object == 0) { in spa_sync_props()
6100 spa->spa_pool_props_object = in spa_sync_props()
6114 spa->spa_pool_props_object, propname, in spa_sync_props()
6116 spa_history_log_internal(spa, "set", tx, in spa_sync_props()
6127 spa->spa_pool_props_object, propname, in spa_sync_props()
6129 spa_history_log_internal(spa, "set", tx, in spa_sync_props()
6137 spa->spa_delegation = intval; in spa_sync_props()
6140 spa->spa_bootfs = intval; in spa_sync_props()
6143 spa->spa_failmode = intval; in spa_sync_props()
6146 spa->spa_autoexpand = intval; in spa_sync_props()
6148 spa_async_request(spa, in spa_sync_props()
6152 spa->spa_dedup_ditto = intval; in spa_sync_props()
6161 mutex_exit(&spa->spa_props_lock); in spa_sync_props()
6172 spa_sync_upgrades(spa_t *spa, dmu_tx_t *tx) in spa_sync_upgrades() argument
6174 dsl_pool_t *dp = spa->spa_dsl_pool; in spa_sync_upgrades()
6176 ASSERT(spa->spa_sync_pass == 1); in spa_sync_upgrades()
6180 if (spa->spa_ubsync.ub_version < SPA_VERSION_ORIGIN && in spa_sync_upgrades()
6181 spa->spa_uberblock.ub_version >= SPA_VERSION_ORIGIN) { in spa_sync_upgrades()
6185 spa->spa_minref += 3; in spa_sync_upgrades()
6188 if (spa->spa_ubsync.ub_version < SPA_VERSION_NEXT_CLONES && in spa_sync_upgrades()
6189 spa->spa_uberblock.ub_version >= SPA_VERSION_NEXT_CLONES) { in spa_sync_upgrades()
6193 if (spa->spa_ubsync.ub_version < SPA_VERSION_DIR_CLONES && in spa_sync_upgrades()
6194 spa->spa_uberblock.ub_version >= SPA_VERSION_DIR_CLONES) { in spa_sync_upgrades()
6198 spa->spa_minref += 3; in spa_sync_upgrades()
6201 if (spa->spa_ubsync.ub_version < SPA_VERSION_FEATURES && in spa_sync_upgrades()
6202 spa->spa_uberblock.ub_version >= SPA_VERSION_FEATURES) { in spa_sync_upgrades()
6203 spa_feature_create_zap_objects(spa, tx); in spa_sync_upgrades()
6212 if (spa->spa_uberblock.ub_version >= SPA_VERSION_FEATURES) { in spa_sync_upgrades()
6213 boolean_t lz4_en = spa_feature_is_enabled(spa, in spa_sync_upgrades()
6215 boolean_t lz4_ac = spa_feature_is_active(spa, in spa_sync_upgrades()
6219 spa_feature_incr(spa, SPA_FEATURE_LZ4_COMPRESS, tx); in spa_sync_upgrades()
6229 spa_sync(spa_t *spa, uint64_t txg) in spa_sync() argument
6231 dsl_pool_t *dp = spa->spa_dsl_pool; in spa_sync()
6232 objset_t *mos = spa->spa_meta_objset; in spa_sync()
6233 bplist_t *free_bpl = &spa->spa_free_bplist[txg & TXG_MASK]; in spa_sync()
6234 vdev_t *rvd = spa->spa_root_vdev; in spa_sync()
6239 VERIFY(spa_writeable(spa)); in spa_sync()
6244 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER); in spa_sync()
6246 spa->spa_syncing_txg = txg; in spa_sync()
6247 spa->spa_sync_pass = 0; in spa_sync()
6253 spa_config_enter(spa, SCL_STATE, FTAG, RW_READER); in spa_sync()
6254 while (list_head(&spa->spa_state_dirty_list) != NULL) { in spa_sync()
6262 spa_config_exit(spa, SCL_CONFIG | SCL_STATE, FTAG); in spa_sync()
6263 spa_config_enter(spa, SCL_CONFIG | SCL_STATE, FTAG, RW_WRITER); in spa_sync()
6264 while ((vd = list_head(&spa->spa_state_dirty_list)) != NULL) { in spa_sync()
6268 spa_config_exit(spa, SCL_CONFIG | SCL_STATE, FTAG); in spa_sync()
6269 spa_config_enter(spa, SCL_CONFIG | SCL_STATE, FTAG, RW_READER); in spa_sync()
6271 spa_config_exit(spa, SCL_STATE, FTAG); in spa_sync()
6275 spa->spa_sync_starttime = gethrtime(); in spa_sync()
6276 VERIFY(cyclic_reprogram(spa->spa_deadman_cycid, in spa_sync()
6277 spa->spa_sync_starttime + spa->spa_deadman_synctime)); in spa_sync()
6283 if (spa->spa_ubsync.ub_version < SPA_VERSION_RAIDZ_DEFLATE && in spa_sync()
6284 spa->spa_uberblock.ub_version >= SPA_VERSION_RAIDZ_DEFLATE) { in spa_sync()
6293 spa->spa_deflate = TRUE; in spa_sync()
6294 VERIFY(0 == zap_add(spa->spa_meta_objset, in spa_sync()
6296 sizeof (uint64_t), 1, &spa->spa_deflate, tx)); in spa_sync()
6304 int pass = ++spa->spa_sync_pass; in spa_sync()
6306 spa_sync_config_object(spa, tx); in spa_sync()
6307 spa_sync_aux_dev(spa, &spa->spa_spares, tx, in spa_sync()
6309 spa_sync_aux_dev(spa, &spa->spa_l2cache, tx, in spa_sync()
6311 spa_errlog_sync(spa, txg); in spa_sync()
6315 spa_sync_frees(spa, free_bpl, tx); in spa_sync()
6323 &spa->spa_deferred_bpobj, tx); in spa_sync()
6326 ddt_sync(spa, txg); in spa_sync()
6329 while (vd = txg_list_remove(&spa->spa_vdev_txg_list, txg)) in spa_sync()
6333 spa_sync_upgrades(spa, tx); in spa_sync()
6335 spa->spa_uberblock.ub_rootbp.blk_birth); in spa_sync()
6347 if (spa->spa_uberblock.ub_rootbp.blk_birth < txg && in spa_sync()
6361 spa_sync_deferred_frees(spa, tx); in spa_sync()
6380 spa_config_enter(spa, SCL_STATE, FTAG, RW_READER); in spa_sync()
6382 if (list_is_empty(&spa->spa_config_dirty_list)) { in spa_sync()
6409 spa->spa_last_synced_guid = rvd->vdev_guid; in spa_sync()
6411 spa_config_exit(spa, SCL_STATE, FTAG); in spa_sync()
6415 zio_suspend(spa, NULL); in spa_sync()
6416 zio_resume_wait(spa); in spa_sync()
6420 VERIFY(cyclic_reprogram(spa->spa_deadman_cycid, CY_INFINITY)); in spa_sync()
6425 while ((vd = list_head(&spa->spa_config_dirty_list)) != NULL) in spa_sync()
6432 if (spa->spa_config_syncing != NULL) { in spa_sync()
6433 spa_config_set(spa, spa->spa_config_syncing); in spa_sync()
6434 spa->spa_config_txg = txg; in spa_sync()
6435 spa->spa_config_syncing = NULL; in spa_sync()
6438 spa->spa_ubsync = spa->spa_uberblock; in spa_sync()
6445 while (vd = txg_list_remove(&spa->spa_vdev_txg_list, TXG_CLEAN(txg))) in spa_sync()
6448 spa_update_dspace(spa); in spa_sync()
6456 ASSERT(txg_list_empty(&spa->spa_vdev_txg_list, txg)); in spa_sync()
6458 spa->spa_sync_pass = 0; in spa_sync()
6460 spa_config_exit(spa, SCL_CONFIG, FTAG); in spa_sync()
6462 spa_handle_ignored_writes(spa); in spa_sync()
6467 spa_async_dispatch(spa); in spa_sync()
6478 spa_t *spa = NULL; in spa_sync_allpools() local
6480 while ((spa = spa_next(spa)) != NULL) { in spa_sync_allpools()
6481 if (spa_state(spa) != POOL_STATE_ACTIVE || in spa_sync_allpools()
6482 !spa_writeable(spa) || spa_suspended(spa)) in spa_sync_allpools()
6484 spa_open_ref(spa, FTAG); in spa_sync_allpools()
6486 txg_wait_synced(spa_get_dsl(spa), 0); in spa_sync_allpools()
6488 spa_close(spa, FTAG); in spa_sync_allpools()
6505 spa_t *spa; in spa_evict_all() local
6512 while ((spa = spa_next(NULL)) != NULL) { in spa_evict_all()
6518 spa_open_ref(spa, FTAG); in spa_evict_all()
6520 spa_async_suspend(spa); in spa_evict_all()
6522 spa_close(spa, FTAG); in spa_evict_all()
6524 if (spa->spa_state != POOL_STATE_UNINITIALIZED) { in spa_evict_all()
6525 spa_unload(spa); in spa_evict_all()
6526 spa_deactivate(spa); in spa_evict_all()
6528 spa_remove(spa); in spa_evict_all()
6534 spa_lookup_by_guid(spa_t *spa, uint64_t guid, boolean_t aux) in spa_lookup_by_guid() argument
6539 if ((vd = vdev_lookup_by_guid(spa->spa_root_vdev, guid)) != NULL) in spa_lookup_by_guid()
6543 for (i = 0; i < spa->spa_l2cache.sav_count; i++) { in spa_lookup_by_guid()
6544 vd = spa->spa_l2cache.sav_vdevs[i]; in spa_lookup_by_guid()
6549 for (i = 0; i < spa->spa_spares.sav_count; i++) { in spa_lookup_by_guid()
6550 vd = spa->spa_spares.sav_vdevs[i]; in spa_lookup_by_guid()
6560 spa_upgrade(spa_t *spa, uint64_t version) in spa_upgrade() argument
6562 ASSERT(spa_writeable(spa)); in spa_upgrade()
6564 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); in spa_upgrade()
6571 ASSERT(SPA_VERSION_IS_SUPPORTED(spa->spa_uberblock.ub_version)); in spa_upgrade()
6572 ASSERT3U(version, >=, spa->spa_uberblock.ub_version); in spa_upgrade()
6574 spa->spa_uberblock.ub_version = version; in spa_upgrade()
6575 vdev_config_dirty(spa->spa_root_vdev); in spa_upgrade()
6577 spa_config_exit(spa, SCL_ALL, FTAG); in spa_upgrade()
6579 txg_wait_synced(spa_get_dsl(spa), 0); in spa_upgrade()
6583 spa_has_spare(spa_t *spa, uint64_t guid) in spa_has_spare() argument
6587 spa_aux_vdev_t *sav = &spa->spa_spares; in spa_has_spare()
6607 spa_has_active_shared_spare(spa_t *spa) in spa_has_active_shared_spare() argument
6611 spa_aux_vdev_t *sav = &spa->spa_spares; in spa_has_active_shared_spare()
6615 &refcnt) && pool != 0ULL && pool == spa_guid(spa) && in spa_has_active_shared_spare()
6631 spa_event_notify(spa_t *spa, vdev_t *vd, const char *name) in spa_event_notify() argument
6643 value.value.sv_string = spa_name(spa); in spa_event_notify()
6648 value.value.sv_uint64 = spa_guid(spa); in spa_event_notify()