1219089Spjd/*
2219089Spjd * CDDL HEADER START
3219089Spjd *
4219089Spjd * The contents of this file are subject to the terms of the
5219089Spjd * Common Development and Distribution License (the "License").
6219089Spjd * You may not use this file except in compliance with the License.
7219089Spjd *
8219089Spjd * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9219089Spjd * or http://www.opensolaris.org/os/licensing.
10219089Spjd * See the License for the specific language governing permissions
11219089Spjd * and limitations under the License.
12219089Spjd *
13219089Spjd * When distributing Covered Code, include this CDDL HEADER in each
14219089Spjd * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15219089Spjd * If applicable, add the following below this CDDL HEADER, with the
16219089Spjd * fields enclosed by brackets "[]" replaced with your own identifying
17219089Spjd * information: Portions Copyright [yyyy] [name of copyright owner]
18219089Spjd *
19219089Spjd * CDDL HEADER END
20219089Spjd */
21219089Spjd/*
22268075Sdelphij * Copyright 2014 Xin Li <delphij@FreeBSD.org>.  All rights reserved.
23247540Smm * Copyright 2013 Martin Matuska <mm@FreeBSD.org>.  All rights reserved.
24219089Spjd * Use is subject to license terms.
25219089Spjd */
26219089Spjd
27219089Spjd#ifndef	_SYS_ZFS_IOCTL_COMPAT_H
28219089Spjd#define	_SYS_ZFS_IOCTL_COMPAT_H
29219089Spjd
30219089Spjd#include <sys/cred.h>
31219089Spjd#include <sys/dmu.h>
32219089Spjd#include <sys/zio.h>
33219089Spjd#include <sys/dsl_deleg.h>
34219089Spjd#include <sys/zfs_ioctl.h>
35219089Spjd
36219089Spjd#ifdef _KERNEL
37219089Spjd#include <sys/nvpair.h>
38219089Spjd#endif  /* _KERNEL */
39219089Spjd
40219089Spjd#ifdef	__cplusplus
41219089Spjdextern "C" {
42219089Spjd#endif
43219089Spjd
44247540Smm/*
45247540Smm * Backwards ioctl compatibility
46247540Smm */
47247540Smm
48247540Smm/* ioctl versions for vfs.zfs.version.ioctl */
49248571Smm#define	ZFS_IOCVER_UNDEF	-1
50248571Smm#define	ZFS_IOCVER_NONE		0
51247540Smm#define	ZFS_IOCVER_DEADMAN	1
52248571Smm#define	ZFS_IOCVER_LZC		2
53249319Smm#define	ZFS_IOCVER_ZCMD		3
54268075Sdelphij#define	ZFS_IOCVER_EDBP		4
55289362Smav#define	ZFS_IOCVER_RESUME	5
56296563Smav#define	ZFS_IOCVER_INLANES	6
57307101Smav#define	ZFS_IOCVER_PAD		7
58307101Smav#define	ZFS_IOCVER_CURRENT	ZFS_IOCVER_PAD
59247540Smm
60247540Smm/* compatibility conversion flag */
61247540Smm#define	ZFS_CMD_COMPAT_NONE	0
62219089Spjd#define	ZFS_CMD_COMPAT_V15	1
63247540Smm#define	ZFS_CMD_COMPAT_V28	2
64248571Smm#define	ZFS_CMD_COMPAT_DEADMAN	3
65249319Smm#define	ZFS_CMD_COMPAT_LZC	4
66268075Sdelphij#define	ZFS_CMD_COMPAT_ZCMD	5
67289362Smav#define	ZFS_CMD_COMPAT_EDBP	6
68296563Smav#define	ZFS_CMD_COMPAT_RESUME	7
69307101Smav#define	ZFS_CMD_COMPAT_INLANES	8
70219089Spjd
71247540Smm#define	ZFS_IOC_COMPAT_PASS	254
72247540Smm#define	ZFS_IOC_COMPAT_FAIL	255
73219089Spjd
74248571Smm#define	ZFS_IOCREQ(ioreq)	((ioreq) & 0xff)
75248571Smm
76249319Smmtypedef struct zfs_iocparm {
77249319Smm	uint32_t	zfs_ioctl_version;
78249319Smm	uint64_t	zfs_cmd;
79249319Smm	uint64_t	zfs_cmd_size;
80249319Smm} zfs_iocparm_t;
81249319Smm
82219089Spjdtypedef struct zinject_record_v15 {
83219089Spjd	uint64_t	zi_objset;
84219089Spjd	uint64_t	zi_object;
85219089Spjd	uint64_t	zi_start;
86219089Spjd	uint64_t	zi_end;
87219089Spjd	uint64_t	zi_guid;
88219089Spjd	uint32_t	zi_level;
89219089Spjd	uint32_t	zi_error;
90219089Spjd	uint64_t	zi_type;
91219089Spjd	uint32_t	zi_freq;
92219089Spjd	uint32_t	zi_failfast;
93219089Spjd} zinject_record_v15_t;
94219089Spjd
95219089Spjdtypedef struct zfs_cmd_v15 {
96219089Spjd	char		zc_name[MAXPATHLEN];
97219089Spjd	char		zc_value[MAXPATHLEN];
98219089Spjd	char		zc_string[MAXNAMELEN];
99219089Spjd	uint64_t	zc_guid;
100219089Spjd	uint64_t	zc_nvlist_conf;		/* really (char *) */
101219089Spjd	uint64_t	zc_nvlist_conf_size;
102219089Spjd	uint64_t	zc_nvlist_src;		/* really (char *) */
103219089Spjd	uint64_t	zc_nvlist_src_size;
104219089Spjd	uint64_t	zc_nvlist_dst;		/* really (char *) */
105219089Spjd	uint64_t	zc_nvlist_dst_size;
106219089Spjd	uint64_t	zc_cookie;
107219089Spjd	uint64_t	zc_objset_type;
108219089Spjd	uint64_t	zc_perm_action;
109219089Spjd	uint64_t 	zc_history;		/* really (char *) */
110219089Spjd	uint64_t 	zc_history_len;
111219089Spjd	uint64_t	zc_history_offset;
112219089Spjd	uint64_t	zc_obj;
113219089Spjd	zfs_share_t	zc_share;
114219089Spjd	uint64_t	zc_jailid;
115219089Spjd	dmu_objset_stats_t zc_objset_stats;
116219089Spjd	struct drr_begin zc_begin_record;
117219089Spjd	zinject_record_v15_t zc_inject_record;
118219089Spjd} zfs_cmd_v15_t;
119219089Spjd
120247540Smmtypedef struct zinject_record_v28 {
121247540Smm	uint64_t	zi_objset;
122247540Smm	uint64_t	zi_object;
123247540Smm	uint64_t	zi_start;
124247540Smm	uint64_t	zi_end;
125247540Smm	uint64_t	zi_guid;
126247540Smm	uint32_t	zi_level;
127247540Smm	uint32_t	zi_error;
128247540Smm	uint64_t	zi_type;
129247540Smm	uint32_t	zi_freq;
130247540Smm	uint32_t	zi_failfast;
131247540Smm	char		zi_func[MAXNAMELEN];
132247540Smm	uint32_t	zi_iotype;
133247540Smm	int32_t		zi_duration;
134247540Smm	uint64_t	zi_timer;
135247540Smm} zinject_record_v28_t;
136247540Smm
137247540Smmtypedef struct zfs_cmd_v28 {
138247540Smm	char		zc_name[MAXPATHLEN];
139247540Smm	char		zc_value[MAXPATHLEN * 2];
140247540Smm	char		zc_string[MAXNAMELEN];
141247540Smm	char		zc_top_ds[MAXPATHLEN];
142247540Smm	uint64_t	zc_guid;
143247540Smm	uint64_t	zc_nvlist_conf;		/* really (char *) */
144247540Smm	uint64_t	zc_nvlist_conf_size;
145247540Smm	uint64_t	zc_nvlist_src;		/* really (char *) */
146247540Smm	uint64_t	zc_nvlist_src_size;
147247540Smm	uint64_t	zc_nvlist_dst;		/* really (char *) */
148247540Smm	uint64_t	zc_nvlist_dst_size;
149247540Smm	uint64_t	zc_cookie;
150247540Smm	uint64_t	zc_objset_type;
151247540Smm	uint64_t	zc_perm_action;
152247540Smm	uint64_t 	zc_history;		/* really (char *) */
153247540Smm	uint64_t 	zc_history_len;
154247540Smm	uint64_t	zc_history_offset;
155247540Smm	uint64_t	zc_obj;
156247540Smm	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
157247540Smm	zfs_share_t	zc_share;
158247540Smm	uint64_t	zc_jailid;
159247540Smm	dmu_objset_stats_t zc_objset_stats;
160247540Smm	struct drr_begin zc_begin_record;
161247540Smm	zinject_record_v28_t zc_inject_record;
162247540Smm	boolean_t	zc_defer_destroy;
163247540Smm	boolean_t	zc_temphold;
164247540Smm	uint64_t	zc_action_handle;
165247540Smm	int		zc_cleanup_fd;
166247540Smm	uint8_t		zc_simple;
167247540Smm	uint8_t		zc_pad[3];		/* alignment */
168247540Smm	uint64_t	zc_sendobj;
169247540Smm	uint64_t	zc_fromobj;
170247540Smm	uint64_t	zc_createtxg;
171247540Smm	zfs_stat_t	zc_stat;
172247540Smm} zfs_cmd_v28_t;
173247540Smm
174296563Smavtypedef struct zinject_record_deadman {
175296563Smav	uint64_t	zi_objset;
176296563Smav	uint64_t	zi_object;
177296563Smav	uint64_t	zi_start;
178296563Smav	uint64_t	zi_end;
179296563Smav	uint64_t	zi_guid;
180296563Smav	uint32_t	zi_level;
181296563Smav	uint32_t	zi_error;
182296563Smav	uint64_t	zi_type;
183296563Smav	uint32_t	zi_freq;
184296563Smav	uint32_t	zi_failfast;
185296563Smav	char		zi_func[MAXNAMELEN];
186296563Smav	uint32_t	zi_iotype;
187296563Smav	int32_t		zi_duration;
188296563Smav	uint64_t	zi_timer;
189296563Smav	uint32_t	zi_cmd;
190296563Smav	uint32_t	zi_pad;
191296563Smav} zinject_record_deadman_t;
192296563Smav
193248571Smmtypedef struct zfs_cmd_deadman {
194248571Smm	char		zc_name[MAXPATHLEN];
195248571Smm	char		zc_value[MAXPATHLEN * 2];
196248571Smm	char		zc_string[MAXNAMELEN];
197248571Smm	char		zc_top_ds[MAXPATHLEN];
198248571Smm	uint64_t	zc_guid;
199248571Smm	uint64_t	zc_nvlist_conf;		/* really (char *) */
200248571Smm	uint64_t	zc_nvlist_conf_size;
201248571Smm	uint64_t	zc_nvlist_src;		/* really (char *) */
202248571Smm	uint64_t	zc_nvlist_src_size;
203248571Smm	uint64_t	zc_nvlist_dst;		/* really (char *) */
204248571Smm	uint64_t	zc_nvlist_dst_size;
205248571Smm	uint64_t	zc_cookie;
206248571Smm	uint64_t	zc_objset_type;
207248571Smm	uint64_t	zc_perm_action;
208248571Smm	uint64_t 	zc_history;		/* really (char *) */
209248571Smm	uint64_t 	zc_history_len;
210248571Smm	uint64_t	zc_history_offset;
211248571Smm	uint64_t	zc_obj;
212248571Smm	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
213248571Smm	zfs_share_t	zc_share;
214248571Smm	uint64_t	zc_jailid;
215248571Smm	dmu_objset_stats_t zc_objset_stats;
216248571Smm	struct drr_begin zc_begin_record;
217248571Smm	/* zc_inject_record doesn't change in libzfs_core */
218296563Smav	zinject_record_deadman_t zc_inject_record;
219248571Smm	boolean_t	zc_defer_destroy;
220248571Smm	boolean_t	zc_temphold;
221248571Smm	uint64_t	zc_action_handle;
222248571Smm	int		zc_cleanup_fd;
223248571Smm	uint8_t		zc_simple;
224248571Smm	uint8_t		zc_pad[3];		/* alignment */
225248571Smm	uint64_t	zc_sendobj;
226248571Smm	uint64_t	zc_fromobj;
227248571Smm	uint64_t	zc_createtxg;
228248571Smm	zfs_stat_t	zc_stat;
229248571Smm} zfs_cmd_deadman_t;
230248571Smm
231268075Sdelphijtypedef struct zfs_cmd_zcmd {
232268075Sdelphij	char		zc_name[MAXPATHLEN];	/* name of pool or dataset */
233268075Sdelphij	uint64_t	zc_nvlist_src;		/* really (char *) */
234268075Sdelphij	uint64_t	zc_nvlist_src_size;
235268075Sdelphij	uint64_t	zc_nvlist_dst;		/* really (char *) */
236268075Sdelphij	uint64_t	zc_nvlist_dst_size;
237268075Sdelphij	boolean_t	zc_nvlist_dst_filled;	/* put an nvlist in dst? */
238268075Sdelphij	int		zc_pad2;
239268075Sdelphij
240268075Sdelphij	/*
241268075Sdelphij	 * The following members are for legacy ioctls which haven't been
242268075Sdelphij	 * converted to the new method.
243268075Sdelphij	 */
244268075Sdelphij	uint64_t	zc_history;		/* really (char *) */
245268075Sdelphij	char		zc_value[MAXPATHLEN * 2];
246268075Sdelphij	char		zc_string[MAXNAMELEN];
247268075Sdelphij	uint64_t	zc_guid;
248268075Sdelphij	uint64_t	zc_nvlist_conf;		/* really (char *) */
249268075Sdelphij	uint64_t	zc_nvlist_conf_size;
250268075Sdelphij	uint64_t	zc_cookie;
251268075Sdelphij	uint64_t	zc_objset_type;
252268075Sdelphij	uint64_t	zc_perm_action;
253268075Sdelphij	uint64_t	zc_history_len;
254268075Sdelphij	uint64_t	zc_history_offset;
255268075Sdelphij	uint64_t	zc_obj;
256268075Sdelphij	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
257268075Sdelphij	zfs_share_t	zc_share;
258268075Sdelphij	uint64_t	zc_jailid;
259268075Sdelphij	dmu_objset_stats_t zc_objset_stats;
260268075Sdelphij	struct drr_begin zc_begin_record;
261296563Smav	zinject_record_deadman_t zc_inject_record;
262268075Sdelphij	boolean_t	zc_defer_destroy;
263268075Sdelphij	boolean_t	zc_temphold;
264268075Sdelphij	uint64_t	zc_action_handle;
265268075Sdelphij	int		zc_cleanup_fd;
266268075Sdelphij	uint8_t		zc_simple;
267268075Sdelphij	uint8_t		zc_pad[3];		/* alignment */
268268075Sdelphij	uint64_t	zc_sendobj;
269268075Sdelphij	uint64_t	zc_fromobj;
270268075Sdelphij	uint64_t	zc_createtxg;
271268075Sdelphij	zfs_stat_t	zc_stat;
272268075Sdelphij} zfs_cmd_zcmd_t;
273268075Sdelphij
274289362Smavtypedef struct zfs_cmd_edbp {
275289362Smav	char		zc_name[MAXPATHLEN];	/* name of pool or dataset */
276289362Smav	uint64_t	zc_nvlist_src;		/* really (char *) */
277289362Smav	uint64_t	zc_nvlist_src_size;
278289362Smav	uint64_t	zc_nvlist_dst;		/* really (char *) */
279289362Smav	uint64_t	zc_nvlist_dst_size;
280289362Smav	boolean_t	zc_nvlist_dst_filled;	/* put an nvlist in dst? */
281289362Smav	int		zc_pad2;
282289362Smav
283289362Smav	/*
284289362Smav	 * The following members are for legacy ioctls which haven't been
285289362Smav	 * converted to the new method.
286289362Smav	 */
287289362Smav	uint64_t	zc_history;		/* really (char *) */
288289362Smav	char		zc_value[MAXPATHLEN * 2];
289289362Smav	char		zc_string[MAXNAMELEN];
290289362Smav	uint64_t	zc_guid;
291289362Smav	uint64_t	zc_nvlist_conf;		/* really (char *) */
292289362Smav	uint64_t	zc_nvlist_conf_size;
293289362Smav	uint64_t	zc_cookie;
294289362Smav	uint64_t	zc_objset_type;
295289362Smav	uint64_t	zc_perm_action;
296289362Smav	uint64_t	zc_history_len;
297289362Smav	uint64_t	zc_history_offset;
298289362Smav	uint64_t	zc_obj;
299289362Smav	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
300289362Smav	zfs_share_t	zc_share;
301289362Smav	uint64_t	zc_jailid;
302289362Smav	dmu_objset_stats_t zc_objset_stats;
303289362Smav	struct drr_begin zc_begin_record;
304296563Smav	zinject_record_deadman_t zc_inject_record;
305289362Smav	uint32_t	zc_defer_destroy;
306289362Smav	uint32_t	zc_flags;
307289362Smav	uint64_t	zc_action_handle;
308289362Smav	int		zc_cleanup_fd;
309289362Smav	uint8_t		zc_simple;
310289362Smav	uint8_t		zc_pad[3];		/* alignment */
311289362Smav	uint64_t	zc_sendobj;
312289362Smav	uint64_t	zc_fromobj;
313289362Smav	uint64_t	zc_createtxg;
314289362Smav	zfs_stat_t	zc_stat;
315289362Smav} zfs_cmd_edbp_t;
316289362Smav
317296563Smavtypedef struct zfs_cmd_resume {
318296563Smav	char		zc_name[MAXPATHLEN];	/* name of pool or dataset */
319296563Smav	uint64_t	zc_nvlist_src;		/* really (char *) */
320296563Smav	uint64_t	zc_nvlist_src_size;
321296563Smav	uint64_t	zc_nvlist_dst;		/* really (char *) */
322296563Smav	uint64_t	zc_nvlist_dst_size;
323296563Smav	boolean_t	zc_nvlist_dst_filled;	/* put an nvlist in dst? */
324296563Smav	int		zc_pad2;
325296563Smav
326296563Smav	/*
327296563Smav	 * The following members are for legacy ioctls which haven't been
328296563Smav	 * converted to the new method.
329296563Smav	 */
330296563Smav	uint64_t	zc_history;		/* really (char *) */
331296563Smav	char		zc_value[MAXPATHLEN * 2];
332296563Smav	char		zc_string[MAXNAMELEN];
333296563Smav	uint64_t	zc_guid;
334296563Smav	uint64_t	zc_nvlist_conf;		/* really (char *) */
335296563Smav	uint64_t	zc_nvlist_conf_size;
336296563Smav	uint64_t	zc_cookie;
337296563Smav	uint64_t	zc_objset_type;
338296563Smav	uint64_t	zc_perm_action;
339296563Smav	uint64_t	zc_history_len;
340296563Smav	uint64_t	zc_history_offset;
341296563Smav	uint64_t	zc_obj;
342296563Smav	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
343296563Smav	zfs_share_t	zc_share;
344296563Smav	uint64_t	zc_jailid;
345296563Smav	dmu_objset_stats_t zc_objset_stats;
346296563Smav	dmu_replay_record_t zc_begin_record;
347296563Smav	zinject_record_deadman_t zc_inject_record;
348296563Smav	uint32_t	zc_defer_destroy;
349296563Smav	uint32_t	zc_flags;
350296563Smav	uint64_t	zc_action_handle;
351296563Smav	int		zc_cleanup_fd;
352296563Smav	uint8_t		zc_simple;
353296563Smav	boolean_t	zc_resumable;
354296563Smav	uint64_t	zc_sendobj;
355296563Smav	uint64_t	zc_fromobj;
356296563Smav	uint64_t	zc_createtxg;
357296563Smav	zfs_stat_t	zc_stat;
358296563Smav} zfs_cmd_resume_t;
359296563Smav
360307101Smavtypedef struct zfs_cmd_inlanes {
361307101Smav	char		zc_name[MAXPATHLEN];	/* name of pool or dataset */
362307101Smav	uint64_t	zc_nvlist_src;		/* really (char *) */
363307101Smav	uint64_t	zc_nvlist_src_size;
364307101Smav	uint64_t	zc_nvlist_dst;		/* really (char *) */
365307101Smav	uint64_t	zc_nvlist_dst_size;
366307101Smav	boolean_t	zc_nvlist_dst_filled;	/* put an nvlist in dst? */
367307101Smav	int		zc_pad2;
368307101Smav
369307101Smav	/*
370307101Smav	 * The following members are for legacy ioctls which haven't been
371307101Smav	 * converted to the new method.
372307101Smav	 */
373307101Smav	uint64_t	zc_history;		/* really (char *) */
374307101Smav	char		zc_value[MAXPATHLEN * 2];
375307101Smav	char		zc_string[MAXNAMELEN];
376307101Smav	uint64_t	zc_guid;
377307101Smav	uint64_t	zc_nvlist_conf;		/* really (char *) */
378307101Smav	uint64_t	zc_nvlist_conf_size;
379307101Smav	uint64_t	zc_cookie;
380307101Smav	uint64_t	zc_objset_type;
381307101Smav	uint64_t	zc_perm_action;
382307101Smav	uint64_t	zc_history_len;
383307101Smav	uint64_t	zc_history_offset;
384307101Smav	uint64_t	zc_obj;
385307101Smav	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
386307101Smav	zfs_share_t	zc_share;
387307101Smav	uint64_t	zc_jailid;
388307101Smav	dmu_objset_stats_t zc_objset_stats;
389307101Smav	dmu_replay_record_t zc_begin_record;
390307101Smav	zinject_record_t zc_inject_record;
391307101Smav	uint32_t	zc_defer_destroy;
392307101Smav	uint32_t	zc_flags;
393307101Smav	uint64_t	zc_action_handle;
394307101Smav	int		zc_cleanup_fd;
395307101Smav	uint8_t		zc_simple;
396307101Smav	boolean_t	zc_resumable;
397307101Smav	uint64_t	zc_sendobj;
398307101Smav	uint64_t	zc_fromobj;
399307101Smav	uint64_t	zc_createtxg;
400307101Smav	zfs_stat_t	zc_stat;
401307101Smav} zfs_cmd_inlanes_t;
402307101Smav
403219089Spjd#ifdef _KERNEL
404219089Spjdunsigned static long zfs_ioctl_v15_to_v28[] = {
405219089Spjd	0,	/*  0 ZFS_IOC_POOL_CREATE */
406219089Spjd	1,	/*  1 ZFS_IOC_POOL_DESTROY */
407219089Spjd	2,	/*  2 ZFS_IOC_POOL_IMPORT */
408219089Spjd	3,	/*  3 ZFS_IOC_POOL_EXPORT */
409219089Spjd	4,	/*  4 ZFS_IOC_POOL_CONFIGS */
410219089Spjd	5,	/*  5 ZFS_IOC_POOL_STATS */
411219089Spjd	6,	/*  6 ZFS_IOC_POOL_TRYIMPORT */
412219089Spjd	7,	/*  7 ZFS_IOC_POOL_SCRUB */
413219089Spjd	8,	/*  8 ZFS_IOC_POOL_FREEZE */
414219089Spjd	9,	/*  9 ZFS_IOC_POOL_UPGRADE */
415219089Spjd	10,	/* 10 ZFS_IOC_POOL_GET_HISTORY */
416219089Spjd	11,	/* 11 ZFS_IOC_VDEV_ADD */
417219089Spjd	12,	/* 12 ZFS_IOC_VDEV_REMOVE */
418219089Spjd	13,	/* 13 ZFS_IOC_VDEV_SET_STATE */
419219089Spjd	14,	/* 14 ZFS_IOC_VDEV_ATTACH */
420219089Spjd	15,	/* 15 ZFS_IOC_VDEV_DETACH */
421219089Spjd	16,	/* 16 ZFS_IOC_VDEV_SETPATH */
422219089Spjd	18,	/* 17 ZFS_IOC_OBJSET_STATS */
423219089Spjd	19,	/* 18 ZFS_IOC_OBJSET_ZPLPROPS */
424219089Spjd	20, 	/* 19 ZFS_IOC_DATASET_LIST_NEXT */
425219089Spjd	21,	/* 20 ZFS_IOC_SNAPSHOT_LIST_NEXT */
426219089Spjd	22,	/* 21 ZFS_IOC_SET_PROP */
427219089Spjd	ZFS_IOC_COMPAT_PASS,	/* 22 ZFS_IOC_CREATE_MINOR */
428219089Spjd	ZFS_IOC_COMPAT_PASS,	/* 23 ZFS_IOC_REMOVE_MINOR */
429219089Spjd	23,	/* 24 ZFS_IOC_CREATE */
430219089Spjd	24,	/* 25 ZFS_IOC_DESTROY */
431219089Spjd	25,	/* 26 ZFS_IOC_ROLLBACK */
432219089Spjd	26,	/* 27 ZFS_IOC_RENAME */
433219089Spjd	27,	/* 28 ZFS_IOC_RECV */
434219089Spjd	28,	/* 29 ZFS_IOC_SEND */
435219089Spjd	29,	/* 30 ZFS_IOC_INJECT_FAULT */
436219089Spjd	30,	/* 31 ZFS_IOC_CLEAR_FAULT */
437219089Spjd	31,	/* 32 ZFS_IOC_INJECT_LIST_NEXT */
438219089Spjd	32,	/* 33 ZFS_IOC_ERROR_LOG */
439219089Spjd	33,	/* 34 ZFS_IOC_CLEAR */
440219089Spjd	34,	/* 35 ZFS_IOC_PROMOTE */
441219089Spjd	35,	/* 36 ZFS_IOC_DESTROY_SNAPS */
442219089Spjd	36,	/* 37 ZFS_IOC_SNAPSHOT */
443219089Spjd	37,	/* 38 ZFS_IOC_DSOBJ_TO_DSNAME */
444219089Spjd	38,	/* 39 ZFS_IOC_OBJ_TO_PATH */
445219089Spjd	39,	/* 40 ZFS_IOC_POOL_SET_PROPS */
446219089Spjd	40,	/* 41 ZFS_IOC_POOL_GET_PROPS */
447219089Spjd	41,	/* 42 ZFS_IOC_SET_FSACL */
448219089Spjd	42,	/* 43 ZFS_IOC_GET_FSACL */
449219089Spjd	ZFS_IOC_COMPAT_PASS,	/* 44 ZFS_IOC_ISCSI_PERM_CHECK */
450219089Spjd	43,	/* 45 ZFS_IOC_SHARE */
451219089Spjd	44,	/* 46 ZFS_IOC_IHNERIT_PROP */
452219089Spjd	58,	/* 47 ZFS_IOC_JAIL */
453219089Spjd	59,	/* 48 ZFS_IOC_UNJAIL */
454219089Spjd	45,	/* 49 ZFS_IOC_SMB_ACL */
455219089Spjd	46,	/* 50 ZFS_IOC_USERSPACE_ONE */
456219089Spjd	47,	/* 51 ZFS_IOC_USERSPACE_MANY */
457219089Spjd	48,	/* 52 ZFS_IOC_USERSPACE_UPGRADE */
458219089Spjd	17,	/* 53 ZFS_IOC_SETFRU */
459219089Spjd};
460219089Spjd
461219089Spjd#else	/* KERNEL */
462219089Spjdunsigned static long zfs_ioctl_v28_to_v15[] = {
463219089Spjd	0,	/*  0 ZFS_IOC_POOL_CREATE */
464219089Spjd	1,	/*  1 ZFS_IOC_POOL_DESTROY */
465219089Spjd	2,	/*  2 ZFS_IOC_POOL_IMPORT */
466219089Spjd	3,	/*  3 ZFS_IOC_POOL_EXPORT */
467219089Spjd	4,	/*  4 ZFS_IOC_POOL_CONFIGS */
468219089Spjd	5,	/*  5 ZFS_IOC_POOL_STATS */
469219089Spjd	6,	/*  6 ZFS_IOC_POOL_TRYIMPORT */
470219089Spjd	7,	/*  7 ZFS_IOC_POOL_SCAN */
471219089Spjd	8,	/*  8 ZFS_IOC_POOL_FREEZE */
472219089Spjd	9,	/*  9 ZFS_IOC_POOL_UPGRADE */
473219089Spjd	10,	/* 10 ZFS_IOC_POOL_GET_HISTORY */
474219089Spjd	11,	/* 11 ZFS_IOC_VDEV_ADD */
475219089Spjd	12,	/* 12 ZFS_IOC_VDEV_REMOVE */
476219089Spjd	13,	/* 13 ZFS_IOC_VDEV_SET_STATE */
477219089Spjd	14,	/* 14 ZFS_IOC_VDEV_ATTACH */
478219089Spjd	15,	/* 15 ZFS_IOC_VDEV_DETACH */
479219089Spjd	16,	/* 16 ZFS_IOC_VDEV_SETPATH */
480219089Spjd	53,	/* 17 ZFS_IOC_VDEV_SETFRU */
481219089Spjd	17,	/* 18 ZFS_IOC_OBJSET_STATS */
482219089Spjd	18,	/* 19 ZFS_IOC_OBJSET_ZPLPROPS */
483219089Spjd	19, 	/* 20 ZFS_IOC_DATASET_LIST_NEXT */
484219089Spjd	20,	/* 21 ZFS_IOC_SNAPSHOT_LIST_NEXT */
485219089Spjd	21,	/* 22 ZFS_IOC_SET_PROP */
486219089Spjd	24,	/* 23 ZFS_IOC_CREATE */
487219089Spjd	25,	/* 24 ZFS_IOC_DESTROY */
488219089Spjd	26,	/* 25 ZFS_IOC_ROLLBACK */
489219089Spjd	27,	/* 26 ZFS_IOC_RENAME */
490219089Spjd	28,	/* 27 ZFS_IOC_RECV */
491219089Spjd	29,	/* 28 ZFS_IOC_SEND */
492219089Spjd	30,	/* 39 ZFS_IOC_INJECT_FAULT */
493219089Spjd	31,	/* 30 ZFS_IOC_CLEAR_FAULT */
494219089Spjd	32,	/* 31 ZFS_IOC_INJECT_LIST_NEXT */
495219089Spjd	33,	/* 32 ZFS_IOC_ERROR_LOG */
496219089Spjd	34,	/* 33 ZFS_IOC_CLEAR */
497219089Spjd	35,	/* 34 ZFS_IOC_PROMOTE */
498219089Spjd	36,	/* 35 ZFS_IOC_DESTROY_SNAPS */
499219089Spjd	37,	/* 36 ZFS_IOC_SNAPSHOT */
500219089Spjd	38,	/* 37 ZFS_IOC_DSOBJ_TO_DSNAME */
501219089Spjd	39,	/* 38 ZFS_IOC_OBJ_TO_PATH */
502219089Spjd	40,	/* 39 ZFS_IOC_POOL_SET_PROPS */
503219089Spjd	41,	/* 40 ZFS_IOC_POOL_GET_PROPS */
504219089Spjd	42,	/* 41 ZFS_IOC_SET_FSACL */
505219089Spjd	43,	/* 42 ZFS_IOC_GET_FSACL */
506219089Spjd	45,	/* 43 ZFS_IOC_SHARE */
507219089Spjd	46,	/* 44 ZFS_IOC_IHNERIT_PROP */
508219089Spjd	49,	/* 45 ZFS_IOC_SMB_ACL */
509219089Spjd	50,	/* 46 ZFS_IOC_USERSPACE_ONE */
510219089Spjd	51,	/* 47 ZFS_IOC_USERSPACE_MANY */
511219089Spjd	52,	/* 48 ZFS_IOC_USERSPACE_UPGRADE */
512219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 49 ZFS_IOC_HOLD */
513219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 50 ZFS_IOC_RELEASE */
514219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 51 ZFS_IOC_GET_HOLDS */
515219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 52 ZFS_IOC_OBJSET_RECVD_PROPS */
516219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 53 ZFS_IOC_VDEV_SPLIT */
517219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 54 ZFS_IOC_NEXT_OBJ */
518219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 55 ZFS_IOC_DIFF */
519219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 56 ZFS_IOC_TMP_SNAPSHOT */
520219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 57 ZFS_IOC_OBJ_TO_STATS */
521219089Spjd	47,	/* 58 ZFS_IOC_JAIL */
522219089Spjd	48,	/* 59 ZFS_IOC_UNJAIL */
523219089Spjd};
524219089Spjd#endif	/* ! _KERNEL */
525219089Spjd
526219089Spjd#ifdef _KERNEL
527248571Smmint zfs_ioctl_compat_pre(zfs_cmd_t *, int *, const int);
528219089Spjdvoid zfs_ioctl_compat_post(zfs_cmd_t *, const int, const int);
529248571Smmnvlist_t *zfs_ioctl_compat_innvl(zfs_cmd_t *, nvlist_t *, const int,
530248571Smm    const int);
531248571Smmnvlist_t *zfs_ioctl_compat_outnvl(zfs_cmd_t *, nvlist_t *, const int,
532248571Smm    const int);
533219089Spjd#else
534248571Smmint zcmd_ioctl_compat(int, int, zfs_cmd_t *, const int);
535219089Spjd#endif	/* _KERNEL */
536219089Spjdvoid zfs_cmd_compat_get(zfs_cmd_t *, caddr_t, const int);
537248571Smmvoid zfs_cmd_compat_put(zfs_cmd_t *, caddr_t, const int, const int);
538219089Spjd
539219089Spjd#ifdef	__cplusplus
540219089Spjd}
541219089Spjd#endif
542219089Spjd
543219089Spjd#endif	/* _SYS_ZFS_IOCTL_COMPAT_H */
544