Lines Matching defs:spa

64 #include <sys/spa.h>
161 static int get_head_ds(spa_t *spa, uint64_t dsobj, uint64_t *head_ds)
164 int error = dsl_dataset_hold_obj_flags(spa->spa_dsl_pool,
179 * spa's list of pending errors. The changes are actually synced out to disk
183 spa_log_error(spa_t *spa, const zbookmark_phys_t *zb, const uint64_t birth)
194 if (spa_load_state(spa) == SPA_LOAD_TRYIMPORT)
197 mutex_enter(&spa->spa_errlist_lock);
203 if (spa->spa_scrub_active || spa->spa_scrub_finished)
204 tree = &spa->spa_errlist_scrub;
206 tree = &spa->spa_errlist_last;
210 mutex_exit(&spa->spa_errlist_lock);
222 if (spa_feature_is_enabled(spa, SPA_FEATURE_HEAD_ERRLOG)) {
230 mutex_exit(&spa->spa_errlist_lock);
266 find_top_affected_fs(spa_t *spa, uint64_t head_ds, zbookmark_err_phys_t *zep,
270 int error = dsl_dataset_oldest_snapshot(spa, head_ds, zep->zb_birth,
276 error = dsl_dataset_hold_obj_flags(spa->spa_dsl_pool, oldest_dsobj,
314 check_filesystem(spa_t *spa, uint64_t head_ds, zbookmark_err_phys_t *zep,
318 dsl_pool_t *dp = spa->spa_dsl_pool;
326 uint64_t txg_to_consider = spa->spa_syncing_txg;
332 * equal to the spa's syncing txg: if check_filesystem() errors out
355 error = zap_count(spa->spa_meta_objset,
434 for (zap_cursor_init(zc, spa->spa_meta_objset, zap_clone);
475 process_error_block(spa_t *spa, uint64_t head_ds, zbookmark_err_phys_t *zep,
497 int error = find_top_affected_fs(spa, head_ds, zep, &top_affected_fs);
505 error = check_filesystem(spa, top_affected_fs, zep,
509 error = check_filesystem(spa, ct->clone_ds, zep,
532 spa_remove_error(spa, &zb, zep->zb_birth);
541 spa_get_last_errlog_size(spa_t *spa)
544 mutex_enter(&spa->spa_errlog_lock);
546 if (spa->spa_errlog_last != 0 &&
547 zap_count(spa->spa_meta_objset, spa->spa_errlog_last,
550 mutex_exit(&spa->spa_errlog_lock);
559 spa_add_healed_error(spa_t *spa, uint64_t obj, zbookmark_phys_t *healed_zb,
570 if (!spa_feature_is_enabled(spa, SPA_FEATURE_HEAD_ERRLOG)) {
573 if (zap_contains(spa->spa_meta_objset, healed_zb->zb_objset,
575 if (!MUTEX_HELD(&spa->spa_errlog_lock)) {
576 mutex_enter(&spa->spa_errlog_lock);
584 avl_tree_t *tree = &spa->spa_errlist_healed;
589 if (!MUTEX_HELD(&spa->spa_errlist_lock)) {
590 mutex_enter(&spa->spa_errlist_lock);
595 mutex_exit(&spa->spa_errlist_lock);
597 mutex_exit(&spa->spa_errlog_lock);
604 mutex_exit(&spa->spa_errlist_lock);
606 mutex_exit(&spa->spa_errlog_lock);
621 for (zap_cursor_init(&zc, spa->spa_meta_objset, spa->spa_errlog_last);
623 if (zap_contains(spa->spa_meta_objset, za->za_first_integer,
625 if (!MUTEX_HELD(&spa->spa_errlog_lock)) {
626 mutex_enter(&spa->spa_errlog_lock);
630 avl_tree_t *tree = &spa->spa_errlist_healed;
636 if (!MUTEX_HELD(&spa->spa_errlist_lock)) {
637 mutex_enter(&spa->spa_errlist_lock);
643 mutex_exit(&spa->spa_errlist_lock);
645 mutex_exit(&spa->spa_errlog_lock);
654 mutex_exit(&spa->spa_errlist_lock);
656 mutex_exit(&spa->spa_errlog_lock);
667 remove_error_from_list(spa_t *spa, avl_tree_t *t, const zbookmark_phys_t *zb)
672 mutex_enter(&spa->spa_errlist_lock);
678 mutex_exit(&spa->spa_errlist_lock);
686 spa_remove_healed_errors(spa_t *spa, avl_tree_t *s, avl_tree_t *l, dmu_tx_t *tx)
692 ASSERT(MUTEX_HELD(&spa->spa_errlog_lock));
694 while ((se = avl_destroy_nodes(&spa->spa_errlist_healed,
696 remove_error_from_list(spa, s, &se->se_bookmark);
697 remove_error_from_list(spa, l, &se->se_bookmark);
699 if (!spa_feature_is_enabled(spa, SPA_FEATURE_HEAD_ERRLOG)) {
701 (void) zap_remove(spa->spa_meta_objset,
702 spa->spa_errlog_last, name, tx);
703 (void) zap_remove(spa->spa_meta_objset,
704 spa->spa_errlog_scrub, name, tx);
709 for (zap_cursor_init(&zc, spa->spa_meta_objset,
710 spa->spa_errlog_last);
713 zap_remove(spa->spa_meta_objset,
718 for (zap_cursor_init(&zc, spa->spa_meta_objset,
719 spa->spa_errlog_scrub);
722 zap_remove(spa->spa_meta_objset,
737 spa_remove_error(spa_t *spa, zbookmark_phys_t *zb, uint64_t birth)
739 spa_add_healed_error(spa, spa->spa_errlog_last, zb, birth);
740 spa_add_healed_error(spa, spa->spa_errlog_scrub, zb, birth);
744 approx_errlog_size_impl(spa_t *spa, uint64_t spa_err_obj)
752 for (zap_cursor_init(&zc, spa->spa_meta_objset, spa_err_obj);
755 if (zap_count(spa->spa_meta_objset, za->za_first_integer,
770 spa_approx_errlog_size(spa_t *spa)
774 if (!spa_feature_is_enabled(spa, SPA_FEATURE_HEAD_ERRLOG)) {
775 mutex_enter(&spa->spa_errlog_lock);
777 if (spa->spa_errlog_scrub != 0 &&
778 zap_count(spa->spa_meta_objset, spa->spa_errlog_scrub,
782 if (spa->spa_errlog_last != 0 && !spa->spa_scrub_finished &&
783 zap_count(spa->spa_meta_objset, spa->spa_errlog_last,
786 mutex_exit(&spa->spa_errlog_lock);
789 mutex_enter(&spa->spa_errlog_lock);
790 total += approx_errlog_size_impl(spa, spa->spa_errlog_last);
791 total += approx_errlog_size_impl(spa, spa->spa_errlog_scrub);
792 mutex_exit(&spa->spa_errlog_lock);
794 mutex_enter(&spa->spa_errlist_lock);
795 total += avl_numnodes(&spa->spa_errlist_last);
796 total += avl_numnodes(&spa->spa_errlist_scrub);
797 mutex_exit(&spa->spa_errlist_lock);
804 * and spa_update_errlog() will set the spa's on-disk error log to new ZAP
808 sync_upgrade_errlog(spa_t *spa, uint64_t spa_err_obj, uint64_t *newobj,
816 *newobj = zap_create(spa->spa_meta_objset, DMU_OT_ERROR_LOG,
823 if (zap_count(spa->spa_meta_objset, spa_err_obj, &count) != 0) {
824 VERIFY0(dmu_object_free(spa->spa_meta_objset, spa_err_obj, tx));
829 for (zap_cursor_init(&zc, spa->spa_meta_objset, spa_err_obj);
849 dsl_pool_t *dp = spa->spa_dsl_pool;
897 error = zap_lookup_int_key(spa->spa_meta_objset, *newobj,
901 err_obj = zap_create(spa->spa_meta_objset,
904 (void) zap_update_int_key(spa->spa_meta_objset,
912 (void) zap_update(spa->spa_meta_objset, err_obj,
918 VERIFY0(dmu_object_free(spa->spa_meta_objset, spa_err_obj, tx));
922 spa_upgrade_errlog(spa_t *spa, dmu_tx_t *tx)
926 mutex_enter(&spa->spa_errlog_lock);
927 if (spa->spa_errlog_last != 0) {
928 sync_upgrade_errlog(spa, spa->spa_errlog_last, &newobj, tx);
929 spa->spa_errlog_last = newobj;
931 (void) zap_update(spa->spa_meta_objset,
933 sizeof (uint64_t), 1, &spa->spa_errlog_last, tx);
936 if (spa->spa_errlog_scrub != 0) {
937 sync_upgrade_errlog(spa, spa->spa_errlog_scrub, &newobj, tx);
938 spa->spa_errlog_scrub = newobj;
940 (void) zap_update(spa->spa_meta_objset,
942 sizeof (uint64_t), 1, &spa->spa_errlog_scrub, tx);
945 mutex_exit(&spa->spa_errlog_lock);
953 process_error_log(spa_t *spa, uint64_t obj, void *uaddr, uint64_t *count)
964 if (!spa_feature_is_enabled(spa, SPA_FEATURE_HEAD_ERRLOG)) {
965 for (zap_cursor_init(zc, spa->spa_meta_objset, obj);
992 for (zap_cursor_init(zc, spa->spa_meta_objset, obj);
1005 for (zap_cursor_init(head_ds_cursor, spa->spa_meta_objset,
1011 int error = process_error_block(spa, head_ds,
1037 process_error_list(spa_t *spa, avl_tree_t *list, void *uaddr, uint64_t *count)
1041 if (!spa_feature_is_enabled(spa, SPA_FEATURE_HEAD_ERRLOG)) {
1055 int error = get_head_ds(spa, se->se_bookmark.zb_objset,
1066 error = process_error_block(spa, head_ds,
1087 spa_get_errlog(spa_t *spa, void *uaddr, uint64_t *count)
1098 dsl_pool_config_enter(spa->spa_dsl_pool, FTAG);
1099 mutex_enter(&spa->spa_errlog_lock);
1101 ret = process_error_log(spa, spa->spa_errlog_scrub, uaddr, count);
1103 if (!ret && !spa->spa_scrub_finished)
1104 ret = process_error_log(spa, spa->spa_errlog_last, uaddr,
1107 mutex_enter(&spa->spa_errlist_lock);
1109 ret = process_error_list(spa, &spa->spa_errlist_scrub, uaddr,
1112 ret = process_error_list(spa, &spa->spa_errlist_last, uaddr,
1114 mutex_exit(&spa->spa_errlist_lock);
1116 mutex_exit(&spa->spa_errlog_lock);
1117 dsl_pool_config_exit(spa->spa_dsl_pool, FTAG);
1119 (void) spa, (void) uaddr, (void) count;
1131 spa_errlog_rotate(spa_t *spa)
1133 mutex_enter(&spa->spa_errlist_lock);
1134 spa->spa_scrub_finished = B_TRUE;
1135 mutex_exit(&spa->spa_errlist_lock);
1143 spa_errlog_drain(spa_t *spa)
1148 mutex_enter(&spa->spa_errlist_lock);
1151 while ((se = avl_destroy_nodes(&spa->spa_errlist_last,
1155 while ((se = avl_destroy_nodes(&spa->spa_errlist_scrub,
1159 mutex_exit(&spa->spa_errlist_lock);
1166 sync_error_list(spa_t *spa, avl_tree_t *t, uint64_t *obj, dmu_tx_t *tx)
1177 *obj = zap_create(spa->spa_meta_objset, DMU_OT_ERROR_LOG,
1181 if (!spa_feature_is_enabled(spa, SPA_FEATURE_HEAD_ERRLOG)) {
1186 (void) zap_update(spa->spa_meta_objset, *obj, buf, 1,
1198 int error = get_head_ds(spa, se->se_bookmark.zb_objset,
1210 error = zap_lookup_int_key(spa->spa_meta_objset,
1214 err_obj = zap_create(spa->spa_meta_objset,
1217 (void) zap_update_int_key(spa->spa_meta_objset,
1223 (void) zap_update(spa->spa_meta_objset,
1234 delete_errlog(spa_t *spa, uint64_t spa_err_obj, dmu_tx_t *tx)
1236 if (spa_feature_is_enabled(spa, SPA_FEATURE_HEAD_ERRLOG)) {
1239 for (zap_cursor_init(&zc, spa->spa_meta_objset, spa_err_obj);
1242 VERIFY0(dmu_object_free(spa->spa_meta_objset,
1248 VERIFY0(dmu_object_free(spa->spa_meta_objset, spa_err_obj, tx));
1262 spa_errlog_sync(spa_t *spa, uint64_t txg)
1268 mutex_enter(&spa->spa_errlist_lock);
1273 if (avl_numnodes(&spa->spa_errlist_scrub) == 0 &&
1274 avl_numnodes(&spa->spa_errlist_last) == 0 &&
1275 avl_numnodes(&spa->spa_errlist_healed) == 0 &&
1276 !spa->spa_scrub_finished) {
1277 mutex_exit(&spa->spa_errlist_lock);
1281 spa_get_errlists(spa, &last, &scrub);
1282 scrub_finished = spa->spa_scrub_finished;
1283 spa->spa_scrub_finished = B_FALSE;
1285 mutex_exit(&spa->spa_errlist_lock);
1292 dsl_pool_config_enter(spa->spa_dsl_pool, FTAG);
1293 mutex_enter(&spa->spa_errlog_lock);
1295 tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
1300 spa_remove_healed_errors(spa, &last, &scrub, tx);
1305 sync_error_list(spa, &last, &spa->spa_errlog_last, tx);
1311 if (spa->spa_errlog_last != 0)
1312 delete_errlog(spa, spa->spa_errlog_last, tx);
1313 spa->spa_errlog_last = spa->spa_errlog_scrub;
1314 spa->spa_errlog_scrub = 0;
1316 sync_error_list(spa, &scrub, &spa->spa_errlog_last, tx);
1322 sync_error_list(spa, &scrub, &spa->spa_errlog_scrub, tx);
1327 (void) zap_update(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
1329 &spa->spa_errlog_last, tx);
1330 (void) zap_update(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
1332 &spa->spa_errlog_scrub, tx);
1336 mutex_exit(&spa->spa_errlog_lock);
1337 dsl_pool_config_exit(spa->spa_dsl_pool, FTAG);
1341 delete_dataset_errlog(spa_t *spa, uint64_t spa_err_obj, uint64_t ds,
1349 for (zap_cursor_init(&zc, spa->spa_meta_objset, spa_err_obj);
1354 (void) zap_remove(spa->spa_meta_objset, spa_err_obj,
1356 VERIFY0(dmu_object_free(spa->spa_meta_objset,
1366 spa_delete_dataset_errlog(spa_t *spa, uint64_t ds, dmu_tx_t *tx)
1368 mutex_enter(&spa->spa_errlog_lock);
1369 delete_dataset_errlog(spa, spa->spa_errlog_scrub, ds, tx);
1370 delete_dataset_errlog(spa, spa->spa_errlog_last, ds, tx);
1371 mutex_exit(&spa->spa_errlog_lock);
1375 find_txg_ancestor_snapshot(spa_t *spa, uint64_t new_head, uint64_t old_head,
1379 dsl_pool_t *dp = spa->spa_dsl_pool;
1409 swap_errlog(spa_t *spa, uint64_t spa_err_obj, uint64_t new_head, uint64_t
1416 int error = zap_lookup_int_key(spa->spa_meta_objset, spa_err_obj,
1424 error = find_txg_ancestor_snapshot(spa, new_head, old_head, &txg);
1433 error = zap_lookup_int_key(spa->spa_meta_objset, spa_err_obj, new_head,
1437 new_head_errlog = zap_create(spa->spa_meta_objset,
1440 (void) zap_update_int_key(spa->spa_meta_objset, spa_err_obj,
1447 for (zap_cursor_init(&zc, spa->spa_meta_objset, old_head_errlog);
1453 (void) zap_update(spa->spa_meta_objset, new_head_errlog,
1456 (void) zap_remove(spa->spa_meta_objset, old_head_errlog,
1465 spa_swap_errlog(spa_t *spa, uint64_t new_head_ds, uint64_t old_head_ds,
1468 mutex_enter(&spa->spa_errlog_lock);
1469 swap_errlog(spa, spa->spa_errlog_scrub, new_head_ds, old_head_ds, tx);
1470 swap_errlog(spa, spa->spa_errlog_last, new_head_ds, old_head_ds, tx);
1471 mutex_exit(&spa->spa_errlog_lock);