1dfc11533SChris Williamson /* 2dfc11533SChris Williamson * CDDL HEADER START 3dfc11533SChris Williamson * 4dfc11533SChris Williamson * This file and its contents are supplied under the terms of the 5dfc11533SChris Williamson * Common Development and Distribution License ("CDDL"), version 1.0. 6dfc11533SChris Williamson * You may only use this file in accordance with the terms of version 7dfc11533SChris Williamson * 1.0 of the CDDL. 8dfc11533SChris Williamson * 9dfc11533SChris Williamson * A full copy of the text of the CDDL should have accompanied this 10dfc11533SChris Williamson * source. A copy of the CDDL is also available via the Internet at 11dfc11533SChris Williamson * http://www.illumos.org/license/CDDL. 12dfc11533SChris Williamson * 13dfc11533SChris Williamson * CDDL HEADER END 14dfc11533SChris Williamson */ 15dfc11533SChris Williamson 16dfc11533SChris Williamson /* 172840dce1SChris Williamson * Copyright (c) 2016, 2017 by Delphix. All rights reserved. 18dfc11533SChris Williamson */ 19dfc11533SChris Williamson 20dfc11533SChris Williamson #ifndef _SYS_ZCP_H 21dfc11533SChris Williamson #define _SYS_ZCP_H 22dfc11533SChris Williamson 23dfc11533SChris Williamson #include <sys/dmu_tx.h> 24dfc11533SChris Williamson #include <sys/dsl_pool.h> 25dfc11533SChris Williamson 26dfc11533SChris Williamson #include "lua.h" 27dfc11533SChris Williamson #include "lualib.h" 28dfc11533SChris Williamson #include "lauxlib.h" 29dfc11533SChris Williamson 30dfc11533SChris Williamson #ifdef __cplusplus 31dfc11533SChris Williamson extern "C" { 32dfc11533SChris Williamson #endif 33dfc11533SChris Williamson 34dfc11533SChris Williamson #define ZCP_RUN_INFO_KEY "runinfo" 35dfc11533SChris Williamson 36dfc11533SChris Williamson extern uint64_t zfs_lua_max_instrlimit; 37dfc11533SChris Williamson extern uint64_t zfs_lua_max_memlimit; 38dfc11533SChris Williamson 39dfc11533SChris Williamson int zcp_argerror(lua_State *, int, const char *, ...); 40dfc11533SChris Williamson 41a3b28680SSerapheim Dimitropoulos int zcp_eval(const char *, const char *, boolean_t, uint64_t, uint64_t, 42a3b28680SSerapheim Dimitropoulos nvpair_t *, nvlist_t *); 43dfc11533SChris Williamson 44dfc11533SChris Williamson int zcp_load_list_lib(lua_State *); 45dfc11533SChris Williamson 46dfc11533SChris Williamson int zcp_load_synctask_lib(lua_State *, boolean_t); 47dfc11533SChris Williamson 48dfc11533SChris Williamson typedef void (zcp_cleanup_t)(void *); 49a3b28680SSerapheim Dimitropoulos typedef struct zcp_cleanup_handler { 50a3b28680SSerapheim Dimitropoulos zcp_cleanup_t *zch_cleanup_func; 51a3b28680SSerapheim Dimitropoulos void *zch_cleanup_arg; 52a3b28680SSerapheim Dimitropoulos list_node_t zch_node; 53a3b28680SSerapheim Dimitropoulos } zcp_cleanup_handler_t; 54dfc11533SChris Williamson 55*d0cb1fb9SDon Brady typedef struct zcp_alloc_arg { 56*d0cb1fb9SDon Brady boolean_t aa_must_succeed; 57*d0cb1fb9SDon Brady int64_t aa_alloc_remaining; 58*d0cb1fb9SDon Brady int64_t aa_alloc_limit; 59*d0cb1fb9SDon Brady } zcp_alloc_arg_t; 60*d0cb1fb9SDon Brady 61dfc11533SChris Williamson typedef struct zcp_run_info { 62dfc11533SChris Williamson dsl_pool_t *zri_pool; 63dfc11533SChris Williamson 64dfc11533SChris Williamson /* 65a3b28680SSerapheim Dimitropoulos * An estimate of the total amount of space consumed by all 66dfc11533SChris Williamson * synctasks we have successfully performed so far in this 67dfc11533SChris Williamson * channel program. Used to generate ENOSPC errors for syncfuncs. 68dfc11533SChris Williamson */ 69dfc11533SChris Williamson int zri_space_used; 70dfc11533SChris Williamson 71dfc11533SChris Williamson /* 72dfc11533SChris Williamson * The credentials of the thread which originally invoked the channel 73dfc11533SChris Williamson * program. Since channel programs are always invoked from the synctask 74dfc11533SChris Williamson * thread they should always do permissions checks against this cred 75dfc11533SChris Williamson * rather than the 'current' thread's. 76dfc11533SChris Williamson */ 77dfc11533SChris Williamson cred_t *zri_cred; 78dfc11533SChris Williamson 79dfc11533SChris Williamson /* 80dfc11533SChris Williamson * The tx in which this channel program is running. 81dfc11533SChris Williamson */ 82dfc11533SChris Williamson dmu_tx_t *zri_tx; 83dfc11533SChris Williamson 84dfc11533SChris Williamson /* 85dfc11533SChris Williamson * The maximum number of Lua instructions the channel program is allowed 86dfc11533SChris Williamson * to execute. If it takes longer than this it will time out. A value 87dfc11533SChris Williamson * of 0 indicates no instruction limit. 88dfc11533SChris Williamson */ 89dfc11533SChris Williamson uint64_t zri_maxinstrs; 90dfc11533SChris Williamson 91dfc11533SChris Williamson /* 92dfc11533SChris Williamson * The number of Lua instructions the channel program has executed. 93dfc11533SChris Williamson */ 94dfc11533SChris Williamson uint64_t zri_curinstrs; 95dfc11533SChris Williamson 96dfc11533SChris Williamson /* 97dfc11533SChris Williamson * Boolean indicating whether or not the channel program exited 98dfc11533SChris Williamson * because it timed out. 99dfc11533SChris Williamson */ 100dfc11533SChris Williamson boolean_t zri_timed_out; 101dfc11533SChris Williamson 102*d0cb1fb9SDon Brady /* 103*d0cb1fb9SDon Brady * Channel program was canceled by user 104*d0cb1fb9SDon Brady */ 105*d0cb1fb9SDon Brady boolean_t zri_canceled; 106*d0cb1fb9SDon Brady 107dfc11533SChris Williamson /* 108a3b28680SSerapheim Dimitropoulos * Boolean indicating whether or not we are running in syncing 109a3b28680SSerapheim Dimitropoulos * context. 110dfc11533SChris Williamson */ 111a3b28680SSerapheim Dimitropoulos boolean_t zri_sync; 112a3b28680SSerapheim Dimitropoulos 113a3b28680SSerapheim Dimitropoulos /* 114a3b28680SSerapheim Dimitropoulos * List of currently registered cleanup handlers, which will be 115a3b28680SSerapheim Dimitropoulos * triggered in the event of a fatal error. 116a3b28680SSerapheim Dimitropoulos */ 117a3b28680SSerapheim Dimitropoulos list_t zri_cleanup_handlers; 118*d0cb1fb9SDon Brady 119*d0cb1fb9SDon Brady /* 120*d0cb1fb9SDon Brady * The Lua state context of our channel program. 121*d0cb1fb9SDon Brady */ 122*d0cb1fb9SDon Brady lua_State *zri_state; 123*d0cb1fb9SDon Brady 124*d0cb1fb9SDon Brady /* 125*d0cb1fb9SDon Brady * Lua memory allocator arguments. 126*d0cb1fb9SDon Brady */ 127*d0cb1fb9SDon Brady zcp_alloc_arg_t *zri_allocargs; 128*d0cb1fb9SDon Brady 129*d0cb1fb9SDon Brady /* 130*d0cb1fb9SDon Brady * Contains output values from zcp script or error string. 131*d0cb1fb9SDon Brady */ 132*d0cb1fb9SDon Brady nvlist_t *zri_outnvl; 133*d0cb1fb9SDon Brady 134*d0cb1fb9SDon Brady /* 135*d0cb1fb9SDon Brady * The errno number returned to caller of zcp_eval(). 136*d0cb1fb9SDon Brady */ 137*d0cb1fb9SDon Brady int zri_result; 138dfc11533SChris Williamson } zcp_run_info_t; 139dfc11533SChris Williamson 140dfc11533SChris Williamson zcp_run_info_t *zcp_run_info(lua_State *); 141a3b28680SSerapheim Dimitropoulos zcp_cleanup_handler_t *zcp_register_cleanup(lua_State *, zcp_cleanup_t, void *); 142a3b28680SSerapheim Dimitropoulos void zcp_deregister_cleanup(lua_State *, zcp_cleanup_handler_t *); 143dfc11533SChris Williamson void zcp_cleanup(lua_State *); 144dfc11533SChris Williamson 145dfc11533SChris Williamson /* 146dfc11533SChris Williamson * Argument parsing routines for channel program callback functions. 147dfc11533SChris Williamson */ 148dfc11533SChris Williamson typedef struct zcp_arg { 149dfc11533SChris Williamson /* 150dfc11533SChris Williamson * The name of this argument. For keyword arguments this is the name 151dfc11533SChris Williamson * functions will use to set the argument. For positional arguments 152dfc11533SChris Williamson * the name has no programatic meaning, but will appear in error 153dfc11533SChris Williamson * messages and help output. 154dfc11533SChris Williamson */ 155dfc11533SChris Williamson const char *za_name; 156dfc11533SChris Williamson 157dfc11533SChris Williamson /* 158dfc11533SChris Williamson * The Lua type this argument should have (e.g. LUA_TSTRING, 159dfc11533SChris Williamson * LUA_TBOOLEAN) see the lua_type() function documentation for a 160dfc11533SChris Williamson * complete list. Calling a function with an argument that does 161dfc11533SChris Williamson * not match the expected type will result in the program terminating. 162dfc11533SChris Williamson */ 163dfc11533SChris Williamson const int za_lua_type; 164dfc11533SChris Williamson } zcp_arg_t; 165dfc11533SChris Williamson 166dfc11533SChris Williamson void zcp_parse_args(lua_State *, const char *, const zcp_arg_t *, 167dfc11533SChris Williamson const zcp_arg_t *); 168dfc11533SChris Williamson int zcp_nvlist_to_lua(lua_State *, nvlist_t *, char *, int); 169dfc11533SChris Williamson int zcp_dataset_hold_error(lua_State *, dsl_pool_t *, const char *, int); 170dfc11533SChris Williamson struct dsl_dataset *zcp_dataset_hold(lua_State *, dsl_pool_t *, 171dfc11533SChris Williamson const char *, void *); 172dfc11533SChris Williamson 173dfc11533SChris Williamson typedef int (zcp_lib_func_t)(lua_State *); 174dfc11533SChris Williamson typedef struct zcp_lib_info { 175dfc11533SChris Williamson const char *name; 176dfc11533SChris Williamson zcp_lib_func_t *func; 177dfc11533SChris Williamson const zcp_arg_t pargs[4]; 178dfc11533SChris Williamson const zcp_arg_t kwargs[2]; 179dfc11533SChris Williamson } zcp_lib_info_t; 180dfc11533SChris Williamson 181dfc11533SChris Williamson #ifdef __cplusplus 182dfc11533SChris Williamson } 183dfc11533SChris Williamson #endif 184dfc11533SChris Williamson 185dfc11533SChris Williamson #endif /* _SYS_ZCP_H */ 186