Lines Matching +full:n +full:- +full:mos
1 // SPDX-License-Identifier: CDDL-1.0
56 (void) strlcpy(buf, fullname, hashp - fullname + 1); in dsl_bookmark_hold_ds()
72 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_bookmark_lookup_impl() local
73 uint64_t bmark_zapobj = ds->ds_bookmarks_obj; in dsl_bookmark_lookup_impl()
80 if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET) in dsl_bookmark_lookup_impl()
89 err = zap_lookup_norm(mos, bmark_zapobj, shortname, sizeof (uint64_t), in dsl_bookmark_lookup_impl()
97 * If later_ds is non-NULL, this will return EXDEV if the specified bookmark
118 if (!dsl_dataset_is_before(later_ds, ds, bmp->zbm_creation_txg)) in dsl_bookmark_lookup()
127 * - bmark is a full dataset path of a bookmark (bookmark_namecheck)
128 * - source is a full path of a snapshot or bookmark
131 * Returns 0 if valid, -1 otherwise.
137 return (-1); in dsl_bookmark_create_nvl_validate_pair()
143 return (-1); in dsl_bookmark_create_nvl_validate_pair()
150 * { newbookmark -> source, ... }
152 * - each pair passes dsl_bookmark_create_nvl_validate_pair
153 * - all newbookmarks are in the same pool
154 * - all newbookmarks have unique names
160 * Returns -1 if it doesn't.
176 return (-1); in dsl_bookmark_create_nvl_validate()
178 return (-1); in dsl_bookmark_create_nvl_validate()
184 return (-1); in dsl_bookmark_create_nvl_validate()
186 first_len = cp - bmark; in dsl_bookmark_create_nvl_validate()
189 return (-1); in dsl_bookmark_create_nvl_validate()
195 return (-1); in dsl_bookmark_create_nvl_validate()
198 /* unique newbookmark names; todo: O(n^2) */ in dsl_bookmark_create_nvl_validate()
202 return (-1); in dsl_bookmark_create_nvl_validate()
243 /* error is retval of the following if-cascade */ in dsl_bookmark_create_check_impl()
249 VERIFY(source_snap_ds->ds_is_snapshot); in dsl_bookmark_create_check_impl()
297 ASSERT3P(dbca->dbca_bmarks, !=, NULL); in dsl_bookmark_create_check()
298 /* dbca->dbca_errors is allowed to be NULL */ in dsl_bookmark_create_check()
302 if (!spa_feature_is_enabled(dp->dp_spa, SPA_FEATURE_BOOKMARKS)) in dsl_bookmark_create_check()
305 if (dsl_bookmark_create_nvl_validate(dbca->dbca_bmarks) != 0) in dsl_bookmark_create_check()
308 for (nvpair_t *pair = nvlist_next_nvpair(dbca->dbca_bmarks, NULL); in dsl_bookmark_create_check()
309 pair != NULL; pair = nvlist_next_nvpair(dbca->dbca_bmarks, pair)) { in dsl_bookmark_create_check()
322 if (dbca->dbca_errors != NULL) in dsl_bookmark_create_check()
323 fnvlist_add_int32(dbca->dbca_errors, in dsl_bookmark_create_check()
335 dbn->dbn_name = spa_strdup(shortname); in dsl_bookmark_node_alloc()
336 dbn->dbn_dirty = B_FALSE; in dsl_bookmark_node_alloc()
337 mutex_init(&dbn->dbn_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_bookmark_node_alloc()
348 objset_t *mos = spa_get_dsl(spa)->dp_meta_objset; in dsl_bookmark_set_phys() local
352 zbm->zbm_guid = dsp->ds_guid; in dsl_bookmark_set_phys()
353 zbm->zbm_creation_txg = dsp->ds_creation_txg; in dsl_bookmark_set_phys()
354 zbm->zbm_creation_time = dsp->ds_creation_time; in dsl_bookmark_set_phys()
355 zbm->zbm_redaction_obj = 0; in dsl_bookmark_set_phys()
364 if (snap->ds_dir->dd_crypto_obj != 0 && in dsl_bookmark_set_phys()
366 (void) zap_lookup(mos, snap->ds_object, in dsl_bookmark_set_phys()
368 &zbm->zbm_ivset_guid); in dsl_bookmark_set_phys()
372 zbm->zbm_flags = ZBM_FLAG_SNAPSHOT_EXISTS | ZBM_FLAG_HAS_FBN; in dsl_bookmark_set_phys()
373 zbm->zbm_referenced_bytes_refd = dsp->ds_referenced_bytes; in dsl_bookmark_set_phys()
374 zbm->zbm_compressed_bytes_refd = dsp->ds_compressed_bytes; in dsl_bookmark_set_phys()
375 zbm->zbm_uncompressed_bytes_refd = dsp->ds_uncompressed_bytes; in dsl_bookmark_set_phys()
378 VERIFY0(dsl_dataset_hold_obj(snap->ds_dir->dd_pool, in dsl_bookmark_set_phys()
379 dsp->ds_next_snap_obj, FTAG, &nextds)); in dsl_bookmark_set_phys()
380 dsl_deadlist_space(&nextds->ds_deadlist, in dsl_bookmark_set_phys()
381 &zbm->zbm_referenced_freed_before_next_snap, in dsl_bookmark_set_phys()
382 &zbm->zbm_compressed_freed_before_next_snap, in dsl_bookmark_set_phys()
383 &zbm->zbm_uncompressed_freed_before_next_snap); in dsl_bookmark_set_phys()
397 objset_t *mos = dp->dp_meta_objset; in dsl_bookmark_node_add() local
399 if (hds->ds_bookmarks_obj == 0) { in dsl_bookmark_node_add()
400 hds->ds_bookmarks_obj = zap_create_norm(mos, in dsl_bookmark_node_add()
403 spa_feature_incr(dp->dp_spa, SPA_FEATURE_BOOKMARKS, tx); in dsl_bookmark_node_add()
406 VERIFY0(zap_add(mos, hds->ds_object, in dsl_bookmark_node_add()
408 sizeof (hds->ds_bookmarks_obj), 1, in dsl_bookmark_node_add()
409 &hds->ds_bookmarks_obj, tx)); in dsl_bookmark_node_add()
412 avl_add(&hds->ds_bookmarks, dbn); in dsl_bookmark_node_add()
420 if (spa_feature_is_enabled(dp->dp_spa, SPA_FEATURE_BOOKMARK_V2) && in dsl_bookmark_node_add()
421 (dbn->dbn_phys.zbm_ivset_guid != 0 || dbn->dbn_phys.zbm_flags & in dsl_bookmark_node_add()
422 ZBM_FLAG_HAS_FBN || dbn->dbn_phys.zbm_redaction_obj != 0)) { in dsl_bookmark_node_add()
424 spa_feature_incr(dp->dp_spa, SPA_FEATURE_BOOKMARK_V2, tx); in dsl_bookmark_node_add()
428 ASSERT0(memcmp(((char *)&dbn->dbn_phys) + bookmark_phys_size, in dsl_bookmark_node_add()
429 &zero_phys, sizeof (zfs_bookmark_phys_t) - bookmark_phys_size)); in dsl_bookmark_node_add()
431 VERIFY0(zap_add(mos, hds->ds_bookmarks_obj, dbn->dbn_name, in dsl_bookmark_node_add()
433 &dbn->dbn_phys, tx)); in dsl_bookmark_node_add()
437 * If redaction_list is non-null, we create a redacted bookmark and redaction
446 objset_t *mos = dp->dp_meta_objset; in dsl_bookmark_create_sync_impl_snap() local
458 dsl_bookmark_set_phys(&dbn->dbn_phys, snapds); in dsl_bookmark_create_sync_impl_snap()
473 dbn->dbn_phys.zbm_redaction_obj = dmu_object_alloc(mos, in dsl_bookmark_create_sync_impl_snap()
476 spa_feature_incr(dp->dp_spa, in dsl_bookmark_create_sync_impl_snap()
479 spa_feature_incr(dp->dp_spa, in dsl_bookmark_create_sync_impl_snap()
484 dbn->dbn_phys.zbm_redaction_obj, tag, &local_rl)); in dsl_bookmark_create_sync_impl_snap()
488 ASSERT3U(local_rl->rl_bonus->db_size, >=, bonuslen); in dsl_bookmark_create_sync_impl_snap()
489 dmu_buf_will_dirty(local_rl->rl_bonus, tx); in dsl_bookmark_create_sync_impl_snap()
492 VERIFY0(dmu_spill_hold_by_bonus(local_rl->rl_bonus, in dsl_bookmark_create_sync_impl_snap()
497 local_rl->rl_phys = db->db_data; in dsl_bookmark_create_sync_impl_snap()
498 local_rl->rl_dbuf = db; in dsl_bookmark_create_sync_impl_snap()
500 memcpy(local_rl->rl_phys->rlp_snaps, redact_snaps, in dsl_bookmark_create_sync_impl_snap()
502 local_rl->rl_phys->rlp_num_snaps = num_redact_snaps; in dsl_bookmark_create_sync_impl_snap()
505 local_rl->rl_phys->rlp_last_blkid = UINT64_MAX; in dsl_bookmark_create_sync_impl_snap()
506 local_rl->rl_phys->rlp_last_object = UINT64_MAX; in dsl_bookmark_create_sync_impl_snap()
514 if (dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN) { in dsl_bookmark_create_sync_impl_snap()
515 spa_feature_incr(dp->dp_spa, in dsl_bookmark_create_sync_impl_snap()
523 shortname, (longlong_t)dbn->dbn_phys.zbm_creation_txg, in dsl_bookmark_create_sync_impl_snap()
524 (longlong_t)snapds->ds_object, in dsl_bookmark_create_sync_impl_snap()
525 (longlong_t)dbn->dbn_phys.zbm_redaction_obj); in dsl_bookmark_create_sync_impl_snap()
550 * ----------------------------------------------------------------- in dsl_bookmark_create_sync_impl_book()
552 * - The zbm_redaction_obj would be referred to by both source and new in dsl_bookmark_create_sync_impl_book()
554 * destroyed, resulting in use-after-free of the referred object. in dsl_bookmark_create_sync_impl_book()
555 * - User expectation when issuing the `zfs bookmark` command is that in dsl_bookmark_create_sync_impl_book()
559 * - reference-count the redaction object => would require on-disk in dsl_bookmark_create_sync_impl_book()
561 * - Copy the redaction object => cannot be done in syncing context in dsl_bookmark_create_sync_impl_book()
569 memcpy(&new_dbn->dbn_phys, &source_phys, sizeof (source_phys)); in dsl_bookmark_create_sync_impl_book()
570 new_dbn->dbn_phys.zbm_redaction_obj = 0; in dsl_bookmark_create_sync_impl_book()
573 if (new_dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN) { in dsl_bookmark_create_sync_impl_book()
574 spa_feature_incr(dp->dp_spa, in dsl_bookmark_create_sync_impl_book()
578 /* dsl_bookmark_node_add bumps bookmarks and v2-bookmarks counter */ in dsl_bookmark_create_sync_impl_book()
584 * v1 bookmark, the v2-only fields are zeroed. in dsl_bookmark_create_sync_impl_book()
585 * And dsl_bookmark_node_add writes back a v1-sized bookmark if in dsl_bookmark_create_sync_impl_book()
586 * v2 bookmarks are disabled and/or v2-only fields are zeroed. in dsl_bookmark_create_sync_impl_book()
587 * => bookmark copying works on pre-bookmark-v2 pools in dsl_bookmark_create_sync_impl_book()
593 new_shortname, (longlong_t)new_dbn->dbn_phys.zbm_creation_txg, in dsl_bookmark_create_sync_impl_book()
605 ASSERT(spa_feature_is_enabled(dmu_tx_pool(tx)->dp_spa, in dsl_bookmark_create_sync()
608 for (nvpair_t *pair = nvlist_next_nvpair(dbca->dbca_bmarks, NULL); in dsl_bookmark_create_sync()
609 pair != NULL; pair = nvlist_next_nvpair(dbca->dbca_bmarks, pair)) { in dsl_bookmark_create_sync()
654 if (!spa_feature_is_enabled(dp->dp_spa, in dsl_bookmark_create_redacted_check()
662 uint64_t snaplimit = ((spa_feature_is_enabled(dp->dp_spa, in dsl_bookmark_create_redacted_check()
663 SPA_FEATURE_REDACTION_LIST_SPILL) ? spa_maxblocksize(dp->dp_spa) : in dsl_bookmark_create_redacted_check()
664 dmu_bonus_max()) - in dsl_bookmark_create_redacted_check()
666 if (dbcra->dbcra_numsnaps > snaplimit) in dsl_bookmark_create_redacted_check()
670 dbcra->dbcra_bmark, dbcra->dbcra_snap) != 0) in dsl_bookmark_create_redacted_check()
674 dbcra->dbcra_bmark, dbcra->dbcra_snap); in dsl_bookmark_create_redacted_check()
682 dsl_bookmark_create_sync_impl_snap(dbcra->dbcra_bmark, in dsl_bookmark_create_redacted_sync()
683 dbcra->dbcra_snap, tx, dbcra->dbcra_numsnaps, dbcra->dbcra_snaps, in dsl_bookmark_create_redacted_sync()
684 dbcra->dbcra_tag, dbcra->dbcra_rl); in dsl_bookmark_create_redacted_sync()
717 ASSERT(RRW_LOCK_HELD(&dp->dp_config_rwlock)); in dsl_bookmark_fetch_props()
722 ZFS_PROP_GUID, bmark_phys->zbm_guid); in dsl_bookmark_fetch_props()
727 ZFS_PROP_CREATETXG, bmark_phys->zbm_creation_txg); in dsl_bookmark_fetch_props()
732 ZFS_PROP_CREATION, bmark_phys->zbm_creation_time); in dsl_bookmark_fetch_props()
737 ZFS_PROP_IVSET_GUID, bmark_phys->zbm_ivset_guid); in dsl_bookmark_fetch_props()
739 if (bmark_phys->zbm_flags & ZBM_FLAG_HAS_FBN) { in dsl_bookmark_fetch_props()
744 bmark_phys->zbm_referenced_bytes_refd); in dsl_bookmark_fetch_props()
750 bmark_phys->zbm_uncompressed_bytes_refd); in dsl_bookmark_fetch_props()
755 bmark_phys->zbm_compressed_bytes_refd == 0 ? 100 : in dsl_bookmark_fetch_props()
756 bmark_phys->zbm_uncompressed_bytes_refd * 100 / in dsl_bookmark_fetch_props()
757 bmark_phys->zbm_compressed_bytes_refd; in dsl_bookmark_fetch_props()
765 bmark_phys->zbm_redaction_obj != 0) { in dsl_bookmark_fetch_props()
768 bmark_phys->zbm_redaction_obj, FTAG, &rl); in dsl_bookmark_fetch_props()
774 rl->rl_phys->rlp_snaps, in dsl_bookmark_fetch_props()
775 rl->rl_phys->rlp_num_snaps); in dsl_bookmark_fetch_props()
784 rl->rl_phys->rlp_last_blkid == UINT64_MAX && in dsl_bookmark_fetch_props()
785 rl->rl_phys->rlp_last_object == UINT64_MAX); in dsl_bookmark_fetch_props()
798 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_bookmarks_impl()
805 for (dsl_bookmark_node_t *dbn = avl_first(&ds->ds_bookmarks); in dsl_get_bookmarks_impl()
806 dbn != NULL; dbn = AVL_NEXT(&ds->ds_bookmarks, dbn)) { in dsl_get_bookmarks_impl()
809 dsl_bookmark_fetch_props(dp, &dbn->dbn_phys, props, out_props); in dsl_get_bookmarks_impl()
811 fnvlist_add_nvlist(outnvl, dbn->dbn_name, out_props); in dsl_get_bookmarks_impl()
819 * their TXG, then by their FBN-ness. The "FBN-ness" component ensures
822 * multiple bookmarks at the same TXG (with the same FBN-ness). In this
832 int64_t cmp = TREE_CMP(ldbn->dbn_phys.zbm_creation_txg, in dsl_bookmark_compare()
833 rdbn->dbn_phys.zbm_creation_txg); in dsl_bookmark_compare()
836 cmp = TREE_CMP((ldbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN), in dsl_bookmark_compare()
837 (rdbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN)); in dsl_bookmark_compare()
840 cmp = strcmp(ldbn->dbn_name, rdbn->dbn_name); in dsl_bookmark_compare()
850 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_bookmark_init_ds()
851 objset_t *mos = dp->dp_meta_objset; in dsl_bookmark_init_ds() local
853 ASSERT(!ds->ds_is_snapshot); in dsl_bookmark_init_ds()
855 avl_create(&ds->ds_bookmarks, dsl_bookmark_compare, in dsl_bookmark_init_ds()
862 int zaperr = zap_lookup(mos, ds->ds_object, DS_FIELD_BOOKMARK_NAMES, in dsl_bookmark_init_ds()
863 sizeof (ds->ds_bookmarks_obj), 1, &ds->ds_bookmarks_obj); in dsl_bookmark_init_ds()
869 if (ds->ds_bookmarks_obj == 0) in dsl_bookmark_init_ds()
877 for (zap_cursor_init(&zc, mos, ds->ds_bookmarks_obj); in dsl_bookmark_init_ds()
881 dsl_bookmark_node_alloc(attr->za_name); in dsl_bookmark_init_ds()
884 dbn->dbn_name, &dbn->dbn_phys); in dsl_bookmark_init_ds()
890 avl_add(&ds->ds_bookmarks, dbn); in dsl_bookmark_init_ds()
905 if (ds->ds_is_snapshot) in dsl_bookmark_fini_ds()
908 while ((dbn = avl_destroy_nodes(&ds->ds_bookmarks, &cookie)) != NULL) { in dsl_bookmark_fini_ds()
909 spa_strfree(dbn->dbn_name); in dsl_bookmark_fini_ds()
910 mutex_destroy(&dbn->dbn_lock); in dsl_bookmark_fini_ds()
913 avl_destroy(&ds->ds_bookmarks); in dsl_bookmark_fini_ds()
987 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_bookmark_destroy_sync_impl() local
988 uint64_t bmark_zapobj = ds->ds_bookmarks_obj; in dsl_bookmark_destroy_sync_impl()
993 * dsl_bookmark_compare()) will be zeroed even if the on-disk in dsl_bookmark_destroy_sync_impl()
1001 * from the given name if the dataset is case-insensitive. Then in dsl_bookmark_destroy_sync_impl()
1005 if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET) in dsl_bookmark_destroy_sync_impl()
1008 VERIFY0(zap_length(mos, bmark_zapobj, name, &int_size, &num_ints)); in dsl_bookmark_destroy_sync_impl()
1013 spa_feature_decr(dmu_objset_spa(mos), in dsl_bookmark_destroy_sync_impl()
1016 VERIFY0(zap_lookup_norm(mos, bmark_zapobj, name, sizeof (uint64_t), in dsl_bookmark_destroy_sync_impl()
1020 dsl_bookmark_node_t *dbn = avl_find(&ds->ds_bookmarks, &search, NULL); in dsl_bookmark_destroy_sync_impl()
1023 if (dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN) { in dsl_bookmark_destroy_sync_impl()
1034 * HAS_FBN are adjacent (with no non-HAS_FBN bookmarks in dsl_bookmark_destroy_sync_impl()
1041 AVL_PREV(&ds->ds_bookmarks, dbn); in dsl_bookmark_destroy_sync_impl()
1043 AVL_NEXT(&ds->ds_bookmarks, dbn); in dsl_bookmark_destroy_sync_impl()
1046 (dbn_prev != NULL && dbn_prev->dbn_phys.zbm_creation_txg == in dsl_bookmark_destroy_sync_impl()
1047 dbn->dbn_phys.zbm_creation_txg && in dsl_bookmark_destroy_sync_impl()
1048 (dbn_prev->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN)) || in dsl_bookmark_destroy_sync_impl()
1049 (dbn_next != NULL && dbn_next->dbn_phys.zbm_creation_txg == in dsl_bookmark_destroy_sync_impl()
1050 dbn->dbn_phys.zbm_creation_txg && in dsl_bookmark_destroy_sync_impl()
1051 (dbn_next->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN)); in dsl_bookmark_destroy_sync_impl()
1053 if (!(dbn->dbn_phys.zbm_flags & ZBM_FLAG_SNAPSHOT_EXISTS) && in dsl_bookmark_destroy_sync_impl()
1055 dbn->dbn_phys.zbm_creation_txg < in dsl_bookmark_destroy_sync_impl()
1056 dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_bookmark_destroy_sync_impl()
1057 dsl_dir_remove_clones_key(ds->ds_dir, in dsl_bookmark_destroy_sync_impl()
1058 dbn->dbn_phys.zbm_creation_txg, tx); in dsl_bookmark_destroy_sync_impl()
1059 dsl_deadlist_remove_key(&ds->ds_deadlist, in dsl_bookmark_destroy_sync_impl()
1060 dbn->dbn_phys.zbm_creation_txg, tx); in dsl_bookmark_destroy_sync_impl()
1063 spa_feature_decr(dmu_objset_spa(mos), in dsl_bookmark_destroy_sync_impl()
1067 if (dbn->dbn_phys.zbm_redaction_obj != 0) { in dsl_bookmark_destroy_sync_impl()
1069 VERIFY0(dnode_hold(mos, in dsl_bookmark_destroy_sync_impl()
1070 dbn->dbn_phys.zbm_redaction_obj, FTAG, &rl)); in dsl_bookmark_destroy_sync_impl()
1071 if (rl->dn_have_spill) { in dsl_bookmark_destroy_sync_impl()
1072 spa_feature_decr(dmu_objset_spa(mos), in dsl_bookmark_destroy_sync_impl()
1076 VERIFY0(dmu_object_free(mos, in dsl_bookmark_destroy_sync_impl()
1077 dbn->dbn_phys.zbm_redaction_obj, tx)); in dsl_bookmark_destroy_sync_impl()
1078 spa_feature_decr(dmu_objset_spa(mos), in dsl_bookmark_destroy_sync_impl()
1082 avl_remove(&ds->ds_bookmarks, dbn); in dsl_bookmark_destroy_sync_impl()
1083 spa_strfree(dbn->dbn_name); in dsl_bookmark_destroy_sync_impl()
1084 mutex_destroy(&dbn->dbn_lock); in dsl_bookmark_destroy_sync_impl()
1087 VERIFY0(zap_remove_norm(mos, bmark_zapobj, name, mt, tx)); in dsl_bookmark_destroy_sync_impl()
1097 ASSERT(nvlist_empty(dbda->dbda_success)); in dsl_bookmark_destroy_check()
1098 ASSERT(nvlist_empty(dbda->dbda_errors)); in dsl_bookmark_destroy_check()
1100 if (!spa_feature_is_enabled(dp->dp_spa, SPA_FEATURE_BOOKMARKS)) in dsl_bookmark_destroy_check()
1103 for (nvpair_t *pair = nvlist_next_nvpair(dbda->dbda_bmarks, NULL); in dsl_bookmark_destroy_check()
1104 pair != NULL; pair = nvlist_next_nvpair(dbda->dbda_bmarks, pair)) { in dsl_bookmark_destroy_check()
1129 error = dsl_redaction_list_hold_obj(tx->tx_pool, in dsl_bookmark_destroy_check()
1144 fnvlist_add_boolean(dbda->dbda_success, in dsl_bookmark_destroy_check()
1148 fnvlist_add_int32(dbda->dbda_errors, fullname, error); in dsl_bookmark_destroy_check()
1160 objset_t *mos = dp->dp_meta_objset; in dsl_bookmark_destroy_sync() local
1162 for (nvpair_t *pair = nvlist_next_nvpair(dbda->dbda_success, NULL); in dsl_bookmark_destroy_sync()
1163 pair != NULL; pair = nvlist_next_nvpair(dbda->dbda_success, pair)) { in dsl_bookmark_destroy_sync()
1176 VERIFY0(zap_count(mos, ds->ds_bookmarks_obj, &zap_cnt)); in dsl_bookmark_destroy_sync()
1178 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_bookmark_destroy_sync()
1179 VERIFY0(zap_destroy(mos, ds->ds_bookmarks_obj, tx)); in dsl_bookmark_destroy_sync()
1180 ds->ds_bookmarks_obj = 0; in dsl_bookmark_destroy_sync()
1181 spa_feature_decr(dp->dp_spa, SPA_FEATURE_BOOKMARKS, tx); in dsl_bookmark_destroy_sync()
1182 VERIFY0(zap_remove(mos, ds->ds_object, in dsl_bookmark_destroy_sync()
1220 return (!zfs_refcount_is_zero(&rl->rl_longholds)); in dsl_redaction_list_long_held()
1228 (void) zfs_refcount_add(&rl->rl_longholds, tag); in dsl_redaction_list_long_hold()
1234 (void) zfs_refcount_remove(&rl->rl_longholds, tag); in dsl_redaction_list_long_rele()
1241 zfs_refcount_destroy(&rl->rl_longholds); in redaction_list_evict_sync()
1249 if (rl->rl_bonus != rl->rl_dbuf) in dsl_redaction_list_rele()
1250 dmu_buf_rele(rl->rl_dbuf, tag); in dsl_redaction_list_rele()
1251 dmu_buf_rele(rl->rl_bonus, tag); in dsl_redaction_list_rele()
1258 objset_t *mos = dp->dp_meta_objset; in dsl_redaction_list_hold_obj() local
1265 err = dmu_bonus_hold(mos, rlobj, tag, &dbuf); in dsl_redaction_list_hold_obj()
1274 rl->rl_bonus = dbuf; in dsl_redaction_list_hold_obj()
1276 rl->rl_dbuf = spill_dbuf; in dsl_redaction_list_hold_obj()
1278 rl->rl_dbuf = dbuf; in dsl_redaction_list_hold_obj()
1280 rl->rl_object = rlobj; in dsl_redaction_list_hold_obj()
1281 rl->rl_phys = rl->rl_dbuf->db_data; in dsl_redaction_list_hold_obj()
1282 rl->rl_mos = dp->dp_meta_objset; in dsl_redaction_list_hold_obj()
1283 zfs_refcount_create(&rl->rl_longholds); in dsl_redaction_list_hold_obj()
1284 dmu_buf_init_user(&rl->rl_dbu, redaction_list_evict_sync, NULL, in dsl_redaction_list_hold_obj()
1285 &rl->rl_bonus); in dsl_redaction_list_hold_obj()
1286 if ((winner = dmu_buf_set_user_ie(dbuf, &rl->rl_dbu)) != NULL) { in dsl_redaction_list_hold_obj()
1314 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_bookmark_ds_destroyed()
1318 dsl_dir_phys(ds->ds_dir)->dd_head_dataset_obj, FTAG, &head)); in dsl_bookmark_ds_destroyed()
1320 dsl_dataset_phys(ds)->ds_next_snap_obj, FTAG, &next)); in dsl_bookmark_ds_destroyed()
1329 dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_bookmark_ds_destroyed()
1332 * The empty-string name can't be in the AVL, and it compares in dsl_bookmark_ds_destroyed()
1336 VERIFY3P(avl_find(&head->ds_bookmarks, &search, &idx), ==, NULL); in dsl_bookmark_ds_destroyed()
1338 avl_nearest(&head->ds_bookmarks, idx, AVL_AFTER); in dsl_bookmark_ds_destroyed()
1345 for (; dbn != NULL && dbn->dbn_phys.zbm_creation_txg < in dsl_bookmark_ds_destroyed()
1346 dsl_dataset_phys(ds)->ds_creation_txg; in dsl_bookmark_ds_destroyed()
1347 dbn = AVL_NEXT(&head->ds_bookmarks, dbn)) { in dsl_bookmark_ds_destroyed()
1348 if (!(dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN)) in dsl_bookmark_ds_destroyed()
1359 dsl_deadlist_space_range(&next->ds_deadlist, in dsl_bookmark_ds_destroyed()
1360 0, dbn->dbn_phys.zbm_creation_txg, in dsl_bookmark_ds_destroyed()
1362 dbn->dbn_phys.zbm_referenced_freed_before_next_snap += in dsl_bookmark_ds_destroyed()
1364 dbn->dbn_phys.zbm_compressed_freed_before_next_snap += in dsl_bookmark_ds_destroyed()
1366 dbn->dbn_phys.zbm_uncompressed_freed_before_next_snap += in dsl_bookmark_ds_destroyed()
1368 VERIFY0(zap_update(dp->dp_meta_objset, head->ds_bookmarks_obj, in dsl_bookmark_ds_destroyed()
1369 dbn->dbn_name, sizeof (uint64_t), in dsl_bookmark_ds_destroyed()
1371 &dbn->dbn_phys, tx)); in dsl_bookmark_ds_destroyed()
1383 for (; dbn != NULL && dbn->dbn_phys.zbm_creation_txg == in dsl_bookmark_ds_destroyed()
1384 dsl_dataset_phys(ds)->ds_creation_txg; in dsl_bookmark_ds_destroyed()
1385 dbn = AVL_NEXT(&head->ds_bookmarks, dbn)) { in dsl_bookmark_ds_destroyed()
1386 if (!(dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN)) { in dsl_bookmark_ds_destroyed()
1387 ASSERT(!(dbn->dbn_phys.zbm_flags & in dsl_bookmark_ds_destroyed()
1391 ASSERT(dbn->dbn_phys.zbm_flags & ZBM_FLAG_SNAPSHOT_EXISTS); in dsl_bookmark_ds_destroyed()
1392 dbn->dbn_phys.zbm_flags &= ~ZBM_FLAG_SNAPSHOT_EXISTS; in dsl_bookmark_ds_destroyed()
1393 VERIFY0(zap_update(dp->dp_meta_objset, head->ds_bookmarks_obj, in dsl_bookmark_ds_destroyed()
1394 dbn->dbn_name, sizeof (uint64_t), in dsl_bookmark_ds_destroyed()
1396 &dbn->dbn_phys, tx)); in dsl_bookmark_ds_destroyed()
1417 for (dsl_bookmark_node_t *dbn = avl_last(&ds->ds_bookmarks); in dsl_bookmark_snapshotted()
1418 dbn != NULL && dbn->dbn_phys.zbm_creation_txg > in dsl_bookmark_snapshotted()
1419 dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_bookmark_snapshotted()
1420 dbn = AVL_PREV(&ds->ds_bookmarks, dbn)) { in dsl_bookmark_snapshotted()
1421 uint64_t creation_txg = dbn->dbn_phys.zbm_creation_txg; in dsl_bookmark_snapshotted()
1429 if ((dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN) && in dsl_bookmark_snapshotted()
1431 dsl_deadlist_add_key(&ds->ds_deadlist, in dsl_bookmark_snapshotted()
1456 dsl_dataset_phys(origin)->ds_creation_txg; in dsl_bookmark_next_changed()
1459 * The empty-string name can't be in the AVL, and it compares in dsl_bookmark_next_changed()
1463 VERIFY3P(avl_find(&head->ds_bookmarks, &search, &idx), ==, NULL); in dsl_bookmark_next_changed()
1465 avl_nearest(&head->ds_bookmarks, idx, AVL_AFTER); in dsl_bookmark_next_changed()
1471 for (; dbn != NULL && dbn->dbn_phys.zbm_creation_txg == in dsl_bookmark_next_changed()
1472 dsl_dataset_phys(origin)->ds_creation_txg && in dsl_bookmark_next_changed()
1473 (dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN); in dsl_bookmark_next_changed()
1474 dbn = AVL_NEXT(&head->ds_bookmarks, dbn)) { in dsl_bookmark_next_changed()
1482 ASSERT3U(dbn->dbn_phys.zbm_guid, ==, in dsl_bookmark_next_changed()
1483 dsl_dataset_phys(origin)->ds_guid); in dsl_bookmark_next_changed()
1484 ASSERT3U(dbn->dbn_phys.zbm_referenced_bytes_refd, ==, in dsl_bookmark_next_changed()
1485 dsl_dataset_phys(origin)->ds_referenced_bytes); in dsl_bookmark_next_changed()
1486 ASSERT(dbn->dbn_phys.zbm_flags & in dsl_bookmark_next_changed()
1493 dbn->dbn_phys.zbm_redaction_obj; in dsl_bookmark_next_changed()
1494 dsl_bookmark_set_phys(&dbn->dbn_phys, origin); in dsl_bookmark_next_changed()
1495 dbn->dbn_phys.zbm_redaction_obj = redaction_obj; in dsl_bookmark_next_changed()
1497 VERIFY0(zap_update(dp->dp_meta_objset, head->ds_bookmarks_obj, in dsl_bookmark_next_changed()
1498 dbn->dbn_name, sizeof (uint64_t), in dsl_bookmark_next_changed()
1500 &dbn->dbn_phys, tx)); in dsl_bookmark_next_changed()
1518 for (dsl_bookmark_node_t *dbn = avl_last(&ds->ds_bookmarks); in dsl_bookmark_block_killed()
1519 dbn != NULL && dbn->dbn_phys.zbm_creation_txg >= in dsl_bookmark_block_killed()
1520 dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_bookmark_block_killed()
1521 dbn = AVL_PREV(&ds->ds_bookmarks, dbn)) { in dsl_bookmark_block_killed()
1527 dbn->dbn_phys.zbm_creation_txg && in dsl_bookmark_block_killed()
1528 (dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN)) { in dsl_bookmark_block_killed()
1529 mutex_enter(&dbn->dbn_lock); in dsl_bookmark_block_killed()
1530 dbn->dbn_phys.zbm_referenced_freed_before_next_snap += in dsl_bookmark_block_killed()
1532 dbn->dbn_phys.zbm_compressed_freed_before_next_snap += in dsl_bookmark_block_killed()
1534 dbn->dbn_phys.zbm_uncompressed_freed_before_next_snap += in dsl_bookmark_block_killed()
1544 dbn->dbn_dirty = B_TRUE; in dsl_bookmark_block_killed()
1545 mutex_exit(&dbn->dbn_lock); in dsl_bookmark_block_killed()
1564 for (dsl_bookmark_node_t *dbn = avl_last(&ds->ds_bookmarks); in dsl_bookmark_sync_done()
1565 dbn != NULL && dbn->dbn_phys.zbm_creation_txg >= in dsl_bookmark_sync_done()
1566 dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_bookmark_sync_done()
1567 dbn = AVL_PREV(&ds->ds_bookmarks, dbn)) { in dsl_bookmark_sync_done()
1568 if (dbn->dbn_dirty) { in dsl_bookmark_sync_done()
1573 ASSERT(dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN); in dsl_bookmark_sync_done()
1574 VERIFY0(zap_update(dp->dp_meta_objset, in dsl_bookmark_sync_done()
1575 ds->ds_bookmarks_obj, in dsl_bookmark_sync_done()
1576 dbn->dbn_name, sizeof (uint64_t), in dsl_bookmark_sync_done()
1578 &dbn->dbn_phys, tx)); in dsl_bookmark_sync_done()
1579 dbn->dbn_dirty = B_FALSE; in dsl_bookmark_sync_done()
1583 for (dsl_bookmark_node_t *dbn = avl_first(&ds->ds_bookmarks); in dsl_bookmark_sync_done()
1584 dbn != NULL; dbn = AVL_NEXT(&ds->ds_bookmarks, dbn)) { in dsl_bookmark_sync_done()
1585 ASSERT(!dbn->dbn_dirty); in dsl_bookmark_sync_done()
1596 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); in dsl_bookmark_latest_txg()
1597 dsl_bookmark_node_t *dbn = avl_last(&ds->ds_bookmarks); in dsl_bookmark_latest_txg()
1600 return (dbn->dbn_phys.zbm_creation_txg); in dsl_bookmark_latest_txg()
1605 * redact_block_phys_t is before the bookmark, return -1. If the first block in
1618 if (first->rbp_object < second->zb_object || in redact_block_zb_compare()
1619 (first->rbp_object == second->zb_object && in redact_block_zb_compare()
1620 first->rbp_blkid + (redact_block_get_count(first) - 1) < in redact_block_zb_compare()
1621 second->zb_blkid)) { in redact_block_zb_compare()
1622 return (-1); in redact_block_zb_compare()
1630 if (first->rbp_object > second->zb_object || in redact_block_zb_compare()
1631 (first->rbp_object == second->zb_object && in redact_block_zb_compare()
1632 first->rbp_blkid > second->zb_blkid)) { in redact_block_zb_compare()
1647 objset_t *mos = rl->rl_mos; in dsl_redaction_list_traverse() local
1650 if (rl->rl_phys->rlp_last_object != UINT64_MAX || in dsl_redaction_list_traverse()
1651 rl->rl_phys->rlp_last_blkid != UINT64_MAX) { in dsl_redaction_list_traverse()
1673 uint64_t maxidx = rl->rl_phys->rlp_num_entries - 1; in dsl_redaction_list_traverse()
1678 uint64_t mididx = minidx + ((maxidx - minidx) / 2); in dsl_redaction_list_traverse()
1679 err = dmu_read(mos, rl->rl_object, mididx * sizeof (rbp), in dsl_redaction_list_traverse()
1691 (mididx == minidx ? minidx : mididx - 1); in dsl_redaction_list_traverse()
1702 err = dmu_read(mos, rl->rl_object, start_block * bufsize, bufsize, buf, in dsl_redaction_list_traverse()
1706 err == 0 && curidx < rl->rl_phys->rlp_num_entries; in dsl_redaction_list_traverse()
1716 err = dmu_read(mos, rl->rl_object, curidx * in dsl_redaction_list_traverse()
1724 * If resume is non-null, we should either not send the data, or in dsl_redaction_list_traverse()
1753 if (resume->zb_object == rb->rbp_object && in dsl_redaction_list_traverse()
1754 resume->zb_blkid > rb->rbp_blkid) { in dsl_redaction_list_traverse()
1755 uint64_t diff = resume->zb_blkid - in dsl_redaction_list_traverse()
1756 rb->rbp_blkid; in dsl_redaction_list_traverse()
1757 rb->rbp_blkid = resume->zb_blkid; in dsl_redaction_list_traverse()
1759 redact_block_get_count(rb) - diff); in dsl_redaction_list_traverse()