Illumos #3306, #3321
[zfs.git] / module / zfs / zio.c
index 638105a..a721903 100644 (file)
@@ -210,6 +210,8 @@ zio_init(void)
        zfs_mg_alloc_failures = MAX((3 * max_ncpus / 2), 8);
 
        zio_inject_init();
+
+       lz4_init();
 }
 
 void
@@ -238,6 +240,8 @@ zio_fini(void)
        kmem_cache_destroy(zio_cache);
 
        zio_inject_fini();
+
+       lz4_fini();
 }
 
 /*
@@ -605,6 +609,9 @@ zio_create(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
        zio->io_vsd_ops = NULL;
        zio->io_offset = offset;
        zio->io_deadline = 0;
+       zio->io_timestamp = 0;
+       zio->io_delta = 0;
+       zio->io_delay = 0;
        zio->io_orig_data = zio->io_data = data;
        zio->io_orig_size = zio->io_size = size;
        zio->io_orig_flags = zio->io_flags = flags;
@@ -616,7 +623,6 @@ zio_create(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
        zio->io_bp_override = NULL;
        zio->io_walk_link = NULL;
        zio->io_transform_stack = NULL;
-       zio->io_delay = 0;
        zio->io_error = 0;
        zio->io_child_count = 0;
        zio->io_parent_count = 0;
@@ -1281,6 +1287,7 @@ __zio_execute(zio_t *zio)
                        return;
                }
 
+#ifdef _KERNEL
                /*
                 * If we executing in the context of the tx_sync_thread,
                 * or we are performing pool initialization outside of a
@@ -1293,6 +1300,7 @@ __zio_execute(zio_t *zio)
                        zio_taskq_dispatch(zio, ZIO_TASKQ_ISSUE, cut);
                        return;
                }
+#endif
 
                zio->io_stage = stage;
                rv = zio_pipeline[highbit(stage) - 1](zio);
@@ -2243,8 +2251,11 @@ zio_ddt_free(zio_t *zio)
 
        ddt_enter(ddt);
        freedde = dde = ddt_lookup(ddt, bp, B_TRUE);
-       ddp = ddt_phys_select(dde, bp);
-       ddt_phys_decref(ddp);
+       if (dde) {
+               ddp = ddt_phys_select(dde, bp);
+               if (ddp)
+                       ddt_phys_decref(ddp);
+       }
        ddt_exit(ddt);
 
        return (ZIO_PIPELINE_CONTINUE);
@@ -2897,11 +2908,11 @@ zio_done(zio_t *zio)
        vdev_stat_update(zio, zio->io_size);
 
        /*
-        * If this I/O is attached to a particular vdev is slow, exeeding
+        * If this I/O is attached to a particular vdev is slow, exceeding
         * 30 seconds to complete, post an error described the I/O delay.
         * We ignore these errors if the device is currently unavailable.
         */
-       if (zio->io_delay >= zio_delay_max) {
+       if (zio->io_delay >= MSEC_TO_TICK(zio_delay_max)) {
                if (zio->io_vd != NULL && !vdev_is_dead(zio->io_vd))
                        zfs_ereport_post(FM_EREPORT_ZFS_DELAY, zio->io_spa,
                                          zio->io_vd, zio, 0, 0);
@@ -3051,7 +3062,7 @@ zio_done(zio_t *zio)
                         * Hand it off to the otherwise-unused claim taskq.
                         */
                        ASSERT(taskq_empty_ent(&zio->io_tqent));
-                       (void) taskq_dispatch_ent(
+                       taskq_dispatch_ent(
                            zio->io_spa->spa_zio_taskq[ZIO_TYPE_CLAIM][ZIO_TASKQ_ISSUE],
                            (task_func_t *)zio_reexecute, zio, 0,
                            &zio->io_tqent);