mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
OpenZFS 8592 - ZFS channel programs - rollback
Authored by: Brad Lewis <brad.lewis@delphix.com> Reviewed by: Chris Williamson <chris.williamson@delphix.com> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Approved by: Robert Mustacchi <rm@joyent.com> Ported-by: Don Brady <don.brady@delphix.com> 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
This commit is contained in:
committed by
Brian Behlendorf
parent
475eca4908
commit
af07368986
@@ -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;
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user