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