xref: /illumos-gate/usr/src/uts/common/fs/zfs/sys/dsl_prop.h (revision 2d85dedb)
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