185 lines
4.6 KiB
C
185 lines
4.6 KiB
C
/*
|
|
* CDDL HEADER START
|
|
*
|
|
* This file and its contents are supplied under the terms of the
|
|
* Common Development and Distribution License ("CDDL"), version 1.0.
|
|
* You may only use this file in accordance with the terms of version
|
|
* 1.0 of the CDDL.
|
|
*
|
|
* A full copy of the text of the CDDL should have accompanied this
|
|
* source. A copy of the CDDL is also available via the Internet at
|
|
* http://www.illumos.org/license/CDDL.
|
|
*
|
|
* CDDL HEADER END
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2016, 2018 by Delphix. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _SYS_ZCP_H
|
|
#define _SYS_ZCP_H
|
|
|
|
#include <sys/dmu_tx.h>
|
|
#include <sys/dsl_pool.h>
|
|
|
|
#include <sys/lua/lua.h>
|
|
#include <sys/lua/lualib.h>
|
|
#include <sys/lua/lauxlib.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define ZCP_RUN_INFO_KEY "runinfo"
|
|
|
|
extern unsigned long zfs_lua_max_instrlimit;
|
|
extern unsigned long zfs_lua_max_memlimit;
|
|
|
|
int zcp_argerror(lua_State *, int, const char *, ...);
|
|
|
|
int zcp_eval(const char *, const char *, boolean_t, uint64_t, uint64_t,
|
|
nvpair_t *, nvlist_t *);
|
|
|
|
int zcp_load_list_lib(lua_State *);
|
|
|
|
int zcp_load_synctask_lib(lua_State *, boolean_t);
|
|
|
|
typedef void (zcp_cleanup_t)(void *);
|
|
typedef struct zcp_cleanup_handler {
|
|
zcp_cleanup_t *zch_cleanup_func;
|
|
void *zch_cleanup_arg;
|
|
list_node_t zch_node;
|
|
} zcp_cleanup_handler_t;
|
|
|
|
typedef struct zcp_alloc_arg {
|
|
boolean_t aa_must_succeed;
|
|
int64_t aa_alloc_remaining;
|
|
int64_t aa_alloc_limit;
|
|
} zcp_alloc_arg_t;
|
|
|
|
typedef struct zcp_run_info {
|
|
dsl_pool_t *zri_pool;
|
|
|
|
/*
|
|
* An estimate of the total amount of space consumed by all
|
|
* synctasks we have successfully performed so far in this
|
|
* channel program. Used to generate ENOSPC errors for syncfuncs.
|
|
*/
|
|
int zri_space_used;
|
|
|
|
/*
|
|
* The credentials of the thread which originally invoked the channel
|
|
* program. Since channel programs are always invoked from the synctask
|
|
* thread they should always do permissions checks against this cred
|
|
* rather than the 'current' thread's.
|
|
*/
|
|
cred_t *zri_cred;
|
|
|
|
/*
|
|
* The tx in which this channel program is running.
|
|
*/
|
|
dmu_tx_t *zri_tx;
|
|
|
|
/*
|
|
* The maximum number of Lua instructions the channel program is allowed
|
|
* to execute. If it takes longer than this it will time out. A value
|
|
* of 0 indicates no instruction limit.
|
|
*/
|
|
uint64_t zri_maxinstrs;
|
|
|
|
/*
|
|
* The number of Lua instructions the channel program has executed.
|
|
*/
|
|
uint64_t zri_curinstrs;
|
|
|
|
/*
|
|
* Boolean indicating whether or not the channel program exited
|
|
* because it timed out.
|
|
*/
|
|
boolean_t zri_timed_out;
|
|
|
|
/*
|
|
* Channel program was canceled by user
|
|
*/
|
|
boolean_t zri_canceled;
|
|
|
|
/*
|
|
* Boolean indicating whether or not we are running in syncing
|
|
* context.
|
|
*/
|
|
boolean_t zri_sync;
|
|
|
|
/*
|
|
* List of currently registered cleanup handlers, which will be
|
|
* triggered in the event of a fatal error.
|
|
*/
|
|
list_t zri_cleanup_handlers;
|
|
|
|
/*
|
|
* The Lua state context of our channel program.
|
|
*/
|
|
lua_State *zri_state;
|
|
|
|
/*
|
|
* Lua memory allocator arguments.
|
|
*/
|
|
zcp_alloc_arg_t *zri_allocargs;
|
|
|
|
/*
|
|
* Contains output values from zcp script or error string.
|
|
*/
|
|
nvlist_t *zri_outnvl;
|
|
|
|
/*
|
|
* The errno number returned to caller of zcp_eval().
|
|
*/
|
|
int zri_result;
|
|
} zcp_run_info_t;
|
|
|
|
zcp_run_info_t *zcp_run_info(lua_State *);
|
|
zcp_cleanup_handler_t *zcp_register_cleanup(lua_State *, zcp_cleanup_t, void *);
|
|
void zcp_deregister_cleanup(lua_State *, zcp_cleanup_handler_t *);
|
|
void zcp_cleanup(lua_State *);
|
|
|
|
/*
|
|
* Argument parsing routines for channel program callback functions.
|
|
*/
|
|
typedef struct zcp_arg {
|
|
/*
|
|
* The name of this argument. For keyword arguments this is the name
|
|
* functions will use to set the argument. For positional arguments
|
|
* the name has no programmatic meaning, but will appear in error
|
|
* messages and help output.
|
|
*/
|
|
const char *za_name;
|
|
|
|
/*
|
|
* The Lua type this argument should have (e.g. LUA_TSTRING,
|
|
* LUA_TBOOLEAN) see the lua_type() function documentation for a
|
|
* complete list. Calling a function with an argument that does
|
|
* not match the expected type will result in the program terminating.
|
|
*/
|
|
const int za_lua_type;
|
|
} zcp_arg_t;
|
|
|
|
void zcp_parse_args(lua_State *, const char *, const zcp_arg_t *,
|
|
const zcp_arg_t *);
|
|
int zcp_nvlist_to_lua(lua_State *, nvlist_t *, char *, int);
|
|
int zcp_dataset_hold_error(lua_State *, dsl_pool_t *, const char *, int);
|
|
struct dsl_dataset *zcp_dataset_hold(lua_State *, dsl_pool_t *,
|
|
const char *, void *);
|
|
|
|
typedef int (zcp_lib_func_t)(lua_State *);
|
|
typedef struct zcp_lib_info {
|
|
const char *name;
|
|
zcp_lib_func_t *func;
|
|
const zcp_arg_t pargs[4];
|
|
const zcp_arg_t kwargs[2];
|
|
} zcp_lib_info_t;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _SYS_ZCP_H */
|