1168404Spjd/*
2168404Spjd * CDDL HEADER START
3168404Spjd *
4168404Spjd * The contents of this file are subject to the terms of the
5168404Spjd * Common Development and Distribution License (the "License").
6168404Spjd * You may not use this file except in compliance with the License.
7168404Spjd *
8168404Spjd * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9168404Spjd * or http://www.opensolaris.org/os/licensing.
10168404Spjd * See the License for the specific language governing permissions
11168404Spjd * and limitations under the License.
12168404Spjd *
13168404Spjd * When distributing Covered Code, include this CDDL HEADER in each
14168404Spjd * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15168404Spjd * If applicable, add the following below this CDDL HEADER, with the
16168404Spjd * fields enclosed by brackets "[]" replaced with your own identifying
17168404Spjd * information: Portions Copyright [yyyy] [name of copyright owner]
18168404Spjd *
19168404Spjd * CDDL HEADER END
20168404Spjd */
21219089Spjd
22168404Spjd/*
23219089Spjd * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24268647Sdelphij * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
25228103Smm * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
26265744Sdelphij * Copyright (c) 2013, Joyent, Inc. All rights reserved.
27235222Smm * Copyright (c) 2012, Martin Matuska <mm@FreeBSD.org>. All rights reserved.
28297112Smav * Copyright (c) 2014 Integros [integros.com]
29168404Spjd */
30168404Spjd
31219089Spjd/* Portions Copyright 2010 Robert Milkowski */
32219089Spjd
33168404Spjd#ifndef	_SYS_FS_ZFS_H
34168404Spjd#define	_SYS_FS_ZFS_H
35168404Spjd
36168404Spjd#include <sys/types.h>
37168404Spjd#include <sys/ioccom.h>
38185029Spjd#include <sys/time.h>
39168404Spjd
40168404Spjd#ifdef	__cplusplus
41168404Spjdextern "C" {
42168404Spjd#endif
43168404Spjd
44168404Spjd/*
45168404Spjd * Types and constants shared between userland and the kernel.
46168404Spjd */
47168404Spjd
48168404Spjd/*
49168404Spjd * Each dataset can be one of the following types.  These constants can be
50168404Spjd * combined into masks that can be passed to various functions.
51168404Spjd */
52168404Spjdtypedef enum {
53263407Sdelphij	ZFS_TYPE_FILESYSTEM	= (1 << 0),
54263407Sdelphij	ZFS_TYPE_SNAPSHOT	= (1 << 1),
55263407Sdelphij	ZFS_TYPE_VOLUME		= (1 << 2),
56263407Sdelphij	ZFS_TYPE_POOL		= (1 << 3),
57263407Sdelphij	ZFS_TYPE_BOOKMARK	= (1 << 4)
58168404Spjd} zfs_type_t;
59168404Spjd
60300028Savg/*
61300028Savg * NB: lzc_dataset_type should be updated whenever a new objset type is added,
62300028Savg * if it represents a real type of a dataset that can be created from userland.
63300028Savg */
64248571Smmtypedef enum dmu_objset_type {
65248571Smm	DMU_OST_NONE,
66248571Smm	DMU_OST_META,
67248571Smm	DMU_OST_ZFS,
68248571Smm	DMU_OST_ZVOL,
69248571Smm	DMU_OST_OTHER,			/* For testing only! */
70248571Smm	DMU_OST_ANY,			/* Be careful! */
71248571Smm	DMU_OST_NUMTYPES
72248571Smm} dmu_objset_type_t;
73248571Smm
74185029Spjd#define	ZFS_TYPE_DATASET	\
75168404Spjd	(ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME | ZFS_TYPE_SNAPSHOT)
76168404Spjd
77307122Smav/*
78307122Smav * All of these include the terminating NUL byte.
79307122Smav */
80219089Spjd#define	ZAP_MAXNAMELEN 256
81219089Spjd#define	ZAP_MAXVALUELEN (1024 * 8)
82219089Spjd#define	ZAP_OLDMAXVALUELEN 1024
83307122Smav#define	ZFS_MAX_DATASET_NAME_LEN 256
84219089Spjd
85168404Spjd/*
86185029Spjd * Dataset properties are identified by these constants and must be added to
87185029Spjd * the end of this list to ensure that external consumers are not affected
88185029Spjd * by the change. If you make any changes to this list, be sure to update
89168404Spjd * the property table in usr/src/common/zfs/zfs_prop.c.
90168404Spjd */
91168404Spjdtypedef enum {
92168404Spjd	ZFS_PROP_TYPE,
93168404Spjd	ZFS_PROP_CREATION,
94168404Spjd	ZFS_PROP_USED,
95168404Spjd	ZFS_PROP_AVAILABLE,
96168404Spjd	ZFS_PROP_REFERENCED,
97168404Spjd	ZFS_PROP_COMPRESSRATIO,
98168404Spjd	ZFS_PROP_MOUNTED,
99168404Spjd	ZFS_PROP_ORIGIN,
100168404Spjd	ZFS_PROP_QUOTA,
101168404Spjd	ZFS_PROP_RESERVATION,
102168404Spjd	ZFS_PROP_VOLSIZE,
103168404Spjd	ZFS_PROP_VOLBLOCKSIZE,
104168404Spjd	ZFS_PROP_RECORDSIZE,
105168404Spjd	ZFS_PROP_MOUNTPOINT,
106168404Spjd	ZFS_PROP_SHARENFS,
107168404Spjd	ZFS_PROP_CHECKSUM,
108168404Spjd	ZFS_PROP_COMPRESSION,
109168404Spjd	ZFS_PROP_ATIME,
110168404Spjd	ZFS_PROP_DEVICES,
111168404Spjd	ZFS_PROP_EXEC,
112168404Spjd	ZFS_PROP_SETUID,
113168404Spjd	ZFS_PROP_READONLY,
114168404Spjd	ZFS_PROP_ZONED,
115168404Spjd	ZFS_PROP_SNAPDIR,
116224174Smm	ZFS_PROP_ACLMODE,
117168404Spjd	ZFS_PROP_ACLINHERIT,
118168404Spjd	ZFS_PROP_CREATETXG,		/* not exposed to the user */
119168404Spjd	ZFS_PROP_NAME,			/* not exposed to the user */
120168404Spjd	ZFS_PROP_CANMOUNT,
121168404Spjd	ZFS_PROP_ISCSIOPTIONS,		/* not exposed to the user */
122168404Spjd	ZFS_PROP_XATTR,
123168404Spjd	ZFS_PROP_NUMCLONES,		/* not exposed to the user */
124168404Spjd	ZFS_PROP_COPIES,
125185029Spjd	ZFS_PROP_VERSION,
126185029Spjd	ZFS_PROP_UTF8ONLY,
127185029Spjd	ZFS_PROP_NORMALIZE,
128185029Spjd	ZFS_PROP_CASE,
129185029Spjd	ZFS_PROP_VSCAN,
130185029Spjd	ZFS_PROP_NBMAND,
131185029Spjd	ZFS_PROP_SHARESMB,
132185029Spjd	ZFS_PROP_REFQUOTA,
133185029Spjd	ZFS_PROP_REFRESERVATION,
134185029Spjd	ZFS_PROP_GUID,
135185029Spjd	ZFS_PROP_PRIMARYCACHE,
136185029Spjd	ZFS_PROP_SECONDARYCACHE,
137185029Spjd	ZFS_PROP_USEDSNAP,
138185029Spjd	ZFS_PROP_USEDDS,
139185029Spjd	ZFS_PROP_USEDCHILD,
140185029Spjd	ZFS_PROP_USEDREFRESERV,
141209962Smm	ZFS_PROP_USERACCOUNTING,	/* not exposed to the user */
142219089Spjd	ZFS_PROP_STMF_SHAREINFO,	/* not exposed to the user */
143219089Spjd	ZFS_PROP_DEFER_DESTROY,
144219089Spjd	ZFS_PROP_USERREFS,
145219089Spjd	ZFS_PROP_LOGBIAS,
146219089Spjd	ZFS_PROP_UNIQUE,		/* not exposed to the user */
147219089Spjd	ZFS_PROP_OBJSETID,		/* not exposed to the user */
148219089Spjd	ZFS_PROP_DEDUP,
149219089Spjd	ZFS_PROP_MLSLABEL,
150219089Spjd	ZFS_PROP_SYNC,
151223623Smm	ZFS_PROP_REFRATIO,
152228103Smm	ZFS_PROP_WRITTEN,
153228103Smm	ZFS_PROP_CLONES,
154247585Smm	ZFS_PROP_LOGICALUSED,
155247585Smm	ZFS_PROP_LOGICALREFERENCED,
156253819Sdelphij	ZFS_PROP_INCONSISTENT,		/* not exposed to the user */
157265678Smav	ZFS_PROP_VOLMODE,
158265744Sdelphij	ZFS_PROP_FILESYSTEM_LIMIT,
159265744Sdelphij	ZFS_PROP_SNAPSHOT_LIMIT,
160265744Sdelphij	ZFS_PROP_FILESYSTEM_COUNT,
161265744Sdelphij	ZFS_PROP_SNAPSHOT_COUNT,
162268647Sdelphij	ZFS_PROP_REDUNDANT_METADATA,
163268659Sdelphij	ZFS_PROP_PREV_SNAP,
164290756Smav	ZFS_PROP_RECEIVE_RESUME_TOKEN,
165185029Spjd	ZFS_NUM_PROPS
166168404Spjd} zfs_prop_t;
167168404Spjd
168209962Smmtypedef enum {
169209962Smm	ZFS_PROP_USERUSED,
170209962Smm	ZFS_PROP_USERQUOTA,
171209962Smm	ZFS_PROP_GROUPUSED,
172209962Smm	ZFS_PROP_GROUPQUOTA,
173209962Smm	ZFS_NUM_USERQUOTA_PROPS
174209962Smm} zfs_userquota_prop_t;
175209962Smm
176209962Smmextern const char *zfs_userquota_prop_prefixes[ZFS_NUM_USERQUOTA_PROPS];
177209962Smm
178185029Spjd/*
179185029Spjd * Pool properties are identified by these constants and must be added to the
180185029Spjd * end of this list to ensure that external consumers are not affected
181185029Spjd * by the change. If you make any changes to this list, be sure to update
182185029Spjd * the property table in usr/src/common/zfs/zpool_prop.c.
183185029Spjd */
184185029Spjdtypedef enum {
185185029Spjd	ZPOOL_PROP_NAME,
186185029Spjd	ZPOOL_PROP_SIZE,
187185029Spjd	ZPOOL_PROP_CAPACITY,
188185029Spjd	ZPOOL_PROP_ALTROOT,
189185029Spjd	ZPOOL_PROP_HEALTH,
190185029Spjd	ZPOOL_PROP_GUID,
191185029Spjd	ZPOOL_PROP_VERSION,
192185029Spjd	ZPOOL_PROP_BOOTFS,
193185029Spjd	ZPOOL_PROP_DELEGATION,
194185029Spjd	ZPOOL_PROP_AUTOREPLACE,
195185029Spjd	ZPOOL_PROP_CACHEFILE,
196185029Spjd	ZPOOL_PROP_FAILUREMODE,
197185029Spjd	ZPOOL_PROP_LISTSNAPS,
198219089Spjd	ZPOOL_PROP_AUTOEXPAND,
199219089Spjd	ZPOOL_PROP_DEDUPDITTO,
200219089Spjd	ZPOOL_PROP_DEDUPRATIO,
201219089Spjd	ZPOOL_PROP_FREE,
202219089Spjd	ZPOOL_PROP_ALLOCATED,
203219089Spjd	ZPOOL_PROP_READONLY,
204228103Smm	ZPOOL_PROP_COMMENT,
205236155Smm	ZPOOL_PROP_EXPANDSZ,
206236884Smm	ZPOOL_PROP_FREEING,
207269773Sdelphij	ZPOOL_PROP_FRAGMENTATION,
208268650Sdelphij	ZPOOL_PROP_LEAKED,
209276081Sdelphij	ZPOOL_PROP_MAXBLOCKSIZE,
210333196Savg	ZPOOL_PROP_TNAME,
211185029Spjd	ZPOOL_NUM_PROPS
212185029Spjd} zpool_prop_t;
213168404Spjd
214228103Smm/* Small enough to not hog a whole line of printout in zpool(1M). */
215228103Smm#define	ZPROP_MAX_COMMENT	32
216228103Smm
217185029Spjd#define	ZPROP_CONT		-2
218185029Spjd#define	ZPROP_INVAL		-1
219168404Spjd
220185029Spjd#define	ZPROP_VALUE		"value"
221185029Spjd#define	ZPROP_SOURCE		"source"
222185029Spjd
223168404Spjdtypedef enum {
224185029Spjd	ZPROP_SRC_NONE = 0x1,
225185029Spjd	ZPROP_SRC_DEFAULT = 0x2,
226185029Spjd	ZPROP_SRC_TEMPORARY = 0x4,
227185029Spjd	ZPROP_SRC_LOCAL = 0x8,
228219089Spjd	ZPROP_SRC_INHERITED = 0x10,
229219089Spjd	ZPROP_SRC_RECEIVED = 0x20
230185029Spjd} zprop_source_t;
231168404Spjd
232219089Spjd#define	ZPROP_SRC_ALL	0x3f
233168404Spjd
234219089Spjd#define	ZPROP_SOURCE_VAL_RECVD	"$recvd"
235219089Spjd#define	ZPROP_N_MORE_ERRORS	"N_MORE_ERRORS"
236219089Spjd/*
237219089Spjd * Dataset flag implemented as a special entry in the props zap object
238219089Spjd * indicating that the dataset has received properties on or after
239219089Spjd * SPA_VERSION_RECVD_PROPS. The first such receive blows away local properties
240219089Spjd * just as it did in earlier versions, and thereafter, local properties are
241219089Spjd * preserved.
242219089Spjd */
243219089Spjd#define	ZPROP_HAS_RECVD		"$hasrecvd"
244219089Spjd
245219089Spjdtypedef enum {
246219089Spjd	ZPROP_ERR_NOCLEAR = 0x1, /* failure to clear existing props */
247219089Spjd	ZPROP_ERR_NORESTORE = 0x2 /* failure to restore props on error */
248219089Spjd} zprop_errflags_t;
249219089Spjd
250185029Spjdtypedef int (*zprop_func)(int, void *);
251185029Spjd
252168404Spjd/*
253185029Spjd * Properties to be set on the root file system of a new pool
254185029Spjd * are stuffed into their own nvlist, which is then included in
255185029Spjd * the properties nvlist with the pool properties.
256168404Spjd */
257185029Spjd#define	ZPOOL_ROOTFS_PROPS	"root-props-nvl"
258185029Spjd
259185029Spjd/*
260185029Spjd * Dataset property functions shared between libzfs and kernel.
261185029Spjd */
262185029Spjdconst char *zfs_prop_default_string(zfs_prop_t);
263185029Spjduint64_t zfs_prop_default_numeric(zfs_prop_t);
264185029Spjdboolean_t zfs_prop_readonly(zfs_prop_t);
265185029Spjdboolean_t zfs_prop_inheritable(zfs_prop_t);
266185029Spjdboolean_t zfs_prop_setonce(zfs_prop_t);
267185029Spjdconst char *zfs_prop_to_name(zfs_prop_t);
268168404Spjdzfs_prop_t zfs_name_to_prop(const char *);
269168404Spjdboolean_t zfs_prop_user(const char *);
270219089Spjdboolean_t zfs_prop_userquota(const char *);
271185029Spjdint zfs_prop_index_to_string(zfs_prop_t, uint64_t, const char **);
272168404Spjdint zfs_prop_string_to_index(zfs_prop_t, const char *, uint64_t *);
273219089Spjduint64_t zfs_prop_random_value(zfs_prop_t, uint64_t seed);
274185029Spjdboolean_t zfs_prop_valid_for_type(int, zfs_type_t);
275168404Spjd
276168404Spjd/*
277185029Spjd * Pool property functions shared between libzfs and kernel.
278168404Spjd */
279185029Spjdzpool_prop_t zpool_name_to_prop(const char *);
280185029Spjdconst char *zpool_prop_to_name(zpool_prop_t);
281185029Spjdconst char *zpool_prop_default_string(zpool_prop_t);
282185029Spjduint64_t zpool_prop_default_numeric(zpool_prop_t);
283185029Spjdboolean_t zpool_prop_readonly(zpool_prop_t);
284236884Smmboolean_t zpool_prop_feature(const char *);
285236884Smmboolean_t zpool_prop_unsupported(const char *name);
286185029Spjdint zpool_prop_index_to_string(zpool_prop_t, uint64_t, const char **);
287185029Spjdint zpool_prop_string_to_index(zpool_prop_t, const char *, uint64_t *);
288219089Spjduint64_t zpool_prop_random_value(zpool_prop_t, uint64_t seed);
289168404Spjd
290168404Spjd/*
291185029Spjd * Definitions for the Delegation.
292185029Spjd */
293185029Spjdtypedef enum {
294185029Spjd	ZFS_DELEG_WHO_UNKNOWN = 0,
295185029Spjd	ZFS_DELEG_USER = 'u',
296185029Spjd	ZFS_DELEG_USER_SETS = 'U',
297185029Spjd	ZFS_DELEG_GROUP = 'g',
298185029Spjd	ZFS_DELEG_GROUP_SETS = 'G',
299185029Spjd	ZFS_DELEG_EVERYONE = 'e',
300185029Spjd	ZFS_DELEG_EVERYONE_SETS = 'E',
301185029Spjd	ZFS_DELEG_CREATE = 'c',
302185029Spjd	ZFS_DELEG_CREATE_SETS = 'C',
303185029Spjd	ZFS_DELEG_NAMED_SET = 's',
304185029Spjd	ZFS_DELEG_NAMED_SET_SETS = 'S'
305185029Spjd} zfs_deleg_who_type_t;
306185029Spjd
307185029Spjdtypedef enum {
308185029Spjd	ZFS_DELEG_NONE = 0,
309185029Spjd	ZFS_DELEG_PERM_LOCAL = 1,
310185029Spjd	ZFS_DELEG_PERM_DESCENDENT = 2,
311185029Spjd	ZFS_DELEG_PERM_LOCALDESCENDENT = 3,
312185029Spjd	ZFS_DELEG_PERM_CREATE = 4
313185029Spjd} zfs_deleg_inherit_t;
314185029Spjd
315185029Spjd#define	ZFS_DELEG_PERM_UID	"uid"
316185029Spjd#define	ZFS_DELEG_PERM_GID	"gid"
317185029Spjd#define	ZFS_DELEG_PERM_GROUPS	"groups"
318185029Spjd
319219089Spjd#define	ZFS_MLSLABEL_DEFAULT	"none"
320219089Spjd
321209962Smm#define	ZFS_SMB_ACL_SRC		"src"
322209962Smm#define	ZFS_SMB_ACL_TARGET	"target"
323209962Smm
324185029Spjdtypedef enum {
325185029Spjd	ZFS_CANMOUNT_OFF = 0,
326185029Spjd	ZFS_CANMOUNT_ON = 1,
327185029Spjd	ZFS_CANMOUNT_NOAUTO = 2
328185029Spjd} zfs_canmount_type_t;
329185029Spjd
330219089Spjdtypedef enum {
331219089Spjd	ZFS_LOGBIAS_LATENCY = 0,
332219089Spjd	ZFS_LOGBIAS_THROUGHPUT = 1
333219089Spjd} zfs_logbias_op_t;
334219089Spjd
335185029Spjdtypedef enum zfs_share_op {
336185029Spjd	ZFS_SHARE_NFS = 0,
337185029Spjd	ZFS_UNSHARE_NFS = 1,
338185029Spjd	ZFS_SHARE_SMB = 2,
339185029Spjd	ZFS_UNSHARE_SMB = 3
340185029Spjd} zfs_share_op_t;
341185029Spjd
342209962Smmtypedef enum zfs_smb_acl_op {
343209962Smm	ZFS_SMB_ACL_ADD,
344209962Smm	ZFS_SMB_ACL_REMOVE,
345209962Smm	ZFS_SMB_ACL_RENAME,
346209962Smm	ZFS_SMB_ACL_PURGE
347209962Smm} zfs_smb_acl_op_t;
348209962Smm
349185029Spjdtypedef enum zfs_cache_type {
350185029Spjd	ZFS_CACHE_NONE = 0,
351185029Spjd	ZFS_CACHE_METADATA = 1,
352185029Spjd	ZFS_CACHE_ALL = 2
353185029Spjd} zfs_cache_type_t;
354185029Spjd
355219089Spjdtypedef enum {
356219089Spjd	ZFS_SYNC_STANDARD = 0,
357219089Spjd	ZFS_SYNC_ALWAYS = 1,
358219089Spjd	ZFS_SYNC_DISABLED = 2
359219089Spjd} zfs_sync_type_t;
360185029Spjd
361265678Smavtypedef enum {
362265678Smav	ZFS_VOLMODE_DEFAULT = 0,
363265678Smav	ZFS_VOLMODE_GEOM = 1,
364265678Smav	ZFS_VOLMODE_DEV = 2,
365265678Smav	ZFS_VOLMODE_NONE = 3
366265678Smav} zfs_volmode_t;
367219089Spjd
368268647Sdelphijtypedef enum {
369268647Sdelphij	ZFS_REDUNDANT_METADATA_ALL,
370268647Sdelphij	ZFS_REDUNDANT_METADATA_MOST
371268647Sdelphij} zfs_redundant_metadata_type_t;
372268647Sdelphij
373185029Spjd/*
374168404Spjd * On-disk version number.
375168404Spjd */
376185029Spjd#define	SPA_VERSION_1			1ULL
377185029Spjd#define	SPA_VERSION_2			2ULL
378185029Spjd#define	SPA_VERSION_3			3ULL
379185029Spjd#define	SPA_VERSION_4			4ULL
380185029Spjd#define	SPA_VERSION_5			5ULL
381185029Spjd#define	SPA_VERSION_6			6ULL
382185029Spjd#define	SPA_VERSION_7			7ULL
383185029Spjd#define	SPA_VERSION_8			8ULL
384185029Spjd#define	SPA_VERSION_9			9ULL
385185029Spjd#define	SPA_VERSION_10			10ULL
386185029Spjd#define	SPA_VERSION_11			11ULL
387185029Spjd#define	SPA_VERSION_12			12ULL
388185029Spjd#define	SPA_VERSION_13			13ULL
389201143Sdelphij#define	SPA_VERSION_14			14ULL
390209962Smm#define	SPA_VERSION_15			15ULL
391219089Spjd#define	SPA_VERSION_16			16ULL
392219089Spjd#define	SPA_VERSION_17			17ULL
393219089Spjd#define	SPA_VERSION_18			18ULL
394219089Spjd#define	SPA_VERSION_19			19ULL
395219089Spjd#define	SPA_VERSION_20			20ULL
396219089Spjd#define	SPA_VERSION_21			21ULL
397219089Spjd#define	SPA_VERSION_22			22ULL
398219089Spjd#define	SPA_VERSION_23			23ULL
399219089Spjd#define	SPA_VERSION_24			24ULL
400219089Spjd#define	SPA_VERSION_25			25ULL
401219089Spjd#define	SPA_VERSION_26			26ULL
402219089Spjd#define	SPA_VERSION_27			27ULL
403219089Spjd#define	SPA_VERSION_28			28ULL
404236884Smm#define	SPA_VERSION_5000		5000ULL
405219089Spjd
406168404Spjd/*
407185029Spjd * When bumping up SPA_VERSION, make sure GRUB ZFS understands the on-disk
408219089Spjd * format change. Go to usr/src/grub/grub-0.97/stage2/{zfs-include/, fsys_zfs*},
409209962Smm * and do the appropriate changes.  Also bump the version number in
410209962Smm * usr/src/grub/capability.
411168404Spjd */
412236884Smm#define	SPA_VERSION			SPA_VERSION_5000
413236884Smm#define	SPA_VERSION_STRING		"5000"
414168404Spjd
415168404Spjd/*
416185029Spjd * Symbolic names for the changes that caused a SPA_VERSION switch.
417168404Spjd * Used in the code when checking for presence or absence of a feature.
418168404Spjd * Feel free to define multiple symbolic names for each version if there
419168404Spjd * were multiple changes to on-disk structures during that version.
420168404Spjd *
421185029Spjd * NOTE: When checking the current SPA_VERSION in your code, be sure
422168404Spjd *       to use spa_version() since it reports the version of the
423168404Spjd *       last synced uberblock.  Checking the in-flight version can
424168404Spjd *       be dangerous in some cases.
425168404Spjd */
426185029Spjd#define	SPA_VERSION_INITIAL		SPA_VERSION_1
427185029Spjd#define	SPA_VERSION_DITTO_BLOCKS	SPA_VERSION_2
428185029Spjd#define	SPA_VERSION_SPARES		SPA_VERSION_3
429219089Spjd#define	SPA_VERSION_RAIDZ2		SPA_VERSION_3
430219089Spjd#define	SPA_VERSION_BPOBJ_ACCOUNT	SPA_VERSION_3
431185029Spjd#define	SPA_VERSION_RAIDZ_DEFLATE	SPA_VERSION_3
432185029Spjd#define	SPA_VERSION_DNODE_BYTES		SPA_VERSION_3
433185029Spjd#define	SPA_VERSION_ZPOOL_HISTORY	SPA_VERSION_4
434185029Spjd#define	SPA_VERSION_GZIP_COMPRESSION	SPA_VERSION_5
435185029Spjd#define	SPA_VERSION_BOOTFS		SPA_VERSION_6
436185029Spjd#define	SPA_VERSION_SLOGS		SPA_VERSION_7
437185029Spjd#define	SPA_VERSION_DELEGATED_PERMS	SPA_VERSION_8
438185029Spjd#define	SPA_VERSION_FUID		SPA_VERSION_9
439185029Spjd#define	SPA_VERSION_REFRESERVATION	SPA_VERSION_9
440185029Spjd#define	SPA_VERSION_REFQUOTA		SPA_VERSION_9
441185029Spjd#define	SPA_VERSION_UNIQUE_ACCURATE	SPA_VERSION_9
442185029Spjd#define	SPA_VERSION_L2CACHE		SPA_VERSION_10
443185029Spjd#define	SPA_VERSION_NEXT_CLONES		SPA_VERSION_11
444185029Spjd#define	SPA_VERSION_ORIGIN		SPA_VERSION_11
445185029Spjd#define	SPA_VERSION_DSL_SCRUB		SPA_VERSION_11
446185029Spjd#define	SPA_VERSION_SNAP_PROPS		SPA_VERSION_12
447185029Spjd#define	SPA_VERSION_USED_BREAKDOWN	SPA_VERSION_13
448201143Sdelphij#define	SPA_VERSION_PASSTHROUGH_X	SPA_VERSION_14
449209962Smm#define	SPA_VERSION_USERSPACE		SPA_VERSION_15
450219089Spjd#define	SPA_VERSION_STMF_PROP		SPA_VERSION_16
451219089Spjd#define	SPA_VERSION_RAIDZ3		SPA_VERSION_17
452219089Spjd#define	SPA_VERSION_USERREFS		SPA_VERSION_18
453219089Spjd#define	SPA_VERSION_HOLES		SPA_VERSION_19
454219089Spjd#define	SPA_VERSION_ZLE_COMPRESSION	SPA_VERSION_20
455219089Spjd#define	SPA_VERSION_DEDUP		SPA_VERSION_21
456219089Spjd#define	SPA_VERSION_RECVD_PROPS		SPA_VERSION_22
457219089Spjd#define	SPA_VERSION_SLIM_ZIL		SPA_VERSION_23
458219089Spjd#define	SPA_VERSION_SA			SPA_VERSION_24
459219089Spjd#define	SPA_VERSION_SCAN		SPA_VERSION_25
460219089Spjd#define	SPA_VERSION_DIR_CLONES		SPA_VERSION_26
461219089Spjd#define	SPA_VERSION_DEADLISTS		SPA_VERSION_26
462219089Spjd#define	SPA_VERSION_FAST_SNAP		SPA_VERSION_27
463219089Spjd#define	SPA_VERSION_MULTI_REPLACE	SPA_VERSION_28
464236884Smm#define	SPA_VERSION_BEFORE_FEATURES	SPA_VERSION_28
465236884Smm#define	SPA_VERSION_FEATURES		SPA_VERSION_5000
466168404Spjd
467236884Smm#define	SPA_VERSION_IS_SUPPORTED(v) \
468236884Smm	(((v) >= SPA_VERSION_INITIAL && (v) <= SPA_VERSION_BEFORE_FEATURES) || \
469236884Smm	((v) >= SPA_VERSION_FEATURES && (v) <= SPA_VERSION))
470236884Smm
471168404Spjd/*
472185029Spjd * ZPL version - rev'd whenever an incompatible on-disk format change
473185029Spjd * occurs.  This is independent of SPA/DMU/ZAP versioning.  You must
474185029Spjd * also update the version_table[] and help message in zfs_prop.c.
475185029Spjd *
476185029Spjd * When changing, be sure to teach GRUB how to read the new format!
477219089Spjd * See usr/src/grub/grub-0.97/stage2/{zfs-include/,fsys_zfs*}
478185029Spjd */
479185029Spjd#define	ZPL_VERSION_1			1ULL
480185029Spjd#define	ZPL_VERSION_2			2ULL
481185029Spjd#define	ZPL_VERSION_3			3ULL
482209962Smm#define	ZPL_VERSION_4			4ULL
483219089Spjd#define	ZPL_VERSION_5			5ULL
484219089Spjd#define	ZPL_VERSION			ZPL_VERSION_5
485219089Spjd#define	ZPL_VERSION_STRING		"5"
486185029Spjd
487185029Spjd#define	ZPL_VERSION_INITIAL		ZPL_VERSION_1
488185029Spjd#define	ZPL_VERSION_DIRENT_TYPE		ZPL_VERSION_2
489185029Spjd#define	ZPL_VERSION_FUID		ZPL_VERSION_3
490185029Spjd#define	ZPL_VERSION_NORMALIZATION	ZPL_VERSION_3
491185029Spjd#define	ZPL_VERSION_SYSATTR		ZPL_VERSION_3
492209962Smm#define	ZPL_VERSION_USERSPACE		ZPL_VERSION_4
493219089Spjd#define	ZPL_VERSION_SA			ZPL_VERSION_5
494185029Spjd
495219089Spjd/* Rewind request information */
496219089Spjd#define	ZPOOL_NO_REWIND		1  /* No policy - default behavior */
497219089Spjd#define	ZPOOL_NEVER_REWIND	2  /* Do not search for best txg or rewind */
498219089Spjd#define	ZPOOL_TRY_REWIND	4  /* Search for best txg, but do not rewind */
499219089Spjd#define	ZPOOL_DO_REWIND		8  /* Rewind to best txg w/in deferred frees */
500219089Spjd#define	ZPOOL_EXTREME_REWIND	16 /* Allow extreme measures to find best txg */
501219089Spjd#define	ZPOOL_REWIND_MASK	28 /* All the possible rewind bits */
502219089Spjd#define	ZPOOL_REWIND_POLICIES	31 /* All the possible policy bits */
503219089Spjd
504219089Spjdtypedef struct zpool_rewind_policy {
505219089Spjd	uint32_t	zrp_request;	/* rewind behavior requested */
506219089Spjd	uint64_t	zrp_maxmeta;	/* max acceptable meta-data errors */
507219089Spjd	uint64_t	zrp_maxdata;	/* max acceptable data errors */
508219089Spjd	uint64_t	zrp_txg;	/* specific txg to load */
509219089Spjd} zpool_rewind_policy_t;
510219089Spjd
511185029Spjd/*
512168404Spjd * The following are configuration names used in the nvlist describing a pool's
513168404Spjd * configuration.
514168404Spjd */
515168404Spjd#define	ZPOOL_CONFIG_VERSION		"version"
516168404Spjd#define	ZPOOL_CONFIG_POOL_NAME		"name"
517168404Spjd#define	ZPOOL_CONFIG_POOL_STATE		"state"
518168404Spjd#define	ZPOOL_CONFIG_POOL_TXG		"txg"
519168404Spjd#define	ZPOOL_CONFIG_POOL_GUID		"pool_guid"
520168404Spjd#define	ZPOOL_CONFIG_CREATE_TXG		"create_txg"
521168404Spjd#define	ZPOOL_CONFIG_TOP_GUID		"top_guid"
522168404Spjd#define	ZPOOL_CONFIG_VDEV_TREE		"vdev_tree"
523168404Spjd#define	ZPOOL_CONFIG_TYPE		"type"
524168404Spjd#define	ZPOOL_CONFIG_CHILDREN		"children"
525168404Spjd#define	ZPOOL_CONFIG_ID			"id"
526168404Spjd#define	ZPOOL_CONFIG_GUID		"guid"
527168404Spjd#define	ZPOOL_CONFIG_PATH		"path"
528168404Spjd#define	ZPOOL_CONFIG_DEVID		"devid"
529168404Spjd#define	ZPOOL_CONFIG_METASLAB_ARRAY	"metaslab_array"
530168404Spjd#define	ZPOOL_CONFIG_METASLAB_SHIFT	"metaslab_shift"
531168404Spjd#define	ZPOOL_CONFIG_ASHIFT		"ashift"
532168404Spjd#define	ZPOOL_CONFIG_ASIZE		"asize"
533168404Spjd#define	ZPOOL_CONFIG_DTL		"DTL"
534219089Spjd#define	ZPOOL_CONFIG_SCAN_STATS		"scan_stats"	/* not stored on disk */
535219089Spjd#define	ZPOOL_CONFIG_VDEV_STATS		"vdev_stats"	/* not stored on disk */
536168404Spjd#define	ZPOOL_CONFIG_WHOLE_DISK		"whole_disk"
537168404Spjd#define	ZPOOL_CONFIG_ERRCOUNT		"error_count"
538168404Spjd#define	ZPOOL_CONFIG_NOT_PRESENT	"not_present"
539168404Spjd#define	ZPOOL_CONFIG_SPARES		"spares"
540168404Spjd#define	ZPOOL_CONFIG_IS_SPARE		"is_spare"
541168404Spjd#define	ZPOOL_CONFIG_NPARITY		"nparity"
542168498Spjd#define	ZPOOL_CONFIG_HOSTID		"hostid"
543168498Spjd#define	ZPOOL_CONFIG_HOSTNAME		"hostname"
544219089Spjd#define	ZPOOL_CONFIG_LOADED_TIME	"initial_load_time"
545185029Spjd#define	ZPOOL_CONFIG_UNSPARE		"unspare"
546185029Spjd#define	ZPOOL_CONFIG_PHYS_PATH		"phys_path"
547185029Spjd#define	ZPOOL_CONFIG_IS_LOG		"is_log"
548185029Spjd#define	ZPOOL_CONFIG_L2CACHE		"l2cache"
549219089Spjd#define	ZPOOL_CONFIG_HOLE_ARRAY		"hole_array"
550219089Spjd#define	ZPOOL_CONFIG_VDEV_CHILDREN	"vdev_children"
551219089Spjd#define	ZPOOL_CONFIG_IS_HOLE		"is_hole"
552219089Spjd#define	ZPOOL_CONFIG_DDT_HISTOGRAM	"ddt_histogram"
553219089Spjd#define	ZPOOL_CONFIG_DDT_OBJ_STATS	"ddt_object_stats"
554219089Spjd#define	ZPOOL_CONFIG_DDT_STATS		"ddt_stats"
555219089Spjd#define	ZPOOL_CONFIG_SPLIT		"splitcfg"
556219089Spjd#define	ZPOOL_CONFIG_ORIG_GUID		"orig_guid"
557219089Spjd#define	ZPOOL_CONFIG_SPLIT_GUID		"split_guid"
558219089Spjd#define	ZPOOL_CONFIG_SPLIT_LIST		"guid_list"
559219089Spjd#define	ZPOOL_CONFIG_REMOVING		"removing"
560254112Sdelphij#define	ZPOOL_CONFIG_RESILVER_TXG	"resilver_txg"
561228103Smm#define	ZPOOL_CONFIG_COMMENT		"comment"
562185029Spjd#define	ZPOOL_CONFIG_SUSPENDED		"suspended"	/* not stored on disk */
563185029Spjd#define	ZPOOL_CONFIG_TIMESTAMP		"timestamp"	/* not stored on disk */
564185029Spjd#define	ZPOOL_CONFIG_BOOTFS		"bootfs"	/* not stored on disk */
565219089Spjd#define	ZPOOL_CONFIG_MISSING_DEVICES	"missing_vdevs"	/* not stored on disk */
566219089Spjd#define	ZPOOL_CONFIG_LOAD_INFO		"load_info"	/* not stored on disk */
567236884Smm#define	ZPOOL_CONFIG_REWIND_INFO	"rewind_info"	/* not stored on disk */
568236884Smm#define	ZPOOL_CONFIG_UNSUP_FEAT		"unsup_feat"	/* not stored on disk */
569238926Smm#define	ZPOOL_CONFIG_ENABLED_FEAT	"enabled_feat"	/* not stored on disk */
570236884Smm#define	ZPOOL_CONFIG_CAN_RDONLY		"can_rdonly"	/* not stored on disk */
571236884Smm#define	ZPOOL_CONFIG_FEATURES_FOR_READ	"features_for_read"
572236884Smm#define	ZPOOL_CONFIG_FEATURE_STATS	"feature_stats"	/* not stored on disk */
573185029Spjd/*
574185029Spjd * The persistent vdev state is stored as separate values rather than a single
575185029Spjd * 'vdev_state' entry.  This is because a device can be in multiple states, such
576185029Spjd * as offline and degraded.
577185029Spjd */
578185029Spjd#define	ZPOOL_CONFIG_OFFLINE		"offline"
579185029Spjd#define	ZPOOL_CONFIG_FAULTED		"faulted"
580185029Spjd#define	ZPOOL_CONFIG_DEGRADED		"degraded"
581185029Spjd#define	ZPOOL_CONFIG_REMOVED		"removed"
582209962Smm#define	ZPOOL_CONFIG_FRU		"fru"
583219089Spjd#define	ZPOOL_CONFIG_AUX_STATE		"aux_state"
584168404Spjd
585219089Spjd/* Rewind policy parameters */
586219089Spjd#define	ZPOOL_REWIND_POLICY		"rewind-policy"
587219089Spjd#define	ZPOOL_REWIND_REQUEST		"rewind-request"
588219089Spjd#define	ZPOOL_REWIND_REQUEST_TXG	"rewind-request-txg"
589219089Spjd#define	ZPOOL_REWIND_META_THRESH	"rewind-meta-thresh"
590219089Spjd#define	ZPOOL_REWIND_DATA_THRESH	"rewind-data-thresh"
591219089Spjd
592219089Spjd/* Rewind data discovered */
593219089Spjd#define	ZPOOL_CONFIG_LOAD_TIME		"rewind_txg_ts"
594219089Spjd#define	ZPOOL_CONFIG_LOAD_DATA_ERRORS	"verify_data_errors"
595219089Spjd#define	ZPOOL_CONFIG_REWIND_TIME	"seconds_of_rewind"
596219089Spjd
597168404Spjd#define	VDEV_TYPE_ROOT			"root"
598168404Spjd#define	VDEV_TYPE_MIRROR		"mirror"
599168404Spjd#define	VDEV_TYPE_REPLACING		"replacing"
600168404Spjd#define	VDEV_TYPE_RAIDZ			"raidz"
601168404Spjd#define	VDEV_TYPE_DISK			"disk"
602168404Spjd#define	VDEV_TYPE_FILE			"file"
603168404Spjd#define	VDEV_TYPE_MISSING		"missing"
604219089Spjd#define	VDEV_TYPE_HOLE			"hole"
605168404Spjd#define	VDEV_TYPE_SPARE			"spare"
606185029Spjd#define	VDEV_TYPE_LOG			"log"
607185029Spjd#define	VDEV_TYPE_L2CACHE		"l2cache"
608168404Spjd
609168404Spjd/*
610168404Spjd * This is needed in userland to report the minimum necessary device size.
611307126Smav *
612307126Smav * Note that the zfs test suite uses 64MB vdevs.
613168404Spjd */
614168404Spjd#define	SPA_MINDEVSIZE		(64ULL << 20)
615168404Spjd
616168404Spjd/*
617269773Sdelphij * Set if the fragmentation has not yet been calculated. This can happen
618269773Sdelphij * because the space maps have not been upgraded or the histogram feature
619269773Sdelphij * is not enabled.
620269773Sdelphij */
621269773Sdelphij#define	ZFS_FRAG_INVALID	UINT64_MAX
622269773Sdelphij
623269773Sdelphij/*
624168404Spjd * The location of the pool configuration repository, shared between kernel and
625168404Spjd * userland.
626168404Spjd */
627185029Spjd#define	ZPOOL_CACHE		"/boot/zfs/zpool.cache"
628168404Spjd
629168404Spjd/*
630168404Spjd * vdev states are ordered from least to most healthy.
631168404Spjd * A vdev that's CANT_OPEN or below is considered unusable.
632168404Spjd */
633168404Spjdtypedef enum vdev_state {
634168404Spjd	VDEV_STATE_UNKNOWN = 0,	/* Uninitialized vdev			*/
635168404Spjd	VDEV_STATE_CLOSED,	/* Not currently open			*/
636168404Spjd	VDEV_STATE_OFFLINE,	/* Not allowed to open			*/
637185029Spjd	VDEV_STATE_REMOVED,	/* Explicitly removed from system	*/
638168404Spjd	VDEV_STATE_CANT_OPEN,	/* Tried to open, but failed		*/
639185029Spjd	VDEV_STATE_FAULTED,	/* External request to fault device	*/
640168404Spjd	VDEV_STATE_DEGRADED,	/* Replicated vdev with unhealthy kids	*/
641168404Spjd	VDEV_STATE_HEALTHY	/* Presumed good			*/
642168404Spjd} vdev_state_t;
643168404Spjd
644185029Spjd#define	VDEV_STATE_ONLINE	VDEV_STATE_HEALTHY
645185029Spjd
646168404Spjd/*
647168404Spjd * vdev aux states.  When a vdev is in the CANT_OPEN state, the aux field
648168404Spjd * of the vdev stats structure uses these constants to distinguish why.
649168404Spjd */
650168404Spjdtypedef enum vdev_aux {
651168404Spjd	VDEV_AUX_NONE,		/* no error				*/
652168404Spjd	VDEV_AUX_OPEN_FAILED,	/* ldi_open_*() or vn_open() failed	*/
653168404Spjd	VDEV_AUX_CORRUPT_DATA,	/* bad label or disk contents		*/
654168404Spjd	VDEV_AUX_NO_REPLICAS,	/* insufficient number of replicas	*/
655168404Spjd	VDEV_AUX_BAD_GUID_SUM,	/* vdev guid sum doesn't match		*/
656168404Spjd	VDEV_AUX_TOO_SMALL,	/* vdev size is too small		*/
657168404Spjd	VDEV_AUX_BAD_LABEL,	/* the label is OK but invalid		*/
658168404Spjd	VDEV_AUX_VERSION_NEWER,	/* on-disk version is too new		*/
659168404Spjd	VDEV_AUX_VERSION_OLDER,	/* on-disk version is too old		*/
660236884Smm	VDEV_AUX_UNSUP_FEAT,	/* unsupported features			*/
661185029Spjd	VDEV_AUX_SPARED,	/* hot spare used in another pool	*/
662185029Spjd	VDEV_AUX_ERR_EXCEEDED,	/* too many errors			*/
663185029Spjd	VDEV_AUX_IO_FAILURE,	/* experienced I/O failure		*/
664219089Spjd	VDEV_AUX_BAD_LOG,	/* cannot read log chain(s)		*/
665219089Spjd	VDEV_AUX_EXTERNAL,	/* external diagnosis			*/
666254591Sgibbs	VDEV_AUX_SPLIT_POOL,	/* vdev was split off into another pool	*/
667254591Sgibbs	VDEV_AUX_ASHIFT_TOO_BIG /* vdev's min block size is too large   */
668168404Spjd} vdev_aux_t;
669168404Spjd
670168404Spjd/*
671168404Spjd * pool state.  The following states are written to disk as part of the normal
672185029Spjd * SPA lifecycle: ACTIVE, EXPORTED, DESTROYED, SPARE, L2CACHE.  The remaining
673185029Spjd * states are software abstractions used at various levels to communicate
674185029Spjd * pool state.
675168404Spjd */
676168404Spjdtypedef enum pool_state {
677168404Spjd	POOL_STATE_ACTIVE = 0,		/* In active use		*/
678168404Spjd	POOL_STATE_EXPORTED,		/* Explicitly exported		*/
679168404Spjd	POOL_STATE_DESTROYED,		/* Explicitly destroyed		*/
680168404Spjd	POOL_STATE_SPARE,		/* Reserved for hot spare use	*/
681185029Spjd	POOL_STATE_L2CACHE,		/* Level 2 ARC device		*/
682168404Spjd	POOL_STATE_UNINITIALIZED,	/* Internal spa_t state		*/
683168404Spjd	POOL_STATE_UNAVAIL,		/* Internal libzfs state	*/
684168404Spjd	POOL_STATE_POTENTIALLY_ACTIVE	/* Internal libzfs state	*/
685168404Spjd} pool_state_t;
686168404Spjd
687168404Spjd/*
688219089Spjd * Scan Functions.
689168404Spjd */
690219089Spjdtypedef enum pool_scan_func {
691219089Spjd	POOL_SCAN_NONE,
692219089Spjd	POOL_SCAN_SCRUB,
693219089Spjd	POOL_SCAN_RESILVER,
694219089Spjd	POOL_SCAN_FUNCS
695219089Spjd} pool_scan_func_t;
696168404Spjd
697168404Spjd/*
698168404Spjd * ZIO types.  Needed to interpret vdev statistics below.
699168404Spjd */
700168404Spjdtypedef enum zio_type {
701168404Spjd	ZIO_TYPE_NULL = 0,
702168404Spjd	ZIO_TYPE_READ,
703168404Spjd	ZIO_TYPE_WRITE,
704168404Spjd	ZIO_TYPE_FREE,
705168404Spjd	ZIO_TYPE_CLAIM,
706168404Spjd	ZIO_TYPE_IOCTL,
707168404Spjd	ZIO_TYPES
708168404Spjd} zio_type_t;
709168404Spjd
710168404Spjd/*
711219089Spjd * Pool statistics.  Note: all fields should be 64-bit because this
712219089Spjd * is passed between kernel and userland as an nvlist uint64 array.
713219089Spjd */
714219089Spjdtypedef struct pool_scan_stat {
715219089Spjd	/* values stored on disk */
716219089Spjd	uint64_t	pss_func;	/* pool_scan_func_t */
717219089Spjd	uint64_t	pss_state;	/* dsl_scan_state_t */
718219089Spjd	uint64_t	pss_start_time;	/* scan start time */
719219089Spjd	uint64_t	pss_end_time;	/* scan end time */
720219089Spjd	uint64_t	pss_to_examine;	/* total bytes to scan */
721219089Spjd	uint64_t	pss_examined;	/* total examined bytes	*/
722219089Spjd	uint64_t	pss_to_process; /* total bytes to process */
723219089Spjd	uint64_t	pss_processed;	/* total processed bytes */
724219089Spjd	uint64_t	pss_errors;	/* scan errors	*/
725219089Spjd
726219089Spjd	/* values not stored on disk */
727219089Spjd	uint64_t	pss_pass_exam;	/* examined bytes per scan pass */
728219089Spjd	uint64_t	pss_pass_start;	/* start time of a scan pass */
729219089Spjd} pool_scan_stat_t;
730219089Spjd
731219089Spjdtypedef enum dsl_scan_state {
732219089Spjd	DSS_NONE,
733219089Spjd	DSS_SCANNING,
734219089Spjd	DSS_FINISHED,
735219089Spjd	DSS_CANCELED,
736219089Spjd	DSS_NUM_STATES
737219089Spjd} dsl_scan_state_t;
738219089Spjd
739219089Spjd
740219089Spjd/*
741168404Spjd * Vdev statistics.  Note: all fields should be 64-bit because this
742168404Spjd * is passed between kernel and userland as an nvlist uint64 array.
743168404Spjd */
744168404Spjdtypedef struct vdev_stat {
745168404Spjd	hrtime_t	vs_timestamp;		/* time since vdev load	*/
746168404Spjd	uint64_t	vs_state;		/* vdev state		*/
747168404Spjd	uint64_t	vs_aux;			/* see vdev_aux_t	*/
748168404Spjd	uint64_t	vs_alloc;		/* space allocated	*/
749168404Spjd	uint64_t	vs_space;		/* total capacity	*/
750168404Spjd	uint64_t	vs_dspace;		/* deflated capacity	*/
751168404Spjd	uint64_t	vs_rsize;		/* replaceable dev size */
752236155Smm	uint64_t	vs_esize;		/* expandable dev size */
753168404Spjd	uint64_t	vs_ops[ZIO_TYPES];	/* operation count	*/
754168404Spjd	uint64_t	vs_bytes[ZIO_TYPES];	/* bytes read/written	*/
755168404Spjd	uint64_t	vs_read_errors;		/* read errors		*/
756168404Spjd	uint64_t	vs_write_errors;	/* write errors		*/
757168404Spjd	uint64_t	vs_checksum_errors;	/* checksum errors	*/
758168404Spjd	uint64_t	vs_self_healed;		/* self-healed bytes	*/
759219089Spjd	uint64_t	vs_scan_removing;	/* removing?	*/
760219089Spjd	uint64_t	vs_scan_processed;	/* scan processed bytes	*/
761254591Sgibbs 	uint64_t	vs_configured_ashift;	/* TLV vdev_ashift      */
762254591Sgibbs 	uint64_t	vs_logical_ashift;	/* vdev_logical_ashift  */
763254591Sgibbs 	uint64_t	vs_physical_ashift;	/* vdev_physical_ashift */
764269773Sdelphij	uint64_t	vs_fragmentation;	/* device fragmentation */
765168404Spjd} vdev_stat_t;
766254591Sgibbs#define VDEV_STAT_VALID(field, uint64_t_field_count) \
767254591Sgibbs    ((uint64_t_field_count * sizeof(uint64_t)) >= \
768254591Sgibbs     (offsetof(vdev_stat_t, field) + sizeof(((vdev_stat_t *)NULL)->field)))
769168404Spjd
770219089Spjd/*
771219089Spjd * DDT statistics.  Note: all fields should be 64-bit because this
772219089Spjd * is passed between kernel and userland as an nvlist uint64 array.
773219089Spjd */
774219089Spjdtypedef struct ddt_object {
775219089Spjd	uint64_t	ddo_count;	/* number of elments in ddt 	*/
776219089Spjd	uint64_t	ddo_dspace;	/* size of ddt on disk		*/
777219089Spjd	uint64_t	ddo_mspace;	/* size of ddt in-core		*/
778219089Spjd} ddt_object_t;
779219089Spjd
780219089Spjdtypedef struct ddt_stat {
781219089Spjd	uint64_t	dds_blocks;	/* blocks			*/
782219089Spjd	uint64_t	dds_lsize;	/* logical size			*/
783219089Spjd	uint64_t	dds_psize;	/* physical size		*/
784219089Spjd	uint64_t	dds_dsize;	/* deflated allocated size	*/
785219089Spjd	uint64_t	dds_ref_blocks;	/* referenced blocks		*/
786219089Spjd	uint64_t	dds_ref_lsize;	/* referenced lsize * refcnt	*/
787219089Spjd	uint64_t	dds_ref_psize;	/* referenced psize * refcnt	*/
788219089Spjd	uint64_t	dds_ref_dsize;	/* referenced dsize * refcnt	*/
789219089Spjd} ddt_stat_t;
790219089Spjd
791219089Spjdtypedef struct ddt_histogram {
792219089Spjd	ddt_stat_t	ddh_stat[64];	/* power-of-two histogram buckets */
793219089Spjd} ddt_histogram_t;
794219089Spjd
795185029Spjd#define	ZVOL_DRIVER	"zvol"
796168404Spjd#define	ZFS_DRIVER	"zfs"
797168404Spjd#define	ZFS_DEV_NAME	"zfs"
798168404Spjd#define	ZFS_DEV		"/dev/" ZFS_DEV_NAME
799299430Smav#define	ZFS_DISK_ROOT	"/dev/dsk"
800299430Smav#define	ZFS_DISK_ROOTD	ZFS_DISK_ROOT "/"
801299430Smav#define	ZFS_RDISK_ROOT	"/dev/rdsk"
802299430Smav#define	ZFS_RDISK_ROOTD	ZFS_RDISK_ROOT "/"
803168404Spjd
804219089Spjd/* general zvol path */
805219089Spjd#define	ZVOL_DIR		"/dev/zvol"
806219089Spjd/* expansion */
807219089Spjd#define	ZVOL_PSEUDO_DEV		"/devices/pseudo/zfs@0:"
808219089Spjd/* for dump and swap */
809219089Spjd#define	ZVOL_FULL_DEV_DIR	ZVOL_DIR "/dsk/"
810219089Spjd#define	ZVOL_FULL_RDEV_DIR	ZVOL_DIR "/rdsk/"
811168404Spjd
812168404Spjd#define	ZVOL_PROP_NAME		"name"
813219089Spjd#define	ZVOL_DEFAULT_BLOCKSIZE	8192
814168404Spjd
815168404Spjd/*
816168404Spjd * /dev/zfs ioctl numbers.
817168404Spjd */
818248571Smmtypedef enum zfs_ioc {
819248571Smm	ZFS_IOC_FIRST =	0,
820248571Smm	ZFS_IOC_POOL_CREATE = ZFS_IOC_FIRST,
821248571Smm	ZFS_IOC_POOL_DESTROY,
822248571Smm	ZFS_IOC_POOL_IMPORT,
823248571Smm	ZFS_IOC_POOL_EXPORT,
824248571Smm	ZFS_IOC_POOL_CONFIGS,
825248571Smm	ZFS_IOC_POOL_STATS,
826248571Smm	ZFS_IOC_POOL_TRYIMPORT,
827248571Smm	ZFS_IOC_POOL_SCAN,
828248571Smm	ZFS_IOC_POOL_FREEZE,
829248571Smm	ZFS_IOC_POOL_UPGRADE,
830248571Smm	ZFS_IOC_POOL_GET_HISTORY,
831248571Smm	ZFS_IOC_VDEV_ADD,
832248571Smm	ZFS_IOC_VDEV_REMOVE,
833248571Smm	ZFS_IOC_VDEV_SET_STATE,
834248571Smm	ZFS_IOC_VDEV_ATTACH,
835248571Smm	ZFS_IOC_VDEV_DETACH,
836248571Smm	ZFS_IOC_VDEV_SETPATH,
837248571Smm	ZFS_IOC_VDEV_SETFRU,
838248571Smm	ZFS_IOC_OBJSET_STATS,
839248571Smm	ZFS_IOC_OBJSET_ZPLPROPS,
840248571Smm	ZFS_IOC_DATASET_LIST_NEXT,
841248571Smm	ZFS_IOC_SNAPSHOT_LIST_NEXT,
842248571Smm	ZFS_IOC_SET_PROP,
843248571Smm	ZFS_IOC_CREATE,
844248571Smm	ZFS_IOC_DESTROY,
845248571Smm	ZFS_IOC_ROLLBACK,
846248571Smm	ZFS_IOC_RENAME,
847248571Smm	ZFS_IOC_RECV,
848248571Smm	ZFS_IOC_SEND,
849248571Smm	ZFS_IOC_INJECT_FAULT,
850248571Smm	ZFS_IOC_CLEAR_FAULT,
851248571Smm	ZFS_IOC_INJECT_LIST_NEXT,
852248571Smm	ZFS_IOC_ERROR_LOG,
853248571Smm	ZFS_IOC_CLEAR,
854248571Smm	ZFS_IOC_PROMOTE,
855248571Smm	ZFS_IOC_DESTROY_SNAPS,
856248571Smm	ZFS_IOC_SNAPSHOT,
857248571Smm	ZFS_IOC_DSOBJ_TO_DSNAME,
858248571Smm	ZFS_IOC_OBJ_TO_PATH,
859248571Smm	ZFS_IOC_POOL_SET_PROPS,
860248571Smm	ZFS_IOC_POOL_GET_PROPS,
861248571Smm	ZFS_IOC_SET_FSACL,
862248571Smm	ZFS_IOC_GET_FSACL,
863248571Smm	ZFS_IOC_SHARE,
864248571Smm	ZFS_IOC_INHERIT_PROP,
865248571Smm	ZFS_IOC_SMB_ACL,
866248571Smm	ZFS_IOC_USERSPACE_ONE,
867248571Smm	ZFS_IOC_USERSPACE_MANY,
868248571Smm	ZFS_IOC_USERSPACE_UPGRADE,
869248571Smm	ZFS_IOC_HOLD,
870248571Smm	ZFS_IOC_RELEASE,
871248571Smm	ZFS_IOC_GET_HOLDS,
872248571Smm	ZFS_IOC_OBJSET_RECVD_PROPS,
873248571Smm	ZFS_IOC_VDEV_SPLIT,
874248571Smm	ZFS_IOC_NEXT_OBJ,
875248571Smm	ZFS_IOC_DIFF,
876248571Smm	ZFS_IOC_TMP_SNAPSHOT,
877248571Smm	ZFS_IOC_OBJ_TO_STATS,
878248571Smm	ZFS_IOC_JAIL,
879248571Smm	ZFS_IOC_UNJAIL,
880248571Smm	ZFS_IOC_POOL_REGUID,
881248571Smm	ZFS_IOC_SPACE_WRITTEN,
882248571Smm	ZFS_IOC_SPACE_SNAPS,
883248571Smm	ZFS_IOC_SEND_PROGRESS,
884248571Smm	ZFS_IOC_POOL_REOPEN,
885248571Smm	ZFS_IOC_LOG_HISTORY,
886248571Smm	ZFS_IOC_SEND_NEW,
887248571Smm	ZFS_IOC_SEND_SPACE,
888248571Smm	ZFS_IOC_CLONE,
889263407Sdelphij	ZFS_IOC_BOOKMARK,
890263407Sdelphij	ZFS_IOC_GET_BOOKMARKS,
891263407Sdelphij	ZFS_IOC_DESTROY_BOOKMARKS,
892308915Savg	ZFS_IOC_NEXTBOOT,
893248571Smm	ZFS_IOC_LAST
894248571Smm} zfs_ioc_t;
895168404Spjd
896168404Spjd/*
897168404Spjd * Internal SPA load state.  Used by FMA diagnosis engine.
898168404Spjd */
899168404Spjdtypedef enum {
900219089Spjd	SPA_LOAD_NONE,		/* no load in progress	*/
901219089Spjd	SPA_LOAD_OPEN,		/* normal open		*/
902219089Spjd	SPA_LOAD_IMPORT,	/* import in progress	*/
903219089Spjd	SPA_LOAD_TRYIMPORT,	/* tryimport in progress */
904219089Spjd	SPA_LOAD_RECOVER,	/* recovery requested	*/
905307279Smav	SPA_LOAD_ERROR,		/* load failed		*/
906307279Smav	SPA_LOAD_CREATE		/* creation in progress */
907168404Spjd} spa_load_state_t;
908168404Spjd
909168404Spjd/*
910168404Spjd * Bookmark name values.
911168404Spjd */
912168404Spjd#define	ZPOOL_ERR_LIST		"error list"
913168404Spjd#define	ZPOOL_ERR_DATASET	"dataset"
914168404Spjd#define	ZPOOL_ERR_OBJECT	"object"
915168404Spjd
916168404Spjd#define	HIS_MAX_RECORD_LEN	(MAXPATHLEN + MAXPATHLEN + 1)
917168404Spjd
918168404Spjd/*
919168404Spjd * The following are names used in the nvlist describing
920168404Spjd * the pool's history log.
921168404Spjd */
922168404Spjd#define	ZPOOL_HIST_RECORD	"history record"
923168404Spjd#define	ZPOOL_HIST_TIME		"history time"
924168404Spjd#define	ZPOOL_HIST_CMD		"history command"
925185029Spjd#define	ZPOOL_HIST_WHO		"history who"
926185029Spjd#define	ZPOOL_HIST_ZONE		"history zone"
927185029Spjd#define	ZPOOL_HIST_HOST		"history hostname"
928185029Spjd#define	ZPOOL_HIST_TXG		"history txg"
929185029Spjd#define	ZPOOL_HIST_INT_EVENT	"history internal event"
930185029Spjd#define	ZPOOL_HIST_INT_STR	"history internal str"
931248571Smm#define	ZPOOL_HIST_INT_NAME	"internal_name"
932248571Smm#define	ZPOOL_HIST_IOCTL	"ioctl"
933248571Smm#define	ZPOOL_HIST_INPUT_NVL	"in_nvl"
934248571Smm#define	ZPOOL_HIST_OUTPUT_NVL	"out_nvl"
935248571Smm#define	ZPOOL_HIST_DSNAME	"dsname"
936248571Smm#define	ZPOOL_HIST_DSID		"dsid"
937168404Spjd
938185029Spjd/*
939185029Spjd * Flags for ZFS_IOC_VDEV_SET_STATE
940185029Spjd */
941185029Spjd#define	ZFS_ONLINE_CHECKREMOVE	0x1
942185029Spjd#define	ZFS_ONLINE_UNSPARE	0x2
943185029Spjd#define	ZFS_ONLINE_FORCEFAULT	0x4
944219089Spjd#define	ZFS_ONLINE_EXPAND	0x8
945185029Spjd#define	ZFS_OFFLINE_TEMPORARY	0x1
946185029Spjd
947185029Spjd/*
948219089Spjd * Flags for ZFS_IOC_POOL_IMPORT
949219089Spjd */
950219089Spjd#define	ZFS_IMPORT_NORMAL	0x0
951219089Spjd#define	ZFS_IMPORT_VERBATIM	0x1
952219089Spjd#define	ZFS_IMPORT_ANY_HOST	0x2
953219089Spjd#define	ZFS_IMPORT_MISSING_LOG	0x4
954219089Spjd#define	ZFS_IMPORT_ONLY		0x8
955333196Savg#define	ZFS_IMPORT_TEMP_NAME	0x20
956219089Spjd
957219089Spjd/*
958185029Spjd * Sysevent payload members.  ZFS will generate the following sysevents with the
959185029Spjd * given payloads:
960185029Spjd *
961185029Spjd *	ESC_ZFS_RESILVER_START
962185029Spjd *	ESC_ZFS_RESILVER_END
963185029Spjd *	ESC_ZFS_POOL_DESTROY
964228103Smm *	ESC_ZFS_POOL_REGUID
965185029Spjd *
966185029Spjd *		ZFS_EV_POOL_NAME	DATA_TYPE_STRING
967185029Spjd *		ZFS_EV_POOL_GUID	DATA_TYPE_UINT64
968185029Spjd *
969185029Spjd *	ESC_ZFS_VDEV_REMOVE
970185029Spjd *	ESC_ZFS_VDEV_CLEAR
971185029Spjd *	ESC_ZFS_VDEV_CHECK
972185029Spjd *
973185029Spjd *		ZFS_EV_POOL_NAME	DATA_TYPE_STRING
974185029Spjd *		ZFS_EV_POOL_GUID	DATA_TYPE_UINT64
975185029Spjd *		ZFS_EV_VDEV_PATH	DATA_TYPE_STRING	(optional)
976185029Spjd *		ZFS_EV_VDEV_GUID	DATA_TYPE_UINT64
977185029Spjd */
978185029Spjd#define	ZFS_EV_POOL_NAME	"pool_name"
979185029Spjd#define	ZFS_EV_POOL_GUID	"pool_guid"
980185029Spjd#define	ZFS_EV_VDEV_PATH	"vdev_path"
981185029Spjd#define	ZFS_EV_VDEV_GUID	"vdev_guid"
982185029Spjd
983168404Spjd#ifdef	__cplusplus
984168404Spjd}
985168404Spjd#endif
986168404Spjd
987168404Spjd#endif	/* _SYS_FS_ZFS_H */
988