xref: /freebsd/sys/contrib/openzfs/man/man8/zfs-program.8 (revision 716fd348e01c5f2ba125f878a634a753436c2994)
116038816SMartin Matuska.\"
2eda14cbcSMatt Macy.\" This file and its contents are supplied under the terms of the
3eda14cbcSMatt Macy.\" Common Development and Distribution License ("CDDL"), version 1.0.
4eda14cbcSMatt Macy.\" You may only use this file in accordance with the terms of version
5eda14cbcSMatt Macy.\" 1.0 of the CDDL.
6eda14cbcSMatt Macy.\"
7eda14cbcSMatt Macy.\" A full copy of the text of the CDDL should have accompanied this
8eda14cbcSMatt Macy.\" source.  A copy of the CDDL is also available via the Internet at
9eda14cbcSMatt Macy.\" http://www.illumos.org/license/CDDL.
10eda14cbcSMatt Macy.\"
11eda14cbcSMatt Macy.\" Copyright (c) 2016, 2019 by Delphix. All Rights Reserved.
12eda14cbcSMatt Macy.\" Copyright (c) 2019, 2020 by Christian Schwarz. All Rights Reserved.
13eda14cbcSMatt Macy.\" Copyright 2020 Joyent, Inc.
14eda14cbcSMatt Macy.\"
1516038816SMartin Matuska.Dd May 27, 2021
16eda14cbcSMatt Macy.Dt ZFS-PROGRAM 8
17eda14cbcSMatt Macy.Os
1816038816SMartin Matuska.
19eda14cbcSMatt Macy.Sh NAME
207877fdebSMatt Macy.Nm zfs-program
2116038816SMartin Matuska.Nd execute ZFS channel programs
22eda14cbcSMatt Macy.Sh SYNOPSIS
237877fdebSMatt Macy.Nm zfs
247877fdebSMatt Macy.Cm program
25eda14cbcSMatt Macy.Op Fl jn
26eda14cbcSMatt Macy.Op Fl t Ar instruction-limit
27eda14cbcSMatt Macy.Op Fl m Ar memory-limit
28eda14cbcSMatt Macy.Ar pool
29eda14cbcSMatt Macy.Ar script
3016038816SMartin Matuska.Op Ar script arguments
3116038816SMartin Matuska.
32eda14cbcSMatt Macy.Sh DESCRIPTION
33eda14cbcSMatt MacyThe ZFS channel program interface allows ZFS administrative operations to be
34eda14cbcSMatt Macyrun programmatically as a Lua script.
35eda14cbcSMatt MacyThe entire script is executed atomically, with no other administrative
36eda14cbcSMatt Macyoperations taking effect concurrently.
37eda14cbcSMatt MacyA library of ZFS calls is made available to channel program scripts.
38eda14cbcSMatt MacyChannel programs may only be run with root privileges.
39eda14cbcSMatt Macy.Pp
40eda14cbcSMatt MacyA modified version of the Lua 5.2 interpreter is used to run channel program
41eda14cbcSMatt Macyscripts.
4216038816SMartin MatuskaThe Lua 5.2 manual can be found at
43eda14cbcSMatt Macy.Lk http://www.lua.org/manual/5.2/
44eda14cbcSMatt Macy.Pp
45eda14cbcSMatt MacyThe channel program given by
46eda14cbcSMatt Macy.Ar script
47eda14cbcSMatt Macywill be run on
48eda14cbcSMatt Macy.Ar pool ,
49eda14cbcSMatt Macyand any attempts to access or modify other pools will cause an error.
5016038816SMartin Matuska.
51eda14cbcSMatt Macy.Sh OPTIONS
52eda14cbcSMatt Macy.Bl -tag -width "-t"
53eda14cbcSMatt Macy.It Fl j
5416038816SMartin MatuskaDisplay channel program output in JSON format.
5516038816SMartin MatuskaWhen this flag is specified and standard output is empty -
5616038816SMartin Matuskachannel program encountered an error.
5716038816SMartin MatuskaThe details of such an error will be printed to standard error in plain text.
58eda14cbcSMatt Macy.It Fl n
59eda14cbcSMatt MacyExecutes a read-only channel program, which runs faster.
60eda14cbcSMatt MacyThe program cannot change on-disk state by calling functions from the
61eda14cbcSMatt Macyzfs.sync submodule.
62eda14cbcSMatt MacyThe program can be used to gather information such as properties and
63eda14cbcSMatt Macydetermining if changes would succeed (zfs.check.*).
64eda14cbcSMatt MacyWithout this flag, all pending changes must be synced to disk before a
65eda14cbcSMatt Macychannel program can complete.
66eda14cbcSMatt Macy.It Fl t Ar instruction-limit
67eda14cbcSMatt MacyLimit the number of Lua instructions to execute.
68eda14cbcSMatt MacyIf a channel program executes more than the specified number of instructions,
69eda14cbcSMatt Macyit will be stopped and an error will be returned.
70eda14cbcSMatt MacyThe default limit is 10 million instructions, and it can be set to a maximum of
71eda14cbcSMatt Macy100 million instructions.
72eda14cbcSMatt Macy.It Fl m Ar memory-limit
73eda14cbcSMatt MacyMemory limit, in bytes.
74eda14cbcSMatt MacyIf a channel program attempts to allocate more memory than the given limit, it
75eda14cbcSMatt Macywill be stopped and an error returned.
76*716fd348SMartin MatuskaThe default memory limit is 10 MiB, and can be set to a maximum of 100 MiB.
77eda14cbcSMatt Macy.El
78eda14cbcSMatt Macy.Pp
79eda14cbcSMatt MacyAll remaining argument strings will be passed directly to the Lua script as
80eda14cbcSMatt Macydescribed in the
81eda14cbcSMatt Macy.Sx LUA INTERFACE
82eda14cbcSMatt Macysection below.
8316038816SMartin Matuska.
84eda14cbcSMatt Macy.Sh LUA INTERFACE
85eda14cbcSMatt MacyA channel program can be invoked either from the command line, or via a library
86eda14cbcSMatt Macycall to
87eda14cbcSMatt Macy.Fn lzc_channel_program .
8816038816SMartin Matuska.
89eda14cbcSMatt Macy.Ss Arguments
90eda14cbcSMatt MacyArguments passed to the channel program are converted to a Lua table.
91eda14cbcSMatt MacyIf invoked from the command line, extra arguments to the Lua script will be
92eda14cbcSMatt Macyaccessible as an array stored in the argument table with the key 'argv':
9316038816SMartin Matuska.Bd -literal -compact -offset indent
94eda14cbcSMatt Macyargs = ...
95eda14cbcSMatt Macyargv = args["argv"]
96eda14cbcSMatt Macy-- argv == {1="arg1", 2="arg2", ...}
97eda14cbcSMatt Macy.Ed
98eda14cbcSMatt Macy.Pp
99*716fd348SMartin MatuskaIf invoked from the libzfs interface, an arbitrary argument list can be
100eda14cbcSMatt Macypassed to the channel program, which is accessible via the same
101*716fd348SMartin Matuska.Qq Li ...
102*716fd348SMartin Matuskasyntax in Lua:
10316038816SMartin Matuska.Bd -literal -compact -offset indent
104eda14cbcSMatt Macyargs = ...
105eda14cbcSMatt Macy-- args == {"foo"="bar", "baz"={...}, ...}
106eda14cbcSMatt Macy.Ed
107eda14cbcSMatt Macy.Pp
108eda14cbcSMatt MacyNote that because Lua arrays are 1-indexed, arrays passed to Lua from the
109*716fd348SMartin Matuskalibzfs interface will have their indices incremented by 1.
110eda14cbcSMatt MacyThat is, the element
111eda14cbcSMatt Macyin
112eda14cbcSMatt Macy.Va arr[0]
113eda14cbcSMatt Macyin a C array passed to a channel program will be stored in
114eda14cbcSMatt Macy.Va arr[1]
115eda14cbcSMatt Macywhen accessed from Lua.
11616038816SMartin Matuska.
117eda14cbcSMatt Macy.Ss Return Values
118eda14cbcSMatt MacyLua return statements take the form:
11916038816SMartin Matuska.Dl return ret0, ret1, ret2, ...
120eda14cbcSMatt Macy.Pp
121eda14cbcSMatt MacyReturn statements returning multiple values are permitted internally in a
122eda14cbcSMatt Macychannel program script, but attempting to return more than one value from the
123eda14cbcSMatt Macytop level of the channel program is not permitted and will throw an error.
124eda14cbcSMatt MacyHowever, tables containing multiple values can still be returned.
125eda14cbcSMatt MacyIf invoked from the command line, a return statement:
12616038816SMartin Matuska.Bd -literal -compact -offset indent
127eda14cbcSMatt Macya = {foo="bar", baz=2}
128eda14cbcSMatt Macyreturn a
129eda14cbcSMatt Macy.Ed
130eda14cbcSMatt Macy.Pp
131eda14cbcSMatt MacyWill be output formatted as:
13216038816SMartin Matuska.Bd -literal -compact -offset indent
133eda14cbcSMatt MacyChannel program fully executed with return value:
134eda14cbcSMatt Macy    return:
135eda14cbcSMatt Macy        baz: 2
136eda14cbcSMatt Macy        foo: 'bar'
137eda14cbcSMatt Macy.Ed
13816038816SMartin Matuska.
139eda14cbcSMatt Macy.Ss Fatal Errors
140eda14cbcSMatt MacyIf the channel program encounters a fatal error while running, a non-zero exit
141eda14cbcSMatt Macystatus will be returned.
142eda14cbcSMatt MacyIf more information about the error is available, a singleton list will be
143eda14cbcSMatt Macyreturned detailing the error:
14416038816SMartin Matuska.Dl error: \&"error string, including Lua stack trace"
145eda14cbcSMatt Macy.Pp
146eda14cbcSMatt MacyIf a fatal error is returned, the channel program may have not executed at all,
147eda14cbcSMatt Macymay have partially executed, or may have fully executed but failed to pass a
148eda14cbcSMatt Macyreturn value back to userland.
149eda14cbcSMatt Macy.Pp
150eda14cbcSMatt MacyIf the channel program exhausts an instruction or memory limit, a fatal error
151eda14cbcSMatt Macywill be generated and the program will be stopped, leaving the program partially
152eda14cbcSMatt Macyexecuted.
153eda14cbcSMatt MacyNo attempt is made to reverse or undo any operations already performed.
154eda14cbcSMatt MacyNote that because both the instruction count and amount of memory used by a
155eda14cbcSMatt Macychannel program are deterministic when run against the same inputs and
156eda14cbcSMatt Macyfilesystem state, as long as a channel program has run successfully once, you
157eda14cbcSMatt Macycan guarantee that it will finish successfully against a similar size system.
158eda14cbcSMatt Macy.Pp
159eda14cbcSMatt MacyIf a channel program attempts to return too large a value, the program will
160eda14cbcSMatt Macyfully execute but exit with a nonzero status code and no return value.
161eda14cbcSMatt Macy.Pp
162eda14cbcSMatt Macy.Em Note :
163eda14cbcSMatt MacyZFS API functions do not generate Fatal Errors when correctly invoked, they
164eda14cbcSMatt Macyreturn an error code and the channel program continues executing.
165eda14cbcSMatt MacySee the
166eda14cbcSMatt Macy.Sx ZFS API
167eda14cbcSMatt Macysection below for function-specific details on error return codes.
16816038816SMartin Matuska.
169eda14cbcSMatt Macy.Ss Lua to C Value Conversion
170*716fd348SMartin MatuskaWhen invoking a channel program via the libzfs interface, it is necessary to
171eda14cbcSMatt Macytranslate arguments and return values from Lua values to their C equivalents,
172eda14cbcSMatt Macyand vice-versa.
173eda14cbcSMatt Macy.Pp
174eda14cbcSMatt MacyThere is a correspondence between nvlist values in C and Lua tables.
175eda14cbcSMatt MacyA Lua table which is returned from the channel program will be recursively
176eda14cbcSMatt Macyconverted to an nvlist, with table values converted to their natural
177eda14cbcSMatt Macyequivalents:
17816038816SMartin Matuska.TS
17916038816SMartin Matuskacw3 l c l .
180eda14cbcSMatt Macy	string	->	string
181eda14cbcSMatt Macy	number	->	int64
182eda14cbcSMatt Macy	boolean	->	boolean_value
183eda14cbcSMatt Macy	nil	->	boolean (no value)
184eda14cbcSMatt Macy	table	->	nvlist
18516038816SMartin Matuska.TE
186eda14cbcSMatt Macy.Pp
187eda14cbcSMatt MacyLikewise, table keys are replaced by string equivalents as follows:
18816038816SMartin Matuska.TS
18916038816SMartin Matuskacw3 l c l .
190eda14cbcSMatt Macy	string	->	no change
191eda14cbcSMatt Macy	number	->	signed decimal string ("%lld")
192eda14cbcSMatt Macy	boolean	->	"true" | "false"
19316038816SMartin Matuska.TE
194eda14cbcSMatt Macy.Pp
195eda14cbcSMatt MacyAny collision of table key strings (for example, the string "true" and a
196eda14cbcSMatt Macytrue boolean value) will cause a fatal error.
197eda14cbcSMatt Macy.Pp
198eda14cbcSMatt MacyLua numbers are represented internally as signed 64-bit integers.
19916038816SMartin Matuska.
200eda14cbcSMatt Macy.Sh LUA STANDARD LIBRARY
201eda14cbcSMatt MacyThe following Lua built-in base library functions are available:
20216038816SMartin Matuska.TS
20316038816SMartin Matuskacw3 l l l l .
20416038816SMartin Matuska	assert	rawlen	collectgarbage	rawget
20516038816SMartin Matuska	error	rawset	getmetatable	select
20616038816SMartin Matuska	ipairs	setmetatable	next	tonumber
20716038816SMartin Matuska	pairs	tostring	rawequal	type
20816038816SMartin Matuska.TE
209eda14cbcSMatt Macy.Pp
210eda14cbcSMatt MacyAll functions in the
211eda14cbcSMatt Macy.Em coroutine ,
212eda14cbcSMatt Macy.Em string ,
213eda14cbcSMatt Macyand
214eda14cbcSMatt Macy.Em table
215eda14cbcSMatt Macybuilt-in submodules are also available.
216eda14cbcSMatt MacyA complete list and documentation of these modules is available in the Lua
217eda14cbcSMatt Macymanual.
218eda14cbcSMatt Macy.Pp
219eda14cbcSMatt MacyThe following functions base library functions have been disabled and are
220eda14cbcSMatt Macynot available for use in channel programs:
22116038816SMartin Matuska.TS
22216038816SMartin Matuskacw3 l l l l l l .
22316038816SMartin Matuska	dofile	loadfile	load	pcall	print	xpcall
22416038816SMartin Matuska.TE
22516038816SMartin Matuska.
226eda14cbcSMatt Macy.Sh ZFS API
22716038816SMartin Matuska.
228eda14cbcSMatt Macy.Ss Function Arguments
229eda14cbcSMatt MacyEach API function takes a fixed set of required positional arguments and
230eda14cbcSMatt Macyoptional keyword arguments.
231eda14cbcSMatt MacyFor example, the destroy function takes a single positional string argument
232eda14cbcSMatt Macy(the name of the dataset to destroy) and an optional "defer" keyword boolean
233eda14cbcSMatt Macyargument.
234eda14cbcSMatt MacyWhen using parentheses to specify the arguments to a Lua function, only
235eda14cbcSMatt Macypositional arguments can be used:
23616038816SMartin Matuska.Dl Sy zfs.sync.destroy Ns Pq \&"rpool@snap"
237eda14cbcSMatt Macy.Pp
238eda14cbcSMatt MacyTo use keyword arguments, functions must be called with a single argument that
239eda14cbcSMatt Macyis a Lua table containing entries mapping integers to positional arguments and
240eda14cbcSMatt Macystrings to keyword arguments:
24116038816SMartin Matuska.Dl Sy zfs.sync.destroy Ns Pq {1="rpool@snap", defer=true}
242eda14cbcSMatt Macy.Pp
243eda14cbcSMatt MacyThe Lua language allows curly braces to be used in place of parenthesis as
244eda14cbcSMatt Macysyntactic sugar for this calling convention:
24516038816SMartin Matuska.Dl Sy zfs.sync.snapshot Ns {"rpool@snap", defer=true}
24616038816SMartin Matuska.
247eda14cbcSMatt Macy.Ss Function Return Values
248eda14cbcSMatt MacyIf an API function succeeds, it returns 0.
249eda14cbcSMatt MacyIf it fails, it returns an error code and the channel program continues
250eda14cbcSMatt Macyexecuting.
251eda14cbcSMatt MacyAPI functions do not generate Fatal Errors except in the case of an
252eda14cbcSMatt Macyunrecoverable internal file system error.
253eda14cbcSMatt Macy.Pp
254eda14cbcSMatt MacyIn addition to returning an error code, some functions also return extra
255eda14cbcSMatt Macydetails describing what caused the error.
256eda14cbcSMatt MacyThis extra description is given as a second return value, and will always be a
257eda14cbcSMatt MacyLua table, or Nil if no error details were returned.
258eda14cbcSMatt MacyDifferent keys will exist in the error details table depending on the function
259eda14cbcSMatt Macyand error case.
260eda14cbcSMatt MacyAny such function may be called expecting a single return value:
26116038816SMartin Matuska.Dl errno = Sy zfs.sync.promote Ns Pq dataset
262eda14cbcSMatt Macy.Pp
263eda14cbcSMatt MacyOr, the error details can be retrieved:
26416038816SMartin Matuska.Bd -literal -compact -offset indent
26516038816SMartin Matuska.No errno, details = Sy zfs.sync.promote Ns Pq dataset
266eda14cbcSMatt Macyif (errno == EEXIST) then
267eda14cbcSMatt Macy    assert(details ~= Nil)
268eda14cbcSMatt Macy    list_of_conflicting_snapshots = details
269eda14cbcSMatt Macyend
270eda14cbcSMatt Macy.Ed
271eda14cbcSMatt Macy.Pp
272eda14cbcSMatt MacyThe following global aliases for API function error return codes are defined
273eda14cbcSMatt Macyfor use in channel programs:
27416038816SMartin Matuska.TS
27516038816SMartin Matuskacw3 l l l l l l l .
27616038816SMartin Matuska	EPERM	ECHILD	ENODEV	ENOSPC	ENOENT	EAGAIN	ENOTDIR
27716038816SMartin Matuska	ESPIPE	ESRCH	ENOMEM	EISDIR	EROFS	EINTR	EACCES
27816038816SMartin Matuska	EINVAL	EMLINK	EIO	EFAULT	ENFILE	EPIPE	ENXIO
27916038816SMartin Matuska	ENOTBLK	EMFILE	EDOM	E2BIG	EBUSY	ENOTTY	ERANGE
28016038816SMartin Matuska	ENOEXEC	EEXIST	ETXTBSY	EDQUOT	EBADF	EXDEV	EFBIG
28116038816SMartin Matuska.TE
28216038816SMartin Matuska.
283eda14cbcSMatt Macy.Ss API Functions
28416038816SMartin MatuskaFor detailed descriptions of the exact behavior of any ZFS administrative
285eda14cbcSMatt Macyoperations, see the main
286184c1b94SMartin Matuska.Xr zfs 8
287eda14cbcSMatt Macymanual page.
288eda14cbcSMatt Macy.Bl -tag -width "xx"
28916038816SMartin Matuska.It Fn zfs.debug msg
290eda14cbcSMatt MacyRecord a debug message in the zfs_dbgmsg log.
291eda14cbcSMatt MacyA log of these messages can be printed via mdb's "::zfs_dbgmsg" command, or
29216038816SMartin Matuskacan be monitored live by running
29316038816SMartin Matuska.Dl dtrace -n 'zfs-dbgmsg{trace(stringof(arg0))}'
294eda14cbcSMatt Macy.Pp
29516038816SMartin Matuska.Bl -tag -compact -width "property (string)"
29616038816SMartin Matuska.It Ar msg Pq string
297eda14cbcSMatt MacyDebug message to be printed.
29816038816SMartin Matuska.El
29916038816SMartin Matuska.It Fn zfs.exists dataset
300eda14cbcSMatt MacyReturns true if the given dataset exists, or false if it doesn't.
301eda14cbcSMatt MacyA fatal error will be thrown if the dataset is not in the target pool.
302eda14cbcSMatt MacyThat is, in a channel program running on rpool,
30316038816SMartin Matuska.Sy zfs.exists Ns Pq \&"rpool/nonexistent_fs"
30416038816SMartin Matuskareturns false, but
30516038816SMartin Matuska.Sy zfs.exists Ns Pq \&"somepool/fs_that_may_exist"
30616038816SMartin Matuskawill error.
307eda14cbcSMatt Macy.Pp
30816038816SMartin Matuska.Bl -tag -compact -width "property (string)"
30916038816SMartin Matuska.It Ar dataset Pq string
310eda14cbcSMatt MacyDataset to check for existence.
311eda14cbcSMatt MacyMust be in the target pool.
31216038816SMartin Matuska.El
31316038816SMartin Matuska.It Fn zfs.get_prop dataset property
314eda14cbcSMatt MacyReturns two values.
315eda14cbcSMatt MacyFirst, a string, number or table containing the property value for the given
316eda14cbcSMatt Macydataset.
317eda14cbcSMatt MacySecond, a string containing the source of the property (i.e. the name of the
318eda14cbcSMatt Macydataset in which it was set or nil if it is readonly).
319eda14cbcSMatt MacyThrows a Lua error if the dataset is invalid or the property doesn't exist.
320eda14cbcSMatt MacyNote that Lua only supports int64 number types whereas ZFS number properties
321eda14cbcSMatt Macyare uint64.
32216038816SMartin MatuskaThis means very large values (like GUIDs) may wrap around and appear negative.
323eda14cbcSMatt Macy.Pp
32416038816SMartin Matuska.Bl -tag -compact -width "property (string)"
32516038816SMartin Matuska.It Ar dataset Pq string
326eda14cbcSMatt MacyFilesystem or snapshot path to retrieve properties from.
32716038816SMartin Matuska.It Ar property Pq string
328eda14cbcSMatt MacyName of property to retrieve.
32916038816SMartin MatuskaAll filesystem, snapshot and volume properties are supported except for
33016038816SMartin Matuska.Sy mounted
33116038816SMartin Matuskaand
33216038816SMartin Matuska.Sy iscsioptions .
33316038816SMartin MatuskaAlso supports the
33416038816SMartin Matuska.Sy written@ Ns Ar snap
33516038816SMartin Matuskaand
33616038816SMartin Matuska.Sy written# Ns Ar bookmark
33716038816SMartin Matuskaproperties and the
33816038816SMartin Matuska.Ao Sy user Ns | Ns Sy group Ac Ns Ao Sy quota Ns | Ns Sy used Ac Ns Sy @ Ns Ar id
33916038816SMartin Matuskaproperties, though the id must be in numeric form.
34016038816SMartin Matuska.El
341eda14cbcSMatt Macy.El
342eda14cbcSMatt Macy.Bl -tag -width "xx"
343eda14cbcSMatt Macy.It Sy zfs.sync submodule
344eda14cbcSMatt MacyThe sync submodule contains functions that modify the on-disk state.
345eda14cbcSMatt MacyThey are executed in "syncing context".
346eda14cbcSMatt Macy.Pp
347eda14cbcSMatt MacyThe available sync submodule functions are as follows:
348eda14cbcSMatt Macy.Bl -tag -width "xx"
34916038816SMartin Matuska.It Sy zfs.sync.destroy Ns Pq Ar dataset , Op Ar defer Ns = Ns Sy true Ns | Ns Sy false
350eda14cbcSMatt MacyDestroy the given dataset.
351eda14cbcSMatt MacyReturns 0 on successful destroy, or a nonzero error code if the dataset could
352eda14cbcSMatt Macynot be destroyed (for example, if the dataset has any active children or
353eda14cbcSMatt Macyclones).
354eda14cbcSMatt Macy.Pp
35516038816SMartin Matuska.Bl -tag -compact -width "newbookmark (string)"
35616038816SMartin Matuska.It Ar dataset Pq string
357eda14cbcSMatt MacyFilesystem or snapshot to be destroyed.
35816038816SMartin Matuska.It Op Ar defer Pq boolean
359eda14cbcSMatt MacyValid only for destroying snapshots.
360eda14cbcSMatt MacyIf set to true, and the snapshot has holds or clones, allows the snapshot to be
361eda14cbcSMatt Macymarked for deferred deletion rather than failing.
36216038816SMartin Matuska.El
36316038816SMartin Matuska.It Fn zfs.sync.inherit dataset property
364eda14cbcSMatt MacyClears the specified property in the given dataset, causing it to be inherited
365eda14cbcSMatt Macyfrom an ancestor, or restored to the default if no ancestor property is set.
366eda14cbcSMatt MacyThe
36716038816SMartin Matuska.Nm zfs Cm inherit Fl S
368eda14cbcSMatt Macyoption has not been implemented.
369eda14cbcSMatt MacyReturns 0 on success, or a nonzero error code if the property could not be
370eda14cbcSMatt Macycleared.
371eda14cbcSMatt Macy.Pp
37216038816SMartin Matuska.Bl -tag -compact -width "newbookmark (string)"
37316038816SMartin Matuska.It Ar dataset Pq string
374eda14cbcSMatt MacyFilesystem or snapshot containing the property to clear.
37516038816SMartin Matuska.It Ar property Pq string
376eda14cbcSMatt MacyThe property to clear.
377eda14cbcSMatt MacyAllowed properties are the same as those for the
378eda14cbcSMatt Macy.Nm zfs Cm inherit
379eda14cbcSMatt Macycommand.
38016038816SMartin Matuska.El
38116038816SMartin Matuska.It Fn zfs.sync.promote dataset
382eda14cbcSMatt MacyPromote the given clone to a filesystem.
383eda14cbcSMatt MacyReturns 0 on successful promotion, or a nonzero error code otherwise.
384eda14cbcSMatt MacyIf EEXIST is returned, the second return value will be an array of the clone's
385eda14cbcSMatt Macysnapshots whose names collide with snapshots of the parent filesystem.
386eda14cbcSMatt Macy.Pp
38716038816SMartin Matuska.Bl -tag -compact -width "newbookmark (string)"
38816038816SMartin Matuska.It Ar dataset Pq string
389eda14cbcSMatt MacyClone to be promoted.
39016038816SMartin Matuska.El
39116038816SMartin Matuska.It Fn zfs.sync.rollback filesystem
392eda14cbcSMatt MacyRollback to the previous snapshot for a dataset.
393eda14cbcSMatt MacyReturns 0 on successful rollback, or a nonzero error code otherwise.
394eda14cbcSMatt MacyRollbacks can be performed on filesystems or zvols, but not on snapshots
395eda14cbcSMatt Macyor mounted datasets.
396eda14cbcSMatt MacyEBUSY is returned in the case where the filesystem is mounted.
397eda14cbcSMatt Macy.Pp
39816038816SMartin Matuska.Bl -tag -compact -width "newbookmark (string)"
39916038816SMartin Matuska.It Ar filesystem Pq string
400eda14cbcSMatt MacyFilesystem to rollback.
40116038816SMartin Matuska.El
40216038816SMartin Matuska.It Fn zfs.sync.set_prop dataset property value
403eda14cbcSMatt MacySets the given property on a dataset.
404eda14cbcSMatt MacyCurrently only user properties are supported.
405eda14cbcSMatt MacyReturns 0 if the property was set, or a nonzero error code otherwise.
406eda14cbcSMatt Macy.Pp
40716038816SMartin Matuska.Bl -tag -compact -width "newbookmark (string)"
40816038816SMartin Matuska.It Ar dataset Pq string
409eda14cbcSMatt MacyThe dataset where the property will be set.
41016038816SMartin Matuska.It Ar property Pq string
411eda14cbcSMatt MacyThe property to set.
41216038816SMartin Matuska.It Ar value Pq string
413eda14cbcSMatt MacyThe value of the property to be set.
41416038816SMartin Matuska.El
41516038816SMartin Matuska.It Fn zfs.sync.snapshot dataset
416eda14cbcSMatt MacyCreate a snapshot of a filesystem.
417eda14cbcSMatt MacyReturns 0 if the snapshot was successfully created,
418eda14cbcSMatt Macyand a nonzero error code otherwise.
419eda14cbcSMatt Macy.Pp
420eda14cbcSMatt MacyNote: Taking a snapshot will fail on any pool older than legacy version 27.
421eda14cbcSMatt MacyTo enable taking snapshots from ZCP scripts, the pool must be upgraded.
422eda14cbcSMatt Macy.Pp
42316038816SMartin Matuska.Bl -tag -compact -width "newbookmark (string)"
42416038816SMartin Matuska.It Ar dataset Pq string
425eda14cbcSMatt MacyName of snapshot to create.
42616038816SMartin Matuska.El
42716038816SMartin Matuska.It Fn zfs.sync.bookmark source newbookmark
428eda14cbcSMatt MacyCreate a bookmark of an existing source snapshot or bookmark.
429eda14cbcSMatt MacyReturns 0 if the new bookmark was successfully created,
430eda14cbcSMatt Macyand a nonzero error code otherwise.
431eda14cbcSMatt Macy.Pp
432eda14cbcSMatt MacyNote: Bookmarking requires the corresponding pool feature to be enabled.
433eda14cbcSMatt Macy.Pp
43416038816SMartin Matuska.Bl -tag -compact -width "newbookmark (string)"
43516038816SMartin Matuska.It Ar source Pq string
436eda14cbcSMatt MacyFull name of the existing snapshot or bookmark.
43716038816SMartin Matuska.It Ar newbookmark Pq string
438eda14cbcSMatt MacyFull name of the new bookmark.
439eda14cbcSMatt Macy.El
44016038816SMartin Matuska.El
441eda14cbcSMatt Macy.It Sy zfs.check submodule
44216038816SMartin MatuskaFor each function in the
44316038816SMartin Matuska.Sy zfs.sync
44416038816SMartin Matuskasubmodule, there is a corresponding
44516038816SMartin Matuska.Sy zfs.check
446eda14cbcSMatt Macyfunction which performs a "dry run" of the same operation.
44716038816SMartin MatuskaEach takes the same arguments as its
44816038816SMartin Matuska.Sy zfs.sync
44916038816SMartin Matuskacounterpart and returns 0 if the operation would succeed,
45016038816SMartin Matuskaor a non-zero error code if it would fail, along with any other error details.
451eda14cbcSMatt MacyThat is, each has the same behavior as the corresponding sync function except
452eda14cbcSMatt Macyfor actually executing the requested change.
453eda14cbcSMatt MacyFor example,
45416038816SMartin Matuska.Fn zfs.check.destroy \&"fs"
455eda14cbcSMatt Macyreturns 0 if
45616038816SMartin Matuska.Fn zfs.sync.destroy \&"fs"
457eda14cbcSMatt Macywould successfully destroy the dataset.
458eda14cbcSMatt Macy.Pp
45916038816SMartin MatuskaThe available
46016038816SMartin Matuska.Sy zfs.check
46116038816SMartin Matuskafunctions are:
46216038816SMartin Matuska.Bl -tag -compact -width "xx"
46316038816SMartin Matuska.It Sy zfs.check.destroy Ns Pq Ar dataset , Op Ar defer Ns = Ns Sy true Ns | Ns Sy false
46416038816SMartin Matuska.It Fn zfs.check.promote dataset
46516038816SMartin Matuska.It Fn zfs.check.rollback filesystem
46616038816SMartin Matuska.It Fn zfs.check.set_property dataset property value
46716038816SMartin Matuska.It Fn zfs.check.snapshot dataset
468eda14cbcSMatt Macy.El
469eda14cbcSMatt Macy.It Sy zfs.list submodule
470eda14cbcSMatt MacyThe zfs.list submodule provides functions for iterating over datasets and
471eda14cbcSMatt Macyproperties.
472eda14cbcSMatt MacyRather than returning tables, these functions act as Lua iterators, and are
473eda14cbcSMatt Macygenerally used as follows:
47416038816SMartin Matuska.Bd -literal -compact -offset indent
47516038816SMartin Matuska.No for child in Fn zfs.list.children \&"rpool" No do
476eda14cbcSMatt Macy    ...
477eda14cbcSMatt Macyend
478eda14cbcSMatt Macy.Ed
479eda14cbcSMatt Macy.Pp
48016038816SMartin MatuskaThe available
48116038816SMartin Matuska.Sy zfs.list
48216038816SMartin Matuskafunctions are:
483eda14cbcSMatt Macy.Bl -tag -width "xx"
48416038816SMartin Matuska.It Fn zfs.list.clones snapshot
485eda14cbcSMatt MacyIterate through all clones of the given snapshot.
486eda14cbcSMatt Macy.Pp
48716038816SMartin Matuska.Bl -tag -compact -width "snapshot (string)"
48816038816SMartin Matuska.It Ar snapshot Pq string
489eda14cbcSMatt MacyMust be a valid snapshot path in the current pool.
49016038816SMartin Matuska.El
49116038816SMartin Matuska.It Fn zfs.list.snapshots dataset
492eda14cbcSMatt MacyIterate through all snapshots of the given dataset.
49316038816SMartin MatuskaEach snapshot is returned as a string containing the full dataset name,
49416038816SMartin Matuskae.g. "pool/fs@snap".
495eda14cbcSMatt Macy.Pp
49616038816SMartin Matuska.Bl -tag -compact -width "snapshot (string)"
49716038816SMartin Matuska.It Ar dataset Pq string
498eda14cbcSMatt MacyMust be a valid filesystem or volume.
49916038816SMartin Matuska.El
50016038816SMartin Matuska.It Fn zfs.list.children dataset
501eda14cbcSMatt MacyIterate through all direct children of the given dataset.
50216038816SMartin MatuskaEach child is returned as a string containing the full dataset name,
50316038816SMartin Matuskae.g. "pool/fs/child".
504eda14cbcSMatt Macy.Pp
50516038816SMartin Matuska.Bl -tag -compact -width "snapshot (string)"
50616038816SMartin Matuska.It Ar dataset Pq string
507eda14cbcSMatt MacyMust be a valid filesystem or volume.
50816038816SMartin Matuska.El
50916038816SMartin Matuska.It Fn zfs.list.bookmarks dataset
51016038816SMartin MatuskaIterate through all bookmarks of the given dataset.
51116038816SMartin MatuskaEach bookmark is returned as a string containing the full dataset name,
51216038816SMartin Matuskae.g. "pool/fs#bookmark".
513eda14cbcSMatt Macy.Pp
51416038816SMartin Matuska.Bl -tag -compact -width "snapshot (string)"
51516038816SMartin Matuska.It Ar dataset Pq string
516eda14cbcSMatt MacyMust be a valid filesystem or volume.
51716038816SMartin Matuska.El
51816038816SMartin Matuska.It Fn zfs.list.holds snapshot
51916038816SMartin MatuskaIterate through all user holds on the given snapshot.
52016038816SMartin MatuskaEach hold is returned
521eda14cbcSMatt Macyas a pair of the hold's tag and the timestamp (in seconds since the epoch) at
522eda14cbcSMatt Macywhich it was created.
523eda14cbcSMatt Macy.Pp
52416038816SMartin Matuska.Bl -tag -compact -width "snapshot (string)"
52516038816SMartin Matuska.It Ar snapshot Pq string
526eda14cbcSMatt MacyMust be a valid snapshot.
52716038816SMartin Matuska.El
52816038816SMartin Matuska.It Fn zfs.list.properties dataset
529eda14cbcSMatt MacyAn alias for zfs.list.user_properties (see relevant entry).
530eda14cbcSMatt Macy.Pp
53116038816SMartin Matuska.Bl -tag -compact -width "snapshot (string)"
53216038816SMartin Matuska.It Ar dataset Pq string
533eda14cbcSMatt MacyMust be a valid filesystem, snapshot, or volume.
53416038816SMartin Matuska.El
53516038816SMartin Matuska.It Fn zfs.list.user_properties dataset
53616038816SMartin MatuskaIterate through all user properties for the given dataset.
53716038816SMartin MatuskaFor each step of the iteration, output the property name, its value,
53816038816SMartin Matuskaand its source.
539eda14cbcSMatt MacyThrows a Lua error if the dataset is invalid.
540eda14cbcSMatt Macy.Pp
54116038816SMartin Matuska.Bl -tag -compact -width "snapshot (string)"
54216038816SMartin Matuska.It Ar dataset Pq string
543eda14cbcSMatt MacyMust be a valid filesystem, snapshot, or volume.
54416038816SMartin Matuska.El
54516038816SMartin Matuska.It Fn zfs.list.system_properties dataset
546eda14cbcSMatt MacyReturns an array of strings, the names of the valid system (non-user defined)
547eda14cbcSMatt Macyproperties for the given dataset.
548eda14cbcSMatt MacyThrows a Lua error if the dataset is invalid.
549eda14cbcSMatt Macy.Pp
55016038816SMartin Matuska.Bl -tag -compact -width "snapshot (string)"
55116038816SMartin Matuska.It Ar dataset Pq string
552eda14cbcSMatt MacyMust be a valid filesystem, snapshot or volume.
553eda14cbcSMatt Macy.El
554eda14cbcSMatt Macy.El
55516038816SMartin Matuska.El
55616038816SMartin Matuska.
557eda14cbcSMatt Macy.Sh EXAMPLES
55816038816SMartin Matuska.
559eda14cbcSMatt Macy.Ss Example 1
560eda14cbcSMatt MacyThe following channel program recursively destroys a filesystem and all its
561eda14cbcSMatt Macysnapshots and children in a naive manner.
562eda14cbcSMatt MacyNote that this does not involve any error handling or reporting.
563eda14cbcSMatt Macy.Bd -literal -offset indent
564eda14cbcSMatt Macyfunction destroy_recursive(root)
565eda14cbcSMatt Macy    for child in zfs.list.children(root) do
566eda14cbcSMatt Macy        destroy_recursive(child)
567eda14cbcSMatt Macy    end
568eda14cbcSMatt Macy    for snap in zfs.list.snapshots(root) do
569eda14cbcSMatt Macy        zfs.sync.destroy(snap)
570eda14cbcSMatt Macy    end
571eda14cbcSMatt Macy    zfs.sync.destroy(root)
572eda14cbcSMatt Macyend
573eda14cbcSMatt Macydestroy_recursive("pool/somefs")
574eda14cbcSMatt Macy.Ed
57516038816SMartin Matuska.
576eda14cbcSMatt Macy.Ss Example 2
577eda14cbcSMatt MacyA more verbose and robust version of the same channel program, which
578eda14cbcSMatt Macyproperly detects and reports errors, and also takes the dataset to destroy
579eda14cbcSMatt Macyas a command line argument, would be as follows:
580eda14cbcSMatt Macy.Bd -literal -offset indent
581eda14cbcSMatt Macysucceeded = {}
582eda14cbcSMatt Macyfailed = {}
583eda14cbcSMatt Macy
584eda14cbcSMatt Macyfunction destroy_recursive(root)
585eda14cbcSMatt Macy    for child in zfs.list.children(root) do
586eda14cbcSMatt Macy        destroy_recursive(child)
587eda14cbcSMatt Macy    end
588eda14cbcSMatt Macy    for snap in zfs.list.snapshots(root) do
589eda14cbcSMatt Macy        err = zfs.sync.destroy(snap)
590eda14cbcSMatt Macy        if (err ~= 0) then
591eda14cbcSMatt Macy            failed[snap] = err
592eda14cbcSMatt Macy        else
593eda14cbcSMatt Macy            succeeded[snap] = err
594eda14cbcSMatt Macy        end
595eda14cbcSMatt Macy    end
596eda14cbcSMatt Macy    err = zfs.sync.destroy(root)
597eda14cbcSMatt Macy    if (err ~= 0) then
598eda14cbcSMatt Macy        failed[root] = err
599eda14cbcSMatt Macy    else
600eda14cbcSMatt Macy        succeeded[root] = err
601eda14cbcSMatt Macy    end
602eda14cbcSMatt Macyend
603eda14cbcSMatt Macy
604eda14cbcSMatt Macyargs = ...
605eda14cbcSMatt Macyargv = args["argv"]
606eda14cbcSMatt Macy
607eda14cbcSMatt Macydestroy_recursive(argv[1])
608eda14cbcSMatt Macy
609eda14cbcSMatt Macyresults = {}
610eda14cbcSMatt Macyresults["succeeded"] = succeeded
611eda14cbcSMatt Macyresults["failed"] = failed
612eda14cbcSMatt Macyreturn results
613eda14cbcSMatt Macy.Ed
61416038816SMartin Matuska.
615eda14cbcSMatt Macy.Ss Example 3
616eda14cbcSMatt MacyThe following function performs a forced promote operation by attempting to
617eda14cbcSMatt Macypromote the given clone and destroying any conflicting snapshots.
618eda14cbcSMatt Macy.Bd -literal -offset indent
619eda14cbcSMatt Macyfunction force_promote(ds)
620eda14cbcSMatt Macy   errno, details = zfs.check.promote(ds)
621eda14cbcSMatt Macy   if (errno == EEXIST) then
622eda14cbcSMatt Macy       assert(details ~= Nil)
623eda14cbcSMatt Macy       for i, snap in ipairs(details) do
624eda14cbcSMatt Macy           zfs.sync.destroy(ds .. "@" .. snap)
625eda14cbcSMatt Macy       end
626eda14cbcSMatt Macy   elseif (errno ~= 0) then
627eda14cbcSMatt Macy       return errno
628eda14cbcSMatt Macy   end
629eda14cbcSMatt Macy   return zfs.sync.promote(ds)
630eda14cbcSMatt Macyend
631eda14cbcSMatt Macy.Ed
632