]> granicus.if.org Git - zfs/blobdiff - include/sys/zfs_ioctl.h
OpenZFS 8604 - Simplify snapshots unmounting code
[zfs] / include / sys / zfs_ioctl.h
index 7b751fea696e21f52575c44a3dec0b92bbdae27f..ab562d24bfa8f27c53034c051607d4a7a2645634 100644 (file)
@@ -20,8 +20,9 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
+ * Copyright (c) 2012, 2017 by Delphix. All rights reserved.
  * Copyright 2016 RackTop Systems.
+ * Copyright (c) 2017, Intel Corporation.
  */
 
 #ifndef        _SYS_ZFS_IOCTL_H
@@ -96,20 +97,24 @@ typedef enum drr_headertype {
 #define        DMU_BACKUP_FEATURE_SA_SPILL             (1 << 2)
 /* flags #3 - #15 are reserved for incompatible closed-source implementations */
 #define        DMU_BACKUP_FEATURE_EMBED_DATA           (1 << 16)
-#define        DMU_BACKUP_FEATURE_EMBED_DATA_LZ4       (1 << 17)
+#define        DMU_BACKUP_FEATURE_LZ4                  (1 << 17)
 /* flag #18 is reserved for a Delphix feature */
 #define        DMU_BACKUP_FEATURE_LARGE_BLOCKS         (1 << 19)
 #define        DMU_BACKUP_FEATURE_RESUMING             (1 << 20)
-#define        DMU_BACKUP_FEATURE_LARGE_DNODE          (1 << 21)
+/* flag #21 is reserved for a Delphix feature */
+#define        DMU_BACKUP_FEATURE_COMPRESSED           (1 << 22)
+#define        DMU_BACKUP_FEATURE_LARGE_DNODE          (1 << 23)
+#define        DMU_BACKUP_FEATURE_RAW                  (1 << 24)
 
 /*
  * Mask of all supported backup features
  */
 #define        DMU_BACKUP_FEATURE_MASK (DMU_BACKUP_FEATURE_DEDUP | \
     DMU_BACKUP_FEATURE_DEDUPPROPS | DMU_BACKUP_FEATURE_SA_SPILL | \
-    DMU_BACKUP_FEATURE_EMBED_DATA | DMU_BACKUP_FEATURE_EMBED_DATA_LZ4 | \
+    DMU_BACKUP_FEATURE_EMBED_DATA | DMU_BACKUP_FEATURE_LZ4 | \
     DMU_BACKUP_FEATURE_RESUMING | DMU_BACKUP_FEATURE_LARGE_BLOCKS | \
-    DMU_BACKUP_FEATURE_LARGE_DNODE)
+    DMU_BACKUP_FEATURE_COMPRESSED | DMU_BACKUP_FEATURE_LARGE_DNODE | \
+    DMU_BACKUP_FEATURE_RAW)
 
 /* Are all features in the given flag word currently supported? */
 #define        DMU_STREAM_SUPPORTED(x) (!((x) & ~DMU_BACKUP_FEATURE_MASK))
@@ -155,12 +160,26 @@ typedef enum dmu_send_resume_token_version {
 #define        DRR_FLAG_FREERECORDS    (1<<2)
 
 /*
- * flags in the drr_checksumflags field in the DRR_WRITE and
- * DRR_WRITE_BYREF blocks
+ * flags in the drr_flags field in the DRR_WRITE, DRR_SPILL, DRR_OBJECT,
+ * DRR_WRITE_BYREF, and DRR_OBJECT_RANGE blocks
  */
-#define        DRR_CHECKSUM_DEDUP      (1<<0)
+#define        DRR_CHECKSUM_DEDUP      (1<<0) /* not used for DRR_SPILL blocks */
+#define        DRR_RAW_BYTESWAP        (1<<1)
 
 #define        DRR_IS_DEDUP_CAPABLE(flags)     ((flags) & DRR_CHECKSUM_DEDUP)
+#define        DRR_IS_RAW_BYTESWAPPED(flags)   ((flags) & DRR_RAW_BYTESWAP)
+
+/* deal with compressed drr_write replay records */
+#define        DRR_WRITE_COMPRESSED(drrw)      ((drrw)->drr_compressiontype != 0)
+#define        DRR_WRITE_PAYLOAD_SIZE(drrw) \
+       (DRR_WRITE_COMPRESSED(drrw) ? (drrw)->drr_compressed_size : \
+       (drrw)->drr_logical_size)
+#define        DRR_SPILL_PAYLOAD_SIZE(drrs) \
+       ((drrs)->drr_compressed_size ? \
+       (drrs)->drr_compressed_size : (drrs)->drr_length)
+#define        DRR_OBJECT_PAYLOAD_SIZE(drro) \
+       ((drro)->drr_raw_bonuslen != 0 ? \
+       (drro)->drr_raw_bonuslen : P2ROUNDUP((drro)->drr_bonuslen, 8))
 
 /*
  * zfs ioctl command structure
@@ -169,7 +188,8 @@ typedef struct dmu_replay_record {
        enum {
                DRR_BEGIN, DRR_OBJECT, DRR_FREEOBJECTS,
                DRR_WRITE, DRR_FREE, DRR_END, DRR_WRITE_BYREF,
-               DRR_SPILL, DRR_WRITE_EMBEDDED, DRR_NUMTYPES
+               DRR_SPILL, DRR_WRITE_EMBEDDED, DRR_OBJECT_RANGE,
+               DRR_NUMTYPES
        } drr_type;
        uint32_t drr_payloadlen;
        union {
@@ -196,8 +216,15 @@ typedef struct dmu_replay_record {
                        uint8_t drr_checksumtype;
                        uint8_t drr_compress;
                        uint8_t drr_dn_slots;
-                       uint8_t drr_pad[5];
+                       uint8_t drr_flags;
+                       uint32_t drr_raw_bonuslen;
                        uint64_t drr_toguid;
+                       /* only (possibly) nonzero for raw streams */
+                       uint8_t drr_indblkshift;
+                       uint8_t drr_nlevels;
+                       uint8_t drr_nblkptr;
+                       uint8_t drr_pad[5];
+                       uint64_t drr_maxblkid;
                        /* bonus content follows */
                } drr_object;
                struct drr_freeobjects {
@@ -210,12 +237,20 @@ typedef struct dmu_replay_record {
                        dmu_object_type_t drr_type;
                        uint32_t drr_pad;
                        uint64_t drr_offset;
-                       uint64_t drr_length;
+                       uint64_t drr_logical_size;
                        uint64_t drr_toguid;
                        uint8_t drr_checksumtype;
-                       uint8_t drr_checksumflags;
-                       uint8_t drr_pad2[6];
-                       ddt_key_t drr_key; /* deduplication key */
+                       uint8_t drr_flags;
+                       uint8_t drr_compressiontype;
+                       uint8_t drr_pad2[5];
+                       /* deduplication key */
+                       ddt_key_t drr_key;
+                       /* only nonzero if drr_compressiontype is not 0 */
+                       uint64_t drr_compressed_size;
+                       /* only nonzero for raw streams */
+                       uint8_t drr_salt[ZIO_DATA_SALT_LEN];
+                       uint8_t drr_iv[ZIO_DATA_IV_LEN];
+                       uint8_t drr_mac[ZIO_DATA_MAC_LEN];
                        /* content follows */
                } drr_write;
                struct drr_free {
@@ -236,7 +271,7 @@ typedef struct dmu_replay_record {
                        uint64_t drr_refoffset;
                        /* properties of the data */
                        uint8_t drr_checksumtype;
-                       uint8_t drr_checksumflags;
+                       uint8_t drr_flags;
                        uint8_t drr_pad2[6];
                        ddt_key_t drr_key; /* deduplication key */
                } drr_write_byref;
@@ -244,7 +279,15 @@ typedef struct dmu_replay_record {
                        uint64_t drr_object;
                        uint64_t drr_length;
                        uint64_t drr_toguid;
-                       uint64_t drr_pad[4]; /* needed for crypto */
+                       uint8_t drr_flags;
+                       uint8_t drr_compressiontype;
+                       uint8_t drr_pad[6];
+                       /* only nonzero for raw streams */
+                       uint64_t drr_compressed_size;
+                       uint8_t drr_salt[ZIO_DATA_SALT_LEN];
+                       uint8_t drr_iv[ZIO_DATA_IV_LEN];
+                       uint8_t drr_mac[ZIO_DATA_MAC_LEN];
+                       dmu_object_type_t drr_type;
                        /* spill data follows */
                } drr_spill;
                struct drr_write_embedded {
@@ -260,6 +303,16 @@ typedef struct dmu_replay_record {
                        uint32_t drr_psize; /* compr. (real) size of payload */
                        /* (possibly compressed) content follows */
                } drr_write_embedded;
+               struct drr_object_range {
+                       uint64_t drr_firstobj;
+                       uint64_t drr_numslots;
+                       uint64_t drr_toguid;
+                       uint8_t drr_salt[ZIO_DATA_SALT_LEN];
+                       uint8_t drr_iv[ZIO_DATA_IV_LEN];
+                       uint8_t drr_mac[ZIO_DATA_MAC_LEN];
+                       uint8_t drr_flags;
+                       uint8_t drr_pad[3];
+               } drr_object_range;
 
                /*
                 * Nore: drr_checksum is overlaid with all record types
@@ -326,6 +379,10 @@ typedef struct zinject_record {
 #define        ZEVENT_SEEK_START       0
 #define        ZEVENT_SEEK_END         UINT64_MAX
 
+/* scaled frequency ranges */
+#define        ZI_PERCENTAGE_MIN       4294UL
+#define        ZI_PERCENTAGE_MAX       UINT32_MAX
+
 typedef enum zinject_type {
        ZINJECT_UNINITIALIZED,
        ZINJECT_DATA_FAULT,
@@ -389,15 +446,14 @@ typedef struct zfs_cmd {
        uint64_t        zc_iflags;              /* internal to zfs(7fs) */
        zfs_share_t     zc_share;
        dmu_objset_stats_t zc_objset_stats;
-       dmu_replay_record_t zc_begin_record;
+       struct drr_begin zc_begin_record;
        zinject_record_t zc_inject_record;
        uint32_t        zc_defer_destroy;
        uint32_t        zc_flags;
        uint64_t        zc_action_handle;
        int             zc_cleanup_fd;
        uint8_t         zc_simple;
-       boolean_t       zc_resumable;
-       uint8_t         zc_pad[2];              /* alignment */
+       uint8_t         zc_pad[3];              /* alignment */
        uint64_t        zc_sendobj;
        uint64_t        zc_fromobj;
        uint64_t        zc_createtxg;
@@ -417,20 +473,22 @@ typedef struct zfs_useracct {
 #define        ZPOOL_EXPORT_AFTER_SPLIT 0x1
 
 #ifdef _KERNEL
+struct objset;
+struct zfsvfs;
 
 typedef struct zfs_creat {
        nvlist_t        *zct_zplprops;
        nvlist_t        *zct_props;
 } zfs_creat_t;
 
-extern int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr);
-extern int zfs_secpolicy_rename_perms(const char *from,
-    const char *to, cred_t *cr);
-extern int zfs_secpolicy_destroy_perms(const char *name, cred_t *cr);
-extern int zfs_unmount_snap(const char *);
+extern int zfs_secpolicy_snapshot_perms(const char *, cred_t *);
+extern int zfs_secpolicy_rename_perms(const char *, const char *, cred_t *);
+extern int zfs_secpolicy_destroy_perms(const char *, cred_t *);
+extern void zfs_unmount_snap(const char *);
 extern void zfs_destroy_unmount_origin(const char *);
-
-extern boolean_t dataset_name_hidden(const char *name);
+extern boolean_t dataset_name_hidden(const char *);
+extern int getzfsvfs_impl(struct objset *, struct zfsvfs **);
+extern int getzfsvfs(const char *, struct zfsvfs **);
 
 enum zfsdev_state_type {
        ZST_ONEXIT,