aboutsummaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorBrad Lewis <[email protected]>2018-02-08 09:20:33 -0700
committerBrian Behlendorf <[email protected]>2018-02-08 15:29:14 -0800
commitaf0736898669eabe31e47405023c80b9a58e5e6c (patch)
tree05c127fee11e5e639326d68f10216bd9ca228265 /module
parent475eca4908731a87fff1be500ba4d7b011d392e4 (diff)
OpenZFS 8592 - ZFS channel programs - rollback
Authored by: Brad Lewis <[email protected]> Reviewed by: Chris Williamson <[email protected]> Reviewed by: Matthew Ahrens <[email protected]> Approved by: Robert Mustacchi <[email protected]> Ported-by: Don Brady <[email protected]> ZFS channel programs should be able to perform a rollback. OpenZFS-issue: https://www.illumos.org/issues/8592 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/d46b5ed6
Diffstat (limited to 'module')
-rw-r--r--module/zfs/dsl_dataset.c13
-rw-r--r--module/zfs/zcp_synctask.c34
2 files changed, 36 insertions, 11 deletions
diff --git a/module/zfs/dsl_dataset.c b/module/zfs/dsl_dataset.c
index af3dc230a..a35ba1f7e 100644
--- a/module/zfs/dsl_dataset.c
+++ b/module/zfs/dsl_dataset.c
@@ -21,7 +21,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011, 2016 by Delphix. All rights reserved.
+ * Copyright (c) 2011, 2017 by Delphix. All rights reserved.
* Copyright (c) 2014, Joyent, Inc. All rights reserved.
* Copyright (c) 2014 RackTop Systems.
* Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
@@ -2526,14 +2526,7 @@ dsl_dataset_handoff_check(dsl_dataset_t *ds, void *owner, dmu_tx_t *tx)
return (0);
}
-typedef struct dsl_dataset_rollback_arg {
- const char *ddra_fsname;
- const char *ddra_tosnap;
- void *ddra_owner;
- nvlist_t *ddra_result;
-} dsl_dataset_rollback_arg_t;
-
-static int
+int
dsl_dataset_rollback_check(void *arg, dmu_tx_t *tx)
{
dsl_dataset_rollback_arg_t *ddra = arg;
@@ -2641,7 +2634,7 @@ dsl_dataset_rollback_check(void *arg, dmu_tx_t *tx)
return (0);
}
-static void
+void
dsl_dataset_rollback_sync(void *arg, dmu_tx_t *tx)
{
dsl_dataset_rollback_arg_t *ddra = arg;
diff --git a/module/zfs/zcp_synctask.c b/module/zfs/zcp_synctask.c
index 923d5ca67..93797e9f3 100644
--- a/module/zfs/zcp_synctask.c
+++ b/module/zfs/zcp_synctask.c
@@ -14,7 +14,7 @@
*/
/*
- * Copyright (c) 2016 by Delphix. All rights reserved.
+ * Copyright (c) 2016, 2017 by Delphix. All rights reserved.
*/
#include <sys/lua/lua.h>
@@ -177,6 +177,37 @@ zcp_synctask_promote(lua_State *state, boolean_t sync, nvlist_t *err_details)
return (err);
}
+static int zcp_synctask_rollback(lua_State *, boolean_t, nvlist_t *err_details);
+static zcp_synctask_info_t zcp_synctask_rollback_info = {
+ .name = "rollback",
+ .func = zcp_synctask_rollback,
+ .space_check = ZFS_SPACE_CHECK_RESERVED,
+ .blocks_modified = 1,
+ .pargs = {
+ {.za_name = "filesystem", .za_lua_type = LUA_TSTRING},
+ {0, 0}
+ },
+ .kwargs = {
+ {0, 0}
+ }
+};
+
+static int
+zcp_synctask_rollback(lua_State *state, boolean_t sync, nvlist_t *err_details)
+{
+ int err;
+ const char *dsname = lua_tostring(state, 1);
+ dsl_dataset_rollback_arg_t ddra = { 0 };
+
+ ddra.ddra_fsname = dsname;
+ ddra.ddra_result = err_details;
+
+ err = zcp_sync_task(state, dsl_dataset_rollback_check,
+ dsl_dataset_rollback_sync, &ddra, sync, dsname);
+
+ return (err);
+}
+
void
zcp_synctask_wrapper_cleanup(void *arg)
{
@@ -247,6 +278,7 @@ zcp_load_synctask_lib(lua_State *state, boolean_t sync)
zcp_synctask_info_t *zcp_synctask_funcs[] = {
&zcp_synctask_destroy_info,
&zcp_synctask_promote_info,
+ &zcp_synctask_rollback_info,
NULL
};