]> git.proxmox.com Git - mirror_zfs-debian.git/blobdiff - cmd/ztest/ztest.c
Imported Upstream version 0.6.2+git20140204
[mirror_zfs-debian.git] / cmd / ztest / ztest.c
index 93a5f1ecf54a68ae71272ae57aa51b9951375c55..7b38dfaa69fa20d6d21b0d981fd493a59d9e3fa8 100644 (file)
@@ -20,8 +20,9 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright (c) 2013 Steven Hartland. All rights reserved.
  */
 
 /*
 #include <sys/metaslab_impl.h>
 #include <sys/dsl_prop.h>
 #include <sys/dsl_dataset.h>
+#include <sys/dsl_destroy.h>
 #include <sys/dsl_scan.h>
 #include <sys/zio_checksum.h>
 #include <sys/refcount.h>
 #include <sys/zfeature.h>
+#include <sys/dsl_userhold.h>
 #include <stdio.h>
 #include <stdio_ext.h>
 #include <stdlib.h>
@@ -205,6 +208,7 @@ enum ztest_io_type {
        ZTEST_IO_WRITE_ZEROES,
        ZTEST_IO_TRUNCATE,
        ZTEST_IO_SETATTR,
+       ZTEST_IO_REWRITE,
        ZTEST_IO_TYPES
 };
 
@@ -362,12 +366,12 @@ ztest_info_t ztest_info[] = {
        { ztest_fault_inject,                   1,      &zopt_sometimes },
        { ztest_ddt_repair,                     1,      &zopt_sometimes },
        { ztest_dmu_snapshot_hold,              1,      &zopt_sometimes },
-       { ztest_reguid,                         1,      &zopt_sometimes },
+       { ztest_reguid,                         1,      &zopt_rarely    },
        { ztest_spa_rename,                     1,      &zopt_rarely    },
        { ztest_scrub,                          1,      &zopt_rarely    },
        { ztest_spa_upgrade,                    1,      &zopt_rarely    },
        { ztest_dsl_dataset_promote_busy,       1,      &zopt_rarely    },
-       { ztest_vdev_attach_detach,             1,      &zopt_rarely    },
+       { ztest_vdev_attach_detach,             1,      &zopt_sometimes },
        { ztest_vdev_LUN_growth,                1,      &zopt_rarely    },
        { ztest_vdev_add_remove,                1,
            &ztest_opts.zo_vdevtime                             },
@@ -785,6 +789,18 @@ ztest_kill(ztest_shared_t *zs)
 {
        zs->zs_alloc = metaslab_class_get_alloc(spa_normal_class(ztest_spa));
        zs->zs_space = metaslab_class_get_space(spa_normal_class(ztest_spa));
+
+       /*
+        * Before we kill off ztest, make sure that the config is updated.
+        * See comment above spa_config_sync().
+        */
+       mutex_enter(&spa_namespace_lock);
+       spa_config_sync(ztest_spa, B_FALSE, B_FALSE);
+       mutex_exit(&spa_namespace_lock);
+
+       if (ztest_opts.zo_verbose >= 3)
+               zfs_dbgmsg_print(FTAG);
+
        (void) kill(getpid(), SIGKILL);
 }
 
@@ -1031,9 +1047,8 @@ ztest_dsl_prop_set_uint64(char *osname, zfs_prop_t prop, uint64_t value,
        uint64_t curval;
        int error;
 
-       error = dsl_prop_set(osname, propname,
-           (inherit ? ZPROP_SRC_NONE : ZPROP_SRC_LOCAL),
-           sizeof (value), 1, &value);
+       error = dsl_prop_set_int(osname, propname,
+           (inherit ? ZPROP_SRC_NONE : ZPROP_SRC_LOCAL), value);
 
        if (error == ENOSPC) {
                ztest_record_enospc(FTAG);
@@ -1042,8 +1057,7 @@ ztest_dsl_prop_set_uint64(char *osname, zfs_prop_t prop, uint64_t value,
        ASSERT0(error);
 
        setpoint = umem_alloc(MAXPATHLEN, UMEM_NOFAIL);
-       VERIFY3U(dsl_prop_get(osname, propname, sizeof (curval),
-           1, &curval, setpoint), ==, 0);
+       VERIFY0(dsl_prop_get_integer(osname, propname, &curval, setpoint));
 
        if (ztest_opts.zo_verbose >= 6) {
                VERIFY(zfs_prop_index_to_string(prop, curval, &valname) == 0);
@@ -1899,6 +1913,12 @@ ztest_get_data(void *arg, lr_write_t *lr, char *buf, zio_t *zio)
                    DMU_READ_NO_PREFETCH);
 
                if (error == 0) {
+                       blkptr_t *obp = dmu_buf_get_blkptr(db);
+                       if (obp) {
+                               ASSERT(BP_IS_HOLE(bp));
+                               *bp = *obp;
+                       }
+
                        zgd->zgd_db = db;
                        zgd->zgd_bp = bp;
 
@@ -2047,6 +2067,9 @@ ztest_remove(ztest_ds_t *zd, ztest_od_t *od, int count)
                        continue;
                }
 
+               /*
+                * No object was found.
+                */
                if (od->od_object == 0)
                        continue;
 
@@ -2162,6 +2185,7 @@ ztest_prealloc(ztest_ds_t *zd, uint64_t object, uint64_t offset, uint64_t size)
 static void
 ztest_io(ztest_ds_t *zd, uint64_t object, uint64_t offset)
 {
+       int err;
        ztest_block_tag_t wbt;
        dmu_object_info_t doi;
        enum ztest_io_type io_type;
@@ -2216,6 +2240,25 @@ ztest_io(ztest_ds_t *zd, uint64_t object, uint64_t offset)
                break;
        default:
                break;
+
+       case ZTEST_IO_REWRITE:
+               (void) rw_enter(&ztest_name_lock, RW_READER);
+               err = ztest_dsl_prop_set_uint64(zd->zd_name,
+                   ZFS_PROP_CHECKSUM, spa_dedup_checksum(ztest_spa),
+                   B_FALSE);
+               VERIFY(err == 0 || err == ENOSPC);
+               err = ztest_dsl_prop_set_uint64(zd->zd_name,
+                   ZFS_PROP_COMPRESSION,
+                   ztest_random_dsl_prop(ZFS_PROP_COMPRESSION),
+                   B_FALSE);
+               VERIFY(err == 0 || err == ENOSPC);
+               (void) rw_exit(&ztest_name_lock);
+
+               VERIFY0(dmu_read(zd->zd_os, object, offset, blocksize, data,
+                   DMU_READ_NO_PREFETCH));
+
+               (void) ztest_write(zd, object, offset, blocksize, data);
+               break;
        }
 
        (void) rw_exit(&zd->zd_zilog_lock);
@@ -2303,6 +2346,11 @@ ztest_zil_remount(ztest_ds_t *zd, uint64_t id)
 {
        objset_t *os = zd->zd_os;
 
+       /*
+        * We grab the zd_dirobj_lock to ensure that no other thread is
+        * updating the zil (i.e. adding in-memory log records) and the
+        * zd_zilog_lock to block any I/O.
+        */
        mutex_enter(&zd->zd_dirobj_lock);
        (void) rw_enter(&zd->zd_zilog_lock, RW_WRITER);
 
@@ -2334,7 +2382,7 @@ ztest_spa_create_destroy(ztest_ds_t *zd, uint64_t id)
         */
        nvroot = make_vdev_root("/dev/bogus", NULL, NULL, 0, 0, 0, 0, 0, 1);
        VERIFY3U(ENOENT, ==,
-           spa_create("ztest_bad_file", nvroot, NULL, NULL, NULL));
+           spa_create("ztest_bad_file", nvroot, NULL, NULL));
        nvlist_free(nvroot);
 
        /*
@@ -2342,7 +2390,7 @@ ztest_spa_create_destroy(ztest_ds_t *zd, uint64_t id)
         */
        nvroot = make_vdev_root("/dev/bogus", NULL, NULL, 0, 0, 0, 0, 2, 1);
        VERIFY3U(ENOENT, ==,
-           spa_create("ztest_bad_mirror", nvroot, NULL, NULL, NULL));
+           spa_create("ztest_bad_mirror", nvroot, NULL, NULL));
        nvlist_free(nvroot);
 
        /*
@@ -2351,7 +2399,7 @@ ztest_spa_create_destroy(ztest_ds_t *zd, uint64_t id)
         */
        (void) rw_enter(&ztest_name_lock, RW_READER);
        nvroot = make_vdev_root("/dev/bogus", NULL, NULL, 0, 0, 0, 0, 0, 1);
-       VERIFY3U(EEXIST, ==, spa_create(zo->zo_pool, nvroot, NULL, NULL, NULL));
+       VERIFY3U(EEXIST, ==, spa_create(zo->zo_pool, nvroot, NULL, NULL));
        nvlist_free(nvroot);
        VERIFY3U(0, ==, spa_open(zo->zo_pool, &spa, FTAG));
        VERIFY3U(EBUSY, ==, spa_destroy(zo->zo_pool));
@@ -2409,7 +2457,7 @@ ztest_spa_upgrade(ztest_ds_t *zd, uint64_t id)
        props = fnvlist_alloc();
        fnvlist_add_uint64(props,
            zpool_prop_to_name(ZPOOL_PROP_VERSION), version);
-       VERIFY3S(spa_create(name, nvroot, props, NULL, NULL), ==, 0);
+       VERIFY3S(spa_create(name, nvroot, props, NULL), ==, 0);
        fnvlist_free(nvroot);
        fnvlist_free(props);
 
@@ -2484,8 +2532,7 @@ ztest_vdev_add_remove(ztest_ds_t *zd, uint64_t id)
        int error;
 
        mutex_enter(&ztest_vdev_lock);
-       leaves =
-               MAX(zs->zs_mirrors + zs->zs_splits, 1) * ztest_opts.zo_raidz;
+       leaves = MAX(zs->zs_mirrors + zs->zs_splits, 1) * ztest_opts.zo_raidz;
 
        spa_config_enter(spa, SCL_VDEV, FTAG, RW_READER);
 
@@ -2507,7 +2554,7 @@ ztest_vdev_add_remove(ztest_ds_t *zd, uint64_t id)
                 * prevent a race between removing a slog (dmu_objset_find)
                 * and destroying a dataset. Removing the slog will
                 * grab a reference on the dataset which may cause
-                * dmu_objset_destroy() to fail with EBUSY thus
+                * dsl_destroy_head() to fail with EBUSY thus
                 * leaving the dataset in an inconsistent state.
                 */
                rw_enter(&ztest_name_lock, RW_WRITER);
@@ -2739,7 +2786,7 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id)
        uint64_t leaf, top;
        uint64_t ashift = ztest_get_ashift();
        uint64_t oldguid, pguid;
-       size_t oldsize, newsize;
+       uint64_t oldsize, newsize;
        char *oldpath, *newpath;
        int replacing;
        int oldvd_has_siblings = B_FALSE;
@@ -2900,8 +2947,8 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id)
        if (error != expected_error && expected_error != EBUSY) {
                fatal(0, "attach (%s %llu, %s %llu, %d) "
                    "returned %d, expected %d",
-                   oldpath, (longlong_t)oldsize, newpath,
-                   (longlong_t)newsize, replacing, error, expected_error);
+                   oldpath, oldsize, newpath,
+                   newsize, replacing, error, expected_error);
        }
 out:
        mutex_exit(&ztest_vdev_lock);
@@ -3196,7 +3243,7 @@ ztest_objset_destroy_cb(const char *name, void *arg)
        /*
         * Verify that the dataset contains a directory object.
         */
-       VERIFY3U(0, ==, dmu_objset_hold(name, FTAG, &os));
+       VERIFY0(dmu_objset_own(name, DMU_OST_OTHER, B_TRUE, FTAG, &os));
        error = dmu_object_info(os, ZTEST_DIROBJ, &doi);
        if (error != ENOENT) {
                /* We could have crashed in the middle of destroying it */
@@ -3204,12 +3251,16 @@ ztest_objset_destroy_cb(const char *name, void *arg)
                ASSERT3U(doi.doi_type, ==, DMU_OT_ZAP_OTHER);
                ASSERT3S(doi.doi_physical_blocks_512, >=, 0);
        }
-       dmu_objset_rele(os, FTAG);
+       dmu_objset_disown(os, FTAG);
 
        /*
         * Destroy the dataset.
         */
-       VERIFY3U(0, ==, dmu_objset_destroy(name, B_FALSE));
+       if (strchr(name, '@') != NULL) {
+               VERIFY0(dsl_destroy_snapshot(name, B_FALSE));
+       } else {
+               VERIFY0(dsl_destroy_head(name));
+       }
        return (0);
 }
 
@@ -3219,17 +3270,17 @@ ztest_snapshot_create(char *osname, uint64_t id)
        char snapname[MAXNAMELEN];
        int error;
 
-       (void) snprintf(snapname, MAXNAMELEN, "%s@%llu", osname,
-           (u_longlong_t)id);
+       (void) snprintf(snapname, sizeof (snapname), "%llu", (u_longlong_t)id);
 
-       error = dmu_objset_snapshot(osname, strchr(snapname, '@') + 1,
-           NULL, NULL, B_FALSE, B_FALSE, -1);
+       error = dmu_objset_snapshot_one(osname, snapname);
        if (error == ENOSPC) {
                ztest_record_enospc(FTAG);
                return (B_FALSE);
        }
-       if (error != 0 && error != EEXIST)
-               fatal(0, "ztest_snapshot_create(%s) = %d", snapname, error);
+       if (error != 0 && error != EEXIST) {
+               fatal(0, "ztest_snapshot_create(%s@%s) = %d", osname,
+                   snapname, error);
+       }
        return (B_TRUE);
 }
 
@@ -3242,7 +3293,7 @@ ztest_snapshot_destroy(char *osname, uint64_t id)
        (void) snprintf(snapname, MAXNAMELEN, "%s@%llu", osname,
            (u_longlong_t)id);
 
-       error = dmu_objset_destroy(snapname, B_FALSE);
+       error = dsl_destroy_snapshot(snapname, B_FALSE);
        if (error != 0 && error != ENOENT)
                fatal(0, "ztest_snapshot_destroy(%s) = %d", snapname, error);
        return (B_TRUE);
@@ -3270,7 +3321,7 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id)
 
        /*
         * If this dataset exists from a previous run, process its replay log
-        * half of the time.  If we don't replay it, then dmu_objset_destroy()
+        * half of the time.  If we don't replay it, then dsl_destroy_head()
         * (invoked from ztest_objset_destroy_cb()) should just throw it away.
         */
        if (ztest_random(2) == 0 &&
@@ -3292,7 +3343,8 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id)
        /*
         * Verify that the destroyed dataset is no longer in the namespace.
         */
-       VERIFY3U(ENOENT, ==, dmu_objset_hold(name, FTAG, &os));
+       VERIFY3U(ENOENT, ==, dmu_objset_own(name, DMU_OST_OTHER, B_TRUE,
+           FTAG, &os));
 
        /*
         * Verify that we can create a new dataset.
@@ -3306,8 +3358,7 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id)
                fatal(0, "dmu_objset_create(%s) = %d", name, error);
        }
 
-       VERIFY3U(0, ==,
-           dmu_objset_own(name, DMU_OST_OTHER, B_FALSE, FTAG, &os));
+       VERIFY0(dmu_objset_own(name, DMU_OST_OTHER, B_FALSE, FTAG, &os));
 
        ztest_zd_init(zdtmp, NULL, os);
 
@@ -3397,21 +3448,21 @@ ztest_dsl_dataset_cleanup(char *osname, uint64_t id)
        (void) snprintf(snap3name, MAXNAMELEN, "%s@s3_%llu",
            clone1name, (u_longlong_t)id);
 
-       error = dmu_objset_destroy(clone2name, B_FALSE);
+       error = dsl_destroy_head(clone2name);
        if (error && error != ENOENT)
-               fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error);
-       error = dmu_objset_destroy(snap3name, B_FALSE);
+               fatal(0, "dsl_destroy_head(%s) = %d", clone2name, error);
+       error = dsl_destroy_snapshot(snap3name, B_FALSE);
        if (error && error != ENOENT)
-               fatal(0, "dmu_objset_destroy(%s) = %d", snap3name, error);
-       error = dmu_objset_destroy(snap2name, B_FALSE);
+               fatal(0, "dsl_destroy_snapshot(%s) = %d", snap3name, error);
+       error = dsl_destroy_snapshot(snap2name, B_FALSE);
        if (error && error != ENOENT)
-               fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error);
-       error = dmu_objset_destroy(clone1name, B_FALSE);
+               fatal(0, "dsl_destroy_snapshot(%s) = %d", snap2name, error);
+       error = dsl_destroy_head(clone1name);
        if (error && error != ENOENT)
-               fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error);
-       error = dmu_objset_destroy(snap1name, B_FALSE);
+               fatal(0, "dsl_destroy_head(%s) = %d", clone1name, error);
+       error = dsl_destroy_snapshot(snap1name, B_FALSE);
        if (error && error != ENOENT)
-               fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error);
+               fatal(0, "dsl_destroy_snapshot(%s) = %d", snap1name, error);
 
        umem_free(snap1name, MAXNAMELEN);
        umem_free(clone1name, MAXNAMELEN);
@@ -3426,8 +3477,7 @@ ztest_dsl_dataset_cleanup(char *osname, uint64_t id)
 void
 ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
 {
-       objset_t *clone;
-       dsl_dataset_t *ds;
+       objset_t *os;
        char *snap1name;
        char *clone1name;
        char *snap2name;
@@ -3457,8 +3507,7 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
        (void) snprintf(snap3name, MAXNAMELEN, "%s@s3_%llu",
            clone1name, (u_longlong_t)id);
 
-       error = dmu_objset_snapshot(osname, strchr(snap1name, '@')+1,
-           NULL, NULL, B_FALSE, B_FALSE, -1);
+       error = dmu_objset_snapshot_one(osname, strchr(snap1name, '@') + 1);
        if (error && error != EEXIST) {
                if (error == ENOSPC) {
                        ztest_record_enospc(FTAG);
@@ -3467,12 +3516,7 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
                fatal(0, "dmu_take_snapshot(%s) = %d", snap1name, error);
        }
 
-       error = dmu_objset_hold(snap1name, FTAG, &clone);
-       if (error)
-               fatal(0, "dmu_open_snapshot(%s) = %d", snap1name, error);
-
-       error = dmu_objset_clone(clone1name, dmu_objset_ds(clone), 0);
-       dmu_objset_rele(clone, FTAG);
+       error = dmu_objset_clone(clone1name, snap1name);
        if (error) {
                if (error == ENOSPC) {
                        ztest_record_enospc(FTAG);
@@ -3481,8 +3525,7 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
                fatal(0, "dmu_objset_create(%s) = %d", clone1name, error);
        }
 
-       error = dmu_objset_snapshot(clone1name, strchr(snap2name, '@')+1,
-           NULL, NULL, B_FALSE, B_FALSE, -1);
+       error = dmu_objset_snapshot_one(clone1name, strchr(snap2name, '@') + 1);
        if (error && error != EEXIST) {
                if (error == ENOSPC) {
                        ztest_record_enospc(FTAG);
@@ -3491,8 +3534,7 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
                fatal(0, "dmu_open_snapshot(%s) = %d", snap2name, error);
        }
 
-       error = dmu_objset_snapshot(clone1name, strchr(snap3name, '@')+1,
-           NULL, NULL, B_FALSE, B_FALSE, -1);
+       error = dmu_objset_snapshot_one(clone1name, strchr(snap3name, '@') + 1);
        if (error && error != EEXIST) {
                if (error == ENOSPC) {
                        ztest_record_enospc(FTAG);
@@ -3501,12 +3543,7 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
                fatal(0, "dmu_open_snapshot(%s) = %d", snap3name, error);
        }
 
-       error = dmu_objset_hold(snap3name, FTAG, &clone);
-       if (error)
-               fatal(0, "dmu_open_snapshot(%s) = %d", snap3name, error);
-
-       error = dmu_objset_clone(clone2name, dmu_objset_ds(clone), 0);
-       dmu_objset_rele(clone, FTAG);
+       error = dmu_objset_clone(clone2name, snap3name);
        if (error) {
                if (error == ENOSPC) {
                        ztest_record_enospc(FTAG);
@@ -3515,14 +3552,14 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
                fatal(0, "dmu_objset_create(%s) = %d", clone2name, error);
        }
 
-       error = dsl_dataset_own(snap2name, B_FALSE, FTAG, &ds);
+       error = dmu_objset_own(snap2name, DMU_OST_ANY, B_TRUE, FTAG, &os);
        if (error)
-               fatal(0, "dsl_dataset_own(%s) = %d", snap2name, error);
+               fatal(0, "dmu_objset_own(%s) = %d", snap2name, error);
        error = dsl_dataset_promote(clone2name, NULL);
        if (error != EBUSY)
                fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name,
                    error);
-       dsl_dataset_disown(ds, FTAG);
+       dmu_objset_disown(os, FTAG);
 
 out:
        ztest_dsl_dataset_cleanup(osname, id);
@@ -3537,7 +3574,7 @@ out:
 }
 
 #undef OD_ARRAY_SIZE
-#define OD_ARRAY_SIZE  4
+#define        OD_ARRAY_SIZE   4
 
 /*
  * Verify that dmu_object_{alloc,free} work as expected.
@@ -3550,7 +3587,7 @@ ztest_dmu_object_alloc_free(ztest_ds_t *zd, uint64_t id)
        int size;
        int b;
 
-       size = sizeof(ztest_od_t) * OD_ARRAY_SIZE;
+       size = sizeof (ztest_od_t) * OD_ARRAY_SIZE;
        od = umem_alloc(size, UMEM_NOFAIL);
        batchsize = OD_ARRAY_SIZE;
 
@@ -3572,7 +3609,7 @@ ztest_dmu_object_alloc_free(ztest_ds_t *zd, uint64_t id)
 }
 
 #undef OD_ARRAY_SIZE
-#define OD_ARRAY_SIZE  2
+#define        OD_ARRAY_SIZE   2
 
 /*
  * Verify that dmu_{read,write} work as expected.
@@ -3584,7 +3621,7 @@ ztest_dmu_read_write(ztest_ds_t *zd, uint64_t id)
        ztest_od_t *od;
 
        objset_t *os = zd->zd_os;
-       size = sizeof(ztest_od_t) * OD_ARRAY_SIZE;
+       size = sizeof (ztest_od_t) * OD_ARRAY_SIZE;
        od = umem_alloc(size, UMEM_NOFAIL);
        dmu_tx_t *tx;
        int i, freeit, error;
@@ -3690,6 +3727,9 @@ ztest_dmu_read_write(ztest_ds_t *zd, uint64_t id)
        else
                dmu_tx_hold_write(tx, bigobj, bigoff, bigsize);
 
+       /* This accounts for setting the checksum/compression. */
+       dmu_tx_hold_bonus(tx, bigobj);
+
        txg = ztest_tx_assign(tx, TXG_MIGHTWAIT, FTAG);
        if (txg == 0) {
                umem_free(packbuf, packsize);
@@ -3848,7 +3888,7 @@ compare_and_update_pbbufs(uint64_t s, bufwad_t *packbuf, bufwad_t *bigbuf,
 }
 
 #undef OD_ARRAY_SIZE
-#define OD_ARRAY_SIZE  2
+#define        OD_ARRAY_SIZE   2
 
 void
 ztest_dmu_read_write_zcopy(ztest_ds_t *zd, uint64_t id)
@@ -3871,7 +3911,7 @@ ztest_dmu_read_write_zcopy(ztest_ds_t *zd, uint64_t id)
        arc_buf_t **bigbuf_arcbufs;
        dmu_object_info_t doi;
 
-       size = sizeof(ztest_od_t) * OD_ARRAY_SIZE;
+       size = sizeof (ztest_od_t) * OD_ARRAY_SIZE;
        od = umem_alloc(size, UMEM_NOFAIL);
 
        /*
@@ -4092,7 +4132,7 @@ ztest_dmu_write_parallel(ztest_ds_t *zd, uint64_t id)
 {
        ztest_od_t *od;
 
-       od = umem_alloc(sizeof(ztest_od_t), UMEM_NOFAIL);
+       od = umem_alloc(sizeof (ztest_od_t), UMEM_NOFAIL);
        uint64_t offset = (1ULL << (ztest_random(20) + 43)) +
            (ztest_random(ZTEST_RANGE_LOCKS) << SPA_MAXBLOCKSHIFT);
 
@@ -4109,7 +4149,7 @@ ztest_dmu_write_parallel(ztest_ds_t *zd, uint64_t id)
        while (ztest_random(10) != 0)
                ztest_io(zd, od->od_object, offset);
 
-       umem_free(od, sizeof(ztest_od_t));
+       umem_free(od, sizeof (ztest_od_t));
 }
 
 void
@@ -4122,17 +4162,18 @@ ztest_dmu_prealloc(ztest_ds_t *zd, uint64_t id)
        uint64_t blocksize = ztest_random_blocksize();
        void *data;
 
-       od = umem_alloc(sizeof(ztest_od_t), UMEM_NOFAIL);
+       od = umem_alloc(sizeof (ztest_od_t), UMEM_NOFAIL);
 
        ztest_od_init(od, id, FTAG, 0, DMU_OT_UINT64_OTHER, blocksize, 0);
 
-       if (ztest_object_init(zd, od, sizeof (ztest_od_t), !ztest_random(2)) != 0) {
-               umem_free(od, sizeof(ztest_od_t));
+       if (ztest_object_init(zd, od, sizeof (ztest_od_t),
+           !ztest_random(2)) != 0) {
+               umem_free(od, sizeof (ztest_od_t));
                return;
        }
 
        if (ztest_truncate(zd, od->od_object, offset, count * blocksize) != 0) {
-               umem_free(od, sizeof(ztest_od_t));
+               umem_free(od, sizeof (ztest_od_t));
                return;
        }
 
@@ -4150,7 +4191,7 @@ ztest_dmu_prealloc(ztest_ds_t *zd, uint64_t id)
        }
 
        umem_free(data, blocksize);
-       umem_free(od, sizeof(ztest_od_t));
+       umem_free(od, sizeof (ztest_od_t));
 }
 
 /*
@@ -4175,7 +4216,7 @@ ztest_zap(ztest_ds_t *zd, uint64_t id)
        int error;
        char *hc[2] = { "s.acl.h", ".s.open.h.hyLZlg" };
 
-       od = umem_alloc(sizeof(ztest_od_t), UMEM_NOFAIL);
+       od = umem_alloc(sizeof (ztest_od_t), UMEM_NOFAIL);
        ztest_od_init(od, id, FTAG, 0, DMU_OT_ZAP_OTHER, 0, 0);
 
        if (ztest_object_init(zd, od, sizeof (ztest_od_t),
@@ -4298,7 +4339,7 @@ ztest_zap(ztest_ds_t *zd, uint64_t id)
        VERIFY3U(0, ==, zap_remove(os, object, propname, tx));
        dmu_tx_commit(tx);
 out:
-       umem_free(od, sizeof(ztest_od_t));
+       umem_free(od, sizeof (ztest_od_t));
 }
 
 /*
@@ -4312,7 +4353,7 @@ ztest_fzap(ztest_ds_t *zd, uint64_t id)
        uint64_t object, txg;
        int i;
 
-       od = umem_alloc(sizeof(ztest_od_t), UMEM_NOFAIL);
+       od = umem_alloc(sizeof (ztest_od_t), UMEM_NOFAIL);
        ztest_od_init(od, id, FTAG, 0, DMU_OT_ZAP_OTHER, 0, 0);
 
        if (ztest_object_init(zd, od, sizeof (ztest_od_t),
@@ -4345,7 +4386,7 @@ ztest_fzap(ztest_ds_t *zd, uint64_t id)
                dmu_tx_commit(tx);
        }
 out:
-       umem_free(od, sizeof(ztest_od_t));
+       umem_free(od, sizeof (ztest_od_t));
 }
 
 /* ARGSUSED */
@@ -4361,11 +4402,11 @@ ztest_zap_parallel(ztest_ds_t *zd, uint64_t id)
        char name[20], string_value[20];
        void *data;
 
-       od = umem_alloc(sizeof(ztest_od_t), UMEM_NOFAIL);
+       od = umem_alloc(sizeof (ztest_od_t), UMEM_NOFAIL);
        ztest_od_init(od, ID_PARALLEL, FTAG, micro, DMU_OT_ZAP_OTHER, 0, 0);
 
        if (ztest_object_init(zd, od, sizeof (ztest_od_t), B_FALSE) != 0) {
-               umem_free(od, sizeof(ztest_od_t));
+               umem_free(od, sizeof (ztest_od_t));
                return;
        }
 
@@ -4396,7 +4437,7 @@ ztest_zap_parallel(ztest_ds_t *zd, uint64_t id)
        }
 
        count = -1ULL;
-       VERIFY(zap_count(os, object, &count) == 0);
+       VERIFY0(zap_count(os, object, &count));
        ASSERT(count != -1ULL);
 
        /*
@@ -4459,7 +4500,7 @@ ztest_zap_parallel(ztest_ds_t *zd, uint64_t id)
        if (tx != NULL)
                dmu_tx_commit(tx);
 
-       umem_free(od, sizeof(ztest_od_t));
+       umem_free(od, sizeof (ztest_od_t));
 }
 
 /*
@@ -4550,11 +4591,11 @@ ztest_dmu_commit_callbacks(ztest_ds_t *zd, uint64_t id)
        uint64_t old_txg, txg;
        int i, error = 0;
 
-       od = umem_alloc(sizeof(ztest_od_t), UMEM_NOFAIL);
+       od = umem_alloc(sizeof (ztest_od_t), UMEM_NOFAIL);
        ztest_od_init(od, id, FTAG, 0, DMU_OT_UINT64_OTHER, 0, 0);
 
        if (ztest_object_init(zd, od, sizeof (ztest_od_t), B_FALSE) != 0) {
-               umem_free(od, sizeof(ztest_od_t));
+               umem_free(od, sizeof (ztest_od_t));
                return;
        }
 
@@ -4597,7 +4638,7 @@ ztest_dmu_commit_callbacks(ztest_ds_t *zd, uint64_t id)
                        umem_free(cb_data[i], sizeof (ztest_cb_data_t));
                }
 
-               umem_free(od, sizeof(ztest_od_t));
+               umem_free(od, sizeof (ztest_od_t));
                return;
        }
 
@@ -4669,7 +4710,7 @@ ztest_dmu_commit_callbacks(ztest_ds_t *zd, uint64_t id)
 
        dmu_tx_commit(tx);
 
-       umem_free(od, sizeof(ztest_od_t));
+       umem_free(od, sizeof (ztest_od_t));
 }
 
 /* ARGSUSED */
@@ -4714,6 +4755,22 @@ ztest_spa_prop_get_set(ztest_ds_t *zd, uint64_t id)
        (void) rw_exit(&ztest_name_lock);
 }
 
+static int
+user_release_one(const char *snapname, const char *holdname)
+{
+       nvlist_t *snaps, *holds;
+       int error;
+
+       snaps = fnvlist_alloc();
+       holds = fnvlist_alloc();
+       fnvlist_add_boolean(holds, holdname);
+       fnvlist_add_nvlist(snaps, snapname, holds);
+       fnvlist_free(holds);
+       error = dsl_dataset_user_release(snaps, NULL);
+       fnvlist_free(snaps);
+       return (error);
+}
+
 /*
  * Test snapshot hold/release and deferred destroy.
  */
@@ -4728,29 +4785,37 @@ ztest_dmu_snapshot_hold(ztest_ds_t *zd, uint64_t id)
        char clonename[100];
        char tag[100];
        char osname[MAXNAMELEN];
+       nvlist_t *holds;
 
        (void) rw_enter(&ztest_name_lock, RW_READER);
 
        dmu_objset_name(os, osname);
 
-       (void) snprintf(snapname, 100, "sh1_%llu", (u_longlong_t)id);
-       (void) snprintf(fullname, 100, "%s@%s", osname, snapname);
-       (void) snprintf(clonename, 100, "%s/ch1_%llu",osname,(u_longlong_t)id);
-       (void) snprintf(tag, 100, "tag_%llu", (u_longlong_t)id);
+       (void) snprintf(snapname, sizeof (snapname), "sh1_%llu",
+           (u_longlong_t)id);
+       (void) snprintf(fullname, sizeof (fullname), "%s@%s", osname, snapname);
+       (void) snprintf(clonename, sizeof (clonename),
+           "%s/ch1_%llu", osname, (u_longlong_t)id);
+       (void) snprintf(tag, sizeof (tag), "tag_%llu", (u_longlong_t)id);
 
        /*
         * Clean up from any previous run.
         */
-       (void) dmu_objset_destroy(clonename, B_FALSE);
-       (void) dsl_dataset_user_release(osname, snapname, tag, B_FALSE);
-       (void) dmu_objset_destroy(fullname, B_FALSE);
+       error = dsl_destroy_head(clonename);
+       if (error != ENOENT)
+               ASSERT0(error);
+       error = user_release_one(fullname, tag);
+       if (error != ESRCH && error != ENOENT)
+               ASSERT0(error);
+       error = dsl_destroy_snapshot(fullname, B_FALSE);
+       if (error != ENOENT)
+               ASSERT0(error);
 
        /*
         * Create snapshot, clone it, mark snap for deferred destroy,
         * destroy clone, verify snap was also destroyed.
         */
-       error = dmu_objset_snapshot(osname, snapname, NULL, NULL, FALSE,
-           FALSE, -1);
+       error = dmu_objset_snapshot_one(osname, snapname);
        if (error) {
                if (error == ENOSPC) {
                        ztest_record_enospc("dmu_objset_snapshot");
@@ -4759,12 +4824,7 @@ ztest_dmu_snapshot_hold(ztest_ds_t *zd, uint64_t id)
                fatal(0, "dmu_objset_snapshot(%s) = %d", fullname, error);
        }
 
-       error = dmu_objset_hold(fullname, FTAG, &origin);
-       if (error)
-               fatal(0, "dmu_objset_hold(%s) = %d", fullname, error);
-
-       error = dmu_objset_clone(clonename, dmu_objset_ds(origin), 0);
-       dmu_objset_rele(origin, FTAG);
+       error = dmu_objset_clone(clonename, fullname);
        if (error) {
                if (error == ENOSPC) {
                        ztest_record_enospc("dmu_objset_clone");
@@ -4773,15 +4833,15 @@ ztest_dmu_snapshot_hold(ztest_ds_t *zd, uint64_t id)
                fatal(0, "dmu_objset_clone(%s) = %d", clonename, error);
        }
 
-       error = dmu_objset_destroy(fullname, B_TRUE);
+       error = dsl_destroy_snapshot(fullname, B_TRUE);
        if (error) {
-               fatal(0, "dmu_objset_destroy(%s, B_TRUE) = %d",
+               fatal(0, "dsl_destroy_snapshot(%s, B_TRUE) = %d",
                    fullname, error);
        }
 
-       error = dmu_objset_destroy(clonename, B_FALSE);
+       error = dsl_destroy_head(clonename);
        if (error)
-               fatal(0, "dmu_objset_destroy(%s) = %d", clonename, error);
+               fatal(0, "dsl_destroy_head(%s) = %d", clonename, error);
 
        error = dmu_objset_hold(fullname, FTAG, &origin);
        if (error != ENOENT)
@@ -4792,8 +4852,7 @@ ztest_dmu_snapshot_hold(ztest_ds_t *zd, uint64_t id)
         * destroy a held snapshot, mark for deferred destroy,
         * release hold, verify snapshot was destroyed.
         */
-       error = dmu_objset_snapshot(osname, snapname, NULL, NULL, FALSE,
-           FALSE, -1);
+       error = dmu_objset_snapshot_one(osname, snapname);
        if (error) {
                if (error == ENOSPC) {
                        ztest_record_enospc("dmu_objset_snapshot");
@@ -4802,28 +4861,31 @@ ztest_dmu_snapshot_hold(ztest_ds_t *zd, uint64_t id)
                fatal(0, "dmu_objset_snapshot(%s) = %d", fullname, error);
        }
 
-       error = dsl_dataset_user_hold(osname, snapname, tag, B_FALSE,
-           B_TRUE, -1);
+       holds = fnvlist_alloc();
+       fnvlist_add_string(holds, fullname, tag);
+       error = dsl_dataset_user_hold(holds, 0, NULL);
+       fnvlist_free(holds);
+
        if (error)
                fatal(0, "dsl_dataset_user_hold(%s)", fullname, tag);
 
-       error = dmu_objset_destroy(fullname, B_FALSE);
+       error = dsl_destroy_snapshot(fullname, B_FALSE);
        if (error != EBUSY) {
-               fatal(0, "dmu_objset_destroy(%s, B_FALSE) = %d",
+               fatal(0, "dsl_destroy_snapshot(%s, B_FALSE) = %d",
                    fullname, error);
        }
 
-       error = dmu_objset_destroy(fullname, B_TRUE);
+       error = dsl_destroy_snapshot(fullname, B_TRUE);
        if (error) {
-               fatal(0, "dmu_objset_destroy(%s, B_TRUE) = %d",
+               fatal(0, "dsl_destroy_snapshot(%s, B_TRUE) = %d",
                    fullname, error);
        }
 
-       error = dsl_dataset_user_release(osname, snapname, tag, B_FALSE);
+       error = user_release_one(fullname, tag);
        if (error)
-               fatal(0, "dsl_dataset_user_release(%s)", fullname, tag);
+               fatal(0, "user_release_one(%s, %s) = %d", fullname, tag, error);
 
-       VERIFY(dmu_objset_hold(fullname, FTAG, &origin) == ENOENT);
+       VERIFY3U(dmu_objset_hold(fullname, FTAG, &origin), ==, ENOENT);
 
 out:
        (void) rw_exit(&ztest_name_lock);
@@ -4865,6 +4927,14 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
 
        ASSERT(leaves >= 1);
 
+       /*
+        * Grab the name lock as reader. There are some operations
+        * which don't like to have their vdevs changed while
+        * they are in progress (i.e. spa_change_guid). Those
+        * operations will have grabbed the name lock as writer.
+        */
+       (void) rw_enter(&ztest_name_lock, RW_READER);
+
        /*
         * We need SCL_STATE here because we're going to look at vd0->vdev_tsd.
         */
@@ -4894,7 +4964,14 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
                if (vd0 != NULL && vd0->vdev_top->vdev_islog)
                        islog = B_TRUE;
 
-               if (vd0 != NULL && maxfaults != 1) {
+               /*
+                * If the top-level vdev needs to be resilvered
+                * then we only allow faults on the device that is
+                * resilvering.
+                */
+               if (vd0 != NULL && maxfaults != 1 &&
+                   (!vdev_resilver_needed(vd0->vdev_top, NULL, NULL) ||
+                   vd0->vdev_resilver_txg != 0)) {
                        /*
                         * Make vd0 explicitly claim to be unreadable,
                         * or unwriteable, or reach behind its back
@@ -4925,6 +5002,7 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
 
                if (sav->sav_count == 0) {
                        spa_config_exit(spa, SCL_STATE, FTAG);
+                       (void) rw_exit(&ztest_name_lock);
                        goto out;
                }
                vd0 = sav->sav_vdevs[ztest_random(sav->sav_count)];
@@ -4938,6 +5016,7 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
        }
 
        spa_config_exit(spa, SCL_STATE, FTAG);
+       (void) rw_exit(&ztest_name_lock);
 
        /*
         * If we can tolerate two or more faults, or we're dealing
@@ -4953,7 +5032,7 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
                         * prevent a race between offlining a slog and
                         * destroying a dataset. Offlining the slog will
                         * grab a reference on the dataset which may cause
-                        * dmu_objset_destroy() to fail with EBUSY thus
+                        * dsl_destroy_head() to fail with EBUSY thus
                         * leaving the dataset in an inconsistent state.
                         */
                        if (islog)
@@ -5047,11 +5126,11 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id)
        blocksize = ztest_random_blocksize();
        blocksize = MIN(blocksize, 2048);       /* because we write so many */
 
-       od = umem_alloc(sizeof(ztest_od_t), UMEM_NOFAIL);
+       od = umem_alloc(sizeof (ztest_od_t), UMEM_NOFAIL);
        ztest_od_init(od, id, FTAG, 0, DMU_OT_UINT64_OTHER, blocksize, 0);
 
        if (ztest_object_init(zd, od, sizeof (ztest_od_t), B_FALSE) != 0) {
-               umem_free(od, sizeof(ztest_od_t));
+               umem_free(od, sizeof (ztest_od_t));
                return;
        }
 
@@ -5066,7 +5145,7 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id)
            ztest_dsl_prop_set_uint64(zd->zd_name, ZFS_PROP_COPIES, 1,
            B_FALSE) != 0) {
                (void) rw_exit(&ztest_name_lock);
-               umem_free(od, sizeof(ztest_od_t));
+               umem_free(od, sizeof (ztest_od_t));
                return;
        }
 
@@ -5081,7 +5160,7 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id)
        txg = ztest_tx_assign(tx, TXG_WAIT, FTAG);
        if (txg == 0) {
                (void) rw_exit(&ztest_name_lock);
-               umem_free(od, sizeof(ztest_od_t));
+               umem_free(od, sizeof (ztest_od_t));
                return;
        }
 
@@ -5090,8 +5169,12 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id)
         */
        for (i = 0; i < copies; i++) {
                uint64_t offset = i * blocksize;
-               VERIFY(dmu_buf_hold(os, object, offset, FTAG, &db,
-                   DMU_READ_NO_PREFETCH) == 0);
+               int error = dmu_buf_hold(os, object, offset, FTAG, &db,
+                   DMU_READ_NO_PREFETCH);
+               if (error != 0) {
+                       fatal(B_FALSE, "dmu_buf_hold(%p, %llu, %llu) = %u",
+                           os, (long long)object, (long long) offset, error);
+               }
                ASSERT(db->db_offset == offset);
                ASSERT(db->db_size == blocksize);
                ASSERT(ztest_pattern_match(db->db_data, db->db_size, pattern) ||
@@ -5107,8 +5190,8 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id)
        /*
         * Find out what block we got.
         */
-       VERIFY(dmu_buf_hold(os, object, 0, FTAG, &db,
-           DMU_READ_NO_PREFETCH) == 0);
+       VERIFY0(dmu_buf_hold(os, object, 0, FTAG, &db,
+           DMU_READ_NO_PREFETCH));
        blk = *((dmu_buf_impl_t *)db)->db_blkptr;
        dmu_buf_rele(db, FTAG);
 
@@ -5126,7 +5209,7 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id)
        zio_buf_free(buf, psize);
 
        (void) rw_exit(&ztest_name_lock);
-       umem_free(od, sizeof(ztest_od_t));
+       umem_free(od, sizeof (ztest_od_t));
 }
 
 /*
@@ -5306,6 +5389,7 @@ ztest_spa_import_export(char *oldname, char *newname)
        nvlist_t *config, *newconfig;
        uint64_t pool_guid;
        spa_t *spa;
+       int error;
 
        if (ztest_opts.zo_verbose >= 4) {
                (void) printf("import/export: old = %s, new = %s\n",
@@ -5350,7 +5434,12 @@ ztest_spa_import_export(char *oldname, char *newname)
        /*
         * Import it under the new name.
         */
-       VERIFY3U(0, ==, spa_import(newname, config, NULL, 0));
+       error = spa_import(newname, config, NULL, 0);
+       if (error != 0) {
+               dump_nvlist(config, 0);
+               fatal(B_FALSE, "couldn't import pool %s as %s: error %u",
+                   oldname, newname, error);
+       }
 
        ztest_walk_pool_directory("pools after import");
 
@@ -5406,7 +5495,7 @@ ztest_resume_thread(void *arg)
        return (NULL);
 }
 
-#define GRACE  300
+#define        GRACE   300
 
 #if 0
 static void
@@ -5557,7 +5646,7 @@ ztest_dataset_open(int d)
        }
        ASSERT(error == 0 || error == EEXIST);
 
-       VERIFY0(dmu_objset_hold(name, zd, &os));
+       VERIFY0(dmu_objset_own(name, DMU_OST_OTHER, B_FALSE, zd, &os));
        (void) rw_exit(&ztest_name_lock);
 
        ztest_zd_init(zd, ZTEST_GET_SHARED_DS(d), os);
@@ -5598,7 +5687,7 @@ ztest_dataset_close(int d)
        ztest_ds_t *zd = &ztest_ds[d];
 
        zil_close(zd->zd_zilog);
-       dmu_objset_rele(zd->zd_os, zd);
+       dmu_objset_disown(zd->zd_os, zd);
 
        ztest_zd_fini(zd);
 }
@@ -5644,13 +5733,14 @@ ztest_run(ztest_shared_t *zs)
         * Open our pool.
         */
        kernel_init(FREAD | FWRITE);
-       VERIFY(spa_open(ztest_opts.zo_pool, &spa, FTAG) == 0);
+       VERIFY0(spa_open(ztest_opts.zo_pool, &spa, FTAG));
        spa->spa_debug = B_TRUE;
        ztest_spa = spa;
 
-       VERIFY3U(0, ==, dmu_objset_hold(ztest_opts.zo_pool, FTAG, &os));
+       VERIFY0(dmu_objset_own(ztest_opts.zo_pool,
+           DMU_OST_ANY, B_TRUE, FTAG, &os));
        zs->zs_guid = dmu_objset_fsid_guid(os);
-       dmu_objset_rele(os, FTAG);
+       dmu_objset_disown(os, FTAG);
 
        spa->spa_dedup_ditto = 2 * ZIO_DEDUPDITTO_MIN;
 
@@ -5741,6 +5831,9 @@ ztest_run(ztest_shared_t *zs)
        zs->zs_alloc = metaslab_class_get_alloc(spa_normal_class(spa));
        zs->zs_space = metaslab_class_get_space(spa_normal_class(spa));
 
+       if (ztest_opts.zo_verbose >= 3)
+               zfs_dbgmsg_print(FTAG);
+
        umem_free(tid, ztest_opts.zo_threads * sizeof (kt_did_t));
 
        /* Kill the resume thread */
@@ -5803,6 +5896,8 @@ ztest_freeze(void)
        kernel_init(FREAD | FWRITE);
        VERIFY3U(0, ==, spa_open(ztest_opts.zo_pool, &spa, FTAG));
        VERIFY3U(0, ==, ztest_dataset_open(0));
+       spa->spa_debug = B_TRUE;
+       ztest_spa = spa;
 
        /*
         * Force the first log block to be transactionally allocated.
@@ -5938,8 +6033,7 @@ ztest_init(ztest_shared_t *zs)
                VERIFY3U(0, ==, nvlist_add_uint64(props, buf, 0));
                free(buf);
        }
-       VERIFY3U(0, ==, spa_create(ztest_opts.zo_pool, nvroot, props,
-           NULL, NULL));
+       VERIFY3U(0, ==, spa_create(ztest_opts.zo_pool, nvroot, props, NULL));
        nvlist_free(nvroot);
 
        VERIFY3U(0, ==, spa_open(ztest_opts.zo_pool, &spa, FTAG));
@@ -6153,11 +6247,12 @@ main(int argc, char **argv)
 
        (void) setvbuf(stdout, NULL, _IOLBF, 0);
 
+       dprintf_setup(&argc, argv);
+
        ztest_fd_rand = open("/dev/urandom", O_RDONLY);
        ASSERT3S(ztest_fd_rand, >=, 0);
 
        if (!fd_data_str) {
-               dprintf_setup(&argc, argv);
                process_options(argc, argv);
 
                setup_data_fd();