#include "lib/getopt.h"
-#include "fio_version.h"
-
-#if FIO_PATCH > 0
-const char fio_version_string[] = __fio_stringify(FIO_MAJOR) "." \
- __fio_stringify(FIO_MINOR) "." \
- __fio_stringify(FIO_PATCH);
-#else
-const char fio_version_string[] = __fio_stringify(FIO_MAJOR) "." \
- __fio_stringify(FIO_MINOR);
-#endif
+const char fio_version_string[] = FIO_VERSION;
#define FIO_RANDSEED (0xb1899bedUL)
static int did_arg;
const fio_fp64_t def_percentile_list[FIO_IO_U_LIST_MAX_LEN] = {
- { .u.f = 1.0 },
- { .u.f = 5.0 },
- { .u.f = 10.0 },
- { .u.f = 20.0 },
- { .u.f = 30.0 },
- { .u.f = 40.0 },
- { .u.f = 50.0 },
- { .u.f = 60.0 },
- { .u.f = 70.0 },
- { .u.f = 80.0 },
- { .u.f = 90.0 },
- { .u.f = 95.0 },
- { .u.f = 99.0 },
- { .u.f = 99.5 },
- { .u.f = 99.9 },
+ { .u.f = 1.00 },
+ { .u.f = 5.00 },
+ { .u.f = 10.00 },
+ { .u.f = 20.00 },
+ { .u.f = 30.00 },
+ { .u.f = 40.00 },
+ { .u.f = 50.00 },
+ { .u.f = 60.00 },
+ { .u.f = 70.00 },
+ { .u.f = 80.00 },
+ { .u.f = 90.00 },
+ { .u.f = 95.00 },
+ { .u.f = 99.00 },
+ { .u.f = 99.50 },
+ { .u.f = 99.90 },
+ { .u.f = 99.95 },
+ { .u.f = 99.99 },
};
#define FIO_CLIENT_FLAG (1 << 16)
}
#endif
+#ifdef WIN32
+ /*
+ * Windows doesn't support O_DIRECT or O_SYNC with the _open interface,
+ * so fail if we're passed those flags
+ */
+ if ((td->io_ops->flags & FIO_SYNCIO) && (td->o.odirect || td->o.sync_io)) {
+ log_err("fio: Windows does not support direct or non-buffered io with"
+ " the synchronous ioengines. Use the 'windowsaio' ioengine"
+ " with 'direct=1' and 'iodepth=1' instead.\n");
+ ret = 1;
+ }
+#endif
+
+ /*
+ * For fully compressible data, just zero them at init time.
+ * It's faster than repeatedly filling it.
+ */
+ if (td->o.compress_percentage == 100) {
+ td->o.zero_buffers = 1;
+ td->o.compress_percentage = 0;
+ }
+
return ret;
}
init_rand_seed(&td->buf_state, td->rand_seeds[7]);
}
-/*
- * Initialize the various random states we need (random io, block size ranges,
- * read/write mix, etc).
- */
-static int init_random_state(struct thread_data *td)
-{
- int fd;
-
- fd = open("/dev/urandom", O_RDONLY);
- if (fd == -1) {
- td_verror(td, errno, "open");
- return 1;
- }
-
- if (read(fd, td->rand_seeds, sizeof(td->rand_seeds)) <
- (int) sizeof(td->rand_seeds)) {
- td_verror(td, EIO, "read");
- close(fd);
- return 1;
- }
-
- close(fd);
- td_fill_rand_seeds(td);
- return 0;
-}
/*
* Initializes the ioengine configured for a job, if it has not been done so
td->groupid = groupid;
prev_group_jobs++;
- if (init_random_state(td))
+ if (init_random_state(td, td->rand_seeds, sizeof(td->rand_seeds))) {
+ td_verror(td, errno, "init_random_state");
goto err;
+ }
if (setup_rate(td))
goto err;
static void usage(const char *name)
{
- printf("fio %s\n", fio_version_string);
+ printf("%s\n", fio_version_string);
printf("%s [options] [job options] <job file(s)>\n", name);
printf(" --debug=options\tEnable debug logging. May be one/more of:\n"
"\t\t\tprocess,file,io,mem,blktrace,verify,random,parse,\n"
break;
case 'v':
if (!cur_client) {
- log_info("fio %s\n", fio_version_string);
+ log_info("%s\n", fio_version_string);
do_exit++;
}
break;
}
if (!terse_output)
- log_info("fio %s\n", fio_version_string);
+ log_info("%s\n", fio_version_string);
return 0;
}