]> git.proxmox.com Git - mirror_zfs.git/blobdiff - include/sys/zio.h
Pool allocation classes
[mirror_zfs.git] / include / sys / zio.h
index 30c4ee3ce4c3e46d6ba86457ece6512cdd253a0c..3220066494dbe3013549a95078619b0383ebb72a 100644 (file)
@@ -22,7 +22,7 @@
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
- * Copyright (c) 2012, 2017 by Delphix. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
  * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
  * Copyright (c) 2013, Joyent, Inc. All rights reserved.
  * Copyright 2016 Toomas Soome <tsoome@me.com>
@@ -167,6 +167,12 @@ enum zio_encrypt {
 #define        ZIO_FAILURE_MODE_CONTINUE       1
 #define        ZIO_FAILURE_MODE_PANIC          2
 
+typedef enum zio_suspend_reason {
+       ZIO_SUSPEND_NONE = 0,
+       ZIO_SUSPEND_IOERR,
+       ZIO_SUSPEND_MMP,
+} zio_suspend_reason_t;
+
 enum zio_flag {
        /*
         * Flags inherited by gang, ddt, and vdev children,
@@ -238,7 +244,10 @@ enum zio_flag {
 
 #define        ZIO_VDEV_CHILD_FLAGS(zio)                               \
        (((zio)->io_flags & ZIO_FLAG_VDEV_INHERIT) |            \
-       ZIO_FLAG_CANFAIL)
+       ZIO_FLAG_DONT_PROPAGATE | ZIO_FLAG_CANFAIL)
+
+#define        ZIO_CHILD_BIT(x)                (1 << (x))
+#define        ZIO_CHILD_BIT_IS_SET(val, x)    ((val) & (1 << (x)))
 
 enum zio_child {
        ZIO_CHILD_VDEV = 0,
@@ -248,6 +257,14 @@ enum zio_child {
        ZIO_CHILD_TYPES
 };
 
+#define        ZIO_CHILD_VDEV_BIT              ZIO_CHILD_BIT(ZIO_CHILD_VDEV)
+#define        ZIO_CHILD_GANG_BIT              ZIO_CHILD_BIT(ZIO_CHILD_GANG)
+#define        ZIO_CHILD_DDT_BIT               ZIO_CHILD_BIT(ZIO_CHILD_DDT)
+#define        ZIO_CHILD_LOGICAL_BIT           ZIO_CHILD_BIT(ZIO_CHILD_LOGICAL)
+#define        ZIO_CHILD_ALL_BITS                                      \
+       (ZIO_CHILD_VDEV_BIT | ZIO_CHILD_GANG_BIT |              \
+       ZIO_CHILD_DDT_BIT | ZIO_CHILD_LOGICAL_BIT)
+
 enum zio_wait_type {
        ZIO_WAIT_READY = 0,
        ZIO_WAIT_DONE,
@@ -261,6 +278,9 @@ enum zio_wait_type {
 #define        ECKSUM  EBADE
 #define        EFRAGS  EBADR
 
+/* Similar for ENOACTIVE */
+#define        ENOTACTIVE      ENOANO
+
 typedef void zio_done_func_t(zio_t *zio);
 
 extern int zio_dva_throttle_enabled;
@@ -333,6 +353,7 @@ typedef struct zio_prop {
        uint8_t                 zp_salt[ZIO_DATA_SALT_LEN];
        uint8_t                 zp_iv[ZIO_DATA_IV_LEN];
        uint8_t                 zp_mac[ZIO_DATA_MAC_LEN];
+       uint32_t                zp_zpl_smallblk;
 } zio_prop_t;
 
 typedef struct zio_cksum_report zio_cksum_report_t;
@@ -388,7 +409,7 @@ typedef struct zio_transform {
        struct zio_transform    *zt_next;
 } zio_transform_t;
 
-typedef int zio_pipe_stage_t(zio_t *zio);
+typedef zio_t *zio_pipe_stage_t(zio_t *zio);
 
 /*
  * The io_reexecute flags are distinct from io_flags because the child must
@@ -453,6 +474,7 @@ struct zio {
        vdev_t          *io_vd;
        void            *io_vsd;
        const zio_vsd_ops_t *io_vsd_ops;
+       metaslab_class_t *io_metaslab_class;    /* dva throttle class */
 
        uint64_t        io_offset;
        hrtime_t        io_timestamp;   /* submitted at */
@@ -487,6 +509,7 @@ struct zio {
        void            *io_waiter;
        kmutex_t        io_lock;
        kcondvar_t      io_cv;
+       int             io_allocator;
 
        /* FMA state */
        zio_cksum_report_t *io_cksum_report;
@@ -546,7 +569,6 @@ extern zio_t *zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg,
 
 extern int zio_alloc_zil(spa_t *spa, objset_t *os, uint64_t txg,
     blkptr_t *new_bp, uint64_t size, boolean_t *slog);
-extern void zio_free_zil(spa_t *spa, uint64_t txg, blkptr_t *bp);
 extern void zio_flush(zio_t *zio, vdev_t *vd);
 extern void zio_shrink(zio_t *zio, uint64_t size);
 
@@ -556,6 +578,7 @@ extern void zio_execute(zio_t *zio);
 extern void zio_interrupt(zio_t *zio);
 extern void zio_delay_init(zio_t *zio);
 extern void zio_delay_interrupt(zio_t *zio);
+extern void zio_deadman(zio_t *zio, char *tag);
 
 extern zio_t *zio_walk_parents(zio_t *cio, zio_link_t **);
 extern zio_t *zio_walk_children(zio_t *pio, zio_link_t **);
@@ -579,13 +602,15 @@ extern zio_t *zio_vdev_child_io(zio_t *zio, blkptr_t *bp, vdev_t *vd,
     zio_done_func_t *done, void *private);
 
 extern zio_t *zio_vdev_delegated_io(vdev_t *vd, uint64_t offset,
-    struct abd *data, uint64_t size, int type, zio_priority_t priority,
+    struct abd *data, uint64_t size, zio_type_t type, zio_priority_t priority,
     enum zio_flag flags, zio_done_func_t *done, void *private);
 
 extern void zio_vdev_io_bypass(zio_t *zio);
 extern void zio_vdev_io_reissue(zio_t *zio);
 extern void zio_vdev_io_redone(zio_t *zio);
 
+extern void zio_change_priority(zio_t *pio, zio_priority_t priority);
+
 extern void zio_checksum_verified(zio_t *zio);
 extern int zio_worst_error(int e1, int e2);
 
@@ -596,7 +621,7 @@ extern enum zio_checksum zio_checksum_dedup_select(spa_t *spa,
 extern enum zio_compress zio_compress_select(spa_t *spa,
     enum zio_compress child, enum zio_compress parent);
 
-extern void zio_suspend(spa_t *spa, zio_t *zio);
+extern void zio_suspend(spa_t *spa, zio_t *zio, zio_suspend_reason_t);
 extern int zio_resume(spa_t *spa);
 extern void zio_resume_wait(spa_t *spa);
 
@@ -617,6 +642,8 @@ extern int zio_inject_list_next(int *id, char *name, size_t buflen,
     struct zinject_record *record);
 extern int zio_clear_fault(int id);
 extern void zio_handle_panic_injection(spa_t *spa, char *tag, uint64_t type);
+extern int zio_handle_decrypt_injection(spa_t *spa, const zbookmark_phys_t *zb,
+    uint64_t type, int error);
 extern int zio_handle_fault_injection(zio_t *zio, int error);
 extern int zio_handle_device_injection(vdev_t *vd, zio_t *zio, int error);
 extern int zio_handle_device_injections(vdev_t *vd, zio_t *zio, int err1,
@@ -629,8 +656,8 @@ extern hrtime_t zio_handle_io_delay(zio_t *zio);
  * Checksum ereport functions
  */
 extern void zfs_ereport_start_checksum(spa_t *spa, vdev_t *vd,
-    zbookmark_phys_t *zb, struct zio *zio, uint64_t offset, uint64_t length,
-    void *arg, struct zio_bad_cksum *info);
+    const zbookmark_phys_t *zb, struct zio *zio, uint64_t offset,
+    uint64_t length, void *arg, struct zio_bad_cksum *info);
 extern void zfs_ereport_finish_checksum(zio_cksum_report_t *report,
     const abd_t *good_data, const abd_t *bad_data, boolean_t drop_if_identical);
 
@@ -638,8 +665,9 @@ extern void zfs_ereport_free_checksum(zio_cksum_report_t *report);
 
 /* If we have the good data in hand, this function can be used */
 extern void zfs_ereport_post_checksum(spa_t *spa, vdev_t *vd,
-    zbookmark_phys_t *zb, struct zio *zio, uint64_t offset, uint64_t length,
-    const abd_t *good_data, const abd_t *bad_data, struct zio_bad_cksum *info);
+    const zbookmark_phys_t *zb, struct zio *zio, uint64_t offset,
+    uint64_t length, const abd_t *good_data, const abd_t *bad_data,
+    struct zio_bad_cksum *info);
 
 /* Called from spa_sync(), but primarily an injection handler */
 extern void spa_handle_ignored_writes(spa_t *spa);