xref: /onnv-gate/usr/src/uts/common/fs/zfs/sys/zfs_ioctl.h (revision 13043:8c712bbb18ea)
1789Sahrens /*
2789Sahrens  * CDDL HEADER START
3789Sahrens  *
4789Sahrens  * The contents of this file are subject to the terms of the
51544Seschrock  * Common Development and Distribution License (the "License").
61544Seschrock  * You may not use this file except in compliance with the License.
7789Sahrens  *
8789Sahrens  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9789Sahrens  * or http://www.opensolaris.org/os/licensing.
10789Sahrens  * See the License for the specific language governing permissions
11789Sahrens  * and limitations under the License.
12789Sahrens  *
13789Sahrens  * When distributing Covered Code, include this CDDL HEADER in each
14789Sahrens  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15789Sahrens  * If applicable, add the following below this CDDL HEADER, with the
16789Sahrens  * fields enclosed by brackets "[]" replaced with your own identifying
17789Sahrens  * information: Portions Copyright [yyyy] [name of copyright owner]
18789Sahrens  *
19789Sahrens  * CDDL HEADER END
20789Sahrens  */
21789Sahrens /*
2212527SChris.Kirby@oracle.com  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23789Sahrens  */
24789Sahrens 
25789Sahrens #ifndef	_SYS_ZFS_IOCTL_H
26789Sahrens #define	_SYS_ZFS_IOCTL_H
27789Sahrens 
28789Sahrens #include <sys/cred.h>
29789Sahrens #include <sys/dmu.h>
301544Seschrock #include <sys/zio.h>
314543Smarks #include <sys/dsl_deleg.h>
3211007SLori.Alt@Sun.COM #include <sys/spa.h>
33*13043STim.Haley@Sun.COM #include <sys/zfs_stat.h>
34789Sahrens 
355331Samw #ifdef _KERNEL
365331Samw #include <sys/nvpair.h>
375331Samw #endif	/* _KERNEL */
385331Samw 
39789Sahrens #ifdef	__cplusplus
40789Sahrens extern "C" {
41789Sahrens #endif
42789Sahrens 
43789Sahrens /*
44789Sahrens  * Property values for snapdir
45789Sahrens  */
46849Sbonwick #define	ZFS_SNAPDIR_HIDDEN		0
47849Sbonwick #define	ZFS_SNAPDIR_VISIBLE		1
48789Sahrens 
4911007SLori.Alt@Sun.COM /*
5011007SLori.Alt@Sun.COM  * Field manipulation macros for the drr_versioninfo field of the
5111007SLori.Alt@Sun.COM  * send stream header.
5211007SLori.Alt@Sun.COM  */
5311007SLori.Alt@Sun.COM 
5411007SLori.Alt@Sun.COM /*
5511007SLori.Alt@Sun.COM  * Header types for zfs send streams.
5611007SLori.Alt@Sun.COM  */
5711007SLori.Alt@Sun.COM typedef enum drr_headertype {
5811007SLori.Alt@Sun.COM 	DMU_SUBSTREAM = 0x1,
5911007SLori.Alt@Sun.COM 	DMU_COMPOUNDSTREAM = 0x2
6011007SLori.Alt@Sun.COM } drr_headertype_t;
6111007SLori.Alt@Sun.COM 
6211007SLori.Alt@Sun.COM #define	DMU_GET_STREAM_HDRTYPE(vi)	BF64_GET((vi), 0, 2)
6311007SLori.Alt@Sun.COM #define	DMU_SET_STREAM_HDRTYPE(vi, x)	BF64_SET((vi), 0, 2, x)
6411007SLori.Alt@Sun.COM 
6511007SLori.Alt@Sun.COM #define	DMU_GET_FEATUREFLAGS(vi)	BF64_GET((vi), 2, 30)
6611007SLori.Alt@Sun.COM #define	DMU_SET_FEATUREFLAGS(vi, x)	BF64_SET((vi), 2, 30, x)
6711007SLori.Alt@Sun.COM 
6811007SLori.Alt@Sun.COM /*
6911007SLori.Alt@Sun.COM  * Feature flags for zfs send streams (flags in drr_versioninfo)
7011007SLori.Alt@Sun.COM  */
7111007SLori.Alt@Sun.COM 
7211007SLori.Alt@Sun.COM #define	DMU_BACKUP_FEATURE_DEDUP	(0x1)
7311381SLori.Alt@Sun.COM #define	DMU_BACKUP_FEATURE_DEDUPPROPS	(0x2)
7411935SMark.Shellenbaum@Sun.COM #define	DMU_BACKUP_FEATURE_SA_SPILL	(0x4)
7511007SLori.Alt@Sun.COM 
7611007SLori.Alt@Sun.COM /*
7711007SLori.Alt@Sun.COM  * Mask of all supported backup features
7811007SLori.Alt@Sun.COM  */
7911381SLori.Alt@Sun.COM #define	DMU_BACKUP_FEATURE_MASK	(DMU_BACKUP_FEATURE_DEDUP | \
8011935SMark.Shellenbaum@Sun.COM 		DMU_BACKUP_FEATURE_DEDUPPROPS | DMU_BACKUP_FEATURE_SA_SPILL)
8111007SLori.Alt@Sun.COM 
8211007SLori.Alt@Sun.COM /* Are all features in the given flag word currently supported? */
8311007SLori.Alt@Sun.COM #define	DMU_STREAM_SUPPORTED(x)	(!((x) & ~DMU_BACKUP_FEATURE_MASK))
8411007SLori.Alt@Sun.COM 
8511007SLori.Alt@Sun.COM /*
8611007SLori.Alt@Sun.COM  * The drr_versioninfo field of the dmu_replay_record has the
8711007SLori.Alt@Sun.COM  * following layout:
8811007SLori.Alt@Sun.COM  *
8911007SLori.Alt@Sun.COM  *	64	56	48	40	32	24	16	8	0
9011007SLori.Alt@Sun.COM  *	+-------+-------+-------+-------+-------+-------+-------+-------+
9111007SLori.Alt@Sun.COM  *  	|		reserved	|        feature-flags	    |C|S|
9211007SLori.Alt@Sun.COM  *	+-------+-------+-------+-------+-------+-------+-------+-------+
9311007SLori.Alt@Sun.COM  *
9411007SLori.Alt@Sun.COM  * The low order two bits indicate the header type: SUBSTREAM (0x1)
9511007SLori.Alt@Sun.COM  * or COMPOUNDSTREAM (0x2).  Using two bits for this is historical:
9611007SLori.Alt@Sun.COM  * this field used to be a version number, where the two version types
9711007SLori.Alt@Sun.COM  * were 1 and 2.  Using two bits for this allows earlier versions of
9811007SLori.Alt@Sun.COM  * the code to be able to recognize send streams that don't use any
9911007SLori.Alt@Sun.COM  * of the features indicated by feature flags.
10011007SLori.Alt@Sun.COM  */
10111007SLori.Alt@Sun.COM 
102789Sahrens #define	DMU_BACKUP_MAGIC 0x2F5bacbacULL
103789Sahrens 
1046492Stimh #define	DRR_FLAG_CLONE		(1<<0)
1056492Stimh #define	DRR_FLAG_CI_DATA	(1<<1)
1065367Sahrens 
107789Sahrens /*
10811381SLori.Alt@Sun.COM  * flags in the drr_checksumflags field in the DRR_WRITE and
10911381SLori.Alt@Sun.COM  * DRR_WRITE_BYREF blocks
11011381SLori.Alt@Sun.COM  */
11111381SLori.Alt@Sun.COM #define	DRR_CHECKSUM_DEDUP	(1<<0)
11211381SLori.Alt@Sun.COM 
11311381SLori.Alt@Sun.COM #define	DRR_IS_DEDUP_CAPABLE(flags)	((flags) & DRR_CHECKSUM_DEDUP)
11411381SLori.Alt@Sun.COM 
11511381SLori.Alt@Sun.COM /*
116789Sahrens  * zfs ioctl command structure
117789Sahrens  */
118789Sahrens typedef struct dmu_replay_record {
119789Sahrens 	enum {
120789Sahrens 		DRR_BEGIN, DRR_OBJECT, DRR_FREEOBJECTS,
12111007SLori.Alt@Sun.COM 		DRR_WRITE, DRR_FREE, DRR_END, DRR_WRITE_BYREF,
12211935SMark.Shellenbaum@Sun.COM 		DRR_SPILL, DRR_NUMTYPES
123789Sahrens 	} drr_type;
1245367Sahrens 	uint32_t drr_payloadlen;
125789Sahrens 	union {
126789Sahrens 		struct drr_begin {
127789Sahrens 			uint64_t drr_magic;
12811007SLori.Alt@Sun.COM 			uint64_t drr_versioninfo; /* was drr_version */
129789Sahrens 			uint64_t drr_creation_time;
130789Sahrens 			dmu_objset_type_t drr_type;
1315367Sahrens 			uint32_t drr_flags;
132789Sahrens 			uint64_t drr_toguid;
133789Sahrens 			uint64_t drr_fromguid;
134789Sahrens 			char drr_toname[MAXNAMELEN];
135789Sahrens 		} drr_begin;
136789Sahrens 		struct drr_end {
1371544Seschrock 			zio_cksum_t drr_checksum;
13811007SLori.Alt@Sun.COM 			uint64_t drr_toguid;
139789Sahrens 		} drr_end;
140789Sahrens 		struct drr_object {
141789Sahrens 			uint64_t drr_object;
142789Sahrens 			dmu_object_type_t drr_type;
143789Sahrens 			dmu_object_type_t drr_bonustype;
144789Sahrens 			uint32_t drr_blksz;
145789Sahrens 			uint32_t drr_bonuslen;
14611007SLori.Alt@Sun.COM 			uint8_t drr_checksumtype;
147789Sahrens 			uint8_t drr_compress;
148789Sahrens 			uint8_t drr_pad[6];
14911007SLori.Alt@Sun.COM 			uint64_t drr_toguid;
1502885Sahrens 			/* bonus content follows */
151789Sahrens 		} drr_object;
152789Sahrens 		struct drr_freeobjects {
153789Sahrens 			uint64_t drr_firstobj;
154789Sahrens 			uint64_t drr_numobjs;
15511007SLori.Alt@Sun.COM 			uint64_t drr_toguid;
156789Sahrens 		} drr_freeobjects;
157789Sahrens 		struct drr_write {
158789Sahrens 			uint64_t drr_object;
159789Sahrens 			dmu_object_type_t drr_type;
160789Sahrens 			uint32_t drr_pad;
161789Sahrens 			uint64_t drr_offset;
162789Sahrens 			uint64_t drr_length;
16311007SLori.Alt@Sun.COM 			uint64_t drr_toguid;
16411007SLori.Alt@Sun.COM 			uint8_t drr_checksumtype;
16511381SLori.Alt@Sun.COM 			uint8_t drr_checksumflags;
16611381SLori.Alt@Sun.COM 			uint8_t drr_pad2[6];
16711381SLori.Alt@Sun.COM 			ddt_key_t drr_key; /* deduplication key */
1682885Sahrens 			/* content follows */
169789Sahrens 		} drr_write;
170789Sahrens 		struct drr_free {
171789Sahrens 			uint64_t drr_object;
172789Sahrens 			uint64_t drr_offset;
173789Sahrens 			uint64_t drr_length;
17411007SLori.Alt@Sun.COM 			uint64_t drr_toguid;
175789Sahrens 		} drr_free;
17611007SLori.Alt@Sun.COM 		struct drr_write_byref {
17711007SLori.Alt@Sun.COM 			/* where to put the data */
17811007SLori.Alt@Sun.COM 			uint64_t drr_object;
17911007SLori.Alt@Sun.COM 			uint64_t drr_offset;
18011007SLori.Alt@Sun.COM 			uint64_t drr_length;
18111007SLori.Alt@Sun.COM 			uint64_t drr_toguid;
18211007SLori.Alt@Sun.COM 			/* where to find the prior copy of the data */
18311007SLori.Alt@Sun.COM 			uint64_t drr_refguid;
18411007SLori.Alt@Sun.COM 			uint64_t drr_refobject;
18511007SLori.Alt@Sun.COM 			uint64_t drr_refoffset;
18611381SLori.Alt@Sun.COM 			/* properties of the data */
18711007SLori.Alt@Sun.COM 			uint8_t drr_checksumtype;
18811381SLori.Alt@Sun.COM 			uint8_t drr_checksumflags;
18911381SLori.Alt@Sun.COM 			uint8_t drr_pad2[6];
19011381SLori.Alt@Sun.COM 			ddt_key_t drr_key; /* deduplication key */
19111007SLori.Alt@Sun.COM 		} drr_write_byref;
19211935SMark.Shellenbaum@Sun.COM 		struct drr_spill {
19311935SMark.Shellenbaum@Sun.COM 			uint64_t drr_object;
19411935SMark.Shellenbaum@Sun.COM 			uint64_t drr_length;
19511935SMark.Shellenbaum@Sun.COM 			uint64_t drr_toguid;
19611935SMark.Shellenbaum@Sun.COM 			uint64_t drr_pad[4]; /* needed for crypto */
19711935SMark.Shellenbaum@Sun.COM 			/* spill data follows */
19811935SMark.Shellenbaum@Sun.COM 		} drr_spill;
199789Sahrens 	} drr_u;
200789Sahrens } dmu_replay_record_t;
201789Sahrens 
202*13043STim.Haley@Sun.COM /* diff record range types */
203*13043STim.Haley@Sun.COM typedef enum diff_type {
204*13043STim.Haley@Sun.COM 	DDR_NONE = 0x1,
205*13043STim.Haley@Sun.COM 	DDR_INUSE = 0x2,
206*13043STim.Haley@Sun.COM 	DDR_FREE = 0x4
207*13043STim.Haley@Sun.COM } diff_type_t;
208*13043STim.Haley@Sun.COM 
209*13043STim.Haley@Sun.COM /*
210*13043STim.Haley@Sun.COM  * The diff reports back ranges of free or in-use objects.
211*13043STim.Haley@Sun.COM  */
212*13043STim.Haley@Sun.COM typedef struct dmu_diff_record {
213*13043STim.Haley@Sun.COM 	uint64_t ddr_type;
214*13043STim.Haley@Sun.COM 	uint64_t ddr_first;
215*13043STim.Haley@Sun.COM 	uint64_t ddr_last;
216*13043STim.Haley@Sun.COM } dmu_diff_record_t;
217*13043STim.Haley@Sun.COM 
2181544Seschrock typedef struct zinject_record {
2191544Seschrock 	uint64_t	zi_objset;
2201544Seschrock 	uint64_t	zi_object;
2211544Seschrock 	uint64_t	zi_start;
2221544Seschrock 	uint64_t	zi_end;
2231544Seschrock 	uint64_t	zi_guid;
2241544Seschrock 	uint32_t	zi_level;
2251544Seschrock 	uint32_t	zi_error;
2261544Seschrock 	uint64_t	zi_type;
2271544Seschrock 	uint32_t	zi_freq;
2289725SEric.Schrock@Sun.COM 	uint32_t	zi_failfast;
22910594SGeorge.Wilson@Sun.COM 	char		zi_func[MAXNAMELEN];
23010685SGeorge.Wilson@Sun.COM 	uint32_t	zi_iotype;
23110921STim.Haley@Sun.COM 	int32_t		zi_duration;
23210921STim.Haley@Sun.COM 	uint64_t	zi_timer;
2331544Seschrock } zinject_record_t;
2341544Seschrock 
2351544Seschrock #define	ZINJECT_NULL		0x1
2361544Seschrock #define	ZINJECT_FLUSH_ARC	0x2
2371544Seschrock #define	ZINJECT_UNLOAD_SPA	0x4
2381544Seschrock 
2394543Smarks typedef struct zfs_share {
2404543Smarks 	uint64_t	z_exportdata;
2414543Smarks 	uint64_t	z_sharedata;
2424543Smarks 	uint64_t	z_sharetype;	/* 0 = share, 1 = unshare */
2434543Smarks 	uint64_t	z_sharemax;  /* max length of share string */
2444543Smarks } zfs_share_t;
2454543Smarks 
2465498Stimh /*
2475498Stimh  * ZFS file systems may behave the usual, POSIX-compliant way, where
2485498Stimh  * name lookups are case-sensitive.  They may also be set up so that
2495498Stimh  * all the name lookups are case-insensitive, or so that only some
2505498Stimh  * lookups, the ones that set an FIGNORECASE flag, are case-insensitive.
2515498Stimh  */
2525498Stimh typedef enum zfs_case {
2535498Stimh 	ZFS_CASE_SENSITIVE,
2545498Stimh 	ZFS_CASE_INSENSITIVE,
2555498Stimh 	ZFS_CASE_MIXED
2565498Stimh } zfs_case_t;
2575498Stimh 
258789Sahrens typedef struct zfs_cmd {
2592467Sek110237 	char		zc_name[MAXPATHLEN];
2603444Sek110237 	char		zc_value[MAXPATHLEN * 2];
2615367Sahrens 	char		zc_string[MAXNAMELEN];
26211007SLori.Alt@Sun.COM 	char		zc_top_ds[MAXPATHLEN];
2631544Seschrock 	uint64_t	zc_guid;
2645094Slling 	uint64_t	zc_nvlist_conf;		/* really (char *) */
2655094Slling 	uint64_t	zc_nvlist_conf_size;
2665094Slling 	uint64_t	zc_nvlist_src;		/* really (char *) */
2672676Seschrock 	uint64_t	zc_nvlist_src_size;
2685094Slling 	uint64_t	zc_nvlist_dst;		/* really (char *) */
2692676Seschrock 	uint64_t	zc_nvlist_dst_size;
270789Sahrens 	uint64_t	zc_cookie;
271789Sahrens 	uint64_t	zc_objset_type;
2724543Smarks 	uint64_t	zc_perm_action;
2735094Slling 	uint64_t 	zc_history;		/* really (char *) */
2744543Smarks 	uint64_t 	zc_history_len;
2752926Sek110237 	uint64_t	zc_history_offset;
2763444Sek110237 	uint64_t	zc_obj;
2779643SEric.Taylor@Sun.COM 	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
2784543Smarks 	zfs_share_t	zc_share;
279789Sahrens 	dmu_objset_stats_t zc_objset_stats;
280789Sahrens 	struct drr_begin zc_begin_record;
2811544Seschrock 	zinject_record_t zc_inject_record;
28210242Schris.kirby@sun.com 	boolean_t	zc_defer_destroy;
28310342Schris.kirby@sun.com 	boolean_t	zc_temphold;
28412527SChris.Kirby@oracle.com 	uint64_t	zc_action_handle;
28512527SChris.Kirby@oracle.com 	int		zc_cleanup_fd;
286*13043STim.Haley@Sun.COM 	uint8_t		zc_pad[4];		/* alignment */
28712786SChris.Kirby@oracle.com 	uint64_t	zc_sendobj;
28812786SChris.Kirby@oracle.com 	uint64_t	zc_fromobj;
28912786SChris.Kirby@oracle.com 	uint64_t	zc_createtxg;
290*13043STim.Haley@Sun.COM 	zfs_stat_t	zc_stat;
291789Sahrens } zfs_cmd_t;
292789Sahrens 
2939396SMatthew.Ahrens@Sun.COM typedef struct zfs_useracct {
2949396SMatthew.Ahrens@Sun.COM 	char zu_domain[256];
2959396SMatthew.Ahrens@Sun.COM 	uid_t zu_rid;
2969396SMatthew.Ahrens@Sun.COM 	uint32_t zu_pad;
2979396SMatthew.Ahrens@Sun.COM 	uint64_t zu_space;
2989396SMatthew.Ahrens@Sun.COM } zfs_useracct_t;
2999396SMatthew.Ahrens@Sun.COM 
30012527SChris.Kirby@oracle.com #define	ZFSDEV_MAX_MINOR	(1 << 16)
30112527SChris.Kirby@oracle.com #define	ZFS_MIN_MINOR	(ZFSDEV_MAX_MINOR + 1)
302849Sbonwick 
30311422SMark.Musante@Sun.COM #define	ZPOOL_EXPORT_AFTER_SPLIT 0x1
30411422SMark.Musante@Sun.COM 
305789Sahrens #ifdef _KERNEL
306789Sahrens 
3075331Samw typedef struct zfs_creat {
3085498Stimh 	nvlist_t	*zct_zplprops;
3095331Samw 	nvlist_t	*zct_props;
3105331Samw } zfs_creat_t;
3115331Samw 
312789Sahrens extern dev_info_t *zfs_dip;
313789Sahrens 
3144543Smarks extern int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr);
3154543Smarks extern int zfs_secpolicy_rename_perms(const char *from,
3164543Smarks     const char *to, cred_t *cr);
3174543Smarks extern int zfs_secpolicy_destroy_perms(const char *name, cred_t *cr);
318789Sahrens extern int zfs_busy(void);
31911209SMatthew.Ahrens@Sun.COM extern int zfs_unmount_snap(const char *, void *);
320789Sahrens 
32112527SChris.Kirby@oracle.com /*
32212527SChris.Kirby@oracle.com  * ZFS minor numbers can refer to either a control device instance or
32312527SChris.Kirby@oracle.com  * a zvol. Depending on the value of zss_type, zss_data points to either
32412527SChris.Kirby@oracle.com  * a zvol_state_t or a zfs_onexit_t.
32512527SChris.Kirby@oracle.com  */
32612527SChris.Kirby@oracle.com enum zfs_soft_state_type {
32712527SChris.Kirby@oracle.com 	ZSST_ZVOL,
32812527SChris.Kirby@oracle.com 	ZSST_CTLDEV
32912527SChris.Kirby@oracle.com };
33012527SChris.Kirby@oracle.com 
33112527SChris.Kirby@oracle.com typedef struct zfs_soft_state {
33212527SChris.Kirby@oracle.com 	enum zfs_soft_state_type zss_type;
33312527SChris.Kirby@oracle.com 	void *zss_data;
33412527SChris.Kirby@oracle.com } zfs_soft_state_t;
33512527SChris.Kirby@oracle.com 
33612527SChris.Kirby@oracle.com extern void *zfsdev_get_soft_state(minor_t minor,
33712527SChris.Kirby@oracle.com     enum zfs_soft_state_type which);
33812527SChris.Kirby@oracle.com extern minor_t zfsdev_minor_alloc(void);
33912527SChris.Kirby@oracle.com 
34012527SChris.Kirby@oracle.com extern void *zfsdev_state;
34112527SChris.Kirby@oracle.com extern kmutex_t zfsdev_state_lock;
34212527SChris.Kirby@oracle.com 
343789Sahrens #endif	/* _KERNEL */
344789Sahrens 
345789Sahrens #ifdef	__cplusplus
346789Sahrens }
347789Sahrens #endif
348789Sahrens 
349789Sahrens #endif	/* _SYS_ZFS_IOCTL_H */
350