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
41 extern "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_INLANES	6
57 #define	ZFS_IOCVER_PAD		7
58 #define	ZFS_IOCVER_LEGACY	ZFS_IOCVER_PAD
59 #define	ZFS_IOCVER_OZFS		15
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 #define	ZFS_CMD_COMPAT_LEGACY	9
72 
73 #define	ZFS_IOC_COMPAT_PASS	254
74 #define	ZFS_IOC_COMPAT_FAIL	255
75 
76 #define	ZFS_IOCREQ(ioreq)	((ioreq) & 0xff)
77 
78 typedef struct zfs_iocparm {
79 	uint32_t	zfs_ioctl_version;
80 	uint64_t	zfs_cmd;
81 	uint64_t	zfs_cmd_size;
82 } zfs_iocparm_t;
83 
84 
85 #define	LEGACY_MAXPATHLEN 1024
86 #define	LEGACY_MAXNAMELEN 256
87 
88 /*
89  * Note: this struct must have the same layout in 32-bit and 64-bit, so
90  * that 32-bit processes (like /sbin/zfs) can pass it to the 64-bit
91  * kernel.  Therefore, we add padding to it so that no "hidden" padding
92  * is automatically added on 64-bit (but not on 32-bit).
93  */
94 typedef struct zfs_cmd_legacy {
95 	char		zc_name[LEGACY_MAXPATHLEN];	/* pool|dataset name */
96 	uint64_t	zc_nvlist_src;		/* really (char *) */
97 	uint64_t	zc_nvlist_src_size;
98 	uint64_t	zc_nvlist_dst;		/* really (char *) */
99 	uint64_t	zc_nvlist_dst_size;
100 	boolean_t	zc_nvlist_dst_filled;	/* put an nvlist in dst? */
101 	int		zc_pad2;
102 
103 	/*
104 	 * The following members are for legacy ioctls which haven't been
105 	 * converted to the new method.
106 	 */
107 	uint64_t	zc_history;		/* really (char *) */
108 	char		zc_value[LEGACY_MAXPATHLEN * 2];
109 	char		zc_string[LEGACY_MAXNAMELEN];
110 	uint64_t	zc_guid;
111 	uint64_t	zc_nvlist_conf;		/* really (char *) */
112 	uint64_t	zc_nvlist_conf_size;
113 	uint64_t	zc_cookie;
114 	uint64_t	zc_objset_type;
115 	uint64_t	zc_perm_action;
116 	uint64_t	zc_history_len;
117 	uint64_t	zc_history_offset;
118 	uint64_t	zc_obj;
119 	uint64_t	zc_iflags;		/* internal to zfs(7fs) */
120 	zfs_share_t	zc_share;
121 	uint64_t	zc_jailid;
122 	dmu_objset_stats_t zc_objset_stats;
123 	dmu_replay_record_t zc_begin_record;
124 	zinject_record_t zc_inject_record;
125 	uint32_t	zc_defer_destroy;
126 	uint32_t	zc_flags;
127 	uint64_t	zc_action_handle;
128 	int		zc_cleanup_fd;
129 	uint8_t		zc_simple;
130 	uint8_t		zc_pad3[3];
131 	boolean_t	zc_resumable;
132 	uint32_t	zc_pad4;
133 	uint64_t	zc_sendobj;
134 	uint64_t	zc_fromobj;
135 	uint64_t	zc_createtxg;
136 	zfs_stat_t	zc_stat;
137 } zfs_cmd_legacy_t;
138 
139 
140 #ifdef _KERNEL
141 int zfs_ioctl_compat_pre(zfs_cmd_t *, int *, const int);
142 void zfs_ioctl_compat_post(zfs_cmd_t *, const int, const int);
143 nvlist_t *zfs_ioctl_compat_innvl(zfs_cmd_t *, nvlist_t *, const int,
144     const int);
145 nvlist_t *zfs_ioctl_compat_outnvl(zfs_cmd_t *, nvlist_t *, const int,
146     const int);
147 #endif	/* _KERNEL */
148 int zfs_ioctl_legacy_to_ozfs(int request);
149 int zfs_ioctl_ozfs_to_legacy(int request);
150 void zfs_cmd_legacy_to_ozfs(zfs_cmd_legacy_t *src, zfs_cmd_t *dst);
151 void zfs_cmd_ozfs_to_legacy(zfs_cmd_t *src, zfs_cmd_legacy_t *dst);
152 
153 void zfs_cmd_compat_put(zfs_cmd_t *, caddr_t, const int, const int);
154 
155 #ifdef	__cplusplus
156 }
157 #endif
158 
159 #endif	/* _SYS_ZFS_IOCTL_COMPAT_H */
160