1fa9e4066Sahrens /* 2fa9e4066Sahrens * CDDL HEADER START 3fa9e4066Sahrens * 4fa9e4066Sahrens * The contents of this file are subject to the terms of the 599653d4eSeschrock * Common Development and Distribution License (the "License"). 699653d4eSeschrock * You may not use this file except in compliance with the License. 7fa9e4066Sahrens * 8fa9e4066Sahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9fa9e4066Sahrens * or http://www.opensolaris.org/os/licensing. 10fa9e4066Sahrens * See the License for the specific language governing permissions 11fa9e4066Sahrens * and limitations under the License. 12fa9e4066Sahrens * 13fa9e4066Sahrens * When distributing Covered Code, include this CDDL HEADER in each 14fa9e4066Sahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15fa9e4066Sahrens * If applicable, add the following below this CDDL HEADER, with the 16fa9e4066Sahrens * fields enclosed by brackets "[]" replaced with your own identifying 17fa9e4066Sahrens * information: Portions Copyright [yyyy] [name of copyright owner] 18fa9e4066Sahrens * 19fa9e4066Sahrens * CDDL HEADER END 20fa9e4066Sahrens */ 21fa9e4066Sahrens /* 223f9d6ad7SLin Ling * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 234445fffbSMatthew Ahrens * Copyright (c) 2012 by Delphix. All rights reserved. 24*2d85dedbSJason King * Copyright 2019 Joyent, Inc. 25fa9e4066Sahrens */ 26fa9e4066Sahrens 27fa9e4066Sahrens #ifndef _SYS_DSL_PROP_H 28fa9e4066Sahrens #define _SYS_DSL_PROP_H 29fa9e4066Sahrens 30fa9e4066Sahrens #include <sys/dmu.h> 31fa9e4066Sahrens #include <sys/dsl_pool.h> 32fa9e4066Sahrens #include <sys/zfs_context.h> 33ea2f5b9eSMatthew Ahrens #include <sys/dsl_synctask.h> 34fa9e4066Sahrens 35fa9e4066Sahrens #ifdef __cplusplus 36fa9e4066Sahrens extern "C" { 37fa9e4066Sahrens #endif 38fa9e4066Sahrens 39fa9e4066Sahrens struct dsl_dataset; 40bb0ade09Sahrens struct dsl_dir; 41fa9e4066Sahrens 42fa9e4066Sahrens /* The callback func may not call into the DMU or DSL! */ 43fa9e4066Sahrens typedef void (dsl_prop_changed_cb_t)(void *arg, uint64_t newval); 44fa9e4066Sahrens 4503bad06fSJustin Gibbs typedef struct dsl_prop_record { 4603bad06fSJustin Gibbs list_node_t pr_node; /* link on dd_props */ 4703bad06fSJustin Gibbs const char *pr_propname; 4803bad06fSJustin Gibbs list_t pr_cbs; 4903bad06fSJustin Gibbs } dsl_prop_record_t; 5003bad06fSJustin Gibbs 51fa9e4066Sahrens typedef struct dsl_prop_cb_record { 5203bad06fSJustin Gibbs list_node_t cbr_pr_node; /* link on pr_cbs */ 5303bad06fSJustin Gibbs list_node_t cbr_ds_node; /* link on ds_prop_cbs */ 5403bad06fSJustin Gibbs dsl_prop_record_t *cbr_pr; 5599653d4eSeschrock struct dsl_dataset *cbr_ds; 56fa9e4066Sahrens dsl_prop_changed_cb_t *cbr_func; 57fa9e4066Sahrens void *cbr_arg; 58fa9e4066Sahrens } dsl_prop_cb_record_t; 59fa9e4066Sahrens 6092241e0bSTom Erickson typedef struct dsl_props_arg { 6192241e0bSTom Erickson nvlist_t *pa_props; 6292241e0bSTom Erickson zprop_source_t pa_source; 6392241e0bSTom Erickson } dsl_props_arg_t; 6492241e0bSTom Erickson 65*2d85dedbSJason King typedef struct dsl_props_set_arg { 66*2d85dedbSJason King const char *dpsa_dsname; 67*2d85dedbSJason King zprop_source_t dpsa_source; 68*2d85dedbSJason King nvlist_t *dpsa_props; 69*2d85dedbSJason King } dsl_props_set_arg_t; 70*2d85dedbSJason King 7103bad06fSJustin Gibbs void dsl_prop_init(dsl_dir_t *dd); 7203bad06fSJustin Gibbs void dsl_prop_fini(dsl_dir_t *dd); 73fa9e4066Sahrens int dsl_prop_register(struct dsl_dataset *ds, const char *propname, 74fa9e4066Sahrens dsl_prop_changed_cb_t *callback, void *cbarg); 7503bad06fSJustin Gibbs void dsl_prop_unregister_all(struct dsl_dataset *ds, void *cbarg); 763b2aab18SMatthew Ahrens void dsl_prop_notify_all(struct dsl_dir *dd); 773b2aab18SMatthew Ahrens boolean_t dsl_prop_hascb(struct dsl_dataset *ds); 78fa9e4066Sahrens 79fa9e4066Sahrens int dsl_prop_get(const char *ddname, const char *propname, 80fa9e4066Sahrens int intsz, int numints, void *buf, char *setpoint); 81fa9e4066Sahrens int dsl_prop_get_integer(const char *ddname, const char *propname, 82fa9e4066Sahrens uint64_t *valuep, char *setpoint); 8392241e0bSTom Erickson int dsl_prop_get_all(objset_t *os, nvlist_t **nvp); 843b2aab18SMatthew Ahrens int dsl_prop_get_received(const char *dsname, nvlist_t **nvp); 85bb0ade09Sahrens int dsl_prop_get_ds(struct dsl_dataset *ds, const char *propname, 86bb0ade09Sahrens int intsz, int numints, void *buf, char *setpoint); 873b2aab18SMatthew Ahrens int dsl_prop_get_int_ds(struct dsl_dataset *ds, const char *propname, 883b2aab18SMatthew Ahrens uint64_t *valuep); 89bb0ade09Sahrens int dsl_prop_get_dd(struct dsl_dir *dd, const char *propname, 9092241e0bSTom Erickson int intsz, int numints, void *buf, char *setpoint, 9192241e0bSTom Erickson boolean_t snapshot); 92fa9e4066Sahrens 93*2d85dedbSJason King int dsl_props_set_check(void *arg, dmu_tx_t *tx); 94*2d85dedbSJason King void dsl_props_set_sync(void *arg, dmu_tx_t *tx); 953b2aab18SMatthew Ahrens void dsl_props_set_sync_impl(struct dsl_dataset *ds, zprop_source_t source, 963b2aab18SMatthew Ahrens nvlist_t *props, dmu_tx_t *tx); 973b2aab18SMatthew Ahrens void dsl_prop_set_sync_impl(struct dsl_dataset *ds, const char *propname, 983b2aab18SMatthew Ahrens zprop_source_t source, int intsz, int numints, const void *value, 993b2aab18SMatthew Ahrens dmu_tx_t *tx); 10092241e0bSTom Erickson int dsl_props_set(const char *dsname, zprop_source_t source, nvlist_t *nvl); 1013b2aab18SMatthew Ahrens int dsl_prop_set_int(const char *dsname, const char *propname, 1023b2aab18SMatthew Ahrens zprop_source_t source, uint64_t value); 1033b2aab18SMatthew Ahrens int dsl_prop_set_string(const char *dsname, const char *propname, 1043b2aab18SMatthew Ahrens zprop_source_t source, const char *value); 1053b2aab18SMatthew Ahrens int dsl_prop_inherit(const char *dsname, const char *propname, 1063b2aab18SMatthew Ahrens zprop_source_t source); 107a2eea2e1Sahrens 1083b2aab18SMatthew Ahrens int dsl_prop_predict(dsl_dir_t *dd, const char *propname, 1093b2aab18SMatthew Ahrens zprop_source_t source, uint64_t value, uint64_t *newvalp); 11092241e0bSTom Erickson 11192241e0bSTom Erickson /* flag first receive on or after SPA_VERSION_RECVD_PROPS */ 1123b2aab18SMatthew Ahrens boolean_t dsl_prop_get_hasrecvd(const char *dsname); 1133b2aab18SMatthew Ahrens int dsl_prop_set_hasrecvd(const char *dsname); 1143b2aab18SMatthew Ahrens void dsl_prop_unset_hasrecvd(const char *dsname); 11592241e0bSTom Erickson 116a2eea2e1Sahrens void dsl_prop_nvlist_add_uint64(nvlist_t *nv, zfs_prop_t prop, uint64_t value); 117a2eea2e1Sahrens void dsl_prop_nvlist_add_string(nvlist_t *nv, 118a2eea2e1Sahrens zfs_prop_t prop, const char *value); 119fa9e4066Sahrens 120fa9e4066Sahrens #ifdef __cplusplus 121fa9e4066Sahrens } 122fa9e4066Sahrens #endif 123fa9e4066Sahrens 124fa9e4066Sahrens #endif /* _SYS_DSL_PROP_H */ 125