zfs_ioctl_compat.h revision 248571
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/*
22247540Smm * Copyright 2013 Martin Matuska <mm@FreeBSD.org>.  All rights reserved.
23219089Spjd * Use is subject to license terms.
24219089Spjd */
25219089Spjd
26219089Spjd#ifndef	_SYS_ZFS_IOCTL_COMPAT_H
27219089Spjd#define	_SYS_ZFS_IOCTL_COMPAT_H
28219089Spjd
29219089Spjd#include <sys/cred.h>
30219089Spjd#include <sys/dmu.h>
31219089Spjd#include <sys/zio.h>
32219089Spjd#include <sys/dsl_deleg.h>
33219089Spjd#include <sys/zfs_ioctl.h>
34219089Spjd
35219089Spjd#ifdef _KERNEL
36219089Spjd#include <sys/nvpair.h>
37219089Spjd#endif  /* _KERNEL */
38219089Spjd
39219089Spjd#ifdef	__cplusplus
40219089Spjdextern "C" {
41219089Spjd#endif
42219089Spjd
43247540Smm/*
44247540Smm * Backwards ioctl compatibility
45247540Smm */
46247540Smm
47247540Smm/* ioctl versions for vfs.zfs.version.ioctl */
48248571Smm#define	ZFS_IOCVER_UNDEF	-1
49248571Smm#define	ZFS_IOCVER_NONE		0
50247540Smm#define	ZFS_IOCVER_DEADMAN	1
51248571Smm#define	ZFS_IOCVER_LZC		2
52248571Smm#define	ZFS_IOCVER_CURRENT	ZFS_IOCVER_LZC
53247540Smm
54247540Smm/* compatibility conversion flag */
55247540Smm#define	ZFS_CMD_COMPAT_NONE	0
56219089Spjd#define	ZFS_CMD_COMPAT_V15	1
57247540Smm#define	ZFS_CMD_COMPAT_V28	2
58248571Smm#define	ZFS_CMD_COMPAT_DEADMAN	3
59219089Spjd
60247540Smm#define	ZFS_IOC_COMPAT_PASS	254
61247540Smm#define	ZFS_IOC_COMPAT_FAIL	255
62219089Spjd
63248571Smm#define	ZFS_IOCREQ(ioreq)	((ioreq) & 0xff)
64248571Smm
65219089Spjdtypedef struct zinject_record_v15 {
66219089Spjd	uint64_t	zi_objset;
67219089Spjd	uint64_t	zi_object;
68219089Spjd	uint64_t	zi_start;
69219089Spjd	uint64_t	zi_end;
70219089Spjd	uint64_t	zi_guid;
71219089Spjd	uint32_t	zi_level;
72219089Spjd	uint32_t	zi_error;
73219089Spjd	uint64_t	zi_type;
74219089Spjd	uint32_t	zi_freq;
75219089Spjd	uint32_t	zi_failfast;
76219089Spjd} zinject_record_v15_t;
77219089Spjd
78219089Spjdtypedef struct zfs_cmd_v15 {
79219089Spjd	char		zc_name[MAXPATHLEN];
80219089Spjd	char		zc_value[MAXPATHLEN];
81219089Spjd	char		zc_string[MAXNAMELEN];
82219089Spjd	uint64_t	zc_guid;
83219089Spjd	uint64_t	zc_nvlist_conf;		/* really (char *) */
84219089Spjd	uint64_t	zc_nvlist_conf_size;
85219089Spjd	uint64_t	zc_nvlist_src;		/* really (char *) */
86219089Spjd	uint64_t	zc_nvlist_src_size;
87219089Spjd	uint64_t	zc_nvlist_dst;		/* really (char *) */
88219089Spjd	uint64_t	zc_nvlist_dst_size;
89219089Spjd	uint64_t	zc_cookie;
90219089Spjd	uint64_t	zc_objset_type;
91219089Spjd	uint64_t	zc_perm_action;
92219089Spjd	uint64_t 	zc_history;		/* really (char *) */
93219089Spjd	uint64_t 	zc_history_len;
94219089Spjd	uint64_t	zc_history_offset;
95219089Spjd	uint64_t	zc_obj;
96219089Spjd	zfs_share_t	zc_share;
97219089Spjd	uint64_t	zc_jailid;
98219089Spjd	dmu_objset_stats_t zc_objset_stats;
99219089Spjd	struct drr_begin zc_begin_record;
100219089Spjd	zinject_record_v15_t zc_inject_record;
101219089Spjd} zfs_cmd_v15_t;
102219089Spjd
103247540Smmtypedef struct zinject_record_v28 {
104247540Smm	uint64_t	zi_objset;
105247540Smm	uint64_t	zi_object;
106247540Smm	uint64_t	zi_start;
107247540Smm	uint64_t	zi_end;
108247540Smm	uint64_t	zi_guid;
109247540Smm	uint32_t	zi_level;
110247540Smm	uint32_t	zi_error;
111247540Smm	uint64_t	zi_type;
112247540Smm	uint32_t	zi_freq;
113247540Smm	uint32_t	zi_failfast;
114247540Smm	char		zi_func[MAXNAMELEN];
115247540Smm	uint32_t	zi_iotype;
116247540Smm	int32_t		zi_duration;
117247540Smm	uint64_t	zi_timer;
118247540Smm} zinject_record_v28_t;
119247540Smm
120247540Smmtypedef struct zfs_cmd_v28 {
121247540Smm	char		zc_name[MAXPATHLEN];
122247540Smm	char		zc_value[MAXPATHLEN * 2];
123247540Smm	char		zc_string[MAXNAMELEN];
124247540Smm	char		zc_top_ds[MAXPATHLEN];
125247540Smm	uint64_t	zc_guid;
126247540Smm	uint64_t	zc_nvlist_conf;		/* really (char *) */
127247540Smm	uint64_t	zc_nvlist_conf_size;
128247540Smm	uint64_t	zc_nvlist_src;		/* really (char *) */
129247540Smm	uint64_t	zc_nvlist_src_size;
130247540Smm	uint64_t	zc_nvlist_dst;		/* really (char *) */
131247540Smm	uint64_t	zc_nvlist_dst_size;
132247540Smm	uint64_t	zc_cookie;
133247540Smm	uint64_t	zc_objset_type;
134247540Smm	uint64_t	zc_perm_action;
135247540Smm	uint64_t 	zc_history;		/* really (char *) */
136247540Smm	uint64_t 	zc_history_len;
137247540Smm	uint64_t	zc_history_offset;
138247540Smm	uint64_t	zc_obj;
139247540Smm	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
140247540Smm	zfs_share_t	zc_share;
141247540Smm	uint64_t	zc_jailid;
142247540Smm	dmu_objset_stats_t zc_objset_stats;
143247540Smm	struct drr_begin zc_begin_record;
144247540Smm	zinject_record_v28_t zc_inject_record;
145247540Smm	boolean_t	zc_defer_destroy;
146247540Smm	boolean_t	zc_temphold;
147247540Smm	uint64_t	zc_action_handle;
148247540Smm	int		zc_cleanup_fd;
149247540Smm	uint8_t		zc_simple;
150247540Smm	uint8_t		zc_pad[3];		/* alignment */
151247540Smm	uint64_t	zc_sendobj;
152247540Smm	uint64_t	zc_fromobj;
153247540Smm	uint64_t	zc_createtxg;
154247540Smm	zfs_stat_t	zc_stat;
155247540Smm} zfs_cmd_v28_t;
156247540Smm
157248571Smmtypedef struct zfs_cmd_deadman {
158248571Smm	char		zc_name[MAXPATHLEN];
159248571Smm	char		zc_value[MAXPATHLEN * 2];
160248571Smm	char		zc_string[MAXNAMELEN];
161248571Smm	char		zc_top_ds[MAXPATHLEN];
162248571Smm	uint64_t	zc_guid;
163248571Smm	uint64_t	zc_nvlist_conf;		/* really (char *) */
164248571Smm	uint64_t	zc_nvlist_conf_size;
165248571Smm	uint64_t	zc_nvlist_src;		/* really (char *) */
166248571Smm	uint64_t	zc_nvlist_src_size;
167248571Smm	uint64_t	zc_nvlist_dst;		/* really (char *) */
168248571Smm	uint64_t	zc_nvlist_dst_size;
169248571Smm	uint64_t	zc_cookie;
170248571Smm	uint64_t	zc_objset_type;
171248571Smm	uint64_t	zc_perm_action;
172248571Smm	uint64_t 	zc_history;		/* really (char *) */
173248571Smm	uint64_t 	zc_history_len;
174248571Smm	uint64_t	zc_history_offset;
175248571Smm	uint64_t	zc_obj;
176248571Smm	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
177248571Smm	zfs_share_t	zc_share;
178248571Smm	uint64_t	zc_jailid;
179248571Smm	dmu_objset_stats_t zc_objset_stats;
180248571Smm	struct drr_begin zc_begin_record;
181248571Smm	/* zc_inject_record doesn't change in libzfs_core */
182248571Smm	zinject_record_t zc_inject_record;
183248571Smm	boolean_t	zc_defer_destroy;
184248571Smm	boolean_t	zc_temphold;
185248571Smm	uint64_t	zc_action_handle;
186248571Smm	int		zc_cleanup_fd;
187248571Smm	uint8_t		zc_simple;
188248571Smm	uint8_t		zc_pad[3];		/* alignment */
189248571Smm	uint64_t	zc_sendobj;
190248571Smm	uint64_t	zc_fromobj;
191248571Smm	uint64_t	zc_createtxg;
192248571Smm	zfs_stat_t	zc_stat;
193248571Smm} zfs_cmd_deadman_t;
194248571Smm
195219089Spjd#ifdef _KERNEL
196219089Spjdunsigned static long zfs_ioctl_v15_to_v28[] = {
197219089Spjd	0,	/*  0 ZFS_IOC_POOL_CREATE */
198219089Spjd	1,	/*  1 ZFS_IOC_POOL_DESTROY */
199219089Spjd	2,	/*  2 ZFS_IOC_POOL_IMPORT */
200219089Spjd	3,	/*  3 ZFS_IOC_POOL_EXPORT */
201219089Spjd	4,	/*  4 ZFS_IOC_POOL_CONFIGS */
202219089Spjd	5,	/*  5 ZFS_IOC_POOL_STATS */
203219089Spjd	6,	/*  6 ZFS_IOC_POOL_TRYIMPORT */
204219089Spjd	7,	/*  7 ZFS_IOC_POOL_SCRUB */
205219089Spjd	8,	/*  8 ZFS_IOC_POOL_FREEZE */
206219089Spjd	9,	/*  9 ZFS_IOC_POOL_UPGRADE */
207219089Spjd	10,	/* 10 ZFS_IOC_POOL_GET_HISTORY */
208219089Spjd	11,	/* 11 ZFS_IOC_VDEV_ADD */
209219089Spjd	12,	/* 12 ZFS_IOC_VDEV_REMOVE */
210219089Spjd	13,	/* 13 ZFS_IOC_VDEV_SET_STATE */
211219089Spjd	14,	/* 14 ZFS_IOC_VDEV_ATTACH */
212219089Spjd	15,	/* 15 ZFS_IOC_VDEV_DETACH */
213219089Spjd	16,	/* 16 ZFS_IOC_VDEV_SETPATH */
214219089Spjd	18,	/* 17 ZFS_IOC_OBJSET_STATS */
215219089Spjd	19,	/* 18 ZFS_IOC_OBJSET_ZPLPROPS */
216219089Spjd	20, 	/* 19 ZFS_IOC_DATASET_LIST_NEXT */
217219089Spjd	21,	/* 20 ZFS_IOC_SNAPSHOT_LIST_NEXT */
218219089Spjd	22,	/* 21 ZFS_IOC_SET_PROP */
219219089Spjd	ZFS_IOC_COMPAT_PASS,	/* 22 ZFS_IOC_CREATE_MINOR */
220219089Spjd	ZFS_IOC_COMPAT_PASS,	/* 23 ZFS_IOC_REMOVE_MINOR */
221219089Spjd	23,	/* 24 ZFS_IOC_CREATE */
222219089Spjd	24,	/* 25 ZFS_IOC_DESTROY */
223219089Spjd	25,	/* 26 ZFS_IOC_ROLLBACK */
224219089Spjd	26,	/* 27 ZFS_IOC_RENAME */
225219089Spjd	27,	/* 28 ZFS_IOC_RECV */
226219089Spjd	28,	/* 29 ZFS_IOC_SEND */
227219089Spjd	29,	/* 30 ZFS_IOC_INJECT_FAULT */
228219089Spjd	30,	/* 31 ZFS_IOC_CLEAR_FAULT */
229219089Spjd	31,	/* 32 ZFS_IOC_INJECT_LIST_NEXT */
230219089Spjd	32,	/* 33 ZFS_IOC_ERROR_LOG */
231219089Spjd	33,	/* 34 ZFS_IOC_CLEAR */
232219089Spjd	34,	/* 35 ZFS_IOC_PROMOTE */
233219089Spjd	35,	/* 36 ZFS_IOC_DESTROY_SNAPS */
234219089Spjd	36,	/* 37 ZFS_IOC_SNAPSHOT */
235219089Spjd	37,	/* 38 ZFS_IOC_DSOBJ_TO_DSNAME */
236219089Spjd	38,	/* 39 ZFS_IOC_OBJ_TO_PATH */
237219089Spjd	39,	/* 40 ZFS_IOC_POOL_SET_PROPS */
238219089Spjd	40,	/* 41 ZFS_IOC_POOL_GET_PROPS */
239219089Spjd	41,	/* 42 ZFS_IOC_SET_FSACL */
240219089Spjd	42,	/* 43 ZFS_IOC_GET_FSACL */
241219089Spjd	ZFS_IOC_COMPAT_PASS,	/* 44 ZFS_IOC_ISCSI_PERM_CHECK */
242219089Spjd	43,	/* 45 ZFS_IOC_SHARE */
243219089Spjd	44,	/* 46 ZFS_IOC_IHNERIT_PROP */
244219089Spjd	58,	/* 47 ZFS_IOC_JAIL */
245219089Spjd	59,	/* 48 ZFS_IOC_UNJAIL */
246219089Spjd	45,	/* 49 ZFS_IOC_SMB_ACL */
247219089Spjd	46,	/* 50 ZFS_IOC_USERSPACE_ONE */
248219089Spjd	47,	/* 51 ZFS_IOC_USERSPACE_MANY */
249219089Spjd	48,	/* 52 ZFS_IOC_USERSPACE_UPGRADE */
250219089Spjd	17,	/* 53 ZFS_IOC_SETFRU */
251219089Spjd};
252219089Spjd
253219089Spjd#else	/* KERNEL */
254219089Spjdunsigned static long zfs_ioctl_v28_to_v15[] = {
255219089Spjd	0,	/*  0 ZFS_IOC_POOL_CREATE */
256219089Spjd	1,	/*  1 ZFS_IOC_POOL_DESTROY */
257219089Spjd	2,	/*  2 ZFS_IOC_POOL_IMPORT */
258219089Spjd	3,	/*  3 ZFS_IOC_POOL_EXPORT */
259219089Spjd	4,	/*  4 ZFS_IOC_POOL_CONFIGS */
260219089Spjd	5,	/*  5 ZFS_IOC_POOL_STATS */
261219089Spjd	6,	/*  6 ZFS_IOC_POOL_TRYIMPORT */
262219089Spjd	7,	/*  7 ZFS_IOC_POOL_SCAN */
263219089Spjd	8,	/*  8 ZFS_IOC_POOL_FREEZE */
264219089Spjd	9,	/*  9 ZFS_IOC_POOL_UPGRADE */
265219089Spjd	10,	/* 10 ZFS_IOC_POOL_GET_HISTORY */
266219089Spjd	11,	/* 11 ZFS_IOC_VDEV_ADD */
267219089Spjd	12,	/* 12 ZFS_IOC_VDEV_REMOVE */
268219089Spjd	13,	/* 13 ZFS_IOC_VDEV_SET_STATE */
269219089Spjd	14,	/* 14 ZFS_IOC_VDEV_ATTACH */
270219089Spjd	15,	/* 15 ZFS_IOC_VDEV_DETACH */
271219089Spjd	16,	/* 16 ZFS_IOC_VDEV_SETPATH */
272219089Spjd	53,	/* 17 ZFS_IOC_VDEV_SETFRU */
273219089Spjd	17,	/* 18 ZFS_IOC_OBJSET_STATS */
274219089Spjd	18,	/* 19 ZFS_IOC_OBJSET_ZPLPROPS */
275219089Spjd	19, 	/* 20 ZFS_IOC_DATASET_LIST_NEXT */
276219089Spjd	20,	/* 21 ZFS_IOC_SNAPSHOT_LIST_NEXT */
277219089Spjd	21,	/* 22 ZFS_IOC_SET_PROP */
278219089Spjd	24,	/* 23 ZFS_IOC_CREATE */
279219089Spjd	25,	/* 24 ZFS_IOC_DESTROY */
280219089Spjd	26,	/* 25 ZFS_IOC_ROLLBACK */
281219089Spjd	27,	/* 26 ZFS_IOC_RENAME */
282219089Spjd	28,	/* 27 ZFS_IOC_RECV */
283219089Spjd	29,	/* 28 ZFS_IOC_SEND */
284219089Spjd	30,	/* 39 ZFS_IOC_INJECT_FAULT */
285219089Spjd	31,	/* 30 ZFS_IOC_CLEAR_FAULT */
286219089Spjd	32,	/* 31 ZFS_IOC_INJECT_LIST_NEXT */
287219089Spjd	33,	/* 32 ZFS_IOC_ERROR_LOG */
288219089Spjd	34,	/* 33 ZFS_IOC_CLEAR */
289219089Spjd	35,	/* 34 ZFS_IOC_PROMOTE */
290219089Spjd	36,	/* 35 ZFS_IOC_DESTROY_SNAPS */
291219089Spjd	37,	/* 36 ZFS_IOC_SNAPSHOT */
292219089Spjd	38,	/* 37 ZFS_IOC_DSOBJ_TO_DSNAME */
293219089Spjd	39,	/* 38 ZFS_IOC_OBJ_TO_PATH */
294219089Spjd	40,	/* 39 ZFS_IOC_POOL_SET_PROPS */
295219089Spjd	41,	/* 40 ZFS_IOC_POOL_GET_PROPS */
296219089Spjd	42,	/* 41 ZFS_IOC_SET_FSACL */
297219089Spjd	43,	/* 42 ZFS_IOC_GET_FSACL */
298219089Spjd	45,	/* 43 ZFS_IOC_SHARE */
299219089Spjd	46,	/* 44 ZFS_IOC_IHNERIT_PROP */
300219089Spjd	49,	/* 45 ZFS_IOC_SMB_ACL */
301219089Spjd	50,	/* 46 ZFS_IOC_USERSPACE_ONE */
302219089Spjd	51,	/* 47 ZFS_IOC_USERSPACE_MANY */
303219089Spjd	52,	/* 48 ZFS_IOC_USERSPACE_UPGRADE */
304219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 49 ZFS_IOC_HOLD */
305219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 50 ZFS_IOC_RELEASE */
306219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 51 ZFS_IOC_GET_HOLDS */
307219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 52 ZFS_IOC_OBJSET_RECVD_PROPS */
308219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 53 ZFS_IOC_VDEV_SPLIT */
309219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 54 ZFS_IOC_NEXT_OBJ */
310219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 55 ZFS_IOC_DIFF */
311219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 56 ZFS_IOC_TMP_SNAPSHOT */
312219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 57 ZFS_IOC_OBJ_TO_STATS */
313219089Spjd	47,	/* 58 ZFS_IOC_JAIL */
314219089Spjd	48,	/* 59 ZFS_IOC_UNJAIL */
315219089Spjd};
316219089Spjd#endif	/* ! _KERNEL */
317219089Spjd
318219089Spjd#ifdef _KERNEL
319248571Smmint zfs_ioctl_compat_pre(zfs_cmd_t *, int *, const int);
320219089Spjdvoid zfs_ioctl_compat_post(zfs_cmd_t *, const int, const int);
321248571Smmnvlist_t *zfs_ioctl_compat_innvl(zfs_cmd_t *, nvlist_t *, const int,
322248571Smm    const int);
323248571Smmnvlist_t *zfs_ioctl_compat_outnvl(zfs_cmd_t *, nvlist_t *, const int,
324248571Smm    const int);
325219089Spjd#else
326248571Smmint zcmd_ioctl_compat(int, int, zfs_cmd_t *, const int);
327219089Spjd#endif	/* _KERNEL */
328219089Spjdvoid zfs_cmd_compat_get(zfs_cmd_t *, caddr_t, const int);
329248571Smmvoid zfs_cmd_compat_put(zfs_cmd_t *, caddr_t, const int, const int);
330219089Spjd
331219089Spjd#ifdef	__cplusplus
332219089Spjd}
333219089Spjd#endif
334219089Spjd
335219089Spjd#endif	/* _SYS_ZFS_IOCTL_COMPAT_H */
336