4 * This file and its contents are supplied under the terms of the
5 * Common Development and Distribution License ("CDDL"), version 1.0.
6 * You may only use this file in accordance with the terms of version
9 * A full copy of the text of the CDDL should have accompanied this
10 * source. A copy of the CDDL is also available via the Internet at
11 * http://www.illumos.org/license/CDDL.
17 * Copyright (c) 2016, 2018 by Delphix. All rights reserved.
23 #include <sys/dmu_tx.h>
24 #include <sys/dsl_pool.h>
26 #include <sys/lua/lua.h>
27 #include <sys/lua/lualib.h>
28 #include <sys/lua/lauxlib.h>
34 #define ZCP_RUN_INFO_KEY "runinfo"
36 extern unsigned long zfs_lua_max_instrlimit
;
37 extern unsigned long zfs_lua_max_memlimit
;
39 int zcp_argerror(lua_State
*, int, const char *, ...);
41 int zcp_eval(const char *, const char *, boolean_t
, uint64_t, uint64_t,
42 nvpair_t
*, nvlist_t
*);
44 int zcp_load_list_lib(lua_State
*);
46 int zcp_load_synctask_lib(lua_State
*, boolean_t
);
48 typedef void (zcp_cleanup_t
)(void *);
49 typedef struct zcp_cleanup_handler
{
50 zcp_cleanup_t
*zch_cleanup_func
;
51 void *zch_cleanup_arg
;
53 } zcp_cleanup_handler_t
;
55 typedef struct zcp_run_info
{
59 * An estimate of the total amount of space consumed by all
60 * synctasks we have successfully performed so far in this
61 * channel program. Used to generate ENOSPC errors for syncfuncs.
66 * The credentials of the thread which originally invoked the channel
67 * program. Since channel programs are always invoked from the synctask
68 * thread they should always do permissions checks against this cred
69 * rather than the 'current' thread's.
74 * The tx in which this channel program is running.
79 * The maximum number of Lua instructions the channel program is allowed
80 * to execute. If it takes longer than this it will time out. A value
81 * of 0 indicates no instruction limit.
83 uint64_t zri_maxinstrs
;
86 * The number of Lua instructions the channel program has executed.
88 uint64_t zri_curinstrs
;
91 * Boolean indicating whether or not the channel program exited
92 * because it timed out.
94 boolean_t zri_timed_out
;
97 * Boolean indicating whether or not we are running in syncing
103 * List of currently registered cleanup handlers, which will be
104 * triggered in the event of a fatal error.
106 list_t zri_cleanup_handlers
;
109 zcp_run_info_t
*zcp_run_info(lua_State
*);
110 zcp_cleanup_handler_t
*zcp_register_cleanup(lua_State
*, zcp_cleanup_t
, void *);
111 void zcp_deregister_cleanup(lua_State
*, zcp_cleanup_handler_t
*);
112 void zcp_cleanup(lua_State
*);
115 * Argument parsing routines for channel program callback functions.
117 typedef struct zcp_arg
{
119 * The name of this argument. For keyword arguments this is the name
120 * functions will use to set the argument. For positional arguments
121 * the name has no programatic meaning, but will appear in error
122 * messages and help output.
127 * The Lua type this argument should have (e.g. LUA_TSTRING,
128 * LUA_TBOOLEAN) see the lua_type() function documentation for a
129 * complete list. Calling a function with an argument that does
130 * not match the expected type will result in the program terminating.
132 const int za_lua_type
;
135 void zcp_parse_args(lua_State
*, const char *, const zcp_arg_t
*,
137 int zcp_nvlist_to_lua(lua_State
*, nvlist_t
*, char *, int);
138 int zcp_dataset_hold_error(lua_State
*, dsl_pool_t
*, const char *, int);
139 struct dsl_dataset
*zcp_dataset_hold(lua_State
*, dsl_pool_t
*,
140 const char *, void *);
142 typedef int (zcp_lib_func_t
)(lua_State
*);
143 typedef struct zcp_lib_info
{
145 zcp_lib_func_t
*func
;
146 const zcp_arg_t pargs
[4];
147 const zcp_arg_t kwargs
[2];
154 #endif /* _SYS_ZCP_H */