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