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/sunddi.h>
32 #include <sys/dmu.h>
33 #include <sys/zio.h>
34 #include <sys/dsl_deleg.h>
35 #include <sys/zfs_ioctl.h>
36 
37 #ifdef _KERNEL
38 #include <sys/nvpair.h>
39 #endif  /* _KERNEL */
40 
41 #ifdef    __cplusplus
42 extern "C" {
43 #endif
44 
45 /*
46  * Backwards ioctl compatibility
47  */
48 
49 /* ioctl versions for vfs.zfs.version.ioctl */
50 #define   ZFS_IOCVER_UNDEF    -1
51 #define   ZFS_IOCVER_NONE               0
52 #define   ZFS_IOCVER_DEADMAN  1
53 #define   ZFS_IOCVER_LZC                2
54 #define   ZFS_IOCVER_ZCMD               3
55 #define   ZFS_IOCVER_EDBP               4
56 #define   ZFS_IOCVER_RESUME   5
57 #define   ZFS_IOCVER_INLANES  6
58 #define   ZFS_IOCVER_PAD                7
59 #define   ZFS_IOCVER_CURRENT  ZFS_IOCVER_PAD
60 
61 /* compatibility conversion flag */
62 #define   ZFS_CMD_COMPAT_NONE 0
63 #define   ZFS_CMD_COMPAT_V15  1
64 #define   ZFS_CMD_COMPAT_V28  2
65 #define   ZFS_CMD_COMPAT_DEADMAN        3
66 #define   ZFS_CMD_COMPAT_LZC  4
67 #define   ZFS_CMD_COMPAT_ZCMD 5
68 #define   ZFS_CMD_COMPAT_EDBP 6
69 #define   ZFS_CMD_COMPAT_RESUME         7
70 #define   ZFS_CMD_COMPAT_INLANES        8
71 
72 #define   ZFS_IOC_COMPAT_PASS 254
73 #define   ZFS_IOC_COMPAT_FAIL 255
74 
75 #define   ZFS_IOCREQ(ioreq)   ((ioreq) & 0xff)
76 
77 typedef struct zfs_iocparm {
78           uint32_t  zfs_ioctl_version;
79           uint64_t  zfs_cmd;
80           uint64_t  zfs_cmd_size;
81 } zfs_iocparm_t;
82 
83 typedef struct zinject_record_v15 {
84           uint64_t  zi_objset;
85           uint64_t  zi_object;
86           uint64_t  zi_start;
87           uint64_t  zi_end;
88           uint64_t  zi_guid;
89           uint32_t  zi_level;
90           uint32_t  zi_error;
91           uint64_t  zi_type;
92           uint32_t  zi_freq;
93           uint32_t  zi_failfast;
94 } zinject_record_v15_t;
95 
96 typedef struct zfs_cmd_v15 {
97           char                zc_name[MAXPATHLEN];
98           char                zc_value[MAXPATHLEN];
99           char                zc_string[MAXNAMELEN];
100           uint64_t  zc_guid;
101           uint64_t  zc_nvlist_conf;               /* really (char *) */
102           uint64_t  zc_nvlist_conf_size;
103           uint64_t  zc_nvlist_src;                /* really (char *) */
104           uint64_t  zc_nvlist_src_size;
105           uint64_t  zc_nvlist_dst;                /* really (char *) */
106           uint64_t  zc_nvlist_dst_size;
107           uint64_t  zc_cookie;
108           uint64_t  zc_objset_type;
109           uint64_t  zc_perm_action;
110           uint64_t  zc_history;                   /* really (char *) */
111           uint64_t  zc_history_len;
112           uint64_t  zc_history_offset;
113           uint64_t  zc_obj;
114           zfs_share_t         zc_share;
115           uint64_t  zc_jailid;
116           dmu_objset_stats_t zc_objset_stats;
117           struct drr_begin zc_begin_record;
118           zinject_record_v15_t zc_inject_record;
119 } zfs_cmd_v15_t;
120 
121 typedef struct zinject_record_v28 {
122           uint64_t  zi_objset;
123           uint64_t  zi_object;
124           uint64_t  zi_start;
125           uint64_t  zi_end;
126           uint64_t  zi_guid;
127           uint32_t  zi_level;
128           uint32_t  zi_error;
129           uint64_t  zi_type;
130           uint32_t  zi_freq;
131           uint32_t  zi_failfast;
132           char                zi_func[MAXNAMELEN];
133           uint32_t  zi_iotype;
134           int32_t             zi_duration;
135           uint64_t  zi_timer;
136 } zinject_record_v28_t;
137 
138 typedef struct zfs_cmd_v28 {
139           char                zc_name[MAXPATHLEN];
140           char                zc_value[MAXPATHLEN * 2];
141           char                zc_string[MAXNAMELEN];
142           char                zc_top_ds[MAXPATHLEN];
143           uint64_t  zc_guid;
144           uint64_t  zc_nvlist_conf;               /* really (char *) */
145           uint64_t  zc_nvlist_conf_size;
146           uint64_t  zc_nvlist_src;                /* really (char *) */
147           uint64_t  zc_nvlist_src_size;
148           uint64_t  zc_nvlist_dst;                /* really (char *) */
149           uint64_t  zc_nvlist_dst_size;
150           uint64_t  zc_cookie;
151           uint64_t  zc_objset_type;
152           uint64_t  zc_perm_action;
153           uint64_t  zc_history;                   /* really (char *) */
154           uint64_t  zc_history_len;
155           uint64_t  zc_history_offset;
156           uint64_t  zc_obj;
157           uint64_t  zc_iflags;                    /* internal to zfs(7fs) */
158           zfs_share_t         zc_share;
159           uint64_t  zc_jailid;
160           dmu_objset_stats_t zc_objset_stats;
161           struct drr_begin zc_begin_record;
162           zinject_record_v28_t zc_inject_record;
163           boolean_t zc_defer_destroy;
164           boolean_t zc_temphold;
165           uint64_t  zc_action_handle;
166           int                 zc_cleanup_fd;
167           uint8_t             zc_simple;
168           uint8_t             zc_pad[3];                    /* alignment */
169           uint64_t  zc_sendobj;
170           uint64_t  zc_fromobj;
171           uint64_t  zc_createtxg;
172           zfs_stat_t          zc_stat;
173 } zfs_cmd_v28_t;
174 
175 typedef struct zinject_record_deadman {
176           uint64_t  zi_objset;
177           uint64_t  zi_object;
178           uint64_t  zi_start;
179           uint64_t  zi_end;
180           uint64_t  zi_guid;
181           uint32_t  zi_level;
182           uint32_t  zi_error;
183           uint64_t  zi_type;
184           uint32_t  zi_freq;
185           uint32_t  zi_failfast;
186           char                zi_func[MAXNAMELEN];
187           uint32_t  zi_iotype;
188           int32_t             zi_duration;
189           uint64_t  zi_timer;
190           uint32_t  zi_cmd;
191           uint32_t  zi_pad;
192 } zinject_record_deadman_t;
193 
194 typedef struct zfs_cmd_deadman {
195           char                zc_name[MAXPATHLEN];
196           char                zc_value[MAXPATHLEN * 2];
197           char                zc_string[MAXNAMELEN];
198           char                zc_top_ds[MAXPATHLEN];
199           uint64_t  zc_guid;
200           uint64_t  zc_nvlist_conf;               /* really (char *) */
201           uint64_t  zc_nvlist_conf_size;
202           uint64_t  zc_nvlist_src;                /* really (char *) */
203           uint64_t  zc_nvlist_src_size;
204           uint64_t  zc_nvlist_dst;                /* really (char *) */
205           uint64_t  zc_nvlist_dst_size;
206           uint64_t  zc_cookie;
207           uint64_t  zc_objset_type;
208           uint64_t  zc_perm_action;
209           uint64_t  zc_history;                   /* really (char *) */
210           uint64_t  zc_history_len;
211           uint64_t  zc_history_offset;
212           uint64_t  zc_obj;
213           uint64_t  zc_iflags;                    /* internal to zfs(7fs) */
214           zfs_share_t         zc_share;
215           uint64_t  zc_jailid;
216           dmu_objset_stats_t zc_objset_stats;
217           struct drr_begin zc_begin_record;
218           /* zc_inject_record doesn't change in libzfs_core */
219           zinject_record_deadman_t zc_inject_record;
220           boolean_t zc_defer_destroy;
221           boolean_t zc_temphold;
222           uint64_t  zc_action_handle;
223           int                 zc_cleanup_fd;
224           uint8_t             zc_simple;
225           uint8_t             zc_pad[3];                    /* alignment */
226           uint64_t  zc_sendobj;
227           uint64_t  zc_fromobj;
228           uint64_t  zc_createtxg;
229           zfs_stat_t          zc_stat;
230 } zfs_cmd_deadman_t;
231 
232 typedef struct zfs_cmd_zcmd {
233           char                zc_name[MAXPATHLEN];          /* name of pool or dataset */
234           uint64_t  zc_nvlist_src;                /* really (char *) */
235           uint64_t  zc_nvlist_src_size;
236           uint64_t  zc_nvlist_dst;                /* really (char *) */
237           uint64_t  zc_nvlist_dst_size;
238           boolean_t zc_nvlist_dst_filled;         /* put an nvlist in dst? */
239           int                 zc_pad2;
240 
241           /*
242            * The following members are for legacy ioctls which haven't been
243            * converted to the new method.
244            */
245           uint64_t  zc_history;                   /* really (char *) */
246           char                zc_value[MAXPATHLEN * 2];
247           char                zc_string[MAXNAMELEN];
248           uint64_t  zc_guid;
249           uint64_t  zc_nvlist_conf;               /* really (char *) */
250           uint64_t  zc_nvlist_conf_size;
251           uint64_t  zc_cookie;
252           uint64_t  zc_objset_type;
253           uint64_t  zc_perm_action;
254           uint64_t  zc_history_len;
255           uint64_t  zc_history_offset;
256           uint64_t  zc_obj;
257           uint64_t  zc_iflags;                    /* internal to zfs(7fs) */
258           zfs_share_t         zc_share;
259           uint64_t  zc_jailid;
260           dmu_objset_stats_t zc_objset_stats;
261           struct drr_begin zc_begin_record;
262           zinject_record_deadman_t zc_inject_record;
263           boolean_t zc_defer_destroy;
264           boolean_t zc_temphold;
265           uint64_t  zc_action_handle;
266           int                 zc_cleanup_fd;
267           uint8_t             zc_simple;
268           uint8_t             zc_pad[3];                    /* alignment */
269           uint64_t  zc_sendobj;
270           uint64_t  zc_fromobj;
271           uint64_t  zc_createtxg;
272           zfs_stat_t          zc_stat;
273 } zfs_cmd_zcmd_t;
274 
275 typedef struct zfs_cmd_edbp {
276           char                zc_name[MAXPATHLEN];          /* name of pool or dataset */
277           uint64_t  zc_nvlist_src;                /* really (char *) */
278           uint64_t  zc_nvlist_src_size;
279           uint64_t  zc_nvlist_dst;                /* really (char *) */
280           uint64_t  zc_nvlist_dst_size;
281           boolean_t zc_nvlist_dst_filled;         /* put an nvlist in dst? */
282           int                 zc_pad2;
283 
284           /*
285            * The following members are for legacy ioctls which haven't been
286            * converted to the new method.
287            */
288           uint64_t  zc_history;                   /* really (char *) */
289           char                zc_value[MAXPATHLEN * 2];
290           char                zc_string[MAXNAMELEN];
291           uint64_t  zc_guid;
292           uint64_t  zc_nvlist_conf;               /* really (char *) */
293           uint64_t  zc_nvlist_conf_size;
294           uint64_t  zc_cookie;
295           uint64_t  zc_objset_type;
296           uint64_t  zc_perm_action;
297           uint64_t  zc_history_len;
298           uint64_t  zc_history_offset;
299           uint64_t  zc_obj;
300           uint64_t  zc_iflags;                    /* internal to zfs(7fs) */
301           zfs_share_t         zc_share;
302           uint64_t  zc_jailid;
303           dmu_objset_stats_t zc_objset_stats;
304           struct drr_begin zc_begin_record;
305           zinject_record_deadman_t zc_inject_record;
306           uint32_t  zc_defer_destroy;
307           uint32_t  zc_flags;
308           uint64_t  zc_action_handle;
309           int                 zc_cleanup_fd;
310           uint8_t             zc_simple;
311           uint8_t             zc_pad[3];                    /* alignment */
312           uint64_t  zc_sendobj;
313           uint64_t  zc_fromobj;
314           uint64_t  zc_createtxg;
315           zfs_stat_t          zc_stat;
316 } zfs_cmd_edbp_t;
317 
318 typedef struct zfs_cmd_resume {
319           char                zc_name[MAXPATHLEN];          /* name of pool or dataset */
320           uint64_t  zc_nvlist_src;                /* really (char *) */
321           uint64_t  zc_nvlist_src_size;
322           uint64_t  zc_nvlist_dst;                /* really (char *) */
323           uint64_t  zc_nvlist_dst_size;
324           boolean_t zc_nvlist_dst_filled;         /* put an nvlist in dst? */
325           int                 zc_pad2;
326 
327           /*
328            * The following members are for legacy ioctls which haven't been
329            * converted to the new method.
330            */
331           uint64_t  zc_history;                   /* really (char *) */
332           char                zc_value[MAXPATHLEN * 2];
333           char                zc_string[MAXNAMELEN];
334           uint64_t  zc_guid;
335           uint64_t  zc_nvlist_conf;               /* really (char *) */
336           uint64_t  zc_nvlist_conf_size;
337           uint64_t  zc_cookie;
338           uint64_t  zc_objset_type;
339           uint64_t  zc_perm_action;
340           uint64_t  zc_history_len;
341           uint64_t  zc_history_offset;
342           uint64_t  zc_obj;
343           uint64_t  zc_iflags;                    /* internal to zfs(7fs) */
344           zfs_share_t         zc_share;
345           uint64_t  zc_jailid;
346           dmu_objset_stats_t zc_objset_stats;
347           dmu_replay_record_t zc_begin_record;
348           zinject_record_deadman_t zc_inject_record;
349           uint32_t  zc_defer_destroy;
350           uint32_t  zc_flags;
351           uint64_t  zc_action_handle;
352           int                 zc_cleanup_fd;
353           uint8_t             zc_simple;
354           boolean_t zc_resumable;
355           uint64_t  zc_sendobj;
356           uint64_t  zc_fromobj;
357           uint64_t  zc_createtxg;
358           zfs_stat_t          zc_stat;
359 } zfs_cmd_resume_t;
360 
361 typedef struct zfs_cmd_inlanes {
362           char                zc_name[MAXPATHLEN];          /* name of pool or dataset */
363           uint64_t  zc_nvlist_src;                /* really (char *) */
364           uint64_t  zc_nvlist_src_size;
365           uint64_t  zc_nvlist_dst;                /* really (char *) */
366           uint64_t  zc_nvlist_dst_size;
367           boolean_t zc_nvlist_dst_filled;         /* put an nvlist in dst? */
368           int                 zc_pad2;
369 
370           /*
371            * The following members are for legacy ioctls which haven't been
372            * converted to the new method.
373            */
374           uint64_t  zc_history;                   /* really (char *) */
375           char                zc_value[MAXPATHLEN * 2];
376           char                zc_string[MAXNAMELEN];
377           uint64_t  zc_guid;
378           uint64_t  zc_nvlist_conf;               /* really (char *) */
379           uint64_t  zc_nvlist_conf_size;
380           uint64_t  zc_cookie;
381           uint64_t  zc_objset_type;
382           uint64_t  zc_perm_action;
383           uint64_t  zc_history_len;
384           uint64_t  zc_history_offset;
385           uint64_t  zc_obj;
386           uint64_t  zc_iflags;                    /* internal to zfs(7fs) */
387           zfs_share_t         zc_share;
388           uint64_t  zc_jailid;
389           dmu_objset_stats_t zc_objset_stats;
390           dmu_replay_record_t zc_begin_record;
391           zinject_record_t zc_inject_record;
392           uint32_t  zc_defer_destroy;
393           uint32_t  zc_flags;
394           uint64_t  zc_action_handle;
395           int                 zc_cleanup_fd;
396           uint8_t             zc_simple;
397           boolean_t zc_resumable;
398           uint64_t  zc_sendobj;
399           uint64_t  zc_fromobj;
400           uint64_t  zc_createtxg;
401           zfs_stat_t          zc_stat;
402 } zfs_cmd_inlanes_t;
403 
404 #ifdef _KERNEL
405 static unsigned long zfs_ioctl_v15_to_v28[] = {
406           0,        /*  0 ZFS_IOC_POOL_CREATE */
407           1,        /*  1 ZFS_IOC_POOL_DESTROY */
408           2,        /*  2 ZFS_IOC_POOL_IMPORT */
409           3,        /*  3 ZFS_IOC_POOL_EXPORT */
410           4,        /*  4 ZFS_IOC_POOL_CONFIGS */
411           5,        /*  5 ZFS_IOC_POOL_STATS */
412           6,        /*  6 ZFS_IOC_POOL_TRYIMPORT */
413           7,        /*  7 ZFS_IOC_POOL_SCRUB */
414           8,        /*  8 ZFS_IOC_POOL_FREEZE */
415           9,        /*  9 ZFS_IOC_POOL_UPGRADE */
416           10,       /* 10 ZFS_IOC_POOL_GET_HISTORY */
417           11,       /* 11 ZFS_IOC_VDEV_ADD */
418           12,       /* 12 ZFS_IOC_VDEV_REMOVE */
419           13,       /* 13 ZFS_IOC_VDEV_SET_STATE */
420           14,       /* 14 ZFS_IOC_VDEV_ATTACH */
421           15,       /* 15 ZFS_IOC_VDEV_DETACH */
422           16,       /* 16 ZFS_IOC_VDEV_SETPATH */
423           18,       /* 17 ZFS_IOC_OBJSET_STATS */
424           19,       /* 18 ZFS_IOC_OBJSET_ZPLPROPS */
425           20,       /* 19 ZFS_IOC_DATASET_LIST_NEXT */
426           21,       /* 20 ZFS_IOC_SNAPSHOT_LIST_NEXT */
427           22,       /* 21 ZFS_IOC_SET_PROP */
428           ZFS_IOC_COMPAT_PASS,          /* 22 ZFS_IOC_CREATE_MINOR */
429           ZFS_IOC_COMPAT_PASS,          /* 23 ZFS_IOC_REMOVE_MINOR */
430           23,       /* 24 ZFS_IOC_CREATE */
431           24,       /* 25 ZFS_IOC_DESTROY */
432           25,       /* 26 ZFS_IOC_ROLLBACK */
433           26,       /* 27 ZFS_IOC_RENAME */
434           27,       /* 28 ZFS_IOC_RECV */
435           28,       /* 29 ZFS_IOC_SEND */
436           29,       /* 30 ZFS_IOC_INJECT_FAULT */
437           30,       /* 31 ZFS_IOC_CLEAR_FAULT */
438           31,       /* 32 ZFS_IOC_INJECT_LIST_NEXT */
439           32,       /* 33 ZFS_IOC_ERROR_LOG */
440           33,       /* 34 ZFS_IOC_CLEAR */
441           34,       /* 35 ZFS_IOC_PROMOTE */
442           35,       /* 36 ZFS_IOC_DESTROY_SNAPS */
443           36,       /* 37 ZFS_IOC_SNAPSHOT */
444           37,       /* 38 ZFS_IOC_DSOBJ_TO_DSNAME */
445           38,       /* 39 ZFS_IOC_OBJ_TO_PATH */
446           39,       /* 40 ZFS_IOC_POOL_SET_PROPS */
447           40,       /* 41 ZFS_IOC_POOL_GET_PROPS */
448           41,       /* 42 ZFS_IOC_SET_FSACL */
449           42,       /* 43 ZFS_IOC_GET_FSACL */
450           ZFS_IOC_COMPAT_PASS,          /* 44 ZFS_IOC_ISCSI_PERM_CHECK */
451           43,       /* 45 ZFS_IOC_SHARE */
452           44,       /* 46 ZFS_IOC_IHNERIT_PROP */
453           58,       /* 47 ZFS_IOC_JAIL */
454           59,       /* 48 ZFS_IOC_UNJAIL */
455           45,       /* 49 ZFS_IOC_SMB_ACL */
456           46,       /* 50 ZFS_IOC_USERSPACE_ONE */
457           47,       /* 51 ZFS_IOC_USERSPACE_MANY */
458           48,       /* 52 ZFS_IOC_USERSPACE_UPGRADE */
459           17,       /* 53 ZFS_IOC_SETFRU */
460 };
461 
462 #else     /* KERNEL */
463 static unsigned long zfs_ioctl_v28_to_v15[] = {
464           0,        /*  0 ZFS_IOC_POOL_CREATE */
465           1,        /*  1 ZFS_IOC_POOL_DESTROY */
466           2,        /*  2 ZFS_IOC_POOL_IMPORT */
467           3,        /*  3 ZFS_IOC_POOL_EXPORT */
468           4,        /*  4 ZFS_IOC_POOL_CONFIGS */
469           5,        /*  5 ZFS_IOC_POOL_STATS */
470           6,        /*  6 ZFS_IOC_POOL_TRYIMPORT */
471           7,        /*  7 ZFS_IOC_POOL_SCAN */
472           8,        /*  8 ZFS_IOC_POOL_FREEZE */
473           9,        /*  9 ZFS_IOC_POOL_UPGRADE */
474           10,       /* 10 ZFS_IOC_POOL_GET_HISTORY */
475           11,       /* 11 ZFS_IOC_VDEV_ADD */
476           12,       /* 12 ZFS_IOC_VDEV_REMOVE */
477           13,       /* 13 ZFS_IOC_VDEV_SET_STATE */
478           14,       /* 14 ZFS_IOC_VDEV_ATTACH */
479           15,       /* 15 ZFS_IOC_VDEV_DETACH */
480           16,       /* 16 ZFS_IOC_VDEV_SETPATH */
481           53,       /* 17 ZFS_IOC_VDEV_SETFRU */
482           17,       /* 18 ZFS_IOC_OBJSET_STATS */
483           18,       /* 19 ZFS_IOC_OBJSET_ZPLPROPS */
484           19,       /* 20 ZFS_IOC_DATASET_LIST_NEXT */
485           20,       /* 21 ZFS_IOC_SNAPSHOT_LIST_NEXT */
486           21,       /* 22 ZFS_IOC_SET_PROP */
487           24,       /* 23 ZFS_IOC_CREATE */
488           25,       /* 24 ZFS_IOC_DESTROY */
489           26,       /* 25 ZFS_IOC_ROLLBACK */
490           27,       /* 26 ZFS_IOC_RENAME */
491           28,       /* 27 ZFS_IOC_RECV */
492           29,       /* 28 ZFS_IOC_SEND */
493           30,       /* 39 ZFS_IOC_INJECT_FAULT */
494           31,       /* 30 ZFS_IOC_CLEAR_FAULT */
495           32,       /* 31 ZFS_IOC_INJECT_LIST_NEXT */
496           33,       /* 32 ZFS_IOC_ERROR_LOG */
497           34,       /* 33 ZFS_IOC_CLEAR */
498           35,       /* 34 ZFS_IOC_PROMOTE */
499           36,       /* 35 ZFS_IOC_DESTROY_SNAPS */
500           37,       /* 36 ZFS_IOC_SNAPSHOT */
501           38,       /* 37 ZFS_IOC_DSOBJ_TO_DSNAME */
502           39,       /* 38 ZFS_IOC_OBJ_TO_PATH */
503           40,       /* 39 ZFS_IOC_POOL_SET_PROPS */
504           41,       /* 40 ZFS_IOC_POOL_GET_PROPS */
505           42,       /* 41 ZFS_IOC_SET_FSACL */
506           43,       /* 42 ZFS_IOC_GET_FSACL */
507           45,       /* 43 ZFS_IOC_SHARE */
508           46,       /* 44 ZFS_IOC_IHNERIT_PROP */
509           49,       /* 45 ZFS_IOC_SMB_ACL */
510           50,       /* 46 ZFS_IOC_USERSPACE_ONE */
511           51,       /* 47 ZFS_IOC_USERSPACE_MANY */
512           52,       /* 48 ZFS_IOC_USERSPACE_UPGRADE */
513           ZFS_IOC_COMPAT_FAIL,          /* 49 ZFS_IOC_HOLD */
514           ZFS_IOC_COMPAT_FAIL,          /* 50 ZFS_IOC_RELEASE */
515           ZFS_IOC_COMPAT_FAIL,          /* 51 ZFS_IOC_GET_HOLDS */
516           ZFS_IOC_COMPAT_FAIL,          /* 52 ZFS_IOC_OBJSET_RECVD_PROPS */
517           ZFS_IOC_COMPAT_FAIL,          /* 53 ZFS_IOC_VDEV_SPLIT */
518           ZFS_IOC_COMPAT_FAIL,          /* 54 ZFS_IOC_NEXT_OBJ */
519           ZFS_IOC_COMPAT_FAIL,          /* 55 ZFS_IOC_DIFF */
520           ZFS_IOC_COMPAT_FAIL,          /* 56 ZFS_IOC_TMP_SNAPSHOT */
521           ZFS_IOC_COMPAT_FAIL,          /* 57 ZFS_IOC_OBJ_TO_STATS */
522           47,       /* 58 ZFS_IOC_JAIL */
523           48,       /* 59 ZFS_IOC_UNJAIL */
524 };
525 #endif    /* ! _KERNEL */
526 
527 #ifdef _KERNEL
528 int zfs_ioctl_compat_pre(zfs_cmd_t *, int *, const int);
529 void zfs_ioctl_compat_post(zfs_cmd_t *, const int, const int);
530 nvlist_t *zfs_ioctl_compat_innvl(zfs_cmd_t *, nvlist_t *, const int,
531     const int);
532 nvlist_t *zfs_ioctl_compat_outnvl(zfs_cmd_t *, nvlist_t *, const int,
533     const int);
534 #else
535 int zcmd_ioctl_compat(int, int, zfs_cmd_t *, const int);
536 #endif    /* _KERNEL */
537 void zfs_cmd_compat_get(zfs_cmd_t *, caddr_t, const int);
538 void zfs_cmd_compat_put(zfs_cmd_t *, caddr_t, const int, const int);
539 
540 #ifdef    __cplusplus
541 }
542 #endif
543 
544 #endif    /* _SYS_ZFS_IOCTL_COMPAT_H */
545