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.
24262086Savg * Copyright (c) 2013 by Delphix. All rights reserved.
25229578Smm * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
26265754Sdelphij * Copyright (c) 2013, Joyent, Inc. All rights reserved.
27235951Smm * Copyright (c) 2012, Martin Matuska <mm@FreeBSD.org>. All rights reserved.
28168404Spjd */
29168404Spjd
30219089Spjd/* Portions Copyright 2010 Robert Milkowski */
31219089Spjd
32168404Spjd#ifndef	_SYS_FS_ZFS_H
33168404Spjd#define	_SYS_FS_ZFS_H
34168404Spjd
35168404Spjd#include <sys/types.h>
36168404Spjd#include <sys/ioccom.h>
37185029Spjd#include <sys/time.h>
38168404Spjd
39168404Spjd#ifdef	__cplusplus
40168404Spjdextern "C" {
41168404Spjd#endif
42168404Spjd
43168404Spjd/*
44168404Spjd * Types and constants shared between userland and the kernel.
45168404Spjd */
46168404Spjd
47168404Spjd/*
48168404Spjd * Each dataset can be one of the following types.  These constants can be
49168404Spjd * combined into masks that can be passed to various functions.
50168404Spjd */
51168404Spjdtypedef enum {
52263410Sdelphij	ZFS_TYPE_FILESYSTEM	= (1 << 0),
53263410Sdelphij	ZFS_TYPE_SNAPSHOT	= (1 << 1),
54263410Sdelphij	ZFS_TYPE_VOLUME		= (1 << 2),
55263410Sdelphij	ZFS_TYPE_POOL		= (1 << 3),
56263410Sdelphij	ZFS_TYPE_BOOKMARK	= (1 << 4)
57168404Spjd} zfs_type_t;
58168404Spjd
59249643Smmtypedef enum dmu_objset_type {
60249643Smm	DMU_OST_NONE,
61249643Smm	DMU_OST_META,
62249643Smm	DMU_OST_ZFS,
63249643Smm	DMU_OST_ZVOL,
64249643Smm	DMU_OST_OTHER,			/* For testing only! */
65249643Smm	DMU_OST_ANY,			/* Be careful! */
66249643Smm	DMU_OST_NUMTYPES
67249643Smm} dmu_objset_type_t;
68249643Smm
69185029Spjd#define	ZFS_TYPE_DATASET	\
70168404Spjd	(ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME | ZFS_TYPE_SNAPSHOT)
71168404Spjd
72219089Spjd#define	ZAP_MAXNAMELEN 256
73219089Spjd#define	ZAP_MAXVALUELEN (1024 * 8)
74219089Spjd#define	ZAP_OLDMAXVALUELEN 1024
75219089Spjd
76168404Spjd/*
77185029Spjd * Dataset properties are identified by these constants and must be added to
78185029Spjd * the end of this list to ensure that external consumers are not affected
79185029Spjd * by the change. If you make any changes to this list, be sure to update
80168404Spjd * the property table in usr/src/common/zfs/zfs_prop.c.
81168404Spjd */
82168404Spjdtypedef enum {
83168404Spjd	ZFS_PROP_TYPE,
84168404Spjd	ZFS_PROP_CREATION,
85168404Spjd	ZFS_PROP_USED,
86168404Spjd	ZFS_PROP_AVAILABLE,
87168404Spjd	ZFS_PROP_REFERENCED,
88168404Spjd	ZFS_PROP_COMPRESSRATIO,
89168404Spjd	ZFS_PROP_MOUNTED,
90168404Spjd	ZFS_PROP_ORIGIN,
91168404Spjd	ZFS_PROP_QUOTA,
92168404Spjd	ZFS_PROP_RESERVATION,
93168404Spjd	ZFS_PROP_VOLSIZE,
94168404Spjd	ZFS_PROP_VOLBLOCKSIZE,
95168404Spjd	ZFS_PROP_RECORDSIZE,
96168404Spjd	ZFS_PROP_MOUNTPOINT,
97168404Spjd	ZFS_PROP_SHARENFS,
98168404Spjd	ZFS_PROP_CHECKSUM,
99168404Spjd	ZFS_PROP_COMPRESSION,
100168404Spjd	ZFS_PROP_ATIME,
101168404Spjd	ZFS_PROP_DEVICES,
102168404Spjd	ZFS_PROP_EXEC,
103168404Spjd	ZFS_PROP_SETUID,
104168404Spjd	ZFS_PROP_READONLY,
105168404Spjd	ZFS_PROP_ZONED,
106168404Spjd	ZFS_PROP_SNAPDIR,
107224174Smm	ZFS_PROP_ACLMODE,
108168404Spjd	ZFS_PROP_ACLINHERIT,
109168404Spjd	ZFS_PROP_CREATETXG,		/* not exposed to the user */
110168404Spjd	ZFS_PROP_NAME,			/* not exposed to the user */
111168404Spjd	ZFS_PROP_CANMOUNT,
112168404Spjd	ZFS_PROP_ISCSIOPTIONS,		/* not exposed to the user */
113168404Spjd	ZFS_PROP_XATTR,
114168404Spjd	ZFS_PROP_NUMCLONES,		/* not exposed to the user */
115168404Spjd	ZFS_PROP_COPIES,
116185029Spjd	ZFS_PROP_VERSION,
117185029Spjd	ZFS_PROP_UTF8ONLY,
118185029Spjd	ZFS_PROP_NORMALIZE,
119185029Spjd	ZFS_PROP_CASE,
120185029Spjd	ZFS_PROP_VSCAN,
121185029Spjd	ZFS_PROP_NBMAND,
122185029Spjd	ZFS_PROP_SHARESMB,
123185029Spjd	ZFS_PROP_REFQUOTA,
124185029Spjd	ZFS_PROP_REFRESERVATION,
125185029Spjd	ZFS_PROP_GUID,
126185029Spjd	ZFS_PROP_PRIMARYCACHE,
127185029Spjd	ZFS_PROP_SECONDARYCACHE,
128185029Spjd	ZFS_PROP_USEDSNAP,
129185029Spjd	ZFS_PROP_USEDDS,
130185029Spjd	ZFS_PROP_USEDCHILD,
131185029Spjd	ZFS_PROP_USEDREFRESERV,
132209962Smm	ZFS_PROP_USERACCOUNTING,	/* not exposed to the user */
133219089Spjd	ZFS_PROP_STMF_SHAREINFO,	/* not exposed to the user */
134219089Spjd	ZFS_PROP_DEFER_DESTROY,
135219089Spjd	ZFS_PROP_USERREFS,
136219089Spjd	ZFS_PROP_LOGBIAS,
137219089Spjd	ZFS_PROP_UNIQUE,		/* not exposed to the user */
138219089Spjd	ZFS_PROP_OBJSETID,		/* not exposed to the user */
139219089Spjd	ZFS_PROP_DEDUP,
140219089Spjd	ZFS_PROP_MLSLABEL,
141219089Spjd	ZFS_PROP_SYNC,
142223623Smm	ZFS_PROP_REFRATIO,
143229578Smm	ZFS_PROP_WRITTEN,
144229578Smm	ZFS_PROP_CLONES,
145248369Smm	ZFS_PROP_LOGICALUSED,
146248369Smm	ZFS_PROP_LOGICALREFERENCED,
147262158Savg	ZFS_PROP_INCONSISTENT,		/* not exposed to the user */
148265754Sdelphij	ZFS_PROP_FILESYSTEM_LIMIT,
149265754Sdelphij	ZFS_PROP_SNAPSHOT_LIMIT,
150265754Sdelphij	ZFS_PROP_FILESYSTEM_COUNT,
151265754Sdelphij	ZFS_PROP_SNAPSHOT_COUNT,
152185029Spjd	ZFS_NUM_PROPS
153168404Spjd} zfs_prop_t;
154168404Spjd
155209962Smmtypedef enum {
156209962Smm	ZFS_PROP_USERUSED,
157209962Smm	ZFS_PROP_USERQUOTA,
158209962Smm	ZFS_PROP_GROUPUSED,
159209962Smm	ZFS_PROP_GROUPQUOTA,
160209962Smm	ZFS_NUM_USERQUOTA_PROPS
161209962Smm} zfs_userquota_prop_t;
162209962Smm
163209962Smmextern const char *zfs_userquota_prop_prefixes[ZFS_NUM_USERQUOTA_PROPS];
164209962Smm
165185029Spjd/*
166185029Spjd * Pool properties are identified by these constants and must be added to the
167185029Spjd * end of this list to ensure that external consumers are not affected
168185029Spjd * by the change. If you make any changes to this list, be sure to update
169185029Spjd * the property table in usr/src/common/zfs/zpool_prop.c.
170185029Spjd */
171185029Spjdtypedef enum {
172185029Spjd	ZPOOL_PROP_NAME,
173185029Spjd	ZPOOL_PROP_SIZE,
174185029Spjd	ZPOOL_PROP_CAPACITY,
175185029Spjd	ZPOOL_PROP_ALTROOT,
176185029Spjd	ZPOOL_PROP_HEALTH,
177185029Spjd	ZPOOL_PROP_GUID,
178185029Spjd	ZPOOL_PROP_VERSION,
179185029Spjd	ZPOOL_PROP_BOOTFS,
180185029Spjd	ZPOOL_PROP_DELEGATION,
181185029Spjd	ZPOOL_PROP_AUTOREPLACE,
182185029Spjd	ZPOOL_PROP_CACHEFILE,
183185029Spjd	ZPOOL_PROP_FAILUREMODE,
184185029Spjd	ZPOOL_PROP_LISTSNAPS,
185219089Spjd	ZPOOL_PROP_AUTOEXPAND,
186219089Spjd	ZPOOL_PROP_DEDUPDITTO,
187219089Spjd	ZPOOL_PROP_DEDUPRATIO,
188219089Spjd	ZPOOL_PROP_FREE,
189219089Spjd	ZPOOL_PROP_ALLOCATED,
190219089Spjd	ZPOOL_PROP_READONLY,
191229578Smm	ZPOOL_PROP_COMMENT,
192236839Smm	ZPOOL_PROP_EXPANDSZ,
193243674Smm	ZPOOL_PROP_FREEING,
194185029Spjd	ZPOOL_NUM_PROPS
195185029Spjd} zpool_prop_t;
196168404Spjd
197229578Smm/* Small enough to not hog a whole line of printout in zpool(1M). */
198229578Smm#define	ZPROP_MAX_COMMENT	32
199229578Smm
200185029Spjd#define	ZPROP_CONT		-2
201185029Spjd#define	ZPROP_INVAL		-1
202168404Spjd
203185029Spjd#define	ZPROP_VALUE		"value"
204185029Spjd#define	ZPROP_SOURCE		"source"
205185029Spjd
206168404Spjdtypedef enum {
207185029Spjd	ZPROP_SRC_NONE = 0x1,
208185029Spjd	ZPROP_SRC_DEFAULT = 0x2,
209185029Spjd	ZPROP_SRC_TEMPORARY = 0x4,
210185029Spjd	ZPROP_SRC_LOCAL = 0x8,
211219089Spjd	ZPROP_SRC_INHERITED = 0x10,
212219089Spjd	ZPROP_SRC_RECEIVED = 0x20
213185029Spjd} zprop_source_t;
214168404Spjd
215219089Spjd#define	ZPROP_SRC_ALL	0x3f
216168404Spjd
217219089Spjd#define	ZPROP_SOURCE_VAL_RECVD	"$recvd"
218219089Spjd#define	ZPROP_N_MORE_ERRORS	"N_MORE_ERRORS"
219219089Spjd/*
220219089Spjd * Dataset flag implemented as a special entry in the props zap object
221219089Spjd * indicating that the dataset has received properties on or after
222219089Spjd * SPA_VERSION_RECVD_PROPS. The first such receive blows away local properties
223219089Spjd * just as it did in earlier versions, and thereafter, local properties are
224219089Spjd * preserved.
225219089Spjd */
226219089Spjd#define	ZPROP_HAS_RECVD		"$hasrecvd"
227219089Spjd
228219089Spjdtypedef enum {
229219089Spjd	ZPROP_ERR_NOCLEAR = 0x1, /* failure to clear existing props */
230219089Spjd	ZPROP_ERR_NORESTORE = 0x2 /* failure to restore props on error */
231219089Spjd} zprop_errflags_t;
232219089Spjd
233185029Spjdtypedef int (*zprop_func)(int, void *);
234185029Spjd
235168404Spjd/*
236185029Spjd * Properties to be set on the root file system of a new pool
237185029Spjd * are stuffed into their own nvlist, which is then included in
238185029Spjd * the properties nvlist with the pool properties.
239168404Spjd */
240185029Spjd#define	ZPOOL_ROOTFS_PROPS	"root-props-nvl"
241185029Spjd
242185029Spjd/*
243185029Spjd * Dataset property functions shared between libzfs and kernel.
244185029Spjd */
245185029Spjdconst char *zfs_prop_default_string(zfs_prop_t);
246185029Spjduint64_t zfs_prop_default_numeric(zfs_prop_t);
247185029Spjdboolean_t zfs_prop_readonly(zfs_prop_t);
248185029Spjdboolean_t zfs_prop_inheritable(zfs_prop_t);
249185029Spjdboolean_t zfs_prop_setonce(zfs_prop_t);
250185029Spjdconst char *zfs_prop_to_name(zfs_prop_t);
251168404Spjdzfs_prop_t zfs_name_to_prop(const char *);
252168404Spjdboolean_t zfs_prop_user(const char *);
253219089Spjdboolean_t zfs_prop_userquota(const char *);
254185029Spjdint zfs_prop_index_to_string(zfs_prop_t, uint64_t, const char **);
255168404Spjdint zfs_prop_string_to_index(zfs_prop_t, const char *, uint64_t *);
256219089Spjduint64_t zfs_prop_random_value(zfs_prop_t, uint64_t seed);
257185029Spjdboolean_t zfs_prop_valid_for_type(int, zfs_type_t);
258168404Spjd
259168404Spjd/*
260185029Spjd * Pool property functions shared between libzfs and kernel.
261168404Spjd */
262185029Spjdzpool_prop_t zpool_name_to_prop(const char *);
263185029Spjdconst char *zpool_prop_to_name(zpool_prop_t);
264185029Spjdconst char *zpool_prop_default_string(zpool_prop_t);
265185029Spjduint64_t zpool_prop_default_numeric(zpool_prop_t);
266185029Spjdboolean_t zpool_prop_readonly(zpool_prop_t);
267243674Smmboolean_t zpool_prop_feature(const char *);
268243674Smmboolean_t zpool_prop_unsupported(const char *name);
269185029Spjdint zpool_prop_index_to_string(zpool_prop_t, uint64_t, const char **);
270185029Spjdint zpool_prop_string_to_index(zpool_prop_t, const char *, uint64_t *);
271219089Spjduint64_t zpool_prop_random_value(zpool_prop_t, uint64_t seed);
272168404Spjd
273168404Spjd/*
274185029Spjd * Definitions for the Delegation.
275185029Spjd */
276185029Spjdtypedef enum {
277185029Spjd	ZFS_DELEG_WHO_UNKNOWN = 0,
278185029Spjd	ZFS_DELEG_USER = 'u',
279185029Spjd	ZFS_DELEG_USER_SETS = 'U',
280185029Spjd	ZFS_DELEG_GROUP = 'g',
281185029Spjd	ZFS_DELEG_GROUP_SETS = 'G',
282185029Spjd	ZFS_DELEG_EVERYONE = 'e',
283185029Spjd	ZFS_DELEG_EVERYONE_SETS = 'E',
284185029Spjd	ZFS_DELEG_CREATE = 'c',
285185029Spjd	ZFS_DELEG_CREATE_SETS = 'C',
286185029Spjd	ZFS_DELEG_NAMED_SET = 's',
287185029Spjd	ZFS_DELEG_NAMED_SET_SETS = 'S'
288185029Spjd} zfs_deleg_who_type_t;
289185029Spjd
290185029Spjdtypedef enum {
291185029Spjd	ZFS_DELEG_NONE = 0,
292185029Spjd	ZFS_DELEG_PERM_LOCAL = 1,
293185029Spjd	ZFS_DELEG_PERM_DESCENDENT = 2,
294185029Spjd	ZFS_DELEG_PERM_LOCALDESCENDENT = 3,
295185029Spjd	ZFS_DELEG_PERM_CREATE = 4
296185029Spjd} zfs_deleg_inherit_t;
297185029Spjd
298185029Spjd#define	ZFS_DELEG_PERM_UID	"uid"
299185029Spjd#define	ZFS_DELEG_PERM_GID	"gid"
300185029Spjd#define	ZFS_DELEG_PERM_GROUPS	"groups"
301185029Spjd
302219089Spjd#define	ZFS_MLSLABEL_DEFAULT	"none"
303219089Spjd
304209962Smm#define	ZFS_SMB_ACL_SRC		"src"
305209962Smm#define	ZFS_SMB_ACL_TARGET	"target"
306209962Smm
307185029Spjdtypedef enum {
308185029Spjd	ZFS_CANMOUNT_OFF = 0,
309185029Spjd	ZFS_CANMOUNT_ON = 1,
310185029Spjd	ZFS_CANMOUNT_NOAUTO = 2
311185029Spjd} zfs_canmount_type_t;
312185029Spjd
313219089Spjdtypedef enum {
314219089Spjd	ZFS_LOGBIAS_LATENCY = 0,
315219089Spjd	ZFS_LOGBIAS_THROUGHPUT = 1
316219089Spjd} zfs_logbias_op_t;
317219089Spjd
318185029Spjdtypedef enum zfs_share_op {
319185029Spjd	ZFS_SHARE_NFS = 0,
320185029Spjd	ZFS_UNSHARE_NFS = 1,
321185029Spjd	ZFS_SHARE_SMB = 2,
322185029Spjd	ZFS_UNSHARE_SMB = 3
323185029Spjd} zfs_share_op_t;
324185029Spjd
325209962Smmtypedef enum zfs_smb_acl_op {
326209962Smm	ZFS_SMB_ACL_ADD,
327209962Smm	ZFS_SMB_ACL_REMOVE,
328209962Smm	ZFS_SMB_ACL_RENAME,
329209962Smm	ZFS_SMB_ACL_PURGE
330209962Smm} zfs_smb_acl_op_t;
331209962Smm
332185029Spjdtypedef enum zfs_cache_type {
333185029Spjd	ZFS_CACHE_NONE = 0,
334185029Spjd	ZFS_CACHE_METADATA = 1,
335185029Spjd	ZFS_CACHE_ALL = 2
336185029Spjd} zfs_cache_type_t;
337185029Spjd
338219089Spjdtypedef enum {
339219089Spjd	ZFS_SYNC_STANDARD = 0,
340219089Spjd	ZFS_SYNC_ALWAYS = 1,
341219089Spjd	ZFS_SYNC_DISABLED = 2
342219089Spjd} zfs_sync_type_t;
343185029Spjd
344219089Spjd
345185029Spjd/*
346168404Spjd * On-disk version number.
347168404Spjd */
348185029Spjd#define	SPA_VERSION_1			1ULL
349185029Spjd#define	SPA_VERSION_2			2ULL
350185029Spjd#define	SPA_VERSION_3			3ULL
351185029Spjd#define	SPA_VERSION_4			4ULL
352185029Spjd#define	SPA_VERSION_5			5ULL
353185029Spjd#define	SPA_VERSION_6			6ULL
354185029Spjd#define	SPA_VERSION_7			7ULL
355185029Spjd#define	SPA_VERSION_8			8ULL
356185029Spjd#define	SPA_VERSION_9			9ULL
357185029Spjd#define	SPA_VERSION_10			10ULL
358185029Spjd#define	SPA_VERSION_11			11ULL
359185029Spjd#define	SPA_VERSION_12			12ULL
360185029Spjd#define	SPA_VERSION_13			13ULL
361201143Sdelphij#define	SPA_VERSION_14			14ULL
362209962Smm#define	SPA_VERSION_15			15ULL
363219089Spjd#define	SPA_VERSION_16			16ULL
364219089Spjd#define	SPA_VERSION_17			17ULL
365219089Spjd#define	SPA_VERSION_18			18ULL
366219089Spjd#define	SPA_VERSION_19			19ULL
367219089Spjd#define	SPA_VERSION_20			20ULL
368219089Spjd#define	SPA_VERSION_21			21ULL
369219089Spjd#define	SPA_VERSION_22			22ULL
370219089Spjd#define	SPA_VERSION_23			23ULL
371219089Spjd#define	SPA_VERSION_24			24ULL
372219089Spjd#define	SPA_VERSION_25			25ULL
373219089Spjd#define	SPA_VERSION_26			26ULL
374219089Spjd#define	SPA_VERSION_27			27ULL
375219089Spjd#define	SPA_VERSION_28			28ULL
376243674Smm#define	SPA_VERSION_5000		5000ULL
377219089Spjd
378168404Spjd/*
379185029Spjd * When bumping up SPA_VERSION, make sure GRUB ZFS understands the on-disk
380219089Spjd * format change. Go to usr/src/grub/grub-0.97/stage2/{zfs-include/, fsys_zfs*},
381209962Smm * and do the appropriate changes.  Also bump the version number in
382209962Smm * usr/src/grub/capability.
383168404Spjd */
384243674Smm#define	SPA_VERSION			SPA_VERSION_5000
385243674Smm#define	SPA_VERSION_STRING		"5000"
386168404Spjd
387168404Spjd/*
388185029Spjd * Symbolic names for the changes that caused a SPA_VERSION switch.
389168404Spjd * Used in the code when checking for presence or absence of a feature.
390168404Spjd * Feel free to define multiple symbolic names for each version if there
391168404Spjd * were multiple changes to on-disk structures during that version.
392168404Spjd *
393185029Spjd * NOTE: When checking the current SPA_VERSION in your code, be sure
394168404Spjd *       to use spa_version() since it reports the version of the
395168404Spjd *       last synced uberblock.  Checking the in-flight version can
396168404Spjd *       be dangerous in some cases.
397168404Spjd */
398185029Spjd#define	SPA_VERSION_INITIAL		SPA_VERSION_1
399185029Spjd#define	SPA_VERSION_DITTO_BLOCKS	SPA_VERSION_2
400185029Spjd#define	SPA_VERSION_SPARES		SPA_VERSION_3
401219089Spjd#define	SPA_VERSION_RAIDZ2		SPA_VERSION_3
402219089Spjd#define	SPA_VERSION_BPOBJ_ACCOUNT	SPA_VERSION_3
403185029Spjd#define	SPA_VERSION_RAIDZ_DEFLATE	SPA_VERSION_3
404185029Spjd#define	SPA_VERSION_DNODE_BYTES		SPA_VERSION_3
405185029Spjd#define	SPA_VERSION_ZPOOL_HISTORY	SPA_VERSION_4
406185029Spjd#define	SPA_VERSION_GZIP_COMPRESSION	SPA_VERSION_5
407185029Spjd#define	SPA_VERSION_BOOTFS		SPA_VERSION_6
408185029Spjd#define	SPA_VERSION_SLOGS		SPA_VERSION_7
409185029Spjd#define	SPA_VERSION_DELEGATED_PERMS	SPA_VERSION_8
410185029Spjd#define	SPA_VERSION_FUID		SPA_VERSION_9
411185029Spjd#define	SPA_VERSION_REFRESERVATION	SPA_VERSION_9
412185029Spjd#define	SPA_VERSION_REFQUOTA		SPA_VERSION_9
413185029Spjd#define	SPA_VERSION_UNIQUE_ACCURATE	SPA_VERSION_9
414185029Spjd#define	SPA_VERSION_L2CACHE		SPA_VERSION_10
415185029Spjd#define	SPA_VERSION_NEXT_CLONES		SPA_VERSION_11
416185029Spjd#define	SPA_VERSION_ORIGIN		SPA_VERSION_11
417185029Spjd#define	SPA_VERSION_DSL_SCRUB		SPA_VERSION_11
418185029Spjd#define	SPA_VERSION_SNAP_PROPS		SPA_VERSION_12
419185029Spjd#define	SPA_VERSION_USED_BREAKDOWN	SPA_VERSION_13
420201143Sdelphij#define	SPA_VERSION_PASSTHROUGH_X	SPA_VERSION_14
421209962Smm#define	SPA_VERSION_USERSPACE		SPA_VERSION_15
422219089Spjd#define	SPA_VERSION_STMF_PROP		SPA_VERSION_16
423219089Spjd#define	SPA_VERSION_RAIDZ3		SPA_VERSION_17
424219089Spjd#define	SPA_VERSION_USERREFS		SPA_VERSION_18
425219089Spjd#define	SPA_VERSION_HOLES		SPA_VERSION_19
426219089Spjd#define	SPA_VERSION_ZLE_COMPRESSION	SPA_VERSION_20
427219089Spjd#define	SPA_VERSION_DEDUP		SPA_VERSION_21
428219089Spjd#define	SPA_VERSION_RECVD_PROPS		SPA_VERSION_22
429219089Spjd#define	SPA_VERSION_SLIM_ZIL		SPA_VERSION_23
430219089Spjd#define	SPA_VERSION_SA			SPA_VERSION_24
431219089Spjd#define	SPA_VERSION_SCAN		SPA_VERSION_25
432219089Spjd#define	SPA_VERSION_DIR_CLONES		SPA_VERSION_26
433219089Spjd#define	SPA_VERSION_DEADLISTS		SPA_VERSION_26
434219089Spjd#define	SPA_VERSION_FAST_SNAP		SPA_VERSION_27
435219089Spjd#define	SPA_VERSION_MULTI_REPLACE	SPA_VERSION_28
436243674Smm#define	SPA_VERSION_BEFORE_FEATURES	SPA_VERSION_28
437243674Smm#define	SPA_VERSION_FEATURES		SPA_VERSION_5000
438168404Spjd
439243674Smm#define	SPA_VERSION_IS_SUPPORTED(v) \
440243674Smm	(((v) >= SPA_VERSION_INITIAL && (v) <= SPA_VERSION_BEFORE_FEATURES) || \
441243674Smm	((v) >= SPA_VERSION_FEATURES && (v) <= SPA_VERSION))
442243674Smm
443168404Spjd/*
444185029Spjd * ZPL version - rev'd whenever an incompatible on-disk format change
445185029Spjd * occurs.  This is independent of SPA/DMU/ZAP versioning.  You must
446185029Spjd * also update the version_table[] and help message in zfs_prop.c.
447185029Spjd *
448185029Spjd * When changing, be sure to teach GRUB how to read the new format!
449219089Spjd * See usr/src/grub/grub-0.97/stage2/{zfs-include/,fsys_zfs*}
450185029Spjd */
451185029Spjd#define	ZPL_VERSION_1			1ULL
452185029Spjd#define	ZPL_VERSION_2			2ULL
453185029Spjd#define	ZPL_VERSION_3			3ULL
454209962Smm#define	ZPL_VERSION_4			4ULL
455219089Spjd#define	ZPL_VERSION_5			5ULL
456219089Spjd#define	ZPL_VERSION			ZPL_VERSION_5
457219089Spjd#define	ZPL_VERSION_STRING		"5"
458185029Spjd
459185029Spjd#define	ZPL_VERSION_INITIAL		ZPL_VERSION_1
460185029Spjd#define	ZPL_VERSION_DIRENT_TYPE		ZPL_VERSION_2
461185029Spjd#define	ZPL_VERSION_FUID		ZPL_VERSION_3
462185029Spjd#define	ZPL_VERSION_NORMALIZATION	ZPL_VERSION_3
463185029Spjd#define	ZPL_VERSION_SYSATTR		ZPL_VERSION_3
464209962Smm#define	ZPL_VERSION_USERSPACE		ZPL_VERSION_4
465219089Spjd#define	ZPL_VERSION_SA			ZPL_VERSION_5
466185029Spjd
467219089Spjd/* Rewind request information */
468219089Spjd#define	ZPOOL_NO_REWIND		1  /* No policy - default behavior */
469219089Spjd#define	ZPOOL_NEVER_REWIND	2  /* Do not search for best txg or rewind */
470219089Spjd#define	ZPOOL_TRY_REWIND	4  /* Search for best txg, but do not rewind */
471219089Spjd#define	ZPOOL_DO_REWIND		8  /* Rewind to best txg w/in deferred frees */
472219089Spjd#define	ZPOOL_EXTREME_REWIND	16 /* Allow extreme measures to find best txg */
473219089Spjd#define	ZPOOL_REWIND_MASK	28 /* All the possible rewind bits */
474219089Spjd#define	ZPOOL_REWIND_POLICIES	31 /* All the possible policy bits */
475219089Spjd
476219089Spjdtypedef struct zpool_rewind_policy {
477219089Spjd	uint32_t	zrp_request;	/* rewind behavior requested */
478219089Spjd	uint64_t	zrp_maxmeta;	/* max acceptable meta-data errors */
479219089Spjd	uint64_t	zrp_maxdata;	/* max acceptable data errors */
480219089Spjd	uint64_t	zrp_txg;	/* specific txg to load */
481219089Spjd} zpool_rewind_policy_t;
482219089Spjd
483185029Spjd/*
484168404Spjd * The following are configuration names used in the nvlist describing a pool's
485168404Spjd * configuration.
486168404Spjd */
487168404Spjd#define	ZPOOL_CONFIG_VERSION		"version"
488168404Spjd#define	ZPOOL_CONFIG_POOL_NAME		"name"
489168404Spjd#define	ZPOOL_CONFIG_POOL_STATE		"state"
490168404Spjd#define	ZPOOL_CONFIG_POOL_TXG		"txg"
491168404Spjd#define	ZPOOL_CONFIG_POOL_GUID		"pool_guid"
492168404Spjd#define	ZPOOL_CONFIG_CREATE_TXG		"create_txg"
493168404Spjd#define	ZPOOL_CONFIG_TOP_GUID		"top_guid"
494168404Spjd#define	ZPOOL_CONFIG_VDEV_TREE		"vdev_tree"
495168404Spjd#define	ZPOOL_CONFIG_TYPE		"type"
496168404Spjd#define	ZPOOL_CONFIG_CHILDREN		"children"
497168404Spjd#define	ZPOOL_CONFIG_ID			"id"
498168404Spjd#define	ZPOOL_CONFIG_GUID		"guid"
499168404Spjd#define	ZPOOL_CONFIG_PATH		"path"
500168404Spjd#define	ZPOOL_CONFIG_DEVID		"devid"
501168404Spjd#define	ZPOOL_CONFIG_METASLAB_ARRAY	"metaslab_array"
502168404Spjd#define	ZPOOL_CONFIG_METASLAB_SHIFT	"metaslab_shift"
503168404Spjd#define	ZPOOL_CONFIG_ASHIFT		"ashift"
504168404Spjd#define	ZPOOL_CONFIG_ASIZE		"asize"
505168404Spjd#define	ZPOOL_CONFIG_DTL		"DTL"
506219089Spjd#define	ZPOOL_CONFIG_SCAN_STATS		"scan_stats"	/* not stored on disk */
507219089Spjd#define	ZPOOL_CONFIG_VDEV_STATS		"vdev_stats"	/* not stored on disk */
508168404Spjd#define	ZPOOL_CONFIG_WHOLE_DISK		"whole_disk"
509168404Spjd#define	ZPOOL_CONFIG_ERRCOUNT		"error_count"
510168404Spjd#define	ZPOOL_CONFIG_NOT_PRESENT	"not_present"
511168404Spjd#define	ZPOOL_CONFIG_SPARES		"spares"
512168404Spjd#define	ZPOOL_CONFIG_IS_SPARE		"is_spare"
513168404Spjd#define	ZPOOL_CONFIG_NPARITY		"nparity"
514168498Spjd#define	ZPOOL_CONFIG_HOSTID		"hostid"
515168498Spjd#define	ZPOOL_CONFIG_HOSTNAME		"hostname"
516219089Spjd#define	ZPOOL_CONFIG_LOADED_TIME	"initial_load_time"
517185029Spjd#define	ZPOOL_CONFIG_UNSPARE		"unspare"
518185029Spjd#define	ZPOOL_CONFIG_PHYS_PATH		"phys_path"
519185029Spjd#define	ZPOOL_CONFIG_IS_LOG		"is_log"
520185029Spjd#define	ZPOOL_CONFIG_L2CACHE		"l2cache"
521219089Spjd#define	ZPOOL_CONFIG_HOLE_ARRAY		"hole_array"
522219089Spjd#define	ZPOOL_CONFIG_VDEV_CHILDREN	"vdev_children"
523219089Spjd#define	ZPOOL_CONFIG_IS_HOLE		"is_hole"
524219089Spjd#define	ZPOOL_CONFIG_DDT_HISTOGRAM	"ddt_histogram"
525219089Spjd#define	ZPOOL_CONFIG_DDT_OBJ_STATS	"ddt_object_stats"
526219089Spjd#define	ZPOOL_CONFIG_DDT_STATS		"ddt_stats"
527219089Spjd#define	ZPOOL_CONFIG_SPLIT		"splitcfg"
528219089Spjd#define	ZPOOL_CONFIG_ORIG_GUID		"orig_guid"
529219089Spjd#define	ZPOOL_CONFIG_SPLIT_GUID		"split_guid"
530219089Spjd#define	ZPOOL_CONFIG_SPLIT_LIST		"guid_list"
531219089Spjd#define	ZPOOL_CONFIG_REMOVING		"removing"
532262086Savg#define	ZPOOL_CONFIG_RESILVER_TXG	"resilver_txg"
533229578Smm#define	ZPOOL_CONFIG_COMMENT		"comment"
534185029Spjd#define	ZPOOL_CONFIG_SUSPENDED		"suspended"	/* not stored on disk */
535185029Spjd#define	ZPOOL_CONFIG_TIMESTAMP		"timestamp"	/* not stored on disk */
536185029Spjd#define	ZPOOL_CONFIG_BOOTFS		"bootfs"	/* not stored on disk */
537219089Spjd#define	ZPOOL_CONFIG_MISSING_DEVICES	"missing_vdevs"	/* not stored on disk */
538219089Spjd#define	ZPOOL_CONFIG_LOAD_INFO		"load_info"	/* not stored on disk */
539243674Smm#define	ZPOOL_CONFIG_REWIND_INFO	"rewind_info"	/* not stored on disk */
540243674Smm#define	ZPOOL_CONFIG_UNSUP_FEAT		"unsup_feat"	/* not stored on disk */
541243674Smm#define	ZPOOL_CONFIG_ENABLED_FEAT	"enabled_feat"	/* not stored on disk */
542243674Smm#define	ZPOOL_CONFIG_CAN_RDONLY		"can_rdonly"	/* not stored on disk */
543243674Smm#define	ZPOOL_CONFIG_FEATURES_FOR_READ	"features_for_read"
544243674Smm#define	ZPOOL_CONFIG_FEATURE_STATS	"feature_stats"	/* not stored on disk */
545185029Spjd/*
546185029Spjd * The persistent vdev state is stored as separate values rather than a single
547185029Spjd * 'vdev_state' entry.  This is because a device can be in multiple states, such
548185029Spjd * as offline and degraded.
549185029Spjd */
550185029Spjd#define	ZPOOL_CONFIG_OFFLINE		"offline"
551185029Spjd#define	ZPOOL_CONFIG_FAULTED		"faulted"
552185029Spjd#define	ZPOOL_CONFIG_DEGRADED		"degraded"
553185029Spjd#define	ZPOOL_CONFIG_REMOVED		"removed"
554209962Smm#define	ZPOOL_CONFIG_FRU		"fru"
555219089Spjd#define	ZPOOL_CONFIG_AUX_STATE		"aux_state"
556168404Spjd
557219089Spjd/* Rewind policy parameters */
558219089Spjd#define	ZPOOL_REWIND_POLICY		"rewind-policy"
559219089Spjd#define	ZPOOL_REWIND_REQUEST		"rewind-request"
560219089Spjd#define	ZPOOL_REWIND_REQUEST_TXG	"rewind-request-txg"
561219089Spjd#define	ZPOOL_REWIND_META_THRESH	"rewind-meta-thresh"
562219089Spjd#define	ZPOOL_REWIND_DATA_THRESH	"rewind-data-thresh"
563219089Spjd
564219089Spjd/* Rewind data discovered */
565219089Spjd#define	ZPOOL_CONFIG_LOAD_TIME		"rewind_txg_ts"
566219089Spjd#define	ZPOOL_CONFIG_LOAD_DATA_ERRORS	"verify_data_errors"
567219089Spjd#define	ZPOOL_CONFIG_REWIND_TIME	"seconds_of_rewind"
568219089Spjd
569168404Spjd#define	VDEV_TYPE_ROOT			"root"
570168404Spjd#define	VDEV_TYPE_MIRROR		"mirror"
571168404Spjd#define	VDEV_TYPE_REPLACING		"replacing"
572168404Spjd#define	VDEV_TYPE_RAIDZ			"raidz"
573168404Spjd#define	VDEV_TYPE_DISK			"disk"
574168404Spjd#define	VDEV_TYPE_FILE			"file"
575168404Spjd#define	VDEV_TYPE_MISSING		"missing"
576219089Spjd#define	VDEV_TYPE_HOLE			"hole"
577168404Spjd#define	VDEV_TYPE_SPARE			"spare"
578185029Spjd#define	VDEV_TYPE_LOG			"log"
579185029Spjd#define	VDEV_TYPE_L2CACHE		"l2cache"
580168404Spjd
581168404Spjd/*
582168404Spjd * This is needed in userland to report the minimum necessary device size.
583168404Spjd */
584168404Spjd#define	SPA_MINDEVSIZE		(64ULL << 20)
585168404Spjd
586168404Spjd/*
587168404Spjd * The location of the pool configuration repository, shared between kernel and
588168404Spjd * userland.
589168404Spjd */
590185029Spjd#define	ZPOOL_CACHE		"/boot/zfs/zpool.cache"
591168404Spjd
592168404Spjd/*
593168404Spjd * vdev states are ordered from least to most healthy.
594168404Spjd * A vdev that's CANT_OPEN or below is considered unusable.
595168404Spjd */
596168404Spjdtypedef enum vdev_state {
597168404Spjd	VDEV_STATE_UNKNOWN = 0,	/* Uninitialized vdev			*/
598168404Spjd	VDEV_STATE_CLOSED,	/* Not currently open			*/
599168404Spjd	VDEV_STATE_OFFLINE,	/* Not allowed to open			*/
600185029Spjd	VDEV_STATE_REMOVED,	/* Explicitly removed from system	*/
601168404Spjd	VDEV_STATE_CANT_OPEN,	/* Tried to open, but failed		*/
602185029Spjd	VDEV_STATE_FAULTED,	/* External request to fault device	*/
603168404Spjd	VDEV_STATE_DEGRADED,	/* Replicated vdev with unhealthy kids	*/
604168404Spjd	VDEV_STATE_HEALTHY	/* Presumed good			*/
605168404Spjd} vdev_state_t;
606168404Spjd
607185029Spjd#define	VDEV_STATE_ONLINE	VDEV_STATE_HEALTHY
608185029Spjd
609168404Spjd/*
610168404Spjd * vdev aux states.  When a vdev is in the CANT_OPEN state, the aux field
611168404Spjd * of the vdev stats structure uses these constants to distinguish why.
612168404Spjd */
613168404Spjdtypedef enum vdev_aux {
614168404Spjd	VDEV_AUX_NONE,		/* no error				*/
615168404Spjd	VDEV_AUX_OPEN_FAILED,	/* ldi_open_*() or vn_open() failed	*/
616168404Spjd	VDEV_AUX_CORRUPT_DATA,	/* bad label or disk contents		*/
617168404Spjd	VDEV_AUX_NO_REPLICAS,	/* insufficient number of replicas	*/
618168404Spjd	VDEV_AUX_BAD_GUID_SUM,	/* vdev guid sum doesn't match		*/
619168404Spjd	VDEV_AUX_TOO_SMALL,	/* vdev size is too small		*/
620168404Spjd	VDEV_AUX_BAD_LABEL,	/* the label is OK but invalid		*/
621168404Spjd	VDEV_AUX_VERSION_NEWER,	/* on-disk version is too new		*/
622168404Spjd	VDEV_AUX_VERSION_OLDER,	/* on-disk version is too old		*/
623243674Smm	VDEV_AUX_UNSUP_FEAT,	/* unsupported features			*/
624185029Spjd	VDEV_AUX_SPARED,	/* hot spare used in another pool	*/
625185029Spjd	VDEV_AUX_ERR_EXCEEDED,	/* too many errors			*/
626185029Spjd	VDEV_AUX_IO_FAILURE,	/* experienced I/O failure		*/
627219089Spjd	VDEV_AUX_BAD_LOG,	/* cannot read log chain(s)		*/
628219089Spjd	VDEV_AUX_EXTERNAL,	/* external diagnosis			*/
629262081Savg	VDEV_AUX_SPLIT_POOL,	/* vdev was split off into another pool	*/
630262081Savg	VDEV_AUX_ASHIFT_TOO_BIG /* vdev's min block size is too large   */
631168404Spjd} vdev_aux_t;
632168404Spjd
633168404Spjd/*
634168404Spjd * pool state.  The following states are written to disk as part of the normal
635185029Spjd * SPA lifecycle: ACTIVE, EXPORTED, DESTROYED, SPARE, L2CACHE.  The remaining
636185029Spjd * states are software abstractions used at various levels to communicate
637185029Spjd * pool state.
638168404Spjd */
639168404Spjdtypedef enum pool_state {
640168404Spjd	POOL_STATE_ACTIVE = 0,		/* In active use		*/
641168404Spjd	POOL_STATE_EXPORTED,		/* Explicitly exported		*/
642168404Spjd	POOL_STATE_DESTROYED,		/* Explicitly destroyed		*/
643168404Spjd	POOL_STATE_SPARE,		/* Reserved for hot spare use	*/
644185029Spjd	POOL_STATE_L2CACHE,		/* Level 2 ARC device		*/
645168404Spjd	POOL_STATE_UNINITIALIZED,	/* Internal spa_t state		*/
646168404Spjd	POOL_STATE_UNAVAIL,		/* Internal libzfs state	*/
647168404Spjd	POOL_STATE_POTENTIALLY_ACTIVE	/* Internal libzfs state	*/
648168404Spjd} pool_state_t;
649168404Spjd
650168404Spjd/*
651219089Spjd * Scan Functions.
652168404Spjd */
653219089Spjdtypedef enum pool_scan_func {
654219089Spjd	POOL_SCAN_NONE,
655219089Spjd	POOL_SCAN_SCRUB,
656219089Spjd	POOL_SCAN_RESILVER,
657219089Spjd	POOL_SCAN_FUNCS
658219089Spjd} pool_scan_func_t;
659168404Spjd
660168404Spjd/*
661168404Spjd * ZIO types.  Needed to interpret vdev statistics below.
662168404Spjd */
663168404Spjdtypedef enum zio_type {
664168404Spjd	ZIO_TYPE_NULL = 0,
665168404Spjd	ZIO_TYPE_READ,
666168404Spjd	ZIO_TYPE_WRITE,
667168404Spjd	ZIO_TYPE_FREE,
668168404Spjd	ZIO_TYPE_CLAIM,
669168404Spjd	ZIO_TYPE_IOCTL,
670168404Spjd	ZIO_TYPES
671168404Spjd} zio_type_t;
672168404Spjd
673168404Spjd/*
674219089Spjd * Pool statistics.  Note: all fields should be 64-bit because this
675219089Spjd * is passed between kernel and userland as an nvlist uint64 array.
676219089Spjd */
677219089Spjdtypedef struct pool_scan_stat {
678219089Spjd	/* values stored on disk */
679219089Spjd	uint64_t	pss_func;	/* pool_scan_func_t */
680219089Spjd	uint64_t	pss_state;	/* dsl_scan_state_t */
681219089Spjd	uint64_t	pss_start_time;	/* scan start time */
682219089Spjd	uint64_t	pss_end_time;	/* scan end time */
683219089Spjd	uint64_t	pss_to_examine;	/* total bytes to scan */
684219089Spjd	uint64_t	pss_examined;	/* total examined bytes	*/
685219089Spjd	uint64_t	pss_to_process; /* total bytes to process */
686219089Spjd	uint64_t	pss_processed;	/* total processed bytes */
687219089Spjd	uint64_t	pss_errors;	/* scan errors	*/
688219089Spjd
689219089Spjd	/* values not stored on disk */
690219089Spjd	uint64_t	pss_pass_exam;	/* examined bytes per scan pass */
691219089Spjd	uint64_t	pss_pass_start;	/* start time of a scan pass */
692219089Spjd} pool_scan_stat_t;
693219089Spjd
694219089Spjdtypedef enum dsl_scan_state {
695219089Spjd	DSS_NONE,
696219089Spjd	DSS_SCANNING,
697219089Spjd	DSS_FINISHED,
698219089Spjd	DSS_CANCELED,
699219089Spjd	DSS_NUM_STATES
700219089Spjd} dsl_scan_state_t;
701219089Spjd
702219089Spjd
703219089Spjd/*
704168404Spjd * Vdev statistics.  Note: all fields should be 64-bit because this
705168404Spjd * is passed between kernel and userland as an nvlist uint64 array.
706168404Spjd */
707168404Spjdtypedef struct vdev_stat {
708168404Spjd	hrtime_t	vs_timestamp;		/* time since vdev load	*/
709168404Spjd	uint64_t	vs_state;		/* vdev state		*/
710168404Spjd	uint64_t	vs_aux;			/* see vdev_aux_t	*/
711168404Spjd	uint64_t	vs_alloc;		/* space allocated	*/
712168404Spjd	uint64_t	vs_space;		/* total capacity	*/
713168404Spjd	uint64_t	vs_dspace;		/* deflated capacity	*/
714168404Spjd	uint64_t	vs_rsize;		/* replaceable dev size */
715236839Smm	uint64_t	vs_esize;		/* expandable dev size */
716168404Spjd	uint64_t	vs_ops[ZIO_TYPES];	/* operation count	*/
717168404Spjd	uint64_t	vs_bytes[ZIO_TYPES];	/* bytes read/written	*/
718168404Spjd	uint64_t	vs_read_errors;		/* read errors		*/
719168404Spjd	uint64_t	vs_write_errors;	/* write errors		*/
720168404Spjd	uint64_t	vs_checksum_errors;	/* checksum errors	*/
721168404Spjd	uint64_t	vs_self_healed;		/* self-healed bytes	*/
722219089Spjd	uint64_t	vs_scan_removing;	/* removing?	*/
723219089Spjd	uint64_t	vs_scan_processed;	/* scan processed bytes	*/
724262081Savg 	uint64_t	vs_configured_ashift;	/* TLV vdev_ashift      */
725262081Savg 	uint64_t	vs_logical_ashift;	/* vdev_logical_ashift  */
726262081Savg 	uint64_t	vs_physical_ashift;	/* vdev_physical_ashift */
727168404Spjd} vdev_stat_t;
728262081Savg#define VDEV_STAT_VALID(field, uint64_t_field_count) \
729262081Savg    ((uint64_t_field_count * sizeof(uint64_t)) >= \
730262081Savg     (offsetof(vdev_stat_t, field) + sizeof(((vdev_stat_t *)NULL)->field)))
731168404Spjd
732219089Spjd/*
733219089Spjd * DDT statistics.  Note: all fields should be 64-bit because this
734219089Spjd * is passed between kernel and userland as an nvlist uint64 array.
735219089Spjd */
736219089Spjdtypedef struct ddt_object {
737219089Spjd	uint64_t	ddo_count;	/* number of elments in ddt 	*/
738219089Spjd	uint64_t	ddo_dspace;	/* size of ddt on disk		*/
739219089Spjd	uint64_t	ddo_mspace;	/* size of ddt in-core		*/
740219089Spjd} ddt_object_t;
741219089Spjd
742219089Spjdtypedef struct ddt_stat {
743219089Spjd	uint64_t	dds_blocks;	/* blocks			*/
744219089Spjd	uint64_t	dds_lsize;	/* logical size			*/
745219089Spjd	uint64_t	dds_psize;	/* physical size		*/
746219089Spjd	uint64_t	dds_dsize;	/* deflated allocated size	*/
747219089Spjd	uint64_t	dds_ref_blocks;	/* referenced blocks		*/
748219089Spjd	uint64_t	dds_ref_lsize;	/* referenced lsize * refcnt	*/
749219089Spjd	uint64_t	dds_ref_psize;	/* referenced psize * refcnt	*/
750219089Spjd	uint64_t	dds_ref_dsize;	/* referenced dsize * refcnt	*/
751219089Spjd} ddt_stat_t;
752219089Spjd
753219089Spjdtypedef struct ddt_histogram {
754219089Spjd	ddt_stat_t	ddh_stat[64];	/* power-of-two histogram buckets */
755219089Spjd} ddt_histogram_t;
756219089Spjd
757185029Spjd#define	ZVOL_DRIVER	"zvol"
758168404Spjd#define	ZFS_DRIVER	"zfs"
759168404Spjd#define	ZFS_DEV_NAME	"zfs"
760168404Spjd#define	ZFS_DEV		"/dev/" ZFS_DEV_NAME
761168404Spjd
762219089Spjd/* general zvol path */
763219089Spjd#define	ZVOL_DIR		"/dev/zvol"
764219089Spjd/* expansion */
765219089Spjd#define	ZVOL_PSEUDO_DEV		"/devices/pseudo/zfs@0:"
766219089Spjd/* for dump and swap */
767219089Spjd#define	ZVOL_FULL_DEV_DIR	ZVOL_DIR "/dsk/"
768219089Spjd#define	ZVOL_FULL_RDEV_DIR	ZVOL_DIR "/rdsk/"
769168404Spjd
770168404Spjd#define	ZVOL_PROP_NAME		"name"
771219089Spjd#define	ZVOL_DEFAULT_BLOCKSIZE	8192
772168404Spjd
773168404Spjd/*
774168404Spjd * /dev/zfs ioctl numbers.
775168404Spjd */
776249643Smmtypedef enum zfs_ioc {
777249643Smm	ZFS_IOC_FIRST =	0,
778249643Smm	ZFS_IOC_POOL_CREATE = ZFS_IOC_FIRST,
779249643Smm	ZFS_IOC_POOL_DESTROY,
780249643Smm	ZFS_IOC_POOL_IMPORT,
781249643Smm	ZFS_IOC_POOL_EXPORT,
782249643Smm	ZFS_IOC_POOL_CONFIGS,
783249643Smm	ZFS_IOC_POOL_STATS,
784249643Smm	ZFS_IOC_POOL_TRYIMPORT,
785249643Smm	ZFS_IOC_POOL_SCAN,
786249643Smm	ZFS_IOC_POOL_FREEZE,
787249643Smm	ZFS_IOC_POOL_UPGRADE,
788249643Smm	ZFS_IOC_POOL_GET_HISTORY,
789249643Smm	ZFS_IOC_VDEV_ADD,
790249643Smm	ZFS_IOC_VDEV_REMOVE,
791249643Smm	ZFS_IOC_VDEV_SET_STATE,
792249643Smm	ZFS_IOC_VDEV_ATTACH,
793249643Smm	ZFS_IOC_VDEV_DETACH,
794249643Smm	ZFS_IOC_VDEV_SETPATH,
795249643Smm	ZFS_IOC_VDEV_SETFRU,
796249643Smm	ZFS_IOC_OBJSET_STATS,
797249643Smm	ZFS_IOC_OBJSET_ZPLPROPS,
798249643Smm	ZFS_IOC_DATASET_LIST_NEXT,
799249643Smm	ZFS_IOC_SNAPSHOT_LIST_NEXT,
800249643Smm	ZFS_IOC_SET_PROP,
801249643Smm	ZFS_IOC_CREATE,
802249643Smm	ZFS_IOC_DESTROY,
803249643Smm	ZFS_IOC_ROLLBACK,
804249643Smm	ZFS_IOC_RENAME,
805249643Smm	ZFS_IOC_RECV,
806249643Smm	ZFS_IOC_SEND,
807249643Smm	ZFS_IOC_INJECT_FAULT,
808249643Smm	ZFS_IOC_CLEAR_FAULT,
809249643Smm	ZFS_IOC_INJECT_LIST_NEXT,
810249643Smm	ZFS_IOC_ERROR_LOG,
811249643Smm	ZFS_IOC_CLEAR,
812249643Smm	ZFS_IOC_PROMOTE,
813249643Smm	ZFS_IOC_DESTROY_SNAPS,
814249643Smm	ZFS_IOC_SNAPSHOT,
815249643Smm	ZFS_IOC_DSOBJ_TO_DSNAME,
816249643Smm	ZFS_IOC_OBJ_TO_PATH,
817249643Smm	ZFS_IOC_POOL_SET_PROPS,
818249643Smm	ZFS_IOC_POOL_GET_PROPS,
819249643Smm	ZFS_IOC_SET_FSACL,
820249643Smm	ZFS_IOC_GET_FSACL,
821249643Smm	ZFS_IOC_SHARE,
822249643Smm	ZFS_IOC_INHERIT_PROP,
823249643Smm	ZFS_IOC_SMB_ACL,
824249643Smm	ZFS_IOC_USERSPACE_ONE,
825249643Smm	ZFS_IOC_USERSPACE_MANY,
826249643Smm	ZFS_IOC_USERSPACE_UPGRADE,
827249643Smm	ZFS_IOC_HOLD,
828249643Smm	ZFS_IOC_RELEASE,
829249643Smm	ZFS_IOC_GET_HOLDS,
830249643Smm	ZFS_IOC_OBJSET_RECVD_PROPS,
831249643Smm	ZFS_IOC_VDEV_SPLIT,
832249643Smm	ZFS_IOC_NEXT_OBJ,
833249643Smm	ZFS_IOC_DIFF,
834249643Smm	ZFS_IOC_TMP_SNAPSHOT,
835249643Smm	ZFS_IOC_OBJ_TO_STATS,
836249643Smm	ZFS_IOC_JAIL,
837249643Smm	ZFS_IOC_UNJAIL,
838249643Smm	ZFS_IOC_POOL_REGUID,
839249643Smm	ZFS_IOC_SPACE_WRITTEN,
840249643Smm	ZFS_IOC_SPACE_SNAPS,
841249643Smm	ZFS_IOC_SEND_PROGRESS,
842249643Smm	ZFS_IOC_POOL_REOPEN,
843249643Smm	ZFS_IOC_LOG_HISTORY,
844249643Smm	ZFS_IOC_SEND_NEW,
845249643Smm	ZFS_IOC_SEND_SPACE,
846249643Smm	ZFS_IOC_CLONE,
847263410Sdelphij	ZFS_IOC_BOOKMARK,
848263410Sdelphij	ZFS_IOC_GET_BOOKMARKS,
849263410Sdelphij	ZFS_IOC_DESTROY_BOOKMARKS,
850249643Smm	ZFS_IOC_LAST
851249643Smm} zfs_ioc_t;
852168404Spjd
853168404Spjd/*
854168404Spjd * Internal SPA load state.  Used by FMA diagnosis engine.
855168404Spjd */
856168404Spjdtypedef enum {
857219089Spjd	SPA_LOAD_NONE,		/* no load in progress	*/
858219089Spjd	SPA_LOAD_OPEN,		/* normal open		*/
859219089Spjd	SPA_LOAD_IMPORT,	/* import in progress	*/
860219089Spjd	SPA_LOAD_TRYIMPORT,	/* tryimport in progress */
861219089Spjd	SPA_LOAD_RECOVER,	/* recovery requested	*/
862219089Spjd	SPA_LOAD_ERROR		/* load failed		*/
863168404Spjd} spa_load_state_t;
864168404Spjd
865168404Spjd/*
866168404Spjd * Bookmark name values.
867168404Spjd */
868168404Spjd#define	ZPOOL_ERR_LIST		"error list"
869168404Spjd#define	ZPOOL_ERR_DATASET	"dataset"
870168404Spjd#define	ZPOOL_ERR_OBJECT	"object"
871168404Spjd
872168404Spjd#define	HIS_MAX_RECORD_LEN	(MAXPATHLEN + MAXPATHLEN + 1)
873168404Spjd
874168404Spjd/*
875168404Spjd * The following are names used in the nvlist describing
876168404Spjd * the pool's history log.
877168404Spjd */
878168404Spjd#define	ZPOOL_HIST_RECORD	"history record"
879168404Spjd#define	ZPOOL_HIST_TIME		"history time"
880168404Spjd#define	ZPOOL_HIST_CMD		"history command"
881185029Spjd#define	ZPOOL_HIST_WHO		"history who"
882185029Spjd#define	ZPOOL_HIST_ZONE		"history zone"
883185029Spjd#define	ZPOOL_HIST_HOST		"history hostname"
884185029Spjd#define	ZPOOL_HIST_TXG		"history txg"
885185029Spjd#define	ZPOOL_HIST_INT_EVENT	"history internal event"
886185029Spjd#define	ZPOOL_HIST_INT_STR	"history internal str"
887249643Smm#define	ZPOOL_HIST_INT_NAME	"internal_name"
888249643Smm#define	ZPOOL_HIST_IOCTL	"ioctl"
889249643Smm#define	ZPOOL_HIST_INPUT_NVL	"in_nvl"
890249643Smm#define	ZPOOL_HIST_OUTPUT_NVL	"out_nvl"
891249643Smm#define	ZPOOL_HIST_DSNAME	"dsname"
892249643Smm#define	ZPOOL_HIST_DSID		"dsid"
893168404Spjd
894185029Spjd/*
895185029Spjd * Flags for ZFS_IOC_VDEV_SET_STATE
896185029Spjd */
897185029Spjd#define	ZFS_ONLINE_CHECKREMOVE	0x1
898185029Spjd#define	ZFS_ONLINE_UNSPARE	0x2
899185029Spjd#define	ZFS_ONLINE_FORCEFAULT	0x4
900219089Spjd#define	ZFS_ONLINE_EXPAND	0x8
901185029Spjd#define	ZFS_OFFLINE_TEMPORARY	0x1
902185029Spjd
903185029Spjd/*
904219089Spjd * Flags for ZFS_IOC_POOL_IMPORT
905219089Spjd */
906219089Spjd#define	ZFS_IMPORT_NORMAL	0x0
907219089Spjd#define	ZFS_IMPORT_VERBATIM	0x1
908219089Spjd#define	ZFS_IMPORT_ANY_HOST	0x2
909219089Spjd#define	ZFS_IMPORT_MISSING_LOG	0x4
910219089Spjd#define	ZFS_IMPORT_ONLY		0x8
911219089Spjd
912219089Spjd/*
913185029Spjd * Sysevent payload members.  ZFS will generate the following sysevents with the
914185029Spjd * given payloads:
915185029Spjd *
916185029Spjd *	ESC_ZFS_RESILVER_START
917185029Spjd *	ESC_ZFS_RESILVER_END
918185029Spjd *	ESC_ZFS_POOL_DESTROY
919229578Smm *	ESC_ZFS_POOL_REGUID
920185029Spjd *
921185029Spjd *		ZFS_EV_POOL_NAME	DATA_TYPE_STRING
922185029Spjd *		ZFS_EV_POOL_GUID	DATA_TYPE_UINT64
923185029Spjd *
924185029Spjd *	ESC_ZFS_VDEV_REMOVE
925185029Spjd *	ESC_ZFS_VDEV_CLEAR
926185029Spjd *	ESC_ZFS_VDEV_CHECK
927185029Spjd *
928185029Spjd *		ZFS_EV_POOL_NAME	DATA_TYPE_STRING
929185029Spjd *		ZFS_EV_POOL_GUID	DATA_TYPE_UINT64
930185029Spjd *		ZFS_EV_VDEV_PATH	DATA_TYPE_STRING	(optional)
931185029Spjd *		ZFS_EV_VDEV_GUID	DATA_TYPE_UINT64
932185029Spjd */
933185029Spjd#define	ZFS_EV_POOL_NAME	"pool_name"
934185029Spjd#define	ZFS_EV_POOL_GUID	"pool_guid"
935185029Spjd#define	ZFS_EV_VDEV_PATH	"vdev_path"
936185029Spjd#define	ZFS_EV_VDEV_GUID	"vdev_guid"
937185029Spjd
938168404Spjd#ifdef	__cplusplus
939168404Spjd}
940168404Spjd#endif
941168404Spjd
942168404Spjd#endif	/* _SYS_FS_ZFS_H */
943