zfs_ioctl_compat.h revision 249319
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
52249319Smm#define	ZFS_IOCVER_ZCMD		3
53249319Smm#define	ZFS_IOCVER_CURRENT	ZFS_IOCVER_ZCMD
54247540Smm
55247540Smm/* compatibility conversion flag */
56247540Smm#define	ZFS_CMD_COMPAT_NONE	0
57219089Spjd#define	ZFS_CMD_COMPAT_V15	1
58247540Smm#define	ZFS_CMD_COMPAT_V28	2
59248571Smm#define	ZFS_CMD_COMPAT_DEADMAN	3
60249319Smm#define	ZFS_CMD_COMPAT_LZC	4
61219089Spjd
62247540Smm#define	ZFS_IOC_COMPAT_PASS	254
63247540Smm#define	ZFS_IOC_COMPAT_FAIL	255
64219089Spjd
65248571Smm#define	ZFS_IOCREQ(ioreq)	((ioreq) & 0xff)
66248571Smm
67249319Smmtypedef struct zfs_iocparm {
68249319Smm	uint32_t	zfs_ioctl_version;
69249319Smm	uint64_t	zfs_cmd;
70249319Smm	uint64_t	zfs_cmd_size;
71249319Smm} zfs_iocparm_t;
72249319Smm
73219089Spjdtypedef struct zinject_record_v15 {
74219089Spjd	uint64_t	zi_objset;
75219089Spjd	uint64_t	zi_object;
76219089Spjd	uint64_t	zi_start;
77219089Spjd	uint64_t	zi_end;
78219089Spjd	uint64_t	zi_guid;
79219089Spjd	uint32_t	zi_level;
80219089Spjd	uint32_t	zi_error;
81219089Spjd	uint64_t	zi_type;
82219089Spjd	uint32_t	zi_freq;
83219089Spjd	uint32_t	zi_failfast;
84219089Spjd} zinject_record_v15_t;
85219089Spjd
86219089Spjdtypedef struct zfs_cmd_v15 {
87219089Spjd	char		zc_name[MAXPATHLEN];
88219089Spjd	char		zc_value[MAXPATHLEN];
89219089Spjd	char		zc_string[MAXNAMELEN];
90219089Spjd	uint64_t	zc_guid;
91219089Spjd	uint64_t	zc_nvlist_conf;		/* really (char *) */
92219089Spjd	uint64_t	zc_nvlist_conf_size;
93219089Spjd	uint64_t	zc_nvlist_src;		/* really (char *) */
94219089Spjd	uint64_t	zc_nvlist_src_size;
95219089Spjd	uint64_t	zc_nvlist_dst;		/* really (char *) */
96219089Spjd	uint64_t	zc_nvlist_dst_size;
97219089Spjd	uint64_t	zc_cookie;
98219089Spjd	uint64_t	zc_objset_type;
99219089Spjd	uint64_t	zc_perm_action;
100219089Spjd	uint64_t 	zc_history;		/* really (char *) */
101219089Spjd	uint64_t 	zc_history_len;
102219089Spjd	uint64_t	zc_history_offset;
103219089Spjd	uint64_t	zc_obj;
104219089Spjd	zfs_share_t	zc_share;
105219089Spjd	uint64_t	zc_jailid;
106219089Spjd	dmu_objset_stats_t zc_objset_stats;
107219089Spjd	struct drr_begin zc_begin_record;
108219089Spjd	zinject_record_v15_t zc_inject_record;
109219089Spjd} zfs_cmd_v15_t;
110219089Spjd
111247540Smmtypedef struct zinject_record_v28 {
112247540Smm	uint64_t	zi_objset;
113247540Smm	uint64_t	zi_object;
114247540Smm	uint64_t	zi_start;
115247540Smm	uint64_t	zi_end;
116247540Smm	uint64_t	zi_guid;
117247540Smm	uint32_t	zi_level;
118247540Smm	uint32_t	zi_error;
119247540Smm	uint64_t	zi_type;
120247540Smm	uint32_t	zi_freq;
121247540Smm	uint32_t	zi_failfast;
122247540Smm	char		zi_func[MAXNAMELEN];
123247540Smm	uint32_t	zi_iotype;
124247540Smm	int32_t		zi_duration;
125247540Smm	uint64_t	zi_timer;
126247540Smm} zinject_record_v28_t;
127247540Smm
128247540Smmtypedef struct zfs_cmd_v28 {
129247540Smm	char		zc_name[MAXPATHLEN];
130247540Smm	char		zc_value[MAXPATHLEN * 2];
131247540Smm	char		zc_string[MAXNAMELEN];
132247540Smm	char		zc_top_ds[MAXPATHLEN];
133247540Smm	uint64_t	zc_guid;
134247540Smm	uint64_t	zc_nvlist_conf;		/* really (char *) */
135247540Smm	uint64_t	zc_nvlist_conf_size;
136247540Smm	uint64_t	zc_nvlist_src;		/* really (char *) */
137247540Smm	uint64_t	zc_nvlist_src_size;
138247540Smm	uint64_t	zc_nvlist_dst;		/* really (char *) */
139247540Smm	uint64_t	zc_nvlist_dst_size;
140247540Smm	uint64_t	zc_cookie;
141247540Smm	uint64_t	zc_objset_type;
142247540Smm	uint64_t	zc_perm_action;
143247540Smm	uint64_t 	zc_history;		/* really (char *) */
144247540Smm	uint64_t 	zc_history_len;
145247540Smm	uint64_t	zc_history_offset;
146247540Smm	uint64_t	zc_obj;
147247540Smm	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
148247540Smm	zfs_share_t	zc_share;
149247540Smm	uint64_t	zc_jailid;
150247540Smm	dmu_objset_stats_t zc_objset_stats;
151247540Smm	struct drr_begin zc_begin_record;
152247540Smm	zinject_record_v28_t zc_inject_record;
153247540Smm	boolean_t	zc_defer_destroy;
154247540Smm	boolean_t	zc_temphold;
155247540Smm	uint64_t	zc_action_handle;
156247540Smm	int		zc_cleanup_fd;
157247540Smm	uint8_t		zc_simple;
158247540Smm	uint8_t		zc_pad[3];		/* alignment */
159247540Smm	uint64_t	zc_sendobj;
160247540Smm	uint64_t	zc_fromobj;
161247540Smm	uint64_t	zc_createtxg;
162247540Smm	zfs_stat_t	zc_stat;
163247540Smm} zfs_cmd_v28_t;
164247540Smm
165248571Smmtypedef struct zfs_cmd_deadman {
166248571Smm	char		zc_name[MAXPATHLEN];
167248571Smm	char		zc_value[MAXPATHLEN * 2];
168248571Smm	char		zc_string[MAXNAMELEN];
169248571Smm	char		zc_top_ds[MAXPATHLEN];
170248571Smm	uint64_t	zc_guid;
171248571Smm	uint64_t	zc_nvlist_conf;		/* really (char *) */
172248571Smm	uint64_t	zc_nvlist_conf_size;
173248571Smm	uint64_t	zc_nvlist_src;		/* really (char *) */
174248571Smm	uint64_t	zc_nvlist_src_size;
175248571Smm	uint64_t	zc_nvlist_dst;		/* really (char *) */
176248571Smm	uint64_t	zc_nvlist_dst_size;
177248571Smm	uint64_t	zc_cookie;
178248571Smm	uint64_t	zc_objset_type;
179248571Smm	uint64_t	zc_perm_action;
180248571Smm	uint64_t 	zc_history;		/* really (char *) */
181248571Smm	uint64_t 	zc_history_len;
182248571Smm	uint64_t	zc_history_offset;
183248571Smm	uint64_t	zc_obj;
184248571Smm	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
185248571Smm	zfs_share_t	zc_share;
186248571Smm	uint64_t	zc_jailid;
187248571Smm	dmu_objset_stats_t zc_objset_stats;
188248571Smm	struct drr_begin zc_begin_record;
189248571Smm	/* zc_inject_record doesn't change in libzfs_core */
190248571Smm	zinject_record_t zc_inject_record;
191248571Smm	boolean_t	zc_defer_destroy;
192248571Smm	boolean_t	zc_temphold;
193248571Smm	uint64_t	zc_action_handle;
194248571Smm	int		zc_cleanup_fd;
195248571Smm	uint8_t		zc_simple;
196248571Smm	uint8_t		zc_pad[3];		/* alignment */
197248571Smm	uint64_t	zc_sendobj;
198248571Smm	uint64_t	zc_fromobj;
199248571Smm	uint64_t	zc_createtxg;
200248571Smm	zfs_stat_t	zc_stat;
201248571Smm} zfs_cmd_deadman_t;
202248571Smm
203219089Spjd#ifdef _KERNEL
204219089Spjdunsigned static long zfs_ioctl_v15_to_v28[] = {
205219089Spjd	0,	/*  0 ZFS_IOC_POOL_CREATE */
206219089Spjd	1,	/*  1 ZFS_IOC_POOL_DESTROY */
207219089Spjd	2,	/*  2 ZFS_IOC_POOL_IMPORT */
208219089Spjd	3,	/*  3 ZFS_IOC_POOL_EXPORT */
209219089Spjd	4,	/*  4 ZFS_IOC_POOL_CONFIGS */
210219089Spjd	5,	/*  5 ZFS_IOC_POOL_STATS */
211219089Spjd	6,	/*  6 ZFS_IOC_POOL_TRYIMPORT */
212219089Spjd	7,	/*  7 ZFS_IOC_POOL_SCRUB */
213219089Spjd	8,	/*  8 ZFS_IOC_POOL_FREEZE */
214219089Spjd	9,	/*  9 ZFS_IOC_POOL_UPGRADE */
215219089Spjd	10,	/* 10 ZFS_IOC_POOL_GET_HISTORY */
216219089Spjd	11,	/* 11 ZFS_IOC_VDEV_ADD */
217219089Spjd	12,	/* 12 ZFS_IOC_VDEV_REMOVE */
218219089Spjd	13,	/* 13 ZFS_IOC_VDEV_SET_STATE */
219219089Spjd	14,	/* 14 ZFS_IOC_VDEV_ATTACH */
220219089Spjd	15,	/* 15 ZFS_IOC_VDEV_DETACH */
221219089Spjd	16,	/* 16 ZFS_IOC_VDEV_SETPATH */
222219089Spjd	18,	/* 17 ZFS_IOC_OBJSET_STATS */
223219089Spjd	19,	/* 18 ZFS_IOC_OBJSET_ZPLPROPS */
224219089Spjd	20, 	/* 19 ZFS_IOC_DATASET_LIST_NEXT */
225219089Spjd	21,	/* 20 ZFS_IOC_SNAPSHOT_LIST_NEXT */
226219089Spjd	22,	/* 21 ZFS_IOC_SET_PROP */
227219089Spjd	ZFS_IOC_COMPAT_PASS,	/* 22 ZFS_IOC_CREATE_MINOR */
228219089Spjd	ZFS_IOC_COMPAT_PASS,	/* 23 ZFS_IOC_REMOVE_MINOR */
229219089Spjd	23,	/* 24 ZFS_IOC_CREATE */
230219089Spjd	24,	/* 25 ZFS_IOC_DESTROY */
231219089Spjd	25,	/* 26 ZFS_IOC_ROLLBACK */
232219089Spjd	26,	/* 27 ZFS_IOC_RENAME */
233219089Spjd	27,	/* 28 ZFS_IOC_RECV */
234219089Spjd	28,	/* 29 ZFS_IOC_SEND */
235219089Spjd	29,	/* 30 ZFS_IOC_INJECT_FAULT */
236219089Spjd	30,	/* 31 ZFS_IOC_CLEAR_FAULT */
237219089Spjd	31,	/* 32 ZFS_IOC_INJECT_LIST_NEXT */
238219089Spjd	32,	/* 33 ZFS_IOC_ERROR_LOG */
239219089Spjd	33,	/* 34 ZFS_IOC_CLEAR */
240219089Spjd	34,	/* 35 ZFS_IOC_PROMOTE */
241219089Spjd	35,	/* 36 ZFS_IOC_DESTROY_SNAPS */
242219089Spjd	36,	/* 37 ZFS_IOC_SNAPSHOT */
243219089Spjd	37,	/* 38 ZFS_IOC_DSOBJ_TO_DSNAME */
244219089Spjd	38,	/* 39 ZFS_IOC_OBJ_TO_PATH */
245219089Spjd	39,	/* 40 ZFS_IOC_POOL_SET_PROPS */
246219089Spjd	40,	/* 41 ZFS_IOC_POOL_GET_PROPS */
247219089Spjd	41,	/* 42 ZFS_IOC_SET_FSACL */
248219089Spjd	42,	/* 43 ZFS_IOC_GET_FSACL */
249219089Spjd	ZFS_IOC_COMPAT_PASS,	/* 44 ZFS_IOC_ISCSI_PERM_CHECK */
250219089Spjd	43,	/* 45 ZFS_IOC_SHARE */
251219089Spjd	44,	/* 46 ZFS_IOC_IHNERIT_PROP */
252219089Spjd	58,	/* 47 ZFS_IOC_JAIL */
253219089Spjd	59,	/* 48 ZFS_IOC_UNJAIL */
254219089Spjd	45,	/* 49 ZFS_IOC_SMB_ACL */
255219089Spjd	46,	/* 50 ZFS_IOC_USERSPACE_ONE */
256219089Spjd	47,	/* 51 ZFS_IOC_USERSPACE_MANY */
257219089Spjd	48,	/* 52 ZFS_IOC_USERSPACE_UPGRADE */
258219089Spjd	17,	/* 53 ZFS_IOC_SETFRU */
259219089Spjd};
260219089Spjd
261219089Spjd#else	/* KERNEL */
262219089Spjdunsigned static long zfs_ioctl_v28_to_v15[] = {
263219089Spjd	0,	/*  0 ZFS_IOC_POOL_CREATE */
264219089Spjd	1,	/*  1 ZFS_IOC_POOL_DESTROY */
265219089Spjd	2,	/*  2 ZFS_IOC_POOL_IMPORT */
266219089Spjd	3,	/*  3 ZFS_IOC_POOL_EXPORT */
267219089Spjd	4,	/*  4 ZFS_IOC_POOL_CONFIGS */
268219089Spjd	5,	/*  5 ZFS_IOC_POOL_STATS */
269219089Spjd	6,	/*  6 ZFS_IOC_POOL_TRYIMPORT */
270219089Spjd	7,	/*  7 ZFS_IOC_POOL_SCAN */
271219089Spjd	8,	/*  8 ZFS_IOC_POOL_FREEZE */
272219089Spjd	9,	/*  9 ZFS_IOC_POOL_UPGRADE */
273219089Spjd	10,	/* 10 ZFS_IOC_POOL_GET_HISTORY */
274219089Spjd	11,	/* 11 ZFS_IOC_VDEV_ADD */
275219089Spjd	12,	/* 12 ZFS_IOC_VDEV_REMOVE */
276219089Spjd	13,	/* 13 ZFS_IOC_VDEV_SET_STATE */
277219089Spjd	14,	/* 14 ZFS_IOC_VDEV_ATTACH */
278219089Spjd	15,	/* 15 ZFS_IOC_VDEV_DETACH */
279219089Spjd	16,	/* 16 ZFS_IOC_VDEV_SETPATH */
280219089Spjd	53,	/* 17 ZFS_IOC_VDEV_SETFRU */
281219089Spjd	17,	/* 18 ZFS_IOC_OBJSET_STATS */
282219089Spjd	18,	/* 19 ZFS_IOC_OBJSET_ZPLPROPS */
283219089Spjd	19, 	/* 20 ZFS_IOC_DATASET_LIST_NEXT */
284219089Spjd	20,	/* 21 ZFS_IOC_SNAPSHOT_LIST_NEXT */
285219089Spjd	21,	/* 22 ZFS_IOC_SET_PROP */
286219089Spjd	24,	/* 23 ZFS_IOC_CREATE */
287219089Spjd	25,	/* 24 ZFS_IOC_DESTROY */
288219089Spjd	26,	/* 25 ZFS_IOC_ROLLBACK */
289219089Spjd	27,	/* 26 ZFS_IOC_RENAME */
290219089Spjd	28,	/* 27 ZFS_IOC_RECV */
291219089Spjd	29,	/* 28 ZFS_IOC_SEND */
292219089Spjd	30,	/* 39 ZFS_IOC_INJECT_FAULT */
293219089Spjd	31,	/* 30 ZFS_IOC_CLEAR_FAULT */
294219089Spjd	32,	/* 31 ZFS_IOC_INJECT_LIST_NEXT */
295219089Spjd	33,	/* 32 ZFS_IOC_ERROR_LOG */
296219089Spjd	34,	/* 33 ZFS_IOC_CLEAR */
297219089Spjd	35,	/* 34 ZFS_IOC_PROMOTE */
298219089Spjd	36,	/* 35 ZFS_IOC_DESTROY_SNAPS */
299219089Spjd	37,	/* 36 ZFS_IOC_SNAPSHOT */
300219089Spjd	38,	/* 37 ZFS_IOC_DSOBJ_TO_DSNAME */
301219089Spjd	39,	/* 38 ZFS_IOC_OBJ_TO_PATH */
302219089Spjd	40,	/* 39 ZFS_IOC_POOL_SET_PROPS */
303219089Spjd	41,	/* 40 ZFS_IOC_POOL_GET_PROPS */
304219089Spjd	42,	/* 41 ZFS_IOC_SET_FSACL */
305219089Spjd	43,	/* 42 ZFS_IOC_GET_FSACL */
306219089Spjd	45,	/* 43 ZFS_IOC_SHARE */
307219089Spjd	46,	/* 44 ZFS_IOC_IHNERIT_PROP */
308219089Spjd	49,	/* 45 ZFS_IOC_SMB_ACL */
309219089Spjd	50,	/* 46 ZFS_IOC_USERSPACE_ONE */
310219089Spjd	51,	/* 47 ZFS_IOC_USERSPACE_MANY */
311219089Spjd	52,	/* 48 ZFS_IOC_USERSPACE_UPGRADE */
312219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 49 ZFS_IOC_HOLD */
313219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 50 ZFS_IOC_RELEASE */
314219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 51 ZFS_IOC_GET_HOLDS */
315219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 52 ZFS_IOC_OBJSET_RECVD_PROPS */
316219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 53 ZFS_IOC_VDEV_SPLIT */
317219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 54 ZFS_IOC_NEXT_OBJ */
318219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 55 ZFS_IOC_DIFF */
319219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 56 ZFS_IOC_TMP_SNAPSHOT */
320219089Spjd	ZFS_IOC_COMPAT_FAIL,	/* 57 ZFS_IOC_OBJ_TO_STATS */
321219089Spjd	47,	/* 58 ZFS_IOC_JAIL */
322219089Spjd	48,	/* 59 ZFS_IOC_UNJAIL */
323219089Spjd};
324219089Spjd#endif	/* ! _KERNEL */
325219089Spjd
326219089Spjd#ifdef _KERNEL
327248571Smmint zfs_ioctl_compat_pre(zfs_cmd_t *, int *, const int);
328219089Spjdvoid zfs_ioctl_compat_post(zfs_cmd_t *, const int, const int);
329248571Smmnvlist_t *zfs_ioctl_compat_innvl(zfs_cmd_t *, nvlist_t *, const int,
330248571Smm    const int);
331248571Smmnvlist_t *zfs_ioctl_compat_outnvl(zfs_cmd_t *, nvlist_t *, const int,
332248571Smm    const int);
333219089Spjd#else
334248571Smmint zcmd_ioctl_compat(int, int, zfs_cmd_t *, const int);
335219089Spjd#endif	/* _KERNEL */
336219089Spjdvoid zfs_cmd_compat_get(zfs_cmd_t *, caddr_t, const int);
337248571Smmvoid zfs_cmd_compat_put(zfs_cmd_t *, caddr_t, const int, const int);
338219089Spjd
339219089Spjd#ifdef	__cplusplus
340219089Spjd}
341219089Spjd#endif
342219089Spjd
343219089Spjd#endif	/* _SYS_ZFS_IOCTL_COMPAT_H */
344