init.c revision aea47d444b02bd7c622f82bb73151fd7136a499f
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdio.h>
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdlib.h>
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <unistd.h>
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <fcntl.h>
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <ctype.h>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string.h>
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <errno.h>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <sys/ipc.h>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <sys/shm.h>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <sys/types.h>
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <sys/stat.h>
12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
13a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "fio.h"
14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#define DEF_BS			(4096)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define DEF_TIMEOUT		(0)
178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define DEF_RATE_CYCLE		(1000)
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define DEF_ODIRECT		(1)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define DEF_IO_ENGINE		(FIO_SYNCIO)
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define DEF_IO_ENGINE_NAME	"sync"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define DEF_SEQUENTIAL		(1)
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define DEF_RAND_REPEAT		(1)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DEF_OVERWRITE		(1)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DEF_CREATE		(1)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define DEF_INVALIDATE		(1)
262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#define DEF_SYNCIO		(0)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define DEF_RANDSEED		(0xb1899bedUL)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DEF_BWAVGTIME		(500)
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define DEF_CREATE_SER		(1)
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define DEF_CREATE_FSYNC	(1)
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define DEF_LOOPS		(1)
328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define DEF_VERIFY		(0)
33a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#define DEF_STONEWALL		(0)
34a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#define DEF_NUMJOBS		(1)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DEF_USE_THREAD		(0)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DEF_FILE_SIZE		(1024 * 1024 * 1024UL)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DEF_ZONE_SIZE		(0)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DEF_ZONE_SKIP		(0)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static char fio_version_string[] = "fio 1.3";
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
42a3f7b4e666c476898878fa745f637129375cd889Ben Murdochstatic int repeatable = DEF_RAND_REPEAT;
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic char *ini_file;
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic int max_jobs = MAX_JOBS;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct thread_data def_thread;
478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)struct thread_data *threads = NULL;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
49a3f7b4e666c476898878fa745f637129375cd889Ben Murdochint rate_quit = 0;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int write_lat_log = 0;
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int write_bw_log = 0;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int exitall_on_terminate = 0;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static int setup_rate(struct thread_data *td)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	int nr_reads_per_sec;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (!td->rate)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return 0;
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (td->rate < td->ratemin) {
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		fprintf(stderr, "min rate larger than nominal rate\n");
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return -1;
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	}
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	nr_reads_per_sec = (td->rate * 1024) / td->min_bs;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->rate_usec_cycle = 1000000 / nr_reads_per_sec;
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->rate_pending_usleep = 0;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	return 0;
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static void setup_log(struct io_log **log)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	struct io_log *l = malloc(sizeof(*l));
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	l->nr_samples = 0;
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	l->max_samples = 1024;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	l->log = malloc(l->max_samples * sizeof(struct io_sample));
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	*log = l;
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void finish_log(struct thread_data *td, struct io_log *log, const char *name)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	char file_name[256];
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	FILE *f;
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	unsigned int i;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	snprintf(file_name, 200, "client%d_%s.log", td->thread_number, name);
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	f = fopen(file_name, "w");
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (!f) {
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		perror("fopen log");
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return;
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	}
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	for (i = 0; i < log->nr_samples; i++)
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		fprintf(f, "%lu, %lu, %u\n", log->log[i].time, log->log[i].val, log->log[i].ddir);
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	fclose(f);
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	free(log->log);
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	free(log);
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static struct thread_data *get_new_job(int global, struct thread_data *parent)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	struct thread_data *td;
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (global)
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		return &def_thread;
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (thread_number >= max_jobs)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return NULL;
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td = &threads[thread_number++];
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	memset(td, 0, sizeof(*td));
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->fd = -1;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->thread_number = thread_number;
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->ddir = parent->ddir;
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->ioprio = parent->ioprio;
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->sequential = parent->sequential;
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	td->bs = parent->bs;
122a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	td->min_bs = parent->min_bs;
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->max_bs = parent->max_bs;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->odirect = parent->odirect;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->thinktime = parent->thinktime;
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)	td->fsync_blocks = parent->fsync_blocks;
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)	td->start_delay = parent->start_delay;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->timeout = parent->timeout;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->io_engine = parent->io_engine;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->create_file = parent->create_file;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->overwrite = parent->overwrite;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->invalidate_cache = parent->invalidate_cache;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->file_size = parent->file_size;
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->file_offset = parent->file_offset;
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->zone_size = parent->zone_size;
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->zone_skip = parent->zone_skip;
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	td->rate = parent->rate;
138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	td->ratemin = parent->ratemin;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->ratecycle = parent->ratecycle;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->iodepth = parent->iodepth;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->sync_io = parent->sync_io;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->mem_type = parent->mem_type;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->bw_avg_time = parent->bw_avg_time;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->create_serialize = parent->create_serialize;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->create_fsync = parent->create_fsync;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->loops = parent->loops;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->verify = parent->verify;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->stonewall = parent->stonewall;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->numjobs = parent->numjobs;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->use_thread = parent->use_thread;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->do_disk_util = parent->do_disk_util;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	memcpy(&td->cpumask, &parent->cpumask, sizeof(td->cpumask));
153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)	strcpy(td->io_engine_name, parent->io_engine_name);
154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)	return td;
156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)static void put_job(struct thread_data *td)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	memset(&threads[td->thread_number - 1], 0, sizeof(*td));
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)	thread_number--;
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int add_job(struct thread_data *td, const char *jobname, int prioclass,
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		   int prio)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	char *ddir_str[] = { "read", "write", "randread", "randwrite",
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			     "rw", NULL, "randrw" };
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	struct stat sb;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	int numjobs, ddir;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef FIO_HAVE_LIBAIO
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)	if (td->io_engine == FIO_LIBAIO) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		fprintf(stderr, "Linux libaio not available\n");
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		return 1;
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	}
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef FIO_HAVE_POSIXAIO
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (td->io_engine == FIO_POSIXAIO) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		fprintf(stderr, "posix aio not available\n");
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		return 1;
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	}
183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifdef FIO_HAVE_IOPRIO
185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	td->ioprio = (prioclass << IOPRIO_CLASS_SHIFT) | prio;
186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	/*
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 * the def_thread is just for options, it's not a real job
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 */
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (td == &def_thread)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		return 0;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (td->io_engine & FIO_SYNCIO)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		td->iodepth = 1;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	else {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		if (!td->iodepth)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			td->iodepth = 1;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	}
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	/*
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 * only really works for sequential io for now
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	 */
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	if (td->zone_size && !td->sequential)
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		td->zone_size = 0;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->filetype = FIO_TYPE_FILE;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (!stat(jobname, &sb)) {
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		if (S_ISBLK(sb.st_mode))
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			td->filetype = FIO_TYPE_BD;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		else if (S_ISCHR(sb.st_mode))
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			td->filetype = FIO_TYPE_CHAR;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (td->filetype == FIO_TYPE_FILE) {
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		if (td->directory[0] != '\0')
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			sprintf(td->file_name, "%s/%s.%d", td->directory, jobname, td->jobnum);
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		else
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			sprintf(td->file_name, "%s.%d", jobname, td->jobnum);
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	} else
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		strncpy(td->file_name, jobname, sizeof(td->file_name) - 1);
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	sem_init(&td->mutex, 0, 0);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->clat_stat[0].min_val = td->clat_stat[1].min_val = ULONG_MAX;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->slat_stat[0].min_val = td->slat_stat[1].min_val = ULONG_MAX;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->bw_stat[0].min_val = td->bw_stat[1].min_val = ULONG_MAX;
228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
229d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	if (td->min_bs == -1U)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		td->min_bs = td->bs;
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (td->max_bs == -1U)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		td->max_bs = td->bs;
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (td_read(td) && !td_rw(td))
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		td->verify = 0;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (td->stonewall && td->thread_number > 1)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		groupid++;
238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	td->groupid = groupid;
240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (setup_rate(td))
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		goto err;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (write_lat_log) {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		setup_log(&td->slat_log);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		setup_log(&td->clat_log);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	}
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (write_bw_log)
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		setup_log(&td->bw_log);
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	ddir = td->ddir + (!td->sequential << 1) + (td->iomix << 2);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	printf("Client%d (g=%d): rw=%s, prio=%d/%d, odir=%d, bs=%d-%d, rate=%d, ioengine=%s, iodepth=%d\n", td->thread_number, td->groupid, ddir_str[ddir], prioclass, prio, td->odirect, td->min_bs, td->max_bs, td->rate, td->io_engine_name, td->iodepth);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	/*
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 * recurse add identical jobs, clear numjobs and stonewall options
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 * as they don't apply to sub-jobs
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 */
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	numjobs = td->numjobs;
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	while (--numjobs) {
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct thread_data *td_new = get_new_job(0, td);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		if (!td_new)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			goto err;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		td_new->numjobs = 1;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		td_new->stonewall = 0;
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		td_new->jobnum = numjobs;
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		if (add_job(td_new, jobname, prioclass, prio))
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch			goto err;
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	}
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	return 0;
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdocherr:
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	put_job(td);
275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	return -1;
276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochint init_random_state(struct thread_data *td)
279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch{
280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	unsigned long seed;
281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	int fd, num_maps, blocks;
282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	fd = open("/dev/random", O_RDONLY);
284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	if (fd == -1) {
285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		td_verror(td, errno);
286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		return 1;
287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	}
288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	if (read(fd, &seed, sizeof(seed)) < (int) sizeof(seed)) {
290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		td_verror(td, EIO);
291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		close(fd);
292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		return 1;
293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	}
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	close(fd);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	srand48_r(seed, &td->bsrange_state);
298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	srand48_r(seed, &td->verify_state);
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (td->sequential)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		return 0;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (repeatable)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		seed = DEF_RANDSEED;
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	blocks = (td->io_size + td->min_bs - 1) / td->min_bs;
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	num_maps = blocks / BLOCKS_PER_MAP;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->file_map = malloc(num_maps * sizeof(long));
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	td->num_maps = num_maps;
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	memset(td->file_map, 0, num_maps * sizeof(long));
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	srand48_r(seed, &td->random_state);
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)	return 0;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void fill_cpu_mask(os_cpu_mask_t cpumask, int cpu)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef FIO_HAVE_CPU_AFFINITY
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	unsigned int i;
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	CPU_ZERO(&cpumask);
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	for (i = 0; i < sizeof(int) * 8; i++) {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		if ((1 << i) & cpu)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			CPU_SET(i, &cpumask);
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	}
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
329b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)static unsigned long get_mult(char c)
331b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles){
332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)	switch (c) {
333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)		case 'k':
334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)		case 'K':
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			return 1024;
336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)		case 'm':
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		case 'M':
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			return 1024 * 1024;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		case 'g':
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		case 'G':
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			return 1024 * 1024 * 1024;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		default:
343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch			return 1;
344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	}
345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
346424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * convert string after '=' into decimal value, noting any size suffix
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int str_cnv(char *p, unsigned long long *val)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
3527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	char *str;
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	int len;
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
355b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)	str = strchr(p, '=');
356b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)	if (!str)
357b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)		return 1;
358b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
359b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)	str++;
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	len = strlen(str);
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	*val = strtoul(str, NULL, 10);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (*val == ULONG_MAX && errno == ERANGE)
364b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)		return 1;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	*val *= get_mult(str[len - 2]);
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	return 0;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int check_strcnv(char *p, char *name, unsigned long long *val)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (strncmp(p, name, strlen(name) - 1))
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		return 1;
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	return str_cnv(p, val);
3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void strip_blank_front(char **p)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	char *s = *p;
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	while (isblank(*s))
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		s++;
3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void strip_blank_end(char *p)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	while (isblank(*p)) {
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		*p = '\0';
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		p--;
391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	}
392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic void terminate_line(char *p)
395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch{
396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	while (*p != '\n' && *p != '\0')
397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		p++;
398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	*p = '\0';
400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochtypedef int (str_cb_fn)(struct thread_data *, char *);
403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic int check_str(char *p, char *name, str_cb_fn *cb, struct thread_data *td)
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	char *s = strstr(p, name);
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (!s)
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return 1;
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	s = strchr(s, '=');
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (!s)
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return 1;
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	s++;
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	strip_blank_front(&s);
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	return cb(td, s);
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static int check_strstore(char *p, char *name, char *dest)
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	char *s = strstr(p, name);
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (!s)
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return 1;
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	s = strchr(p, '=');
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch	if (!s)
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch		return 1;
430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)	s++;
432a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	strip_blank_front(&s);
4337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	strcpy(dest, s);
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	s = dest + strlen(dest) - 1;
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	strip_blank_end(s);
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	return 0;
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int __check_range(char *str, unsigned long *val)
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	char suffix;
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (sscanf(str, "%lu%c", val, &suffix) == 2) {
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		*val *= get_mult(suffix);
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		return 0;
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	}
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (sscanf(str, "%lu", val) == 1)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		return 0;
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	return 1;
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
456a3f7b4e666c476898878fa745f637129375cd889Ben Murdochstatic int check_range(char *p, char *name, unsigned long *s, unsigned long *e)
457d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles){
458a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	char option[128];
459a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	char *str, *p1, *p2;
460a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
461a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	strcpy(option, p);
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	p = option;
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	str = strstr(p, name);
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (!str)
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return 1;
467a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
468a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	p += strlen(name);
469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	str = strchr(p, '=');
4717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	if (!str)
4727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch		return 1;
4737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	/*
475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	 * 'p' now holds whatever is after the '=' sign
4767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	 */
477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	p1 = str + 1;
478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch	/*
4802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch	 * terminate p1 at the '-' sign
481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	 */
4822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch	p = strchr(p1, '-');
483a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	if (!p)
484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		return 1;
485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	p2 = p + 1;
487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	*p = '\0';
488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
489ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	if (!__check_range(p1, s) && !__check_range(p2, e))
490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch		return 0;
491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	return 1;
493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic int check_int(char *p, char *name, unsigned int *val)
496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch{
4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	char *str;
4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	str = strstr(p, name);
5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	if (!str)
5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		return 1;
5024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	str = strchr(p, '=');
5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	if (!str)
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return 1;
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	str++;
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	if (sscanf(str, "%u", val) == 1)
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return 0;
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	return 1;
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static int check_strset(char *p, char *name)
5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	return strncmp(p, name, strlen(name));
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic int is_empty_or_comment(char *line)
521d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles){
522d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	unsigned int i;
523d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
524d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	for (i = 0; i < strlen(line); i++) {
525d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		if (line[i] == ';')
526a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch			return 1;
527a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch		if (!isspace(line[i]) && !iscntrl(line[i]))
528a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch			return 0;
529d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	}
530d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	return 1;
532a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
533a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
534a3f7b4e666c476898878fa745f637129375cd889Ben Murdochstatic int str_rw_cb(struct thread_data *td, char *mem)
535d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles){
5363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	if (!strncmp(mem, "read", 4) || !strncmp(mem, "0", 1)) {
5373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		td->ddir = DDIR_READ;
538d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		td->sequential = 1;
539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		return 0;
540d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	} else if (!strncmp(mem, "randread", 8)) {
5414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		td->ddir = DDIR_READ;
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		td->sequential = 0;
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		return 0;
544a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	} else if (!strncmp(mem, "write", 5) || !strncmp(mem, "1", 1)) {
545a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch		td->ddir = DDIR_WRITE;
546d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		td->sequential = 1;
547d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		return 0;
548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	} else if (!strncmp(mem, "randwrite", 9)) {
5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		td->ddir = DDIR_WRITE;
5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		td->sequential = 0;
551d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		return 0;
552a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	} else if (!strncmp(mem, "rw", 2)) {
553a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch		td->ddir = 0;
5548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		td->iomix = 1;
5558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		td->sequential = 1;
5568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		return 0;
5578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	} else if (!strncmp(mem, "randrw", 6)) {
5588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		td->ddir = 0;
5598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		td->iomix = 1;
5608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		td->sequential = 0;
5618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		return 0;
5628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	}
5638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	fprintf(stderr, "bad data direction: %s\n", mem);
5658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	return 1;
566a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic int str_verify_cb(struct thread_data *td, char *mem)
5698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles){
5708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	if (!strncmp(mem, "0", 1)) {
5718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		td->verify = VERIFY_NONE;
5728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		return 0;
5738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	} else if (!strncmp(mem, "md5", 3) || !strncmp(mem, "1", 1)) {
5748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		td->verify = VERIFY_MD5;
5758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		return 0;
5768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	} else if (!strncmp(mem, "crc32", 5)) {
5778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		td->verify = VERIFY_CRC32;
5788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		return 0;
5798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	}
5808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	fprintf(stderr, "bad verify type: %s\n", mem);
5828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	return 1;
5838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)static int str_mem_cb(struct thread_data *td, char *mem)
5868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles){
5878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	if (!strncmp(mem, "malloc", 6)) {
5888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		td->mem_type = MEM_MALLOC;
5898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		return 0;
5908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	} else if (!strncmp(mem, "shm", 3)) {
5918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		td->mem_type = MEM_SHM;
5928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		return 0;
5938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	} else if (!strncmp(mem, "mmap", 4)) {
594d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		td->mem_type = MEM_MMAP;
5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		return 0;
596d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	}
597d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
598d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	fprintf(stderr, "bad mem type: %s\n", mem);
599d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	return 1;
600d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
601d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static int str_ioengine_cb(struct thread_data *td, char *str)
6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){
604d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	if (!strncmp(str, "linuxaio", 8) || !strncmp(str, "aio", 3) ||
605d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	    !strncmp(str, "libaio", 6)) {
606d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		strcpy(td->io_engine_name, "libaio");
6073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		td->io_engine = FIO_LIBAIO;
608d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		return 0;
6093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	} else if (!strncmp(str, "posixaio", 8)) {
6103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		strcpy(td->io_engine_name, "posixaio");
6113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		td->io_engine = FIO_POSIXAIO;
6123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		return 0;
6133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	} else if (!strncmp(str, "sync", 4)) {
6143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		strcpy(td->io_engine_name, "sync");
6153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		td->io_engine = FIO_SYNCIO;
6163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		return 0;
6173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	} else if (!strncmp(str, "mmap", 4)) {
6183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		strcpy(td->io_engine_name, "mmap");
6193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		td->io_engine = FIO_MMAPIO;
620d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		return 0;
6213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	} else if (!strncmp(str, "sgio", 4)) {
6223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		strcpy(td->io_engine_name, "sgio");
6233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		td->io_engine = FIO_SGIO;
6243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		return 0;
6253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	}
626d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
6273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	fprintf(stderr, "bad ioengine type: %s\n", str);
628d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	return 1;
6293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
6303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)static int str_iolog_cb(struct thread_data *td, char *file)
632d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles){
633d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	terminate_line(file);
634d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	strncpy(td->iolog_file, file, sizeof(td->iolog_file) - 1);
635d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
636d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	return 0;
637d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
638d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
639d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)int parse_jobs_ini(char *file)
640d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles){
641d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	unsigned int prioclass, prio, cpu, global;
642d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	unsigned long long ull;
643d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	unsigned long ul1, ul2;
644d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	struct thread_data *td;
645d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	char *string, *name;
646d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	fpos_t off;
647d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	FILE *f;
648d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	char *p;
649d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
650d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	f = fopen(file, "r");
651d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	if (!f) {
652d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		perror("fopen job file");
653d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		return 1;
654d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	}
655d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
656d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	string = malloc(4096);
657d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	name = malloc(256);
658d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
659d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	while ((p = fgets(string, 4096, f)) != NULL) {
660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		if (is_empty_or_comment(p))
661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			continue;
6624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		if (sscanf(p, "[%s]", name) != 1)
6634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			continue;
6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		global = !strncmp(name, "global", 6);
6664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
667d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		name[strlen(name) - 1] = '\0';
668d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
669d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		td = get_new_job(global, &def_thread);
670d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		if (!td)
671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			return 1;
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
673d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		prioclass = 2;
674d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)		prio = 4;
675d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		fgetpos(f, &off);
6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		while ((p = fgets(string, 4096, f)) != NULL) {
6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			if (is_empty_or_comment(p))
6794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				continue;
6804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			if (strstr(p, "["))
6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				break;
682d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
683d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			if (!check_int(p, "prio", &prio)) {
684d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifndef FIO_HAVE_IOPRIO
685d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				fprintf(stderr, "io priorities not available\n");
686d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				return 1;
687d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
688d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				fgetpos(f, &off);
689d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				continue;
690d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			}
691d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			if (!check_int(p, "prioclass", &prioclass)) {
692d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifndef FIO_HAVE_IOPRIO
693d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				fprintf(stderr, "io priorities not available\n");
694d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				return 1;
695d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
696d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				fgetpos(f, &off);
697d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				continue;
698d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			}
699d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			if (!check_int(p, "direct", &td->odirect)) {
7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				fgetpos(f, &off);
7014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				continue;
7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			}
7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			if (!check_int(p, "rate", &td->rate)) {
7044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				fgetpos(f, &off);
7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				continue;
7064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			}
7074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			if (!check_int(p, "ratemin", &td->ratemin)) {
708d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				fgetpos(f, &off);
709d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				continue;
710d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			}
711d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			if (!check_int(p, "ratecycle", &td->ratecycle)) {
7128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)				fgetpos(f, &off);
7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				continue;
7144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			}
715d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			if (!check_int(p, "thinktime", &td->thinktime)) {
716d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				fgetpos(f, &off);
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_int(p, "cpumask", &cpu)) {
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef FIO_HAVE_CPU_AFFINITY
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fprintf(stderr, "cpu affinity not available\n");
722d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				return 1;
723d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
724d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				fill_cpu_mask(td->cpumask, cpu);
725d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)				fgetpos(f, &off);
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_int(p, "fsync", &td->fsync_blocks)) {
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
731d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			}
732d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			if (!check_int(p, "startdelay", &td->start_delay)) {
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_int(p, "timeout", &td->timeout)) {
7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_int(p, "invalidate",&td->invalidate_cache)) {
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_int(p, "iodepth", &td->iodepth)) {
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_int(p, "sync", &td->sync_io)) {
7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_int(p, "bwavgtime", &td->bw_avg_time)) {
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_int(p, "create_serialize", &td->create_serialize)) {
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_int(p, "create_fsync", &td->create_fsync)) {
7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
764d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			if (!check_int(p, "loops", &td->loops)) {
7654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				fgetpos(f, &off);
7664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				continue;
767d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			}
768d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)			if (!check_int(p, "numjobs", &td->numjobs)) {
7694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				fgetpos(f, &off);
7704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				continue;
7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_int(p, "overwrite", &td->overwrite)) {
7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				continue;
7754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			}
7764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)			if (!check_range(p, "bsrange", &ul1, &ul2)) {
7774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)				if (ul1 > ul2) {
7784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)					td->max_bs = ul1;
779d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)					td->min_bs = ul2;
7803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)				} else {
7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)					td->max_bs = ul2;
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)					td->min_bs = ul1;
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				}
7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_strcnv(p, "bs", &ull)) {
7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				td->bs = ull;
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_strcnv(p, "size", &td->file_size)) {
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_strcnv(p, "offset", &td->file_offset)) {
7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_strcnv(p, "zonesize", &td->zone_size)) {
8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_strcnv(p, "zoneskip", &td->zone_skip)) {
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_strstore(p, "directory", td->directory)) {
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_str(p, "mem", str_mem_cb, td)) {
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_str(p, "verify", str_verify_cb, td)) {
8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				continue;
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			}
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)			if (!check_str(p, "rw", str_rw_cb, td)) {
8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)				fgetpos(f, &off);
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)				continue;
823			}
824			if (!check_str(p, "ioengine", str_ioengine_cb, td)) {
825				fgetpos(f, &off);
826				continue;
827			}
828			if (!check_strset(p, "create")) {
829				td->create_file = 1;
830				fgetpos(f, &off);
831				continue;
832			}
833			if (!check_strset(p, "exitall")) {
834				exitall_on_terminate = 1;
835				fgetpos(f, &off);
836				continue;
837			}
838			if (!check_strset(p, "stonewall")) {
839				td->stonewall = 1;
840				fgetpos(f, &off);
841				continue;
842			}
843			if (!check_strset(p, "thread")) {
844				td->use_thread = 1;
845				fgetpos(f, &off);
846				continue;
847			}
848			if (!check_str(p, "iolog", str_iolog_cb, td)) {
849				td->iolog = 1;
850				fgetpos(f, &off);
851				continue;
852			}
853
854			printf("Client%d: bad option %s\n",td->thread_number,p);
855			return 1;
856		}
857		fsetpos(f, &off);
858
859		if (add_job(td, name, prioclass, prio))
860			return 1;
861	}
862
863	free(string);
864	free(name);
865	fclose(f);
866	return 0;
867}
868
869static int fill_def_thread(void)
870{
871	memset(&def_thread, 0, sizeof(def_thread));
872
873	if (fio_getaffinity(getpid(), &def_thread.cpumask) == -1) {
874		perror("sched_getaffinity");
875		return 1;
876	}
877
878	/*
879	 * fill globals
880	 */
881	def_thread.ddir = DDIR_READ;
882	def_thread.iomix = 0;
883	def_thread.bs = DEF_BS;
884	def_thread.min_bs = -1;
885	def_thread.max_bs = -1;
886	def_thread.io_engine = DEF_IO_ENGINE;
887	strcpy(def_thread.io_engine_name, DEF_IO_ENGINE_NAME);
888	def_thread.odirect = DEF_ODIRECT;
889	def_thread.ratecycle = DEF_RATE_CYCLE;
890	def_thread.sequential = DEF_SEQUENTIAL;
891	def_thread.timeout = DEF_TIMEOUT;
892	def_thread.create_file = DEF_CREATE;
893	def_thread.overwrite = DEF_OVERWRITE;
894	def_thread.invalidate_cache = DEF_INVALIDATE;
895	def_thread.sync_io = DEF_SYNCIO;
896	def_thread.mem_type = MEM_MALLOC;
897	def_thread.bw_avg_time = DEF_BWAVGTIME;
898	def_thread.create_serialize = DEF_CREATE_SER;
899	def_thread.create_fsync = DEF_CREATE_FSYNC;
900	def_thread.loops = DEF_LOOPS;
901	def_thread.verify = DEF_VERIFY;
902	def_thread.stonewall = DEF_STONEWALL;
903	def_thread.numjobs = DEF_NUMJOBS;
904	def_thread.use_thread = DEF_USE_THREAD;
905#ifdef FIO_HAVE_DISK_UTIL
906	def_thread.do_disk_util = 1;
907#endif
908
909	return 0;
910}
911
912static void usage(char *name)
913{
914	printf("%s\n", fio_version_string);
915	printf("\t-s IO is sequential\n");
916	printf("\t-b Block size in KiB for each IO\n");
917	printf("\t-t Runtime in seconds\n");
918	printf("\t-R Exit all threads on failure to meet rate goal\n");
919	printf("\t-o Use O_DIRECT\n");
920	printf("\t-l Generate per-job latency logs\n");
921	printf("\t-w Generate per-job bandwidth logs\n");
922	printf("\t-f Job file (Required)\n");
923	printf("\t-v Print version info and exit\n");
924}
925
926static void parse_cmd_line(int argc, char *argv[])
927{
928	int c;
929
930	while ((c = getopt(argc, argv, "s:b:t:r:R:o:f:lwvh")) != EOF) {
931		switch (c) {
932			case 's':
933				def_thread.sequential = !!atoi(optarg);
934				break;
935			case 'b':
936				def_thread.bs = atoi(optarg);
937				def_thread.bs <<= 10;
938				if (!def_thread.bs) {
939					printf("bad block size\n");
940					def_thread.bs = DEF_BS;
941				}
942				break;
943			case 't':
944				def_thread.timeout = atoi(optarg);
945				break;
946			case 'r':
947				repeatable = !!atoi(optarg);
948				break;
949			case 'R':
950				rate_quit = !!atoi(optarg);
951				break;
952			case 'o':
953				def_thread.odirect = !!atoi(optarg);
954				break;
955			case 'f':
956				ini_file = strdup(optarg);
957				break;
958			case 'l':
959				write_lat_log = 1;
960				break;
961			case 'w':
962				write_bw_log = 1;
963				break;
964			case 'h':
965				usage(argv[0]);
966				exit(0);
967			case 'v':
968				printf("%s\n", fio_version_string);
969				exit(0);
970		}
971	}
972}
973
974static void free_shm(void)
975{
976	struct shmid_ds sbuf;
977
978	if (threads) {
979		shmdt(threads);
980		threads = NULL;
981		shmctl(shm_id, IPC_RMID, &sbuf);
982	}
983}
984
985static int setup_thread_area(void)
986{
987	/*
988	 * 1024 is too much on some machines, scale max_jobs if
989	 * we get a failure that looks like too large a shm segment
990	 */
991	do {
992		int s = max_jobs * sizeof(struct thread_data);
993
994		shm_id = shmget(0, s, IPC_CREAT | 0600);
995		if (shm_id != -1)
996			break;
997		if (errno != EINVAL) {
998			perror("shmget");
999			break;
1000		}
1001
1002		max_jobs >>= 1;
1003	} while (max_jobs);
1004
1005	if (shm_id == -1)
1006		return 1;
1007
1008	threads = shmat(shm_id, NULL, 0);
1009	if (threads == (void *) -1) {
1010		perror("shmat");
1011		return 1;
1012	}
1013
1014	atexit(free_shm);
1015	return 0;
1016}
1017
1018int parse_options(int argc, char *argv[])
1019{
1020	if (setup_thread_area())
1021		return 1;
1022	if (fill_def_thread())
1023		return 1;
1024
1025	parse_cmd_line(argc, argv);
1026
1027	if (!ini_file) {
1028		printf("Need job file\n");
1029		usage(argv[0]);
1030		return 1;
1031	}
1032
1033	if (parse_jobs_ini(ini_file))
1034		return 1;
1035
1036	return 0;
1037}
1038