]> git.proxmox.com Git - mirror_zfs.git/blame - include/sys/zcp.h
OpenZFS 8604 - Simplify snapshots unmounting code
[mirror_zfs.git] / include / sys / zcp.h
CommitLineData
d99a0153
CW
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/*
234c91c5 17 * Copyright (c) 2016, 2017 by Delphix. All rights reserved.
d99a0153
CW
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 <sys/lua/lua.h>
27#include <sys/lua/lualib.h>
28#include <sys/lua/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 *, uint64_t, uint64_t, nvpair_t *,
42 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 *);
49
50typedef struct zcp_run_info {
51 dsl_pool_t *zri_pool;
52
53 /*
54 * An estimate of the total ammount of space consumed by all
55 * synctasks we have successfully performed so far in this
56 * channel program. Used to generate ENOSPC errors for syncfuncs.
57 */
58 int zri_space_used;
59
60 /*
61 * The credentials of the thread which originally invoked the channel
62 * program. Since channel programs are always invoked from the synctask
63 * thread they should always do permissions checks against this cred
64 * rather than the 'current' thread's.
65 */
66 cred_t *zri_cred;
67
68 /*
69 * The tx in which this channel program is running.
70 */
71 dmu_tx_t *zri_tx;
72
73 /*
74 * The maximum number of Lua instructions the channel program is allowed
75 * to execute. If it takes longer than this it will time out. A value
76 * of 0 indicates no instruction limit.
77 */
78 uint64_t zri_maxinstrs;
79
80 /*
81 * The number of Lua instructions the channel program has executed.
82 */
83 uint64_t zri_curinstrs;
84
85 /*
86 * Boolean indicating whether or not the channel program exited
87 * because it timed out.
88 */
89 boolean_t zri_timed_out;
90
91 /*
92 * The currently registered cleanup function, which will be called
93 * with the stored argument if a fatal error occurs.
94 */
95 zcp_cleanup_t *zri_cleanup;
96 void *zri_cleanup_arg;
97} zcp_run_info_t;
98
99zcp_run_info_t *zcp_run_info(lua_State *);
100void zcp_register_cleanup(lua_State *, zcp_cleanup_t, void *);
101void zcp_clear_cleanup(lua_State *);
102void zcp_cleanup(lua_State *);
103
104/*
105 * Argument parsing routines for channel program callback functions.
106 */
107typedef struct zcp_arg {
108 /*
109 * The name of this argument. For keyword arguments this is the name
110 * functions will use to set the argument. For positional arguments
111 * the name has no programatic meaning, but will appear in error
112 * messages and help output.
113 */
114 const char *za_name;
115
116 /*
117 * The Lua type this argument should have (e.g. LUA_TSTRING,
118 * LUA_TBOOLEAN) see the lua_type() function documentation for a
119 * complete list. Calling a function with an argument that does
120 * not match the expected type will result in the program terminating.
121 */
122 const int za_lua_type;
123} zcp_arg_t;
124
125void zcp_parse_args(lua_State *, const char *, const zcp_arg_t *,
126 const zcp_arg_t *);
127int zcp_nvlist_to_lua(lua_State *, nvlist_t *, char *, int);
128int zcp_dataset_hold_error(lua_State *, dsl_pool_t *, const char *, int);
129struct dsl_dataset *zcp_dataset_hold(lua_State *, dsl_pool_t *,
130 const char *, void *);
131
132typedef int (zcp_lib_func_t)(lua_State *);
133typedef struct zcp_lib_info {
134 const char *name;
135 zcp_lib_func_t *func;
136 const zcp_arg_t pargs[4];
137 const zcp_arg_t kwargs[2];
138} zcp_lib_info_t;
139
d99a0153
CW
140#ifdef __cplusplus
141}
142#endif
143
144#endif /* _SYS_ZCP_H */