zfs_ioctl_compat.h revision 290756
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2014 Xin Li <delphij@FreeBSD.org>.  All rights reserved.
23 * Copyright 2013 Martin Matuska <mm@FreeBSD.org>.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef	_SYS_ZFS_IOCTL_COMPAT_H
28#define	_SYS_ZFS_IOCTL_COMPAT_H
29
30#include <sys/cred.h>
31#include <sys/dmu.h>
32#include <sys/zio.h>
33#include <sys/dsl_deleg.h>
34#include <sys/zfs_ioctl.h>
35
36#ifdef _KERNEL
37#include <sys/nvpair.h>
38#endif  /* _KERNEL */
39
40#ifdef	__cplusplus
41extern "C" {
42#endif
43
44/*
45 * Backwards ioctl compatibility
46 */
47
48/* ioctl versions for vfs.zfs.version.ioctl */
49#define	ZFS_IOCVER_UNDEF	-1
50#define	ZFS_IOCVER_NONE		0
51#define	ZFS_IOCVER_DEADMAN	1
52#define	ZFS_IOCVER_LZC		2
53#define	ZFS_IOCVER_ZCMD		3
54#define	ZFS_IOCVER_EDBP		4
55#define	ZFS_IOCVER_RESUME	5
56#define	ZFS_IOCVER_CURRENT	ZFS_IOCVER_RESUME
57
58/* compatibility conversion flag */
59#define	ZFS_CMD_COMPAT_NONE	0
60#define	ZFS_CMD_COMPAT_V15	1
61#define	ZFS_CMD_COMPAT_V28	2
62#define	ZFS_CMD_COMPAT_DEADMAN	3
63#define	ZFS_CMD_COMPAT_LZC	4
64#define	ZFS_CMD_COMPAT_ZCMD	5
65#define	ZFS_CMD_COMPAT_EDBP	6
66
67#define	ZFS_IOC_COMPAT_PASS	254
68#define	ZFS_IOC_COMPAT_FAIL	255
69
70#define	ZFS_IOCREQ(ioreq)	((ioreq) & 0xff)
71
72typedef struct zfs_iocparm {
73	uint32_t	zfs_ioctl_version;
74	uint64_t	zfs_cmd;
75	uint64_t	zfs_cmd_size;
76} zfs_iocparm_t;
77
78typedef struct zinject_record_v15 {
79	uint64_t	zi_objset;
80	uint64_t	zi_object;
81	uint64_t	zi_start;
82	uint64_t	zi_end;
83	uint64_t	zi_guid;
84	uint32_t	zi_level;
85	uint32_t	zi_error;
86	uint64_t	zi_type;
87	uint32_t	zi_freq;
88	uint32_t	zi_failfast;
89} zinject_record_v15_t;
90
91typedef struct zfs_cmd_v15 {
92	char		zc_name[MAXPATHLEN];
93	char		zc_value[MAXPATHLEN];
94	char		zc_string[MAXNAMELEN];
95	uint64_t	zc_guid;
96	uint64_t	zc_nvlist_conf;		/* really (char *) */
97	uint64_t	zc_nvlist_conf_size;
98	uint64_t	zc_nvlist_src;		/* really (char *) */
99	uint64_t	zc_nvlist_src_size;
100	uint64_t	zc_nvlist_dst;		/* really (char *) */
101	uint64_t	zc_nvlist_dst_size;
102	uint64_t	zc_cookie;
103	uint64_t	zc_objset_type;
104	uint64_t	zc_perm_action;
105	uint64_t 	zc_history;		/* really (char *) */
106	uint64_t 	zc_history_len;
107	uint64_t	zc_history_offset;
108	uint64_t	zc_obj;
109	zfs_share_t	zc_share;
110	uint64_t	zc_jailid;
111	dmu_objset_stats_t zc_objset_stats;
112	struct drr_begin zc_begin_record;
113	zinject_record_v15_t zc_inject_record;
114} zfs_cmd_v15_t;
115
116typedef struct zinject_record_v28 {
117	uint64_t	zi_objset;
118	uint64_t	zi_object;
119	uint64_t	zi_start;
120	uint64_t	zi_end;
121	uint64_t	zi_guid;
122	uint32_t	zi_level;
123	uint32_t	zi_error;
124	uint64_t	zi_type;
125	uint32_t	zi_freq;
126	uint32_t	zi_failfast;
127	char		zi_func[MAXNAMELEN];
128	uint32_t	zi_iotype;
129	int32_t		zi_duration;
130	uint64_t	zi_timer;
131} zinject_record_v28_t;
132
133typedef struct zfs_cmd_v28 {
134	char		zc_name[MAXPATHLEN];
135	char		zc_value[MAXPATHLEN * 2];
136	char		zc_string[MAXNAMELEN];
137	char		zc_top_ds[MAXPATHLEN];
138	uint64_t	zc_guid;
139	uint64_t	zc_nvlist_conf;		/* really (char *) */
140	uint64_t	zc_nvlist_conf_size;
141	uint64_t	zc_nvlist_src;		/* really (char *) */
142	uint64_t	zc_nvlist_src_size;
143	uint64_t	zc_nvlist_dst;		/* really (char *) */
144	uint64_t	zc_nvlist_dst_size;
145	uint64_t	zc_cookie;
146	uint64_t	zc_objset_type;
147	uint64_t	zc_perm_action;
148	uint64_t 	zc_history;		/* really (char *) */
149	uint64_t 	zc_history_len;
150	uint64_t	zc_history_offset;
151	uint64_t	zc_obj;
152	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
153	zfs_share_t	zc_share;
154	uint64_t	zc_jailid;
155	dmu_objset_stats_t zc_objset_stats;
156	struct drr_begin zc_begin_record;
157	zinject_record_v28_t zc_inject_record;
158	boolean_t	zc_defer_destroy;
159	boolean_t	zc_temphold;
160	uint64_t	zc_action_handle;
161	int		zc_cleanup_fd;
162	uint8_t		zc_simple;
163	uint8_t		zc_pad[3];		/* alignment */
164	uint64_t	zc_sendobj;
165	uint64_t	zc_fromobj;
166	uint64_t	zc_createtxg;
167	zfs_stat_t	zc_stat;
168} zfs_cmd_v28_t;
169
170typedef struct zfs_cmd_deadman {
171	char		zc_name[MAXPATHLEN];
172	char		zc_value[MAXPATHLEN * 2];
173	char		zc_string[MAXNAMELEN];
174	char		zc_top_ds[MAXPATHLEN];
175	uint64_t	zc_guid;
176	uint64_t	zc_nvlist_conf;		/* really (char *) */
177	uint64_t	zc_nvlist_conf_size;
178	uint64_t	zc_nvlist_src;		/* really (char *) */
179	uint64_t	zc_nvlist_src_size;
180	uint64_t	zc_nvlist_dst;		/* really (char *) */
181	uint64_t	zc_nvlist_dst_size;
182	uint64_t	zc_cookie;
183	uint64_t	zc_objset_type;
184	uint64_t	zc_perm_action;
185	uint64_t 	zc_history;		/* really (char *) */
186	uint64_t 	zc_history_len;
187	uint64_t	zc_history_offset;
188	uint64_t	zc_obj;
189	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
190	zfs_share_t	zc_share;
191	uint64_t	zc_jailid;
192	dmu_objset_stats_t zc_objset_stats;
193	struct drr_begin zc_begin_record;
194	/* zc_inject_record doesn't change in libzfs_core */
195	zinject_record_t zc_inject_record;
196	boolean_t	zc_defer_destroy;
197	boolean_t	zc_temphold;
198	uint64_t	zc_action_handle;
199	int		zc_cleanup_fd;
200	uint8_t		zc_simple;
201	uint8_t		zc_pad[3];		/* alignment */
202	uint64_t	zc_sendobj;
203	uint64_t	zc_fromobj;
204	uint64_t	zc_createtxg;
205	zfs_stat_t	zc_stat;
206} zfs_cmd_deadman_t;
207
208typedef struct zfs_cmd_zcmd {
209	char		zc_name[MAXPATHLEN];	/* name of pool or dataset */
210	uint64_t	zc_nvlist_src;		/* really (char *) */
211	uint64_t	zc_nvlist_src_size;
212	uint64_t	zc_nvlist_dst;		/* really (char *) */
213	uint64_t	zc_nvlist_dst_size;
214	boolean_t	zc_nvlist_dst_filled;	/* put an nvlist in dst? */
215	int		zc_pad2;
216
217	/*
218	 * The following members are for legacy ioctls which haven't been
219	 * converted to the new method.
220	 */
221	uint64_t	zc_history;		/* really (char *) */
222	char		zc_value[MAXPATHLEN * 2];
223	char		zc_string[MAXNAMELEN];
224	uint64_t	zc_guid;
225	uint64_t	zc_nvlist_conf;		/* really (char *) */
226	uint64_t	zc_nvlist_conf_size;
227	uint64_t	zc_cookie;
228	uint64_t	zc_objset_type;
229	uint64_t	zc_perm_action;
230	uint64_t	zc_history_len;
231	uint64_t	zc_history_offset;
232	uint64_t	zc_obj;
233	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
234	zfs_share_t	zc_share;
235	uint64_t	zc_jailid;
236	dmu_objset_stats_t zc_objset_stats;
237	struct drr_begin zc_begin_record;
238	zinject_record_t zc_inject_record;
239	boolean_t	zc_defer_destroy;
240	boolean_t	zc_temphold;
241	uint64_t	zc_action_handle;
242	int		zc_cleanup_fd;
243	uint8_t		zc_simple;
244	uint8_t		zc_pad[3];		/* alignment */
245	uint64_t	zc_sendobj;
246	uint64_t	zc_fromobj;
247	uint64_t	zc_createtxg;
248	zfs_stat_t	zc_stat;
249} zfs_cmd_zcmd_t;
250
251typedef struct zfs_cmd_edbp {
252	char		zc_name[MAXPATHLEN];	/* name of pool or dataset */
253	uint64_t	zc_nvlist_src;		/* really (char *) */
254	uint64_t	zc_nvlist_src_size;
255	uint64_t	zc_nvlist_dst;		/* really (char *) */
256	uint64_t	zc_nvlist_dst_size;
257	boolean_t	zc_nvlist_dst_filled;	/* put an nvlist in dst? */
258	int		zc_pad2;
259
260	/*
261	 * The following members are for legacy ioctls which haven't been
262	 * converted to the new method.
263	 */
264	uint64_t	zc_history;		/* really (char *) */
265	char		zc_value[MAXPATHLEN * 2];
266	char		zc_string[MAXNAMELEN];
267	uint64_t	zc_guid;
268	uint64_t	zc_nvlist_conf;		/* really (char *) */
269	uint64_t	zc_nvlist_conf_size;
270	uint64_t	zc_cookie;
271	uint64_t	zc_objset_type;
272	uint64_t	zc_perm_action;
273	uint64_t	zc_history_len;
274	uint64_t	zc_history_offset;
275	uint64_t	zc_obj;
276	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
277	zfs_share_t	zc_share;
278	uint64_t	zc_jailid;
279	dmu_objset_stats_t zc_objset_stats;
280	struct drr_begin zc_begin_record;
281	zinject_record_t zc_inject_record;
282	uint32_t	zc_defer_destroy;
283	uint32_t	zc_flags;
284	uint64_t	zc_action_handle;
285	int		zc_cleanup_fd;
286	uint8_t		zc_simple;
287	uint8_t		zc_pad[3];		/* alignment */
288	uint64_t	zc_sendobj;
289	uint64_t	zc_fromobj;
290	uint64_t	zc_createtxg;
291	zfs_stat_t	zc_stat;
292} zfs_cmd_edbp_t;
293
294#ifdef _KERNEL
295unsigned static long zfs_ioctl_v15_to_v28[] = {
296	0,	/*  0 ZFS_IOC_POOL_CREATE */
297	1,	/*  1 ZFS_IOC_POOL_DESTROY */
298	2,	/*  2 ZFS_IOC_POOL_IMPORT */
299	3,	/*  3 ZFS_IOC_POOL_EXPORT */
300	4,	/*  4 ZFS_IOC_POOL_CONFIGS */
301	5,	/*  5 ZFS_IOC_POOL_STATS */
302	6,	/*  6 ZFS_IOC_POOL_TRYIMPORT */
303	7,	/*  7 ZFS_IOC_POOL_SCRUB */
304	8,	/*  8 ZFS_IOC_POOL_FREEZE */
305	9,	/*  9 ZFS_IOC_POOL_UPGRADE */
306	10,	/* 10 ZFS_IOC_POOL_GET_HISTORY */
307	11,	/* 11 ZFS_IOC_VDEV_ADD */
308	12,	/* 12 ZFS_IOC_VDEV_REMOVE */
309	13,	/* 13 ZFS_IOC_VDEV_SET_STATE */
310	14,	/* 14 ZFS_IOC_VDEV_ATTACH */
311	15,	/* 15 ZFS_IOC_VDEV_DETACH */
312	16,	/* 16 ZFS_IOC_VDEV_SETPATH */
313	18,	/* 17 ZFS_IOC_OBJSET_STATS */
314	19,	/* 18 ZFS_IOC_OBJSET_ZPLPROPS */
315	20, 	/* 19 ZFS_IOC_DATASET_LIST_NEXT */
316	21,	/* 20 ZFS_IOC_SNAPSHOT_LIST_NEXT */
317	22,	/* 21 ZFS_IOC_SET_PROP */
318	ZFS_IOC_COMPAT_PASS,	/* 22 ZFS_IOC_CREATE_MINOR */
319	ZFS_IOC_COMPAT_PASS,	/* 23 ZFS_IOC_REMOVE_MINOR */
320	23,	/* 24 ZFS_IOC_CREATE */
321	24,	/* 25 ZFS_IOC_DESTROY */
322	25,	/* 26 ZFS_IOC_ROLLBACK */
323	26,	/* 27 ZFS_IOC_RENAME */
324	27,	/* 28 ZFS_IOC_RECV */
325	28,	/* 29 ZFS_IOC_SEND */
326	29,	/* 30 ZFS_IOC_INJECT_FAULT */
327	30,	/* 31 ZFS_IOC_CLEAR_FAULT */
328	31,	/* 32 ZFS_IOC_INJECT_LIST_NEXT */
329	32,	/* 33 ZFS_IOC_ERROR_LOG */
330	33,	/* 34 ZFS_IOC_CLEAR */
331	34,	/* 35 ZFS_IOC_PROMOTE */
332	35,	/* 36 ZFS_IOC_DESTROY_SNAPS */
333	36,	/* 37 ZFS_IOC_SNAPSHOT */
334	37,	/* 38 ZFS_IOC_DSOBJ_TO_DSNAME */
335	38,	/* 39 ZFS_IOC_OBJ_TO_PATH */
336	39,	/* 40 ZFS_IOC_POOL_SET_PROPS */
337	40,	/* 41 ZFS_IOC_POOL_GET_PROPS */
338	41,	/* 42 ZFS_IOC_SET_FSACL */
339	42,	/* 43 ZFS_IOC_GET_FSACL */
340	ZFS_IOC_COMPAT_PASS,	/* 44 ZFS_IOC_ISCSI_PERM_CHECK */
341	43,	/* 45 ZFS_IOC_SHARE */
342	44,	/* 46 ZFS_IOC_IHNERIT_PROP */
343	58,	/* 47 ZFS_IOC_JAIL */
344	59,	/* 48 ZFS_IOC_UNJAIL */
345	45,	/* 49 ZFS_IOC_SMB_ACL */
346	46,	/* 50 ZFS_IOC_USERSPACE_ONE */
347	47,	/* 51 ZFS_IOC_USERSPACE_MANY */
348	48,	/* 52 ZFS_IOC_USERSPACE_UPGRADE */
349	17,	/* 53 ZFS_IOC_SETFRU */
350};
351
352#else	/* KERNEL */
353unsigned static long zfs_ioctl_v28_to_v15[] = {
354	0,	/*  0 ZFS_IOC_POOL_CREATE */
355	1,	/*  1 ZFS_IOC_POOL_DESTROY */
356	2,	/*  2 ZFS_IOC_POOL_IMPORT */
357	3,	/*  3 ZFS_IOC_POOL_EXPORT */
358	4,	/*  4 ZFS_IOC_POOL_CONFIGS */
359	5,	/*  5 ZFS_IOC_POOL_STATS */
360	6,	/*  6 ZFS_IOC_POOL_TRYIMPORT */
361	7,	/*  7 ZFS_IOC_POOL_SCAN */
362	8,	/*  8 ZFS_IOC_POOL_FREEZE */
363	9,	/*  9 ZFS_IOC_POOL_UPGRADE */
364	10,	/* 10 ZFS_IOC_POOL_GET_HISTORY */
365	11,	/* 11 ZFS_IOC_VDEV_ADD */
366	12,	/* 12 ZFS_IOC_VDEV_REMOVE */
367	13,	/* 13 ZFS_IOC_VDEV_SET_STATE */
368	14,	/* 14 ZFS_IOC_VDEV_ATTACH */
369	15,	/* 15 ZFS_IOC_VDEV_DETACH */
370	16,	/* 16 ZFS_IOC_VDEV_SETPATH */
371	53,	/* 17 ZFS_IOC_VDEV_SETFRU */
372	17,	/* 18 ZFS_IOC_OBJSET_STATS */
373	18,	/* 19 ZFS_IOC_OBJSET_ZPLPROPS */
374	19, 	/* 20 ZFS_IOC_DATASET_LIST_NEXT */
375	20,	/* 21 ZFS_IOC_SNAPSHOT_LIST_NEXT */
376	21,	/* 22 ZFS_IOC_SET_PROP */
377	24,	/* 23 ZFS_IOC_CREATE */
378	25,	/* 24 ZFS_IOC_DESTROY */
379	26,	/* 25 ZFS_IOC_ROLLBACK */
380	27,	/* 26 ZFS_IOC_RENAME */
381	28,	/* 27 ZFS_IOC_RECV */
382	29,	/* 28 ZFS_IOC_SEND */
383	30,	/* 39 ZFS_IOC_INJECT_FAULT */
384	31,	/* 30 ZFS_IOC_CLEAR_FAULT */
385	32,	/* 31 ZFS_IOC_INJECT_LIST_NEXT */
386	33,	/* 32 ZFS_IOC_ERROR_LOG */
387	34,	/* 33 ZFS_IOC_CLEAR */
388	35,	/* 34 ZFS_IOC_PROMOTE */
389	36,	/* 35 ZFS_IOC_DESTROY_SNAPS */
390	37,	/* 36 ZFS_IOC_SNAPSHOT */
391	38,	/* 37 ZFS_IOC_DSOBJ_TO_DSNAME */
392	39,	/* 38 ZFS_IOC_OBJ_TO_PATH */
393	40,	/* 39 ZFS_IOC_POOL_SET_PROPS */
394	41,	/* 40 ZFS_IOC_POOL_GET_PROPS */
395	42,	/* 41 ZFS_IOC_SET_FSACL */
396	43,	/* 42 ZFS_IOC_GET_FSACL */
397	45,	/* 43 ZFS_IOC_SHARE */
398	46,	/* 44 ZFS_IOC_IHNERIT_PROP */
399	49,	/* 45 ZFS_IOC_SMB_ACL */
400	50,	/* 46 ZFS_IOC_USERSPACE_ONE */
401	51,	/* 47 ZFS_IOC_USERSPACE_MANY */
402	52,	/* 48 ZFS_IOC_USERSPACE_UPGRADE */
403	ZFS_IOC_COMPAT_FAIL,	/* 49 ZFS_IOC_HOLD */
404	ZFS_IOC_COMPAT_FAIL,	/* 50 ZFS_IOC_RELEASE */
405	ZFS_IOC_COMPAT_FAIL,	/* 51 ZFS_IOC_GET_HOLDS */
406	ZFS_IOC_COMPAT_FAIL,	/* 52 ZFS_IOC_OBJSET_RECVD_PROPS */
407	ZFS_IOC_COMPAT_FAIL,	/* 53 ZFS_IOC_VDEV_SPLIT */
408	ZFS_IOC_COMPAT_FAIL,	/* 54 ZFS_IOC_NEXT_OBJ */
409	ZFS_IOC_COMPAT_FAIL,	/* 55 ZFS_IOC_DIFF */
410	ZFS_IOC_COMPAT_FAIL,	/* 56 ZFS_IOC_TMP_SNAPSHOT */
411	ZFS_IOC_COMPAT_FAIL,	/* 57 ZFS_IOC_OBJ_TO_STATS */
412	47,	/* 58 ZFS_IOC_JAIL */
413	48,	/* 59 ZFS_IOC_UNJAIL */
414};
415#endif	/* ! _KERNEL */
416
417#ifdef _KERNEL
418int zfs_ioctl_compat_pre(zfs_cmd_t *, int *, const int);
419void zfs_ioctl_compat_post(zfs_cmd_t *, const int, const int);
420nvlist_t *zfs_ioctl_compat_innvl(zfs_cmd_t *, nvlist_t *, const int,
421    const int);
422nvlist_t *zfs_ioctl_compat_outnvl(zfs_cmd_t *, nvlist_t *, const int,
423    const int);
424#else
425int zcmd_ioctl_compat(int, int, zfs_cmd_t *, const int);
426#endif	/* _KERNEL */
427void zfs_cmd_compat_get(zfs_cmd_t *, caddr_t, const int);
428void zfs_cmd_compat_put(zfs_cmd_t *, caddr_t, const int, const int);
429
430#ifdef	__cplusplus
431}
432#endif
433
434#endif	/* _SYS_ZFS_IOCTL_COMPAT_H */
435