1*61145dc2SMartin Matuska // SPDX-License-Identifier: CDDL-1.0
2eda14cbcSMatt Macy /*
3eda14cbcSMatt Macy * CDDL HEADER START
4eda14cbcSMatt Macy *
5eda14cbcSMatt Macy * This file and its contents are supplied under the terms of the
6eda14cbcSMatt Macy * Common Development and Distribution License ("CDDL"), version 1.0.
7eda14cbcSMatt Macy * You may only use this file in accordance with the terms of version
8eda14cbcSMatt Macy * 1.0 of the CDDL.
9eda14cbcSMatt Macy *
10eda14cbcSMatt Macy * A full copy of the text of the CDDL should have accompanied this
11eda14cbcSMatt Macy * source. A copy of the CDDL is also available via the Internet at
12eda14cbcSMatt Macy * http://www.illumos.org/license/CDDL.
13eda14cbcSMatt Macy *
14eda14cbcSMatt Macy * CDDL HEADER END
15eda14cbcSMatt Macy */
16eda14cbcSMatt Macy
17eda14cbcSMatt Macy /*
18eda14cbcSMatt Macy * Copyright (c) 2016 by Delphix. All rights reserved.
19eda14cbcSMatt Macy * Copyrigh 2020 Joyent, Inc.
20eda14cbcSMatt Macy */
21eda14cbcSMatt Macy
22eda14cbcSMatt Macy #include <sys/lua/lua.h>
23eda14cbcSMatt Macy #include <sys/lua/lualib.h>
24eda14cbcSMatt Macy #include <sys/lua/lauxlib.h>
25eda14cbcSMatt Macy
26eda14cbcSMatt Macy #include <sys/dsl_prop.h>
27eda14cbcSMatt Macy #include <sys/dsl_dir.h>
28eda14cbcSMatt Macy #include <sys/dsl_synctask.h>
29eda14cbcSMatt Macy #include <sys/dsl_dataset.h>
30eda14cbcSMatt Macy #include <sys/zcp.h>
31eda14cbcSMatt Macy #include <sys/zcp_set.h>
32eda14cbcSMatt Macy #include <sys/zcp_iter.h>
33eda14cbcSMatt Macy #include <sys/zcp_global.h>
34eda14cbcSMatt Macy #include <sys/zvol.h>
35eda14cbcSMatt Macy
36eda14cbcSMatt Macy #include <zfs_prop.h>
37eda14cbcSMatt Macy
38eda14cbcSMatt Macy static void
zcp_set_user_prop(lua_State * state,dsl_pool_t * dp,const char * dsname,const char * prop_name,const char * prop_val,dmu_tx_t * tx)39eda14cbcSMatt Macy zcp_set_user_prop(lua_State *state, dsl_pool_t *dp, const char *dsname,
40eda14cbcSMatt Macy const char *prop_name, const char *prop_val, dmu_tx_t *tx)
41eda14cbcSMatt Macy {
42eda14cbcSMatt Macy dsl_dataset_t *ds = zcp_dataset_hold(state, dp, dsname, FTAG);
43eda14cbcSMatt Macy if (ds == NULL)
44eda14cbcSMatt Macy return; /* not reached; zcp_dataset_hold() longjmp'd */
45eda14cbcSMatt Macy
46eda14cbcSMatt Macy nvlist_t *nvl = fnvlist_alloc();
47eda14cbcSMatt Macy fnvlist_add_string(nvl, prop_name, prop_val);
48eda14cbcSMatt Macy
49eda14cbcSMatt Macy dsl_props_set_sync_impl(ds, ZPROP_SRC_LOCAL, nvl, tx);
50eda14cbcSMatt Macy
51eda14cbcSMatt Macy fnvlist_free(nvl);
52eda14cbcSMatt Macy dsl_dataset_rele(ds, FTAG);
53eda14cbcSMatt Macy }
54eda14cbcSMatt Macy
55eda14cbcSMatt Macy int
zcp_set_prop_check(void * arg,dmu_tx_t * tx)56eda14cbcSMatt Macy zcp_set_prop_check(void *arg, dmu_tx_t *tx)
57eda14cbcSMatt Macy {
58eda14cbcSMatt Macy zcp_set_prop_arg_t *args = arg;
59eda14cbcSMatt Macy const char *prop_name = args->prop;
60eda14cbcSMatt Macy dsl_props_set_arg_t dpsa = {
61eda14cbcSMatt Macy .dpsa_dsname = args->dsname,
62eda14cbcSMatt Macy .dpsa_source = ZPROP_SRC_LOCAL,
63eda14cbcSMatt Macy };
64eda14cbcSMatt Macy nvlist_t *nvl = NULL;
65eda14cbcSMatt Macy int ret = 0;
66eda14cbcSMatt Macy
67eda14cbcSMatt Macy /*
68eda14cbcSMatt Macy * Only user properties are currently supported. When non-user
69eda14cbcSMatt Macy * properties are supported, we will want to use
70eda14cbcSMatt Macy * zfs_valid_proplist() to verify the properties.
71eda14cbcSMatt Macy */
72eda14cbcSMatt Macy if (!zfs_prop_user(prop_name)) {
73eda14cbcSMatt Macy return (EINVAL);
74eda14cbcSMatt Macy }
75eda14cbcSMatt Macy
76eda14cbcSMatt Macy nvl = fnvlist_alloc();
77eda14cbcSMatt Macy fnvlist_add_string(nvl, args->prop, args->val);
78eda14cbcSMatt Macy dpsa.dpsa_props = nvl;
79eda14cbcSMatt Macy
80eda14cbcSMatt Macy ret = dsl_props_set_check(&dpsa, tx);
81eda14cbcSMatt Macy nvlist_free(nvl);
82eda14cbcSMatt Macy
83eda14cbcSMatt Macy return (ret);
84eda14cbcSMatt Macy }
85eda14cbcSMatt Macy
86eda14cbcSMatt Macy void
zcp_set_prop_sync(void * arg,dmu_tx_t * tx)87eda14cbcSMatt Macy zcp_set_prop_sync(void *arg, dmu_tx_t *tx)
88eda14cbcSMatt Macy {
89eda14cbcSMatt Macy zcp_set_prop_arg_t *args = arg;
90eda14cbcSMatt Macy zcp_run_info_t *ri = zcp_run_info(args->state);
91eda14cbcSMatt Macy dsl_pool_t *dp = ri->zri_pool;
92eda14cbcSMatt Macy
93eda14cbcSMatt Macy const char *dsname = args->dsname;
94eda14cbcSMatt Macy const char *prop_name = args->prop;
95eda14cbcSMatt Macy const char *prop_val = args->val;
96eda14cbcSMatt Macy
97eda14cbcSMatt Macy if (zfs_prop_user(prop_name)) {
98eda14cbcSMatt Macy zcp_set_user_prop(args->state, dp, dsname, prop_name,
99eda14cbcSMatt Macy prop_val, tx);
100eda14cbcSMatt Macy }
101eda14cbcSMatt Macy }
102