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 (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
23 | * Copyright (c) 2011-2012 Pawel Jakub Dawidek. All rights reserved. |
24 | * Copyright (c) 2012, 2015 by Delphix. All rights reserved. |
25 | * Copyright 2016 RackTop Systems. |
26 | * Copyright (c) 2014 Integros [integros.com] |
27 | */ |
28 | |
29 | #ifndef _SYS_ZFS_IOCTL_H |
30 | #define _SYS_ZFS_IOCTL_H |
31 | |
32 | #include <sys/cred.h> |
33 | #include <sys/dmu.h> |
34 | #include <sys/zio.h> |
35 | #include <sys/dsl_deleg.h> |
36 | #include <sys/spa.h> |
37 | #include <sys/zfs_stat.h> |
38 | |
39 | #ifdef _KERNEL |
40 | #include <sys/nvpair.h> |
41 | #endif /* _KERNEL */ |
42 | |
43 | #ifdef __cplusplus |
44 | extern "C" { |
45 | #endif |
46 | |
47 | /* |
48 | * The structures in this file are passed between userland and the |
49 | * kernel. Userland may be running a 32-bit process, while the kernel |
50 | * is 64-bit. Therefore, these structures need to compile the same in |
51 | * 32-bit and 64-bit. This means not using type "long", and adding |
52 | * explicit padding so that the 32-bit structure will not be packed more |
53 | * tightly than the 64-bit structure (which requires 64-bit alignment). |
54 | */ |
55 | |
56 | /* |
57 | * Property values for snapdir |
58 | */ |
59 | #define ZFS_SNAPDIR_HIDDEN 0 |
60 | #define ZFS_SNAPDIR_VISIBLE 1 |
61 | |
62 | /* |
63 | * Field manipulation macros for the drr_versioninfo field of the |
64 | * send stream header. |
65 | */ |
66 | |
67 | /* |
68 | * Header types for zfs send streams. |
69 | */ |
70 | typedef enum { |
71 | DMU_SUBSTREAM = 0x1, |
72 | DMU_COMPOUNDSTREAM = 0x2 |
73 | } ; |
74 | |
75 | #define DMU_GET_STREAM_HDRTYPE(vi) BF64_GET((vi), 0, 2) |
76 | #define DMU_SET_STREAM_HDRTYPE(vi, x) BF64_SET((vi), 0, 2, x) |
77 | |
78 | #define DMU_GET_FEATUREFLAGS(vi) BF64_GET((vi), 2, 30) |
79 | #define DMU_SET_FEATUREFLAGS(vi, x) BF64_SET((vi), 2, 30, x) |
80 | |
81 | /* |
82 | * Feature flags for zfs send streams (flags in drr_versioninfo) |
83 | */ |
84 | |
85 | #define DMU_BACKUP_FEATURE_DEDUP (1 << 0) |
86 | #define DMU_BACKUP_FEATURE_DEDUPPROPS (1 << 1) |
87 | #define DMU_BACKUP_FEATURE_SA_SPILL (1 << 2) |
88 | /* flags #3 - #15 are reserved for incompatible closed-source implementations */ |
89 | #define DMU_BACKUP_FEATURE_EMBED_DATA (1 << 16) |
90 | #define DMU_BACKUP_FEATURE_EMBED_DATA_LZ4 (1 << 17) |
91 | /* flag #18 is reserved for a Delphix feature */ |
92 | #define DMU_BACKUP_FEATURE_LARGE_BLOCKS (1 << 19) |
93 | #define DMU_BACKUP_FEATURE_RESUMING (1 << 20) |
94 | |
95 | /* |
96 | * Mask of all supported backup features |
97 | */ |
98 | #define DMU_BACKUP_FEATURE_MASK (DMU_BACKUP_FEATURE_DEDUP | \ |
99 | DMU_BACKUP_FEATURE_DEDUPPROPS | DMU_BACKUP_FEATURE_SA_SPILL | \ |
100 | DMU_BACKUP_FEATURE_EMBED_DATA | DMU_BACKUP_FEATURE_EMBED_DATA_LZ4 | \ |
101 | DMU_BACKUP_FEATURE_RESUMING | \ |
102 | DMU_BACKUP_FEATURE_LARGE_BLOCKS) |
103 | |
104 | /* Are all features in the given flag word currently supported? */ |
105 | #define DMU_STREAM_SUPPORTED(x) (!((x) & ~DMU_BACKUP_FEATURE_MASK)) |
106 | |
107 | typedef enum dmu_send_resume_token_version { |
108 | ZFS_SEND_RESUME_TOKEN_VERSION = 1 |
109 | } dmu_send_resume_token_version_t; |
110 | |
111 | /* |
112 | * The drr_versioninfo field of the dmu_replay_record has the |
113 | * following layout: |
114 | * |
115 | * 64 56 48 40 32 24 16 8 0 |
116 | * +-------+-------+-------+-------+-------+-------+-------+-------+ |
117 | * | reserved | feature-flags |C|S| |
118 | * +-------+-------+-------+-------+-------+-------+-------+-------+ |
119 | * |
120 | * The low order two bits indicate the header type: SUBSTREAM (0x1) |
121 | * or COMPOUNDSTREAM (0x2). Using two bits for this is historical: |
122 | * this field used to be a version number, where the two version types |
123 | * were 1 and 2. Using two bits for this allows earlier versions of |
124 | * the code to be able to recognize send streams that don't use any |
125 | * of the features indicated by feature flags. |
126 | */ |
127 | |
128 | #define DMU_BACKUP_MAGIC 0x2F5bacbacULL |
129 | |
130 | /* |
131 | * Send stream flags. Bits 24-31 are reserved for vendor-specific |
132 | * implementations and should not be used. |
133 | */ |
134 | #define DRR_FLAG_CLONE (1<<0) |
135 | #define DRR_FLAG_CI_DATA (1<<1) |
136 | /* |
137 | * This send stream, if it is a full send, includes the FREE and FREEOBJECT |
138 | * records that are created by the sending process. This means that the send |
139 | * stream can be received as a clone, even though it is not an incremental. |
140 | * This is not implemented as a feature flag, because the receiving side does |
141 | * not need to have implemented it to receive this stream; it is fully backwards |
142 | * compatible. We need a flag, though, because full send streams without it |
143 | * cannot necessarily be received as a clone correctly. |
144 | */ |
145 | #define DRR_FLAG_FREERECORDS (1<<2) |
146 | |
147 | /* |
148 | * flags in the drr_checksumflags field in the DRR_WRITE and |
149 | * DRR_WRITE_BYREF blocks |
150 | */ |
151 | #define DRR_CHECKSUM_DEDUP (1<<0) |
152 | |
153 | #define DRR_IS_DEDUP_CAPABLE(flags) ((flags) & DRR_CHECKSUM_DEDUP) |
154 | |
155 | /* |
156 | * zfs ioctl command structure |
157 | */ |
158 | struct drr_begin { |
159 | uint64_t drr_magic; |
160 | uint64_t drr_versioninfo; /* was drr_version */ |
161 | uint64_t drr_creation_time; |
162 | dmu_objset_type_t drr_type; |
163 | uint32_t drr_flags; |
164 | uint64_t drr_toguid; |
165 | uint64_t drr_fromguid; |
166 | char drr_toname[MAXNAMELEN]; |
167 | }; |
168 | |
169 | struct drr_end { |
170 | zio_cksum_t drr_checksum; |
171 | uint64_t drr_toguid; |
172 | }; |
173 | |
174 | struct drr_object { |
175 | uint64_t drr_object; |
176 | dmu_object_type_t drr_type; |
177 | dmu_object_type_t drr_bonustype; |
178 | uint32_t drr_blksz; |
179 | uint32_t drr_bonuslen; |
180 | uint8_t drr_checksumtype; |
181 | uint8_t drr_compress; |
182 | uint8_t drr_pad[6]; |
183 | uint64_t drr_toguid; |
184 | /* bonus content follows */ |
185 | }; |
186 | |
187 | struct drr_freeobjects { |
188 | uint64_t drr_firstobj; |
189 | uint64_t drr_numobjs; |
190 | uint64_t drr_toguid; |
191 | }; |
192 | |
193 | struct drr_write { |
194 | uint64_t drr_object; |
195 | dmu_object_type_t drr_type; |
196 | uint32_t drr_pad; |
197 | uint64_t drr_offset; |
198 | uint64_t drr_length; |
199 | uint64_t drr_toguid; |
200 | uint8_t drr_checksumtype; |
201 | uint8_t drr_checksumflags; |
202 | uint8_t drr_pad2[6]; |
203 | ddt_key_t drr_key; /* deduplication key */ |
204 | /* content follows */ |
205 | }; |
206 | |
207 | struct drr_free { |
208 | uint64_t drr_object; |
209 | uint64_t drr_offset; |
210 | uint64_t drr_length; |
211 | uint64_t drr_toguid; |
212 | }; |
213 | |
214 | struct drr_write_byref { |
215 | /* where to put the data */ |
216 | uint64_t drr_object; |
217 | uint64_t drr_offset; |
218 | uint64_t drr_length; |
219 | uint64_t drr_toguid; |
220 | /* where to find the prior copy of the data */ |
221 | uint64_t drr_refguid; |
222 | uint64_t drr_refobject; |
223 | uint64_t drr_refoffset; |
224 | /* properties of the data */ |
225 | uint8_t drr_checksumtype; |
226 | uint8_t drr_checksumflags; |
227 | uint8_t drr_pad2[6]; |
228 | ddt_key_t drr_key; /* deduplication key */ |
229 | }; |
230 | |
231 | struct drr_spill { |
232 | uint64_t drr_object; |
233 | uint64_t drr_length; |
234 | uint64_t drr_toguid; |
235 | uint64_t drr_pad[4]; /* needed for crypto */ |
236 | /* spill data follows */ |
237 | }; |
238 | |
239 | typedef struct dmu_replay_record { |
240 | enum { |
241 | DRR_BEGIN, DRR_OBJECT, DRR_FREEOBJECTS, |
242 | DRR_WRITE, DRR_FREE, DRR_END, DRR_WRITE_BYREF, |
243 | DRR_SPILL, DRR_WRITE_EMBEDDED, DRR_NUMTYPES |
244 | } drr_type; |
245 | uint32_t drr_payloadlen; |
246 | union { |
247 | struct drr_begin drr_begin; |
248 | struct drr_end drr_end; |
249 | struct drr_object drr_object; |
250 | struct drr_freeobjects drr_freeobjects; |
251 | struct drr_write drr_write; |
252 | struct drr_free drr_free; |
253 | struct drr_write_byref drr_write_byref; |
254 | struct drr_spill drr_spill; |
255 | struct drr_write_embedded { |
256 | uint64_t drr_object; |
257 | uint64_t drr_offset; |
258 | /* logical length, should equal blocksize */ |
259 | uint64_t drr_length; |
260 | uint64_t drr_toguid; |
261 | uint8_t drr_compression; |
262 | uint8_t drr_etype; |
263 | uint8_t drr_pad[6]; |
264 | uint32_t drr_lsize; /* uncompressed size of payload */ |
265 | uint32_t drr_psize; /* compr. (real) size of payload */ |
266 | /* (possibly compressed) content follows */ |
267 | } drr_write_embedded; |
268 | |
269 | /* |
270 | * Nore: drr_checksum is overlaid with all record types |
271 | * except DRR_BEGIN. Therefore its (non-pad) members |
272 | * must not overlap with members from the other structs. |
273 | * We accomplish this by putting its members at the very |
274 | * end of the struct. |
275 | */ |
276 | struct drr_checksum { |
277 | uint64_t drr_pad[34]; |
278 | /* |
279 | * fletcher-4 checksum of everything preceding the |
280 | * checksum. |
281 | */ |
282 | zio_cksum_t drr_checksum; |
283 | } drr_checksum; |
284 | } drr_u; |
285 | } dmu_replay_record_t; |
286 | |
287 | /* diff record range types */ |
288 | typedef enum diff_type { |
289 | DDR_NONE = 0x1, |
290 | DDR_INUSE = 0x2, |
291 | DDR_FREE = 0x4 |
292 | } diff_type_t; |
293 | |
294 | /* |
295 | * The diff reports back ranges of free or in-use objects. |
296 | */ |
297 | typedef struct dmu_diff_record { |
298 | uint64_t ddr_type; |
299 | uint64_t ddr_first; |
300 | uint64_t ddr_last; |
301 | } dmu_diff_record_t; |
302 | |
303 | typedef struct zinject_record { |
304 | uint64_t zi_objset; |
305 | uint64_t zi_object; |
306 | uint64_t zi_start; |
307 | uint64_t zi_end; |
308 | uint64_t zi_guid; |
309 | uint32_t zi_level; |
310 | uint32_t zi_error; |
311 | uint64_t zi_type; |
312 | uint32_t zi_freq; |
313 | uint32_t zi_failfast; |
314 | char zi_func[MAXNAMELEN]; |
315 | uint32_t zi_iotype; |
316 | int32_t zi_duration; |
317 | uint64_t zi_timer; |
318 | uint64_t zi_nlanes; |
319 | uint32_t zi_cmd; |
320 | uint32_t zi_pad; |
321 | } zinject_record_t; |
322 | |
323 | #define ZINJECT_NULL 0x1 |
324 | #define ZINJECT_FLUSH_ARC 0x2 |
325 | #define ZINJECT_UNLOAD_SPA 0x4 |
326 | |
327 | typedef enum zinject_type { |
328 | ZINJECT_UNINITIALIZED, |
329 | ZINJECT_DATA_FAULT, |
330 | ZINJECT_DEVICE_FAULT, |
331 | ZINJECT_LABEL_FAULT, |
332 | ZINJECT_IGNORED_WRITES, |
333 | ZINJECT_PANIC, |
334 | ZINJECT_DELAY_IO, |
335 | } zinject_type_t; |
336 | |
337 | typedef struct zfs_share { |
338 | uint64_t z_exportdata; |
339 | uint64_t z_sharedata; |
340 | uint64_t z_sharetype; /* 0 = share, 1 = unshare */ |
341 | uint64_t z_sharemax; /* max length of share string */ |
342 | } zfs_share_t; |
343 | |
344 | /* |
345 | * ZFS file systems may behave the usual, POSIX-compliant way, where |
346 | * name lookups are case-sensitive. They may also be set up so that |
347 | * all the name lookups are case-insensitive, or so that only some |
348 | * lookups, the ones that set an FIGNORECASE flag, are case-insensitive. |
349 | */ |
350 | typedef enum zfs_case { |
351 | ZFS_CASE_SENSITIVE, |
352 | ZFS_CASE_INSENSITIVE, |
353 | ZFS_CASE_MIXED |
354 | } zfs_case_t; |
355 | |
356 | /* |
357 | * Note: this struct must have the same layout in 32-bit and 64-bit, so |
358 | * that 32-bit processes (like /sbin/zfs) can pass it to the 64-bit |
359 | * kernel. Therefore, we add padding to it so that no "hidden" padding |
360 | * is automatically added on 64-bit (but not on 32-bit). |
361 | */ |
362 | typedef struct zfs_cmd { |
363 | char zc_name[MAXPATHLEN]; /* name of pool or dataset */ |
364 | uint64_t zc_nvlist_src; /* really (char *) */ |
365 | uint64_t zc_nvlist_src_size; |
366 | uint64_t zc_nvlist_dst; /* really (char *) */ |
367 | uint64_t zc_nvlist_dst_size; |
368 | boolean_t zc_nvlist_dst_filled; /* put an nvlist in dst? */ |
369 | int zc_pad2; |
370 | |
371 | /* |
372 | * The following members are for legacy ioctls which haven't been |
373 | * converted to the new method. |
374 | */ |
375 | uint64_t zc_history; /* really (char *) */ |
376 | char zc_value[MAXPATHLEN * 2]; |
377 | char zc_string[MAXNAMELEN]; |
378 | uint64_t zc_guid; |
379 | uint64_t zc_nvlist_conf; /* really (char *) */ |
380 | uint64_t zc_nvlist_conf_size; |
381 | uint64_t zc_cookie; |
382 | uint64_t zc_objset_type; |
383 | uint64_t zc_perm_action; |
384 | uint64_t zc_history_len; |
385 | uint64_t zc_history_offset; |
386 | uint64_t zc_obj; |
387 | uint64_t zc_iflags; /* internal to zfs(7fs) */ |
388 | zfs_share_t zc_share; |
389 | uint64_t zc_jailid; |
390 | dmu_objset_stats_t zc_objset_stats; |
391 | dmu_replay_record_t zc_begin_record; |
392 | zinject_record_t zc_inject_record; |
393 | uint32_t zc_defer_destroy; |
394 | uint32_t zc_flags; |
395 | uint64_t zc_action_handle; |
396 | int zc_cleanup_fd; |
397 | uint8_t zc_simple; |
398 | uint8_t zc_pad3[3]; |
399 | boolean_t zc_resumable; |
400 | uint32_t zc_pad4; |
401 | uint64_t zc_sendobj; |
402 | uint64_t zc_fromobj; |
403 | uint64_t zc_createtxg; |
404 | zfs_stat_t zc_stat; |
405 | } zfs_cmd_t; |
406 | |
407 | typedef struct zfs_useracct { |
408 | char zu_domain[256]; |
409 | uid_t zu_rid; |
410 | uint32_t zu_pad; |
411 | uint64_t zu_space; |
412 | } zfs_useracct_t; |
413 | |
414 | #define ZFSDEV_MAX_MINOR (1 << 16) |
415 | #define ZFS_MIN_MINOR (ZFSDEV_MAX_MINOR + 1) |
416 | |
417 | #define ZPOOL_EXPORT_AFTER_SPLIT 0x1 |
418 | |
419 | #ifdef _KERNEL |
420 | |
421 | typedef struct zfs_creat { |
422 | nvlist_t *zct_zplprops; |
423 | nvlist_t *zct_props; |
424 | } zfs_creat_t; |
425 | |
426 | extern dev_info_t *zfs_dip; |
427 | |
428 | extern int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr); |
429 | extern int zfs_secpolicy_rename_perms(const char *from, |
430 | const char *to, cred_t *cr); |
431 | extern int zfs_secpolicy_destroy_perms(const char *name, cred_t *cr); |
432 | extern int zfs_busy(void); |
433 | extern int zfs_unmount_snap(const char *); |
434 | extern void zfs_destroy_unmount_origin(const char *); |
435 | |
436 | /* |
437 | * ZFS minor numbers can refer to either a control device instance or |
438 | * a zvol. Depending on the value of zss_type, zss_data points to either |
439 | * a zvol_state_t or a zfs_onexit_t. |
440 | */ |
441 | enum zfs_soft_state_type { |
442 | ZSST_ZVOL, |
443 | ZSST_CTLDEV |
444 | }; |
445 | |
446 | typedef struct zfs_soft_state { |
447 | enum zfs_soft_state_type zss_type; |
448 | void *zss_data; |
449 | } zfs_soft_state_t; |
450 | |
451 | extern void *zfsdev_get_soft_state(minor_t minor, |
452 | enum zfs_soft_state_type which); |
453 | extern minor_t zfsdev_minor_alloc(void); |
454 | |
455 | extern void *zfsdev_state; |
456 | |
457 | #endif /* _KERNEL */ |
458 | |
459 | #ifdef __cplusplus |
460 | } |
461 | #endif |
462 | |
463 | #endif /* _SYS_ZFS_IOCTL_H */ |
464 | |