1 /*
2  * Copyright (c) 2020 iXsystems, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  */
27 
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD$");
30 
31 #include <sys/types.h>
32 #include <sys/param.h>
33 #include <sys/conf.h>
34 #include <sys/kernel.h>
35 #include <sys/lock.h>
36 #include <sys/malloc.h>
37 #include <sys/mutex.h>
38 #include <sys/errno.h>
39 #include <sys/cmn_err.h>
40 #include <sys/zfs_ioctl_compat.h>
41 
42 #ifdef ZFS_LEGACY_SUPPORT
43 enum zfs_ioc_legacy {
44 	ZFS_IOC_LEGACY_NONE =	-1,
45 	ZFS_IOC_LEGACY_FIRST =	0,
46 	ZFS_LEGACY_IOC = ZFS_IOC_LEGACY_FIRST,
47 	ZFS_IOC_LEGACY_POOL_CREATE = ZFS_IOC_LEGACY_FIRST,
48 	ZFS_IOC_LEGACY_POOL_DESTROY,
49 	ZFS_IOC_LEGACY_POOL_IMPORT,
50 	ZFS_IOC_LEGACY_POOL_EXPORT,
51 	ZFS_IOC_LEGACY_POOL_CONFIGS,
52 	ZFS_IOC_LEGACY_POOL_STATS,
53 	ZFS_IOC_LEGACY_POOL_TRYIMPORT,
54 	ZFS_IOC_LEGACY_POOL_SCAN,
55 	ZFS_IOC_LEGACY_POOL_FREEZE,
56 	ZFS_IOC_LEGACY_POOL_UPGRADE,
57 	ZFS_IOC_LEGACY_POOL_GET_HISTORY,
58 	ZFS_IOC_LEGACY_VDEV_ADD,
59 	ZFS_IOC_LEGACY_VDEV_REMOVE,
60 	ZFS_IOC_LEGACY_VDEV_SET_STATE,
61 	ZFS_IOC_LEGACY_VDEV_ATTACH,
62 	ZFS_IOC_LEGACY_VDEV_DETACH,
63 	ZFS_IOC_LEGACY_VDEV_SETPATH,
64 	ZFS_IOC_LEGACY_VDEV_SETFRU,
65 	ZFS_IOC_LEGACY_OBJSET_STATS,
66 	ZFS_IOC_LEGACY_OBJSET_ZPLPROPS,
67 	ZFS_IOC_LEGACY_DATASET_LIST_NEXT,
68 	ZFS_IOC_LEGACY_SNAPSHOT_LIST_NEXT,
69 	ZFS_IOC_LEGACY_SET_PROP,
70 	ZFS_IOC_LEGACY_CREATE,
71 	ZFS_IOC_LEGACY_DESTROY,
72 	ZFS_IOC_LEGACY_ROLLBACK,
73 	ZFS_IOC_LEGACY_RENAME,
74 	ZFS_IOC_LEGACY_RECV,
75 	ZFS_IOC_LEGACY_SEND,
76 	ZFS_IOC_LEGACY_INJECT_FAULT,
77 	ZFS_IOC_LEGACY_CLEAR_FAULT,
78 	ZFS_IOC_LEGACY_INJECT_LIST_NEXT,
79 	ZFS_IOC_LEGACY_ERROR_LOG,
80 	ZFS_IOC_LEGACY_CLEAR,
81 	ZFS_IOC_LEGACY_PROMOTE,
82 	ZFS_IOC_LEGACY_DESTROY_SNAPS,
83 	ZFS_IOC_LEGACY_SNAPSHOT,
84 	ZFS_IOC_LEGACY_DSOBJ_TO_DSNAME,
85 	ZFS_IOC_LEGACY_OBJ_TO_PATH,
86 	ZFS_IOC_LEGACY_POOL_SET_PROPS,
87 	ZFS_IOC_LEGACY_POOL_GET_PROPS,
88 	ZFS_IOC_LEGACY_SET_FSACL,
89 	ZFS_IOC_LEGACY_GET_FSACL,
90 	ZFS_IOC_LEGACY_SHARE,
91 	ZFS_IOC_LEGACY_INHERIT_PROP,
92 	ZFS_IOC_LEGACY_SMB_ACL,
93 	ZFS_IOC_LEGACY_USERSPACE_ONE,
94 	ZFS_IOC_LEGACY_USERSPACE_MANY,
95 	ZFS_IOC_LEGACY_USERSPACE_UPGRADE,
96 	ZFS_IOC_LEGACY_HOLD,
97 	ZFS_IOC_LEGACY_RELEASE,
98 	ZFS_IOC_LEGACY_GET_HOLDS,
99 	ZFS_IOC_LEGACY_OBJSET_RECVD_PROPS,
100 	ZFS_IOC_LEGACY_VDEV_SPLIT,
101 	ZFS_IOC_LEGACY_NEXT_OBJ,
102 	ZFS_IOC_LEGACY_DIFF,
103 	ZFS_IOC_LEGACY_TMP_SNAPSHOT,
104 	ZFS_IOC_LEGACY_OBJ_TO_STATS,
105 	ZFS_IOC_LEGACY_JAIL,
106 	ZFS_IOC_LEGACY_UNJAIL,
107 	ZFS_IOC_LEGACY_POOL_REGUID,
108 	ZFS_IOC_LEGACY_SPACE_WRITTEN,
109 	ZFS_IOC_LEGACY_SPACE_SNAPS,
110 	ZFS_IOC_LEGACY_SEND_PROGRESS,
111 	ZFS_IOC_LEGACY_POOL_REOPEN,
112 	ZFS_IOC_LEGACY_LOG_HISTORY,
113 	ZFS_IOC_LEGACY_SEND_NEW,
114 	ZFS_IOC_LEGACY_SEND_SPACE,
115 	ZFS_IOC_LEGACY_CLONE,
116 	ZFS_IOC_LEGACY_BOOKMARK,
117 	ZFS_IOC_LEGACY_GET_BOOKMARKS,
118 	ZFS_IOC_LEGACY_DESTROY_BOOKMARKS,
119 	ZFS_IOC_LEGACY_NEXTBOOT,
120 	ZFS_IOC_LEGACY_CHANNEL_PROGRAM,
121 	ZFS_IOC_LEGACY_REMAP,
122 	ZFS_IOC_LEGACY_POOL_CHECKPOINT,
123 	ZFS_IOC_LEGACY_POOL_DISCARD_CHECKPOINT,
124 	ZFS_IOC_LEGACY_POOL_INITIALIZE,
125 	ZFS_IOC_LEGACY_POOL_SYNC,
126 	ZFS_IOC_LEGACY_LAST
127 };
128 
129 static unsigned long zfs_ioctl_legacy_to_ozfs_[] = {
130 	ZFS_IOC_POOL_CREATE,			/* 0x00 */
131 	ZFS_IOC_POOL_DESTROY,			/* 0x01 */
132 	ZFS_IOC_POOL_IMPORT,			/* 0x02 */
133 	ZFS_IOC_POOL_EXPORT,			/* 0x03 */
134 	ZFS_IOC_POOL_CONFIGS,			/* 0x04 */
135 	ZFS_IOC_POOL_STATS,			/* 0x05 */
136 	ZFS_IOC_POOL_TRYIMPORT,			/* 0x06 */
137 	ZFS_IOC_POOL_SCAN,			/* 0x07 */
138 	ZFS_IOC_POOL_FREEZE,			/* 0x08 */
139 	ZFS_IOC_POOL_UPGRADE,			/* 0x09 */
140 	ZFS_IOC_POOL_GET_HISTORY,		/* 0x0a */
141 	ZFS_IOC_VDEV_ADD,			/* 0x0b */
142 	ZFS_IOC_VDEV_REMOVE,			/* 0x0c */
143 	ZFS_IOC_VDEV_SET_STATE,			/* 0x0d */
144 	ZFS_IOC_VDEV_ATTACH,			/* 0x0e */
145 	ZFS_IOC_VDEV_DETACH,			/* 0x0f */
146 	ZFS_IOC_VDEV_SETPATH,			/* 0x10 */
147 	ZFS_IOC_VDEV_SETFRU,			/* 0x11 */
148 	ZFS_IOC_OBJSET_STATS,			/* 0x12 */
149 	ZFS_IOC_OBJSET_ZPLPROPS,		/* 0x13 */
150 	ZFS_IOC_DATASET_LIST_NEXT,		/* 0x14 */
151 	ZFS_IOC_SNAPSHOT_LIST_NEXT,		/* 0x15 */
152 	ZFS_IOC_SET_PROP,			/* 0x16 */
153 	ZFS_IOC_CREATE,				/* 0x17 */
154 	ZFS_IOC_DESTROY,			/* 0x18 */
155 	ZFS_IOC_ROLLBACK,			/* 0x19 */
156 	ZFS_IOC_RENAME,				/* 0x1a */
157 	ZFS_IOC_RECV,				/* 0x1b */
158 	ZFS_IOC_SEND,				/* 0x1c */
159 	ZFS_IOC_INJECT_FAULT,			/* 0x1d */
160 	ZFS_IOC_CLEAR_FAULT,			/* 0x1e */
161 	ZFS_IOC_INJECT_LIST_NEXT,		/* 0x1f */
162 	ZFS_IOC_ERROR_LOG,			/* 0x20 */
163 	ZFS_IOC_CLEAR,				/* 0x21 */
164 	ZFS_IOC_PROMOTE,			/* 0x22 */
165 	/* start of mismatch */
166 
167 	ZFS_IOC_DESTROY_SNAPS,			/* 0x23:0x3b */
168 	ZFS_IOC_SNAPSHOT,			/* 0x24:0x23 */
169 	ZFS_IOC_DSOBJ_TO_DSNAME,		/* 0x25:0x24 */
170 	ZFS_IOC_OBJ_TO_PATH,			/* 0x26:0x25 */
171 	ZFS_IOC_POOL_SET_PROPS,			/* 0x27:0x26 */
172 	ZFS_IOC_POOL_GET_PROPS,			/* 0x28:0x27 */
173 	ZFS_IOC_SET_FSACL,			/* 0x29:0x28 */
174 	ZFS_IOC_GET_FSACL,			/* 0x30:0x29 */
175 	ZFS_IOC_SHARE,				/* 0x2b:0x2a */
176 	ZFS_IOC_INHERIT_PROP,			/* 0x2c:0x2b */
177 	ZFS_IOC_SMB_ACL,			/* 0x2d:0x2c */
178 	ZFS_IOC_USERSPACE_ONE,			/* 0x2e:0x2d */
179 	ZFS_IOC_USERSPACE_MANY,			/* 0x2f:0x2e */
180 	ZFS_IOC_USERSPACE_UPGRADE,		/* 0x30:0x2f */
181 	ZFS_IOC_HOLD,				/* 0x31:0x30 */
182 	ZFS_IOC_RELEASE,			/* 0x32:0x31 */
183 	ZFS_IOC_GET_HOLDS,			/* 0x33:0x32 */
184 	ZFS_IOC_OBJSET_RECVD_PROPS,		/* 0x34:0x33 */
185 	ZFS_IOC_VDEV_SPLIT,			/* 0x35:0x34 */
186 	ZFS_IOC_NEXT_OBJ,			/* 0x36:0x35 */
187 	ZFS_IOC_DIFF,				/* 0x37:0x36 */
188 	ZFS_IOC_TMP_SNAPSHOT,			/* 0x38:0x37 */
189 	ZFS_IOC_OBJ_TO_STATS,			/* 0x39:0x38 */
190 	ZFS_IOC_JAIL,			/* 0x3a:0xc2 */
191 	ZFS_IOC_UNJAIL,			/* 0x3b:0xc3 */
192 	ZFS_IOC_POOL_REGUID,			/* 0x3c:0x3c */
193 	ZFS_IOC_SPACE_WRITTEN,			/* 0x3d:0x39 */
194 	ZFS_IOC_SPACE_SNAPS,			/* 0x3e:0x3a */
195 	ZFS_IOC_SEND_PROGRESS,			/* 0x3f:0x3e */
196 	ZFS_IOC_POOL_REOPEN,			/* 0x40:0x3d */
197 	ZFS_IOC_LOG_HISTORY,			/* 0x41:0x3f */
198 	ZFS_IOC_SEND_NEW,			/* 0x42:0x40 */
199 	ZFS_IOC_SEND_SPACE,			/* 0x43:0x41 */
200 	ZFS_IOC_CLONE,				/* 0x44:0x42 */
201 	ZFS_IOC_BOOKMARK,			/* 0x45:0x43 */
202 	ZFS_IOC_GET_BOOKMARKS,			/* 0x46:0x44 */
203 	ZFS_IOC_DESTROY_BOOKMARKS,		/* 0x47:0x45 */
204 	ZFS_IOC_NEXTBOOT,			/* 0x48:0xc1 */
205 	ZFS_IOC_CHANNEL_PROGRAM,		/* 0x49:0x48 */
206 	ZFS_IOC_REMAP,				/* 0x4a:0x4c */
207 	ZFS_IOC_POOL_CHECKPOINT,		/* 0x4b:0x4d */
208 	ZFS_IOC_POOL_DISCARD_CHECKPOINT,	/* 0x4c:0x4e */
209 	ZFS_IOC_POOL_INITIALIZE,		/* 0x4d:0x4f */
210 };
211 
212 static unsigned long zfs_ioctl_ozfs_to_legacy_common_[] = {
213 	ZFS_IOC_POOL_CREATE,			/* 0x00 */
214 	ZFS_IOC_POOL_DESTROY,			/* 0x01 */
215 	ZFS_IOC_POOL_IMPORT,			/* 0x02 */
216 	ZFS_IOC_POOL_EXPORT,			/* 0x03 */
217 	ZFS_IOC_POOL_CONFIGS,			/* 0x04 */
218 	ZFS_IOC_POOL_STATS,			/* 0x05 */
219 	ZFS_IOC_POOL_TRYIMPORT,			/* 0x06 */
220 	ZFS_IOC_POOL_SCAN,			/* 0x07 */
221 	ZFS_IOC_POOL_FREEZE,			/* 0x08 */
222 	ZFS_IOC_POOL_UPGRADE,			/* 0x09 */
223 	ZFS_IOC_POOL_GET_HISTORY,		/* 0x0a */
224 	ZFS_IOC_VDEV_ADD,			/* 0x0b */
225 	ZFS_IOC_VDEV_REMOVE,			/* 0x0c */
226 	ZFS_IOC_VDEV_SET_STATE,			/* 0x0d */
227 	ZFS_IOC_VDEV_ATTACH,			/* 0x0e */
228 	ZFS_IOC_VDEV_DETACH,			/* 0x0f */
229 	ZFS_IOC_VDEV_SETPATH,			/* 0x10 */
230 	ZFS_IOC_VDEV_SETFRU,			/* 0x11 */
231 	ZFS_IOC_OBJSET_STATS,			/* 0x12 */
232 	ZFS_IOC_OBJSET_ZPLPROPS,		/* 0x13 */
233 	ZFS_IOC_DATASET_LIST_NEXT,		/* 0x14 */
234 	ZFS_IOC_SNAPSHOT_LIST_NEXT,		/* 0x15 */
235 	ZFS_IOC_SET_PROP,			/* 0x16 */
236 	ZFS_IOC_CREATE,				/* 0x17 */
237 	ZFS_IOC_DESTROY,			/* 0x18 */
238 	ZFS_IOC_ROLLBACK,			/* 0x19 */
239 	ZFS_IOC_RENAME,				/* 0x1a */
240 	ZFS_IOC_RECV,				/* 0x1b */
241 	ZFS_IOC_SEND,				/* 0x1c */
242 	ZFS_IOC_INJECT_FAULT,			/* 0x1d */
243 	ZFS_IOC_CLEAR_FAULT,			/* 0x1e */
244 	ZFS_IOC_INJECT_LIST_NEXT,		/* 0x1f */
245 	ZFS_IOC_ERROR_LOG,			/* 0x20 */
246 	ZFS_IOC_CLEAR,				/* 0x21 */
247 	ZFS_IOC_PROMOTE,			/* 0x22 */
248 	/* start of mismatch */
249 	ZFS_IOC_LEGACY_SNAPSHOT,		/* 0x23 */
250 	ZFS_IOC_LEGACY_DSOBJ_TO_DSNAME,		/* 0x24 */
251 	ZFS_IOC_LEGACY_OBJ_TO_PATH,		/* 0x25 */
252 	ZFS_IOC_LEGACY_POOL_SET_PROPS,		/* 0x26 */
253 	ZFS_IOC_LEGACY_POOL_GET_PROPS,		/* 0x27 */
254 	ZFS_IOC_LEGACY_SET_FSACL,		/* 0x28 */
255 	ZFS_IOC_LEGACY_GET_FSACL,		/* 0x29 */
256 	ZFS_IOC_LEGACY_SHARE,			/* 0x2a */
257 	ZFS_IOC_LEGACY_INHERIT_PROP,		/* 0x2b */
258 	ZFS_IOC_LEGACY_SMB_ACL,			/* 0x2c */
259 	ZFS_IOC_LEGACY_USERSPACE_ONE,		/* 0x2d */
260 	ZFS_IOC_LEGACY_USERSPACE_MANY,		/* 0x2e */
261 	ZFS_IOC_LEGACY_USERSPACE_UPGRADE,	/* 0x2f */
262 	ZFS_IOC_LEGACY_HOLD,			/* 0x30 */
263 	ZFS_IOC_LEGACY_RELEASE,			/* 0x31 */
264 	ZFS_IOC_LEGACY_GET_HOLDS,		/* 0x32 */
265 	ZFS_IOC_LEGACY_OBJSET_RECVD_PROPS,	/* 0x33 */
266 	ZFS_IOC_LEGACY_VDEV_SPLIT,		/* 0x34 */
267 	ZFS_IOC_LEGACY_NEXT_OBJ,		/* 0x35 */
268 	ZFS_IOC_LEGACY_DIFF,			/* 0x36 */
269 	ZFS_IOC_LEGACY_TMP_SNAPSHOT,		/* 0x37 */
270 	ZFS_IOC_LEGACY_OBJ_TO_STATS,		/* 0x38 */
271 	ZFS_IOC_LEGACY_SPACE_WRITTEN,		/* 0x39 */
272 	ZFS_IOC_LEGACY_SPACE_SNAPS,		/* 0x3a */
273 	ZFS_IOC_LEGACY_DESTROY_SNAPS,		/* 0x3b */
274 	ZFS_IOC_LEGACY_POOL_REGUID,		/* 0x3c */
275 	ZFS_IOC_LEGACY_POOL_REOPEN,		/* 0x3d */
276 	ZFS_IOC_LEGACY_SEND_PROGRESS,		/* 0x3e */
277 	ZFS_IOC_LEGACY_LOG_HISTORY,		/* 0x3f */
278 	ZFS_IOC_LEGACY_SEND_NEW,		/* 0x40 */
279 	ZFS_IOC_LEGACY_SEND_SPACE,		/* 0x41 */
280 	ZFS_IOC_LEGACY_CLONE,			/* 0x42 */
281 	ZFS_IOC_LEGACY_BOOKMARK,		/* 0x43 */
282 	ZFS_IOC_LEGACY_GET_BOOKMARKS,		/* 0x44 */
283 	ZFS_IOC_LEGACY_DESTROY_BOOKMARKS,	/* 0x45 */
284 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_RECV_NEW */
285 	ZFS_IOC_LEGACY_POOL_SYNC,		/* 0x47 */
286 	ZFS_IOC_LEGACY_CHANNEL_PROGRAM,		/* 0x48 */
287 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_LOAD_KEY */
288 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_UNLOAD_KEY */
289 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_CHANGE_KEY */
290 	ZFS_IOC_LEGACY_REMAP,			/* 0x4c */
291 	ZFS_IOC_LEGACY_POOL_CHECKPOINT,		/* 0x4d */
292 	ZFS_IOC_LEGACY_POOL_DISCARD_CHECKPOINT,	/* 0x4e */
293 	ZFS_IOC_LEGACY_POOL_INITIALIZE,		/* 0x4f  */
294 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_POOL_TRIM */
295 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_REDACT */
296 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_GET_BOOKMARK_PROPS */
297 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_WAIT */
298 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_WAIT_FS */
299 };
300 
301 static unsigned long zfs_ioctl_ozfs_to_legacy_platform_[] = {
302 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_EVENTS_NEXT */
303 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_EVENTS_CLEAR */
304 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_EVENTS_SEEK */
305 	ZFS_IOC_LEGACY_NEXTBOOT,
306 	ZFS_IOC_LEGACY_JAIL,
307 	ZFS_IOC_LEGACY_UNJAIL,
308 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_SET_BOOTENV */
309 	ZFS_IOC_LEGACY_NONE, /* ZFS_IOC_GET_BOOTENV */
310 };
311 
312 int
313 zfs_ioctl_legacy_to_ozfs(int request)
314 {
315 	if (request >= sizeof (zfs_ioctl_legacy_to_ozfs_)/sizeof (long))
316 		return (-1);
317 	return (zfs_ioctl_legacy_to_ozfs_[request]);
318 }
319 
320 int
321 zfs_ioctl_ozfs_to_legacy(int request)
322 {
323 	if (request >= ZFS_IOC_LAST)
324 		return (-1);
325 
326 	if (request > ZFS_IOC_PLATFORM) {
327 		request -= ZFS_IOC_PLATFORM + 1;
328 		return (zfs_ioctl_ozfs_to_legacy_platform_[request]);
329 	}
330 	if (request >= sizeof (zfs_ioctl_ozfs_to_legacy_common_)/sizeof (long))
331 		return (-1);
332 	return (zfs_ioctl_ozfs_to_legacy_common_[request]);
333 }
334 
335 void
336 zfs_cmd_legacy_to_ozfs(zfs_cmd_legacy_t *src, zfs_cmd_t *dst)
337 {
338 	memcpy(dst, src, offsetof(zfs_cmd_t, zc_objset_stats));
339 	*&dst->zc_objset_stats = *&src->zc_objset_stats;
340 	memcpy(&dst->zc_begin_record, &src->zc_begin_record,
341 	    offsetof(zfs_cmd_t, zc_sendobj) -
342 	    offsetof(zfs_cmd_t, zc_begin_record));
343 	memcpy(&dst->zc_sendobj, &src->zc_sendobj,
344 	    sizeof (zfs_cmd_t) - 8 - offsetof(zfs_cmd_t, zc_sendobj));
345 	dst->zc_zoneid = src->zc_jailid;
346 }
347 
348 void
349 zfs_cmd_ozfs_to_legacy(zfs_cmd_t *src, zfs_cmd_legacy_t *dst)
350 {
351 	memcpy(dst, src, offsetof(zfs_cmd_t, zc_objset_stats));
352 	*&dst->zc_objset_stats = *&src->zc_objset_stats;
353 	*&dst->zc_begin_record.drr_u.drr_begin = *&src->zc_begin_record;
354 	dst->zc_begin_record.drr_payloadlen = 0;
355 	dst->zc_begin_record.drr_type = 0;
356 
357 	memcpy(&dst->zc_inject_record, &src->zc_inject_record,
358 	    offsetof(zfs_cmd_t, zc_sendobj) -
359 	    offsetof(zfs_cmd_t, zc_inject_record));
360 	dst->zc_resumable = B_FALSE;
361 	memcpy(&dst->zc_sendobj, &src->zc_sendobj,
362 	    sizeof (zfs_cmd_t) - 8 - offsetof(zfs_cmd_t, zc_sendobj));
363 	dst->zc_jailid = src->zc_zoneid;
364 }
365 #endif /* ZFS_LEGACY_SUPPORT */
366