aboutsummaryrefslogtreecommitdiffstats
path: root/module/zfs/zcp_synctask.c
diff options
context:
space:
mode:
authorChristian Schwarz <[email protected]>2020-01-16 02:15:05 +0100
committerBrian Behlendorf <[email protected]>2020-02-11 13:19:17 -0800
commit948f0c44196d2fa254399ec0d716c2ba0bb9ffad (patch)
tree87307e1d30a2f0601f64bb75603aedeb70f73b54 /module/zfs/zcp_synctask.c
parenta73f361fdb2c0a7778e70b482e316054fc2d8630 (diff)
zcp: add zfs.sync.bookmark
Add support for bookmark creation and cloning. Reviewed-by: Matt Ahrens <[email protected]> Reviewed-by: Paul Dagnelie <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Christian Schwarz <[email protected]> Closes #9571
Diffstat (limited to 'module/zfs/zcp_synctask.c')
-rw-r--r--module/zfs/zcp_synctask.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/module/zfs/zcp_synctask.c b/module/zfs/zcp_synctask.c
index 22fec6f3f..a6f7a04c7 100644
--- a/module/zfs/zcp_synctask.c
+++ b/module/zfs/zcp_synctask.c
@@ -15,6 +15,7 @@
/*
* Copyright (c) 2016, 2017 by Delphix. All rights reserved.
+ * Copyright (c) 2019, 2020 by Christian Schwarz. All rights reserved.
* Copyright 2020 Joyent, Inc.
*/
@@ -370,6 +371,49 @@ zcp_synctask_inherit_prop(lua_State *state, boolean_t sync,
return (err);
}
+static int zcp_synctask_bookmark(lua_State *, boolean_t, nvlist_t *);
+static zcp_synctask_info_t zcp_synctask_bookmark_info = {
+ .name = "bookmark",
+ .func = zcp_synctask_bookmark,
+ .pargs = {
+ {.za_name = "snapshot | bookmark", .za_lua_type = LUA_TSTRING},
+ {.za_name = "bookmark", .za_lua_type = LUA_TSTRING},
+ {NULL, 0}
+ },
+ .kwargs = {
+ {NULL, 0}
+ },
+ .space_check = ZFS_SPACE_CHECK_NORMAL,
+ .blocks_modified = 1,
+};
+
+/* ARGSUSED */
+static int
+zcp_synctask_bookmark(lua_State *state, boolean_t sync, nvlist_t *err_details)
+{
+ int err;
+ const char *source = lua_tostring(state, 1);
+ const char *new = lua_tostring(state, 2);
+
+ nvlist_t *bmarks = fnvlist_alloc();
+ fnvlist_add_string(bmarks, new, source);
+
+ zcp_cleanup_handler_t *zch = zcp_register_cleanup(state,
+ (zcp_cleanup_t *)&fnvlist_free, bmarks);
+
+ dsl_bookmark_create_arg_t dbca = {
+ .dbca_bmarks = bmarks,
+ .dbca_errors = NULL,
+ };
+ err = zcp_sync_task(state, dsl_bookmark_create_check,
+ dsl_bookmark_create_sync, &dbca, sync, source);
+
+ zcp_deregister_cleanup(state, zch);
+ fnvlist_free(bmarks);
+
+ return (err);
+}
+
static int
zcp_synctask_wrapper(lua_State *state)
{
@@ -439,6 +483,7 @@ zcp_load_synctask_lib(lua_State *state, boolean_t sync)
&zcp_synctask_rollback_info,
&zcp_synctask_snapshot_info,
&zcp_synctask_inherit_prop_info,
+ &zcp_synctask_bookmark_info,
NULL
};