1/*
2 * CDDL HEADER START
3 *
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
7 * 1.0 of the CDDL.
8 *
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.
12 *
13 * CDDL HEADER END
14 */
15
16/*
17 * Copyright (c) 2016, 2017 by Delphix. All rights reserved.
18 */
19
20#ifndef _SYS_ZCP_H
21#define	_SYS_ZCP_H
22
23#include <sys/dmu_tx.h>
24#include <sys/dsl_pool.h>
25
26#include "lua.h"
27#include "lualib.h"
28#include "lauxlib.h"
29
30#ifdef	__cplusplus
31extern "C" {
32#endif
33
34#define	ZCP_RUN_INFO_KEY "runinfo"
35
36extern uint64_t zfs_lua_max_instrlimit;
37extern uint64_t zfs_lua_max_memlimit;
38
39int zcp_argerror(lua_State *, int, const char *, ...);
40
41int zcp_eval(const char *, const char *, boolean_t, uint64_t, uint64_t,
42    nvpair_t *, nvlist_t *);
43
44int zcp_load_list_lib(lua_State *);
45
46int zcp_load_synctask_lib(lua_State *, boolean_t);
47
48typedef void (zcp_cleanup_t)(void *);
49typedef struct zcp_cleanup_handler {
50	zcp_cleanup_t *zch_cleanup_func;
51	void *zch_cleanup_arg;
52	list_node_t zch_node;
53} zcp_cleanup_handler_t;
54
55typedef struct zcp_run_info {
56	dsl_pool_t	*zri_pool;
57
58	/*
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.
62	 */
63	int		zri_space_used;
64
65	/*
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.
70	 */
71	cred_t		*zri_cred;
72
73	/*
74	 * The tx in which this channel program is running.
75	 */
76	dmu_tx_t	*zri_tx;
77
78	/*
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.
82	 */
83	uint64_t	zri_maxinstrs;
84
85	/*
86	 * The number of Lua instructions the channel program has executed.
87	 */
88	uint64_t	zri_curinstrs;
89
90	/*
91	 * Boolean indicating whether or not the channel program exited
92	 * because it timed out.
93	 */
94	boolean_t	zri_timed_out;
95
96	/*
97	 * Boolean indicating whether or not we are running in syncing
98	 * context.
99	 */
100	boolean_t	zri_sync;
101
102	/*
103	 * List of currently registered cleanup handlers, which will be
104	 * triggered in the event of a fatal error.
105	 */
106	list_t		zri_cleanup_handlers;
107} zcp_run_info_t;
108
109zcp_run_info_t *zcp_run_info(lua_State *);
110zcp_cleanup_handler_t *zcp_register_cleanup(lua_State *, zcp_cleanup_t, void *);
111void zcp_deregister_cleanup(lua_State *, zcp_cleanup_handler_t *);
112void zcp_cleanup(lua_State *);
113
114/*
115 * Argument parsing routines for channel program callback functions.
116 */
117typedef struct zcp_arg {
118	/*
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.
123	 */
124	const char *za_name;
125
126	/*
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.
131	 */
132	const int za_lua_type;
133} zcp_arg_t;
134
135void zcp_parse_args(lua_State *, const char *, const zcp_arg_t *,
136    const zcp_arg_t *);
137int zcp_nvlist_to_lua(lua_State *, nvlist_t *, char *, int);
138int zcp_dataset_hold_error(lua_State *, dsl_pool_t *, const char *, int);
139struct dsl_dataset *zcp_dataset_hold(lua_State *, dsl_pool_t *,
140    const char *, void *);
141
142typedef int (zcp_lib_func_t)(lua_State *);
143typedef struct zcp_lib_info {
144	const char *name;
145	zcp_lib_func_t *func;
146	const zcp_arg_t pargs[4];
147	const zcp_arg_t kwargs[2];
148} zcp_lib_info_t;
149
150#ifdef	__cplusplus
151}
152#endif
153
154#endif	/* _SYS_ZCP_H */
155