| 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 | |