config/dracut/90zfs: handle cases where hostid(1) returns all zeros
[zfs.git] / include / sys / zcp.h
blobd7b1dfaa2ea5b8efb8499e90bedc50cf82c7e6a4
1 /*
2 * CDDL HEADER START
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.
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.
13 * CDDL HEADER END
17 * Copyright (c) 2016, 2018 by Delphix. All rights reserved.
20 #ifndef _SYS_ZCP_H
21 #define _SYS_ZCP_H
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>
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
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;
52 list_node_t zch_node;
53 } zcp_cleanup_handler_t;
55 typedef struct zcp_alloc_arg {
56 boolean_t aa_must_succeed;
57 int64_t aa_alloc_remaining;
58 int64_t aa_alloc_limit;
59 } zcp_alloc_arg_t;
61 typedef struct zcp_run_info {
62 dsl_pool_t *zri_pool;
65 * An estimate of the total amount of space consumed by all
66 * synctasks we have successfully performed so far in this
67 * channel program. Used to generate ENOSPC errors for syncfuncs.
69 int zri_space_used;
72 * The credentials of the thread which originally invoked the channel
73 * program. Since channel programs are always invoked from the synctask
74 * thread they should always do permissions checks against this cred
75 * rather than the 'current' thread's.
77 cred_t *zri_cred;
78 proc_t *zri_proc;
81 * The tx in which this channel program is running.
83 dmu_tx_t *zri_tx;
86 * The maximum number of Lua instructions the channel program is allowed
87 * to execute. If it takes longer than this it will time out. A value
88 * of 0 indicates no instruction limit.
90 uint64_t zri_maxinstrs;
93 * The number of Lua instructions the channel program has executed.
95 uint64_t zri_curinstrs;
98 * Boolean indicating whether or not the channel program exited
99 * because it timed out.
101 boolean_t zri_timed_out;
104 * Channel program was canceled by user
106 boolean_t zri_canceled;
109 * Boolean indicating whether or not we are running in syncing
110 * context.
112 boolean_t zri_sync;
115 * List of currently registered cleanup handlers, which will be
116 * triggered in the event of a fatal error.
118 list_t zri_cleanup_handlers;
121 * The Lua state context of our channel program.
123 lua_State *zri_state;
126 * Lua memory allocator arguments.
128 zcp_alloc_arg_t *zri_allocargs;
131 * Contains output values from zcp script or error string.
133 nvlist_t *zri_outnvl;
136 * The keys of this nvlist are datasets which may be zvols and may need
137 * to have device minor nodes created. This information is passed from
138 * syncing context (where the zvol is created) to open context (where we
139 * create the minor nodes).
141 nvlist_t *zri_new_zvols;
144 * The errno number returned to caller of zcp_eval().
146 int zri_result;
147 } zcp_run_info_t;
149 zcp_run_info_t *zcp_run_info(lua_State *);
150 zcp_cleanup_handler_t *zcp_register_cleanup(lua_State *, zcp_cleanup_t, void *);
151 void zcp_deregister_cleanup(lua_State *, zcp_cleanup_handler_t *);
152 void zcp_cleanup(lua_State *);
155 * Argument parsing routines for channel program callback functions.
157 typedef struct zcp_arg {
159 * The name of this argument. For keyword arguments this is the name
160 * functions will use to set the argument. For positional arguments
161 * the name has no programmatic meaning, but will appear in error
162 * messages and help output.
164 const char *za_name;
167 * The Lua type this argument should have (e.g. LUA_TSTRING,
168 * LUA_TBOOLEAN) see the lua_type() function documentation for a
169 * complete list. Calling a function with an argument that does
170 * not match the expected type will result in the program terminating.
172 const int za_lua_type;
173 } zcp_arg_t;
175 void zcp_parse_args(lua_State *, const char *, const zcp_arg_t *,
176 const zcp_arg_t *);
177 int zcp_nvlist_to_lua(lua_State *, nvlist_t *, char *, int);
178 int zcp_dataset_hold_error(lua_State *, dsl_pool_t *, const char *, int);
179 struct dsl_dataset *zcp_dataset_hold(lua_State *, dsl_pool_t *,
180 const char *, void *);
182 typedef int (zcp_lib_func_t)(lua_State *);
183 typedef struct zcp_lib_info {
184 const char *name;
185 zcp_lib_func_t *func;
186 const zcp_arg_t pargs[4];
187 const zcp_arg_t kwargs[2];
188 } zcp_lib_info_t;
190 #ifdef __cplusplus
192 #endif
194 #endif /* _SYS_ZCP_H */