Illumos #3145, #3212
[zfs.git] / include / sys / zio.h
index 97d8ec7..0527979 100644 (file)
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  */
+/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
+ */
 
 #ifndef _ZIO_H
 #define        _ZIO_H
@@ -116,6 +120,11 @@ enum zio_compress {
        ZIO_COMPRESS_ON_VALUE == ZIO_COMPRESS_LZJB) ||  \
        (compress) == ZIO_COMPRESS_OFF)
 
+/*
+ * Default Linux timeout for a sd device.
+ */
+#define ZIO_DELAY_MAX                  (30 * MILLISEC)
+
 #define        ZIO_FAILURE_MODE_WAIT           0
 #define        ZIO_FAILURE_MODE_CONTINUE       1
 #define        ZIO_FAILURE_MODE_PANIC          2
@@ -185,7 +194,8 @@ enum zio_flag {
        ZIO_FLAG_RAW            = 1 << 21,
        ZIO_FLAG_GANG_CHILD     = 1 << 22,
        ZIO_FLAG_DDT_CHILD      = 1 << 23,
-       ZIO_FLAG_GODFATHER      = 1 << 24
+       ZIO_FLAG_GODFATHER      = 1 << 24,
+       ZIO_FLAG_FASTWRITE      = 1 << 25
 };
 
 #define        ZIO_FLAG_MUSTSUCCEED            0
@@ -269,6 +279,14 @@ typedef struct zbookmark {
 #define        ZB_ZIL_OBJECT           (0ULL)
 #define        ZB_ZIL_LEVEL            (-2LL)
 
+#define        ZB_IS_ZERO(zb)                                          \
+       ((zb)->zb_objset == 0 && (zb)->zb_object == 0 &&        \
+       (zb)->zb_level == 0 && (zb)->zb_blkid == 0)
+#define        ZB_IS_ROOT(zb)                          \
+       ((zb)->zb_object == ZB_ROOT_OBJECT &&   \
+       (zb)->zb_level == ZB_ROOT_LEVEL &&      \
+       (zb)->zb_blkid == ZB_ROOT_BLKID)
+
 typedef struct zio_prop {
        enum zio_checksum       zp_checksum;
        enum zio_compress       zp_compress;
@@ -286,6 +304,7 @@ typedef void zio_cksum_finish_f(zio_cksum_report_t *rep,
 typedef void zio_cksum_free_f(void *cbdata, size_t size);
 
 struct zio_bad_cksum;                          /* defined in zio_checksum.h */
+struct dnode_phys;
 
 struct zio_cksum_report {
        struct zio_cksum_report *zcr_next;
@@ -401,6 +420,7 @@ struct zio {
        enum zio_flag   io_orig_flags;
        enum zio_stage  io_orig_stage;
        enum zio_stage  io_orig_pipeline;
+       uint64_t        io_delay;
        int             io_error;
        int             io_child_error[ZIO_CHILD_TYPES];
        uint64_t        io_children[ZIO_CHILD_TYPES][ZIO_WAIT_TYPES];
@@ -417,6 +437,9 @@ struct zio {
        /* FMA state */
        zio_cksum_report_t *io_cksum_report;
        uint64_t        io_ena;
+
+       /* Taskq dispatching state */
+       taskq_ent_t     io_tqent;
 };
 
 extern zio_t *zio_null(zio_t *pio, spa_t *spa, vdev_t *vd,
@@ -463,7 +486,7 @@ extern zio_t *zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg,
     const blkptr_t *bp, enum zio_flag flags);
 
 extern int zio_alloc_zil(spa_t *spa, uint64_t txg, blkptr_t *new_bp,
-    blkptr_t *old_bp, uint64_t size, boolean_t use_slog);
+    uint64_t size, boolean_t use_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);
@@ -482,6 +505,8 @@ extern void *zio_buf_alloc(size_t size);
 extern void zio_buf_free(void *buf, size_t size);
 extern void *zio_data_buf_alloc(size_t size);
 extern void zio_data_buf_free(void *buf, size_t size);
+extern void *zio_vdev_alloc(void);
+extern void zio_vdev_free(void *buf);
 
 extern void zio_resubmit_stage_async(void *);
 
@@ -552,6 +577,10 @@ extern void zfs_ereport_post_checksum(spa_t *spa, vdev_t *vd,
 /* Called from spa_sync(), but primarily an injection handler */
 extern void spa_handle_ignored_writes(spa_t *spa);
 
+/* zbookmark functions */
+boolean_t zbookmark_is_before(const struct dnode_phys *dnp,
+    const zbookmark_t *zb1, const zbookmark_t *zb2);
+
 #ifdef __cplusplus
 }
 #endif