MFV r323912: 8592 ZFS channel programs - rollback
illumos/illumos-gate@000cce6b6f
000cce6b6f
https://www.illumos.org/issues/8592
ZFS channel programs should be able to perform a rollback. This logic will
probably look pretty similar to zfs.sync.destroy().
Reviewed by: Chris Williamson <chris.williamson@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Author: Brad Lewis <brad.lewis@delphix.com>
MFC after: 5 weeks
X-MFC after: r324163
This commit is contained in:
parent
f080f1459e
commit
904b3b0775
@ -8,9 +8,9 @@
|
||||
.\" http://www.illumos.org/license/CDDL.
|
||||
.\"
|
||||
.\"
|
||||
.\" Copyright (c) 2016 by Delphix. All Rights Reserved.
|
||||
.\" Copyright (c) 2016, 2017 by Delphix. All rights reserved.
|
||||
.\"
|
||||
.Dd September 28, 2017
|
||||
.Dd October 02, 2016
|
||||
.Dt ZFS-PROGRAM 1M
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -361,6 +361,17 @@ dataset (string)
|
||||
.Bd -ragged -compact -offset "xxxx"
|
||||
Clone to be promoted.
|
||||
.Ed
|
||||
.It Em zfs.sync.rollback(filesystem)
|
||||
Rollback to the previous snapshot for a dataset.
|
||||
Returns 0 on successful rollback, or a nonzero error code otherwise.
|
||||
Rollbacks can be performed on filesystems or zvols, but not on snapshots
|
||||
or mounted datasets.
|
||||
EBUSY is returned in the case where the filesystem is mounted.
|
||||
.Pp
|
||||
filesystem (string)
|
||||
.Bd -ragged -compact -offset "xxxx"
|
||||
Filesystem to rollback.
|
||||
.Ed
|
||||
.El
|
||||
.It Sy zfs.check submodule
|
||||
For each function in the zfs.sync submodule, there is a corresponding zfs.check
|
||||
@ -380,6 +391,7 @@ The available zfs.check functions are:
|
||||
.Bl -tag -width "xx"
|
||||
.It Em zfs.check.destroy(dataset, [defer=true|false])
|
||||
.It Em zfs.check.promote(dataset)
|
||||
.It Em zfs.check.rollback(filesystem)
|
||||
.El
|
||||
.It Sy zfs.list submodule
|
||||
The zfs.list submodule provides functions for iterating over datasets and
|
||||
|
@ -22,7 +22,7 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Portions Copyright (c) 2011 Martin Matuska <mm@FreeBSD.org>
|
||||
* 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.
|
||||
@ -2538,14 +2538,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;
|
||||
@ -2653,7 +2646,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;
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2015 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2011, 2017 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
|
||||
* Copyright (c) 2013 Steven Hartland. All rights reserved.
|
||||
* Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
|
||||
@ -237,6 +237,13 @@ typedef struct dsl_dataset_promote_arg {
|
||||
cred_t *cr;
|
||||
} dsl_dataset_promote_arg_t;
|
||||
|
||||
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;
|
||||
|
||||
/*
|
||||
* The max length of a temporary tag prefix is the number of hex digits
|
||||
* required to express UINT64_MAX plus one for the hyphen.
|
||||
@ -375,6 +382,9 @@ void dsl_dataset_set_refreservation_sync_impl(dsl_dataset_t *ds,
|
||||
void dsl_dataset_zapify(dsl_dataset_t *ds, dmu_tx_t *tx);
|
||||
boolean_t dsl_dataset_is_zapified(dsl_dataset_t *ds);
|
||||
boolean_t dsl_dataset_has_resume_receive_state(dsl_dataset_t *ds);
|
||||
|
||||
int dsl_dataset_rollback_check(void *arg, dmu_tx_t *tx);
|
||||
void dsl_dataset_rollback_sync(void *arg, dmu_tx_t *tx);
|
||||
int dsl_dataset_rollback(const char *fsname, const char *tosnap, void *owner,
|
||||
nvlist_t *result);
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2016, 2017 by Delphix. All rights reserved.
|
||||
*/
|
||||
|
||||
#include "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},
|
||||
{NULL, 0}
|
||||
},
|
||||
.kwargs = {
|
||||
{NULL, 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
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user