Fix dbuf_dirty_record_t leaks
[zfs.git] / cmd / ztest / ztest.c
index b2d81b5..b5cee5b 100644 (file)
@@ -341,6 +341,22 @@ static boolean_t ztest_exiting;
 
 /* Global commit callback list */
 static ztest_cb_list_t zcl;
+/* Commit cb delay */
+static uint64_t zc_min_txg_delay = UINT64_MAX;
+static int zc_cb_counter = 0;
+
+/*
+ * Minimum number of commit callbacks that need to be registered for us to check
+ * whether the minimum txg delay is acceptable.
+ */
+#define        ZTEST_COMMIT_CB_MIN_REG 100
+
+/*
+ * If a number of txgs equal to this threshold have been created after a commit
+ * callback has been registered but not called, then we assume there is an
+ * implementation bug.
+ */
+#define        ZTEST_COMMIT_CB_THRESH  (TXG_CONCURRENT_STATES + 1000)
 
 extern uint64_t metaslab_gang_bang;
 extern uint64_t metaslab_df_alloc_threshold;
@@ -359,7 +375,7 @@ static void usage(boolean_t) __NORETURN;
  * debugging facilities.
  */
 const char *
-_umem_debug_init()
+_umem_debug_init(void)
 {
        return ("default,verbose"); /* $UMEM_DEBUG setting */
 }
@@ -979,25 +995,28 @@ ztest_zd_init(ztest_ds_t *zd, objset_t *os)
        zd->zd_zilog = dmu_objset_zil(os);
        zd->zd_seq = 0;
        dmu_objset_name(os, zd->zd_name);
+       int l;
 
        VERIFY(_mutex_init(&zd->zd_dirobj_lock, USYNC_THREAD, NULL) == 0);
 
-       for (int l = 0; l < ZTEST_OBJECT_LOCKS; l++)
+       for (l = 0; l < ZTEST_OBJECT_LOCKS; l++)
                ztest_rll_init(&zd->zd_object_lock[l]);
 
-       for (int l = 0; l < ZTEST_RANGE_LOCKS; l++)
+       for (l = 0; l < ZTEST_RANGE_LOCKS; l++)
                ztest_rll_init(&zd->zd_range_lock[l]);
 }
 
 static void
 ztest_zd_fini(ztest_ds_t *zd)
 {
+       int l;
+
        VERIFY(_mutex_destroy(&zd->zd_dirobj_lock) == 0);
 
-       for (int l = 0; l < ZTEST_OBJECT_LOCKS; l++)
+       for (l = 0; l < ZTEST_OBJECT_LOCKS; l++)
                ztest_rll_destroy(&zd->zd_object_lock[l]);
 
-       for (int l = 0; l < ZTEST_RANGE_LOCKS; l++)
+       for (l = 0; l < ZTEST_RANGE_LOCKS; l++)
                ztest_rll_destroy(&zd->zd_range_lock[l]);
 }
 
@@ -1039,6 +1058,7 @@ ztest_pattern_set(void *buf, uint64_t size, uint64_t value)
                *ip++ = value;
 }
 
+#ifndef NDEBUG
 static boolean_t
 ztest_pattern_match(void *buf, uint64_t size, uint64_t value)
 {
@@ -1051,6 +1071,7 @@ ztest_pattern_match(void *buf, uint64_t size, uint64_t value)
 
        return (diff == 0);
 }
+#endif
 
 static void
 ztest_bt_generate(ztest_block_tag_t *bt, objset_t *os, uint64_t object,
@@ -1576,26 +1597,26 @@ ztest_replay_setattr(ztest_ds_t *zd, lr_setattr_t *lr, boolean_t byteswap)
 }
 
 zil_replay_func_t *ztest_replay_vector[TX_MAX_TYPE] = {
-       NULL,                   /* 0 no such transaction type */
-       ztest_replay_create,    /* TX_CREATE */
-       NULL,                   /* TX_MKDIR */
-       NULL,                   /* TX_MKXATTR */
-       NULL,                   /* TX_SYMLINK */
-       ztest_replay_remove,    /* TX_REMOVE */
-       NULL,                   /* TX_RMDIR */
-       NULL,                   /* TX_LINK */
-       NULL,                   /* TX_RENAME */
-       ztest_replay_write,     /* TX_WRITE */
-       ztest_replay_truncate,  /* TX_TRUNCATE */
-       ztest_replay_setattr,   /* TX_SETATTR */
-       NULL,                   /* TX_ACL */
-       NULL,                   /* TX_CREATE_ACL */
-       NULL,                   /* TX_CREATE_ATTR */
-       NULL,                   /* TX_CREATE_ACL_ATTR */
-       NULL,                   /* TX_MKDIR_ACL */
-       NULL,                   /* TX_MKDIR_ATTR */
-       NULL,                   /* TX_MKDIR_ACL_ATTR */
-       NULL,                   /* TX_WRITE2 */
+       NULL,                           /* 0 no such transaction type */
+       (zil_replay_func_t *)ztest_replay_create,       /* TX_CREATE */
+       NULL,                                           /* TX_MKDIR */
+       NULL,                                           /* TX_MKXATTR */
+       NULL,                                           /* TX_SYMLINK */
+       (zil_replay_func_t *)ztest_replay_remove,       /* TX_REMOVE */
+       NULL,                                           /* TX_RMDIR */
+       NULL,                                           /* TX_LINK */
+       NULL,                                           /* TX_RENAME */
+       (zil_replay_func_t *)ztest_replay_write,        /* TX_WRITE */
+       (zil_replay_func_t *)ztest_replay_truncate,     /* TX_TRUNCATE */
+       (zil_replay_func_t *)ztest_replay_setattr,      /* TX_SETATTR */
+       NULL,                                           /* TX_ACL */
+       NULL,                                           /* TX_CREATE_ACL */
+       NULL,                                           /* TX_CREATE_ATTR */
+       NULL,                                           /* TX_CREATE_ACL_ATTR */
+       NULL,                                           /* TX_MKDIR_ACL */
+       NULL,                                           /* TX_MKDIR_ATTR */
+       NULL,                                           /* TX_MKDIR_ACL_ATTR */
+       NULL,                                           /* TX_WRITE2 */
 };
 
 /*
@@ -1731,10 +1752,11 @@ ztest_lookup(ztest_ds_t *zd, ztest_od_t *od, int count)
 {
        int missing = 0;
        int error;
+       int i;
 
        ASSERT(_mutex_held(&zd->zd_dirobj_lock));
 
-       for (int i = 0; i < count; i++, od++) {
+       for (i = 0; i < count; i++, od++) {
                od->od_object = 0;
                error = zap_lookup(zd->zd_os, od->od_dir, od->od_name,
                    sizeof (uint64_t), 1, &od->od_object);
@@ -1771,10 +1793,11 @@ static int
 ztest_create(ztest_ds_t *zd, ztest_od_t *od, int count)
 {
        int missing = 0;
+       int i;
 
        ASSERT(_mutex_held(&zd->zd_dirobj_lock));
 
-       for (int i = 0; i < count; i++, od++) {
+       for (i = 0; i < count; i++, od++) {
                if (missing) {
                        od->od_object = 0;
                        missing++;
@@ -1816,12 +1839,13 @@ ztest_remove(ztest_ds_t *zd, ztest_od_t *od, int count)
 {
        int missing = 0;
        int error;
+       int i;
 
        ASSERT(_mutex_held(&zd->zd_dirobj_lock));
 
        od += count - 1;
 
-       for (int i = count - 1; i >= 0; i--, od--) {
+       for (i = count - 1; i >= 0; i--, od--) {
                if (missing) {
                        missing++;
                        continue;
@@ -1992,6 +2016,8 @@ ztest_io(ztest_ds_t *zd, uint64_t object, uint64_t offset)
        case ZTEST_IO_SETATTR:
                (void) ztest_setattr(zd, object);
                break;
+       default:
+               break;
        }
 
        umem_free(data, blocksize);
@@ -2016,7 +2042,7 @@ ztest_od_init(ztest_od_t *od, uint64_t id, char *tag, uint64_t index,
        od->od_gen = 0;
 
        (void) snprintf(od->od_name, sizeof (od->od_name), "%s(%lld)[%llu]",
-           tag, (int64_t)id, index);
+           tag, (longlong_t)id, (u_longlong_t)index);
 }
 
 /*
@@ -2108,11 +2134,12 @@ static vdev_t *
 vdev_lookup_by_path(vdev_t *vd, const char *path)
 {
        vdev_t *mvd;
+       int c;
 
        if (vd->vdev_path != NULL && strcmp(path, vd->vdev_path) == 0)
                return (vd);
 
-       for (int c = 0; c < vd->vdev_children; c++)
+       for (c = 0; c < vd->vdev_children; c++)
                if ((mvd = vdev_lookup_by_path(vd->vdev_child[c], path)) !=
                    NULL)
                        return (mvd);
@@ -2573,7 +2600,7 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id)
 vdev_t *
 grow_vdev(vdev_t *vd, void *arg)
 {
-       spa_t *spa = vd->vdev_spa;
+       ASSERTV(spa_t *spa = vd->vdev_spa);
        size_t *newsize = arg;
        size_t fsize;
        int fd;
@@ -2585,7 +2612,7 @@ grow_vdev(vdev_t *vd, void *arg)
                return (vd);
 
        fsize = lseek(fd, 0, SEEK_END);
-       (void) ftruncate(fd, *newsize);
+       VERIFY(ftruncate(fd, *newsize) == 0);
 
        if (zopt_verbose >= 6) {
                (void) printf("%s grew from %lu to %lu bytes\n",
@@ -2662,6 +2689,8 @@ online_vdev(vdev_t *vd, void *arg)
 vdev_t *
 vdev_walk_tree(vdev_t *vd, vdev_t *(*func)(vdev_t *, void *), void *arg)
 {
+       uint_t c;
+
        if (vd->vdev_ops->vdev_op_leaf) {
                if (func == NULL)
                        return (vd);
@@ -2669,7 +2698,7 @@ vdev_walk_tree(vdev_t *vd, vdev_t *(*func)(vdev_t *, void *), void *arg)
                        return (func(vd, arg));
        }
 
-       for (uint_t c = 0; c < vd->vdev_children; c++) {
+       for (c = 0; c < vd->vdev_children; c++) {
                vdev_t *cvd = vd->vdev_child[c];
                if ((cvd = vdev_walk_tree(cvd, func, arg)) != NULL)
                        return (cvd);
@@ -2914,6 +2943,7 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id)
        objset_t *os, *os2;
        char name[MAXNAMELEN];
        zilog_t *zilog;
+       int i;
 
        (void) rw_rdlock(&zs->zs_name_lock);
 
@@ -2974,7 +3004,7 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id)
         * and randomly take a couple of snapshots along the way.
         */
        iters = ztest_random(5);
-       for (int i = 0; i < iters; i++) {
+       for (i = 0; i < iters; i++) {
                ztest_dmu_object_alloc_free(&zdtmp, id);
                if (ztest_random(iters) == 0)
                        (void) ztest_snapshot_create(name, i);
@@ -3032,11 +3062,16 @@ ztest_dsl_dataset_cleanup(char *osname, uint64_t id)
        char snap3name[MAXNAMELEN];
        int error;
 
-       (void) snprintf(snap1name, MAXNAMELEN, "%s@s1_%llu", osname, id);
-       (void) snprintf(clone1name, MAXNAMELEN, "%s/c1_%llu", osname, id);
-       (void) snprintf(snap2name, MAXNAMELEN, "%s@s2_%llu", clone1name, id);
-       (void) snprintf(clone2name, MAXNAMELEN, "%s/c2_%llu", osname, id);
-       (void) snprintf(snap3name, MAXNAMELEN, "%s@s3_%llu", clone1name, id);
+       (void) snprintf(snap1name, MAXNAMELEN, "%s@s1_%llu",
+           osname, (u_longlong_t)id);
+       (void) snprintf(clone1name, MAXNAMELEN, "%s/c1_%llu",
+           osname, (u_longlong_t)id);
+       (void) snprintf(snap2name, MAXNAMELEN, "%s@s2_%llu",
+           clone1name, (u_longlong_t)id);
+       (void) snprintf(clone2name, MAXNAMELEN, "%s/c2_%llu",
+           osname, (u_longlong_t)id);
+       (void) snprintf(snap3name, MAXNAMELEN, "%s@s3_%llu",
+           clone1name, (u_longlong_t)id);
 
        error = dmu_objset_destroy(clone2name, B_FALSE);
        if (error && error != ENOENT)
@@ -3076,11 +3111,16 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
 
        ztest_dsl_dataset_cleanup(osname, id);
 
-       (void) snprintf(snap1name, MAXNAMELEN, "%s@s1_%llu", osname, id);
-       (void) snprintf(clone1name, MAXNAMELEN, "%s/c1_%llu", osname, id);
-       (void) snprintf(snap2name, MAXNAMELEN, "%s@s2_%llu", clone1name, id);
-       (void) snprintf(clone2name, MAXNAMELEN, "%s/c2_%llu", osname, id);
-       (void) snprintf(snap3name, MAXNAMELEN, "%s@s3_%llu", clone1name, id);
+       (void) snprintf(snap1name, MAXNAMELEN, "%s@s1_%llu",
+           osname, (u_longlong_t)id);
+       (void) snprintf(clone1name, MAXNAMELEN, "%s/c1_%llu",
+           osname, (u_longlong_t)id);
+       (void) snprintf(snap2name, MAXNAMELEN, "%s@s2_%llu",
+           clone1name, (u_longlong_t)id);
+       (void) snprintf(clone2name, MAXNAMELEN, "%s/c2_%llu",
+           osname, (u_longlong_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);
@@ -3163,8 +3203,9 @@ ztest_dmu_object_alloc_free(ztest_ds_t *zd, uint64_t id)
 {
        ztest_od_t od[4];
        int batchsize = sizeof (od) / sizeof (od[0]);
+       int b;
 
-       for (int b = 0; b < batchsize; b++)
+       for (b = 0; b < batchsize; b++)
                ztest_od_init(&od[b], id, FTAG, b, DMU_OT_UINT64_OTHER, 0, 0);
 
        /*
@@ -3880,6 +3921,7 @@ ztest_fzap(ztest_ds_t *zd, uint64_t id)
        objset_t *os = zd->zd_os;
        ztest_od_t od[1];
        uint64_t object, txg;
+       int i;
 
        ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_ZAP_OTHER, 0, 0);
 
@@ -3893,14 +3935,14 @@ ztest_fzap(ztest_ds_t *zd, uint64_t id)
         * and gets upgraded to a fatzap. Also, since we are adding
         * 2050 entries we should see ptrtbl growth and leaf-block split.
         */
-       for (int i = 0; i < 2050; i++) {
+       for (i = 0; i < 2050; i++) {
                char name[MAXNAMELEN];
                uint64_t value = i;
                dmu_tx_t *tx;
                int error;
 
                (void) snprintf(name, sizeof (name), "fzap-%llu-%llu",
-                   id, value);
+                   (u_longlong_t)id, (u_longlong_t)value);
 
                tx = dmu_tx_create(os);
                dmu_tx_hold_zap(tx, object, B_TRUE, name);
@@ -4066,18 +4108,20 @@ ztest_commit_callback(void *arg, int error)
                return;
        }
 
-       /* Was this callback added to the global callback list? */
-       if (!data->zcd_added)
-               goto out;
-
+       ASSERT(data->zcd_added);
        ASSERT3U(data->zcd_txg, !=, 0);
 
-       /* Remove our callback from the list */
        (void) mutex_lock(&zcl.zcl_callbacks_lock);
+
+       /* See if this cb was called more quickly */
+       if ((synced_txg - data->zcd_txg) < zc_min_txg_delay)
+               zc_min_txg_delay = synced_txg - data->zcd_txg;
+
+       /* Remove our callback from the list */
        list_remove(&zcl.zcl_callbacks, data);
+
        (void) mutex_unlock(&zcl.zcl_callbacks_lock);
 
-out:
        umem_free(data, sizeof (ztest_cb_data_t));
 }
 
@@ -4096,13 +4140,6 @@ ztest_create_cb_data(objset_t *os, uint64_t txg)
 }
 
 /*
- * If a number of txgs equal to this threshold have been created after a commit
- * callback has been registered but not called, then we assume there is an
- * implementation bug.
- */
-#define        ZTEST_COMMIT_CALLBACK_THRESH    (TXG_CONCURRENT_STATES + 2)
-
-/*
  * Commit callback test.
  */
 void
@@ -4113,7 +4150,7 @@ ztest_dmu_commit_callbacks(ztest_ds_t *zd, uint64_t id)
        dmu_tx_t *tx;
        ztest_cb_data_t *cb_data[3], *tmp_cb;
        uint64_t old_txg, txg;
-       int i, error;
+       int i, error = 0;
 
        ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, 0, 0);
 
@@ -4193,7 +4230,7 @@ ztest_dmu_commit_callbacks(ztest_ds_t *zd, uint64_t id)
         */
        tmp_cb = list_head(&zcl.zcl_callbacks);
        if (tmp_cb != NULL &&
-           tmp_cb->zcd_txg > txg - ZTEST_COMMIT_CALLBACK_THRESH) {
+           tmp_cb->zcd_txg + ZTEST_COMMIT_CB_THRESH < txg) {
                fatal(0, "Commit callback threshold exceeded, oldest txg: %"
                    PRIu64 ", open txg: %" PRIu64 "\n", tmp_cb->zcd_txg, txg);
        }
@@ -4224,6 +4261,8 @@ ztest_dmu_commit_callbacks(ztest_ds_t *zd, uint64_t id)
                tmp_cb = cb_data[i];
        }
 
+       zc_cb_counter += 3;
+
        (void) mutex_unlock(&zcl.zcl_callbacks_lock);
 
        dmu_tx_commit(tx);
@@ -4240,10 +4279,11 @@ ztest_dsl_prop_get_set(ztest_ds_t *zd, uint64_t id)
                ZFS_PROP_DEDUP
        };
        ztest_shared_t *zs = ztest_shared;
+       int p;
 
        (void) rw_rdlock(&zs->zs_name_lock);
 
-       for (int p = 0; p < sizeof (proplist) / sizeof (proplist[0]); p++)
+       for (p = 0; p < sizeof (proplist) / sizeof (proplist[0]); p++)
                (void) ztest_dsl_prop_set_uint64(zd->zd_name, proplist[p],
                    ztest_random_dsl_prop(proplist[p]), (int)ztest_random(2));
 
@@ -4399,7 +4439,7 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
        int fd;
        uint64_t offset;
        uint64_t leaves;
-       uint64_t bad = 0x1990c0ffeedecade;
+       uint64_t bad = 0x1990c0ffeedecadeull;
        uint64_t top, leaf;
        char path0[MAXPATHLEN];
        char pathrand[MAXPATHLEN];
@@ -4580,6 +4620,7 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id)
        void *buf;
        blkptr_t blk;
        int copies = 2 * ZIO_DEDUPDITTO_MIN;
+       int i;
 
        blocksize = ztest_random_blocksize();
        blocksize = MIN(blocksize, 2048);       /* because we write so many */
@@ -4620,7 +4661,7 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id)
        /*
         * Write all the copies of our block.
         */
-       for (int i = 0; i < copies; i++) {
+       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);
@@ -4924,8 +4965,9 @@ ztest_execute(ztest_info_t *zi, uint64_t id)
        ztest_shared_t *zs = ztest_shared;
        ztest_ds_t *zd = &zs->zs_zd[id % zopt_datasets];
        hrtime_t functime = gethrtime();
+       int i;
 
-       for (int i = 0; i < zi->zi_iters; i++)
+       for (i = 0; i < zi->zi_iters; i++)
                zi->zi_func(zd, id);
 
        functime = gethrtime() - functime;
@@ -4988,6 +5030,7 @@ static void
 ztest_dataset_destroy(ztest_shared_t *zs, int d)
 {
        char name[MAXNAMELEN];
+       int t;
 
        ztest_dataset_name(name, zs->zs_pool, d);
 
@@ -4999,7 +5042,7 @@ ztest_dataset_destroy(ztest_shared_t *zs, int d)
         * ztest thread t operates on dataset (t % zopt_datasets),
         * so there may be more than one thing to clean up.
         */
-       for (int t = d; t < zopt_threads; t += zopt_datasets)
+       for (t = d; t < zopt_threads; t += zopt_datasets)
                ztest_dsl_dataset_cleanup(name, t);
 
        (void) dmu_objset_find(name, ztest_objset_destroy_cb, NULL,
@@ -5105,6 +5148,7 @@ ztest_run(ztest_shared_t *zs)
        spa_t *spa;
        thread_t resume_tid;
        int error;
+       int t, d;
 
        ztest_exiting = B_FALSE;
 
@@ -5163,8 +5207,8 @@ ztest_run(ztest_shared_t *zs)
         * we probe a 5-wide window around each power of two.
         * This hits all edge cases, including zero and the max.
         */
-       for (int t = 0; t < 64; t++) {
-               for (int d = -5; d <= 5; d++) {
+       for (t = 0; t < 64; t++) {
+               for (d = -5; d <= 5; d++) {
                        error = dmu_object_info(spa->spa_meta_objset,
                            (1ULL << t) + d, NULL);
                        ASSERT(error == 0 || error == ENOENT ||
@@ -5189,7 +5233,7 @@ ztest_run(ztest_shared_t *zs)
        /*
         * Kick off all the tests that run in parallel.
         */
-       for (int t = 0; t < zopt_threads; t++) {
+       for (t = 0; t < zopt_threads; t++) {
                if (t < zopt_datasets && ztest_dataset_open(zs, t) != 0)
                        return;
                VERIFY(thr_create(0, 0, ztest_thread, (void *)(uintptr_t)t,
@@ -5200,7 +5244,7 @@ ztest_run(ztest_shared_t *zs)
         * Wait for all of the tests to complete.  We go in reverse order
         * so we don't close datasets while threads are still using them.
         */
-       for (int t = zopt_threads - 1; t >= 0; t--) {
+       for (t = zopt_threads - 1; t >= 0; t--) {
                VERIFY(thr_join(tid[t], NULL, NULL) == 0);
                if (t < zopt_datasets)
                        ztest_dataset_close(zs, t);
@@ -5225,6 +5269,10 @@ ztest_run(ztest_shared_t *zs)
        for (uint64_t object = 1; object < 50; object++)
                dmu_prefetch(spa->spa_meta_objset, object, 0, 1ULL << 20);
 
+       /* Verify that at least one commit cb was called in a timely fashion */
+       if (zc_cb_counter >= ZTEST_COMMIT_CB_MIN_REG)
+               VERIFY3U(zc_min_txg_delay, ==, 0);
+
        spa_close(spa, FTAG);
 
        /*
@@ -5352,7 +5400,7 @@ print_time(hrtime_t t, char *timebuf)
 }
 
 static nvlist_t *
-make_random_props()
+make_random_props(void)
 {
        nvlist_t *props;
 
@@ -5423,6 +5471,7 @@ main(int argc, char **argv)
        char timebuf[100];
        char numbuf[6];
        spa_t *spa;
+       int i, f;
 
        (void) setvbuf(stdout, NULL, _IOLBF, 0);
 
@@ -5431,7 +5480,8 @@ main(int argc, char **argv)
        process_options(argc, argv);
 
        /* Override location of zpool.cache */
-       (void) asprintf((char **)&spa_config_path, "%s/zpool.cache", zopt_dir);
+       VERIFY(asprintf((char **)&spa_config_path, "%s/zpool.cache",
+           zopt_dir) != -1);
 
        /*
         * Blow away any existing copy of zpool.cache
@@ -5455,7 +5505,7 @@ main(int argc, char **argv)
        /*
         * Create and initialize our storage pool.
         */
-       for (int i = 1; i <= zopt_init; i++) {
+       for (i = 1; i <= zopt_init; i++) {
                bzero(zs, sizeof (ztest_shared_t));
                if (zopt_verbose >= 3 && zopt_init != 1)
                        (void) printf("ztest_init(), pass %d\n", i);
@@ -5467,7 +5517,7 @@ main(int argc, char **argv)
        zs->zs_proc_start = gethrtime();
        zs->zs_proc_stop = zs->zs_proc_start + zopt_time * NANOSEC;
 
-       for (int f = 0; f < ZTEST_FUNCS; f++) {
+       for (f = 0; f < ZTEST_FUNCS; f++) {
                zi = &zs->zs_info[f];
                *zi = ztest_info[f];
                if (zs->zs_proc_start + zi->zi_interval[0] > zs->zs_proc_stop)
@@ -5489,7 +5539,7 @@ main(int argc, char **argv)
                /*
                 * Initialize the workload counters for each function.
                 */
-               for (int f = 0; f < ZTEST_FUNCS; f++) {
+               for (f = 0; f < ZTEST_FUNCS; f++) {
                        zi = &zs->zs_info[f];
                        zi->zi_call_count = 0;
                        zi->zi_call_time = 0;
@@ -5561,7 +5611,7 @@ main(int argc, char **argv)
                            "Calls", "Time", "Function");
                        (void) printf("%7s %9s   %s\n",
                            "-----", "----", "--------");
-                       for (int f = 0; f < ZTEST_FUNCS; f++) {
+                       for (f = 0; f < ZTEST_FUNCS; f++) {
                                Dl_info dli;
 
                                zi = &zs->zs_info[f];