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 https://opensource.org/licenses/CDDL-1.0.
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 /*
41  * Legacy ioctl support allows compatibility with pre-OpenZFS tools on
42  * FreeBSD.  The need for it will eventually pass (perhaps after FreeBSD
43  * 12 is well out of support), at which point this code can be removed.
44  * For now, downstream consumers may choose to disable this code by
45  * removing the following define.
46  */
47 #define	ZFS_LEGACY_SUPPORT
48 
49 #ifdef	__cplusplus
50 extern "C" {
51 #endif
52 
53 /*
54  * Backwards ioctl compatibility
55  */
56 
57 /* ioctl versions for vfs.zfs.version.ioctl */
58 #define	ZFS_IOCVER_UNDEF	-1
59 #define	ZFS_IOCVER_NONE		0
60 #define	ZFS_IOCVER_DEADMAN	1
61 #define	ZFS_IOCVER_LZC		2
62 #define	ZFS_IOCVER_ZCMD		3
63 #define	ZFS_IOCVER_EDBP		4
64 #define	ZFS_IOCVER_RESUME	5
65 #define	ZFS_IOCVER_INLANES	6
66 #define	ZFS_IOCVER_PAD		7
67 #define	ZFS_IOCVER_LEGACY	ZFS_IOCVER_PAD
68 #define	ZFS_IOCVER_OZFS		15
69 
70 /* compatibility conversion flag */
71 #define	ZFS_CMD_COMPAT_NONE	0
72 #define	ZFS_CMD_COMPAT_V15	1
73 #define	ZFS_CMD_COMPAT_V28	2
74 #define	ZFS_CMD_COMPAT_DEADMAN	3
75 #define	ZFS_CMD_COMPAT_LZC	4
76 #define	ZFS_CMD_COMPAT_ZCMD	5
77 #define	ZFS_CMD_COMPAT_EDBP	6
78 #define	ZFS_CMD_COMPAT_RESUME	7
79 #define	ZFS_CMD_COMPAT_INLANES	8
80 #define	ZFS_CMD_COMPAT_LEGACY	9
81 
82 #define	ZFS_IOC_COMPAT_PASS	254
83 #define	ZFS_IOC_COMPAT_FAIL	255
84 
85 #define	ZFS_IOCREQ(ioreq)	((ioreq) & 0xff)
86 
87 typedef struct zfs_iocparm {
88 	uint32_t	zfs_ioctl_version;
89 	uint64_t	zfs_cmd;
90 	uint64_t	zfs_cmd_size;
91 } zfs_iocparm_t;
92 
93 
94 #ifdef ZFS_LEGACY_SUPPORT
95 #define	LEGACY_MAXPATHLEN 1024
96 #define	LEGACY_MAXNAMELEN 256
97 
98 /*
99  * Note: this struct must have the same layout in 32-bit and 64-bit, so
100  * that 32-bit processes (like /sbin/zfs) can pass it to the 64-bit
101  * kernel.  Therefore, we add padding to it so that no "hidden" padding
102  * is automatically added on 64-bit (but not on 32-bit).
103  */
104 typedef struct zfs_cmd_legacy {
105 	char		zc_name[LEGACY_MAXPATHLEN];	/* pool|dataset name */
106 	uint64_t	zc_nvlist_src;		/* really (char *) */
107 	uint64_t	zc_nvlist_src_size;
108 	uint64_t	zc_nvlist_dst;		/* really (char *) */
109 	uint64_t	zc_nvlist_dst_size;
110 	boolean_t	zc_nvlist_dst_filled;	/* put an nvlist in dst? */
111 	int		zc_pad2;
112 
113 	/*
114 	 * The following members are for legacy ioctls which haven't been
115 	 * converted to the new method.
116 	 */
117 	uint64_t	zc_history;		/* really (char *) */
118 	char		zc_value[LEGACY_MAXPATHLEN * 2];
119 	char		zc_string[LEGACY_MAXNAMELEN];
120 	uint64_t	zc_guid;
121 	uint64_t	zc_nvlist_conf;		/* really (char *) */
122 	uint64_t	zc_nvlist_conf_size;
123 	uint64_t	zc_cookie;
124 	uint64_t	zc_objset_type;
125 	uint64_t	zc_perm_action;
126 	uint64_t	zc_history_len;
127 	uint64_t	zc_history_offset;
128 	uint64_t	zc_obj;
129 	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
130 	zfs_share_t	zc_share;
131 	uint64_t	zc_jailid;
132 	dmu_objset_stats_t zc_objset_stats;
133 	dmu_replay_record_t zc_begin_record;
134 	zinject_record_t zc_inject_record;
135 	uint32_t	zc_defer_destroy;
136 	uint32_t	zc_flags;
137 	uint64_t	zc_action_handle;
138 	int		zc_cleanup_fd;
139 	uint8_t		zc_simple;
140 	uint8_t		zc_pad3[3];
141 	boolean_t	zc_resumable;
142 	uint32_t	zc_pad4;
143 	uint64_t	zc_sendobj;
144 	uint64_t	zc_fromobj;
145 	uint64_t	zc_createtxg;
146 	zfs_stat_t	zc_stat;
147 } zfs_cmd_legacy_t;
148 #endif
149 
150 
151 #ifdef _KERNEL
152 int zfs_ioctl_compat_pre(zfs_cmd_t *, int *, const int);
153 void zfs_ioctl_compat_post(zfs_cmd_t *, const int, const int);
154 nvlist_t *zfs_ioctl_compat_innvl(zfs_cmd_t *, nvlist_t *, const int,
155     const int);
156 nvlist_t *zfs_ioctl_compat_outnvl(zfs_cmd_t *, nvlist_t *, const int,
157     const int);
158 #endif	/* _KERNEL */
159 #ifdef ZFS_LEGACY_SUPPORT
160 int zfs_ioctl_legacy_to_ozfs(int request);
161 int zfs_ioctl_ozfs_to_legacy(int request);
162 void zfs_cmd_legacy_to_ozfs(zfs_cmd_legacy_t *src, zfs_cmd_t *dst);
163 void zfs_cmd_ozfs_to_legacy(zfs_cmd_t *src, zfs_cmd_legacy_t *dst);
164 #endif
165 
166 void zfs_cmd_compat_put(zfs_cmd_t *, caddr_t, const int, const int);
167 
168 #ifdef	__cplusplus
169 }
170 #endif
171 
172 #endif	/* _SYS_ZFS_IOCTL_COMPAT_H */
173