16e112132382b6442b636ee39b02951d771408e8frobbiew/*
26e112132382b6442b636ee39b02951d771408e8frobbiew* Disktest
36e112132382b6442b636ee39b02951d771408e8frobbiew* Copyright (c) International Business Machines Corp., 2001
46e112132382b6442b636ee39b02951d771408e8frobbiew*
56e112132382b6442b636ee39b02951d771408e8frobbiew*
66e112132382b6442b636ee39b02951d771408e8frobbiew* This program is free software; you can redistribute it and/or modify
76e112132382b6442b636ee39b02951d771408e8frobbiew* it under the terms of the GNU General Public License as published by
86e112132382b6442b636ee39b02951d771408e8frobbiew* the Free Software Foundation; either version 2 of the License, or
96e112132382b6442b636ee39b02951d771408e8frobbiew* (at your option) any later version.
106e112132382b6442b636ee39b02951d771408e8frobbiew*
116e112132382b6442b636ee39b02951d771408e8frobbiew* This program is distributed in the hope that it will be useful,
126e112132382b6442b636ee39b02951d771408e8frobbiew* but WITHOUT ANY WARRANTY; without even the implied warranty of
136e112132382b6442b636ee39b02951d771408e8frobbiew* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
146e112132382b6442b636ee39b02951d771408e8frobbiew* GNU General Public License for more details.
156e112132382b6442b636ee39b02951d771408e8frobbiew*
166e112132382b6442b636ee39b02951d771408e8frobbiew* You should have received a copy of the GNU General Public License
176e112132382b6442b636ee39b02951d771408e8frobbiew* along with this program; if not, write to the Free Software
186e112132382b6442b636ee39b02951d771408e8frobbiew* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
196e112132382b6442b636ee39b02951d771408e8frobbiew*
206e112132382b6442b636ee39b02951d771408e8frobbiew*  Please send e-mail to yardleyb@us.ibm.com if you have
216e112132382b6442b636ee39b02951d771408e8frobbiew*  questions or comments.
226e112132382b6442b636ee39b02951d771408e8frobbiew*
236e112132382b6442b636ee39b02951d771408e8frobbiew*  Project Website:  TBD
246e112132382b6442b636ee39b02951d771408e8frobbiew*
2577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak* $Id: main.h,v 1.5 2008/02/14 08:22:23 subrata_modak Exp $
266e112132382b6442b636ee39b02951d771408e8frobbiew*
276e112132382b6442b636ee39b02951d771408e8frobbiew*/
286e112132382b6442b636ee39b02951d771408e8frobbiew
296e112132382b6442b636ee39b02951d771408e8frobbiew#ifndef _DISKTEST_H
306e112132382b6442b636ee39b02951d771408e8frobbiew#define _DISKTEST_H
316e112132382b6442b636ee39b02951d771408e8frobbiew
326b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew#ifdef WINDOWS
336e112132382b6442b636ee39b02951d771408e8frobbiew#include <windows.h>
346e112132382b6442b636ee39b02951d771408e8frobbiew#include <winioctl.h>
356e112132382b6442b636ee39b02951d771408e8frobbiew#include <io.h>
366e112132382b6442b636ee39b02951d771408e8frobbiew#include <process.h>
376e112132382b6442b636ee39b02951d771408e8frobbiew#include <sys/stat.h>
386e112132382b6442b636ee39b02951d771408e8frobbiew#else
3977e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#include <pthread.h>
406e112132382b6442b636ee39b02951d771408e8frobbiew#include <sys/types.h>
416e112132382b6442b636ee39b02951d771408e8frobbiew#include <sys/ioctl.h>
426e112132382b6442b636ee39b02951d771408e8frobbiew#include <unistd.h>
436e112132382b6442b636ee39b02951d771408e8frobbiew#endif
446e112132382b6442b636ee39b02951d771408e8frobbiew
456e112132382b6442b636ee39b02951d771408e8frobbiew#include <stdio.h>
466e112132382b6442b636ee39b02951d771408e8frobbiew#include <stdlib.h>
476e112132382b6442b636ee39b02951d771408e8frobbiew#include <stdarg.h>
486e112132382b6442b636ee39b02951d771408e8frobbiew#include <signal.h>
496e112132382b6442b636ee39b02951d771408e8frobbiew#include <time.h>
506e112132382b6442b636ee39b02951d771408e8frobbiew#include <errno.h>
516e112132382b6442b636ee39b02951d771408e8frobbiew#include "defs.h"
526e112132382b6442b636ee39b02951d771408e8frobbiew
5377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define VER_STR "v1.4.2"
5477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define BLKGETSIZE _IO(0x12,96)		/* IOCTL for getting the device size */
5577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define BLKSSZGET  _IO(0x12,104)	/* ALT IOCTL for getting the device size */
566e112132382b6442b636ee39b02951d771408e8frobbiew
5777e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define DEV_NAME_LEN		80		/* max character for target name */
5877e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define MAX_ARG_LEN			160		/* max length of command line arguments for startarg display */
5977e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define HOSTNAME_SIZE		16		/* number of hostname characters used in mark header */
6077e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define BLK_SIZE			512		/* default size of an LBA in bytes */
6177e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define ALIGNSIZE			4096	/* memory alignment size in bytes */
6277e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define DEFAULT_IO_TIMEOUT	120		/* the default number of seconds before IO timeout */
636b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew
6477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak/* the new way we align */
6577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define ALIGN(x, y) (((long long unsigned)x/(long long unsigned)y)*(long long unsigned)y)
6663f12ff6ff6ac8de6bba5201b43fbb258ea54f7brobbiew
676b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew#if __WORDSIZE == 64
6877e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak/* the old way we use to align */
6977e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak/* #define ALIGN(x, bs) (((OFF_T)x + ((OFF_T)bs - 1)) & ~((OFF_T)bs - 1)) */
7063f12ff6ff6ac8de6bba5201b43fbb258ea54f7brobbiew#define BUFALIGN(x) (void *) (((unsigned long)x + (OFF_T)(ALIGNSIZE - 1)) & (OFF_T)~(ALIGNSIZE - 1))
716b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew#else
7277e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak/* the old way we use to align */
7377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak/* #define ALIGN(x, bs) ((x + (bs - 1)) & ~(bs - 1)) */
7463f12ff6ff6ac8de6bba5201b43fbb258ea54f7brobbiew#define BUFALIGN(x) (void *) (((unsigned long)x + (ALIGNSIZE - 1)) & ~(ALIGNSIZE - 1))
756b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew#endif
7663f12ff6ff6ac8de6bba5201b43fbb258ea54f7brobbiew
776e112132382b6442b636ee39b02951d771408e8frobbiew#define MASK(x,y) (x & y)
786e112132382b6442b636ee39b02951d771408e8frobbiew
796e112132382b6442b636ee39b02951d771408e8frobbiew/* each is a 64b number.  offsets are in 8B*offset placement */
806b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew#define OFF_RLBA	0	/* offset in memseg of current read LBA */
816b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew#define OFF_WLBA	1	/* offset in memseg of current write LBA */
826e112132382b6442b636ee39b02951d771408e8frobbiew
836b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew#define BMP_OFFSET	2*sizeof(OFF_T)		/* bitmap starts here */
846e112132382b6442b636ee39b02951d771408e8frobbiew
856e112132382b6442b636ee39b02951d771408e8frobbiew#define TST_STS(x)			(x & 0x1)	/* current testing status */
866e112132382b6442b636ee39b02951d771408e8frobbiew#define SET_STS_PASS(x)		(x | 0x01)
876e112132382b6442b636ee39b02951d771408e8frobbiew#define SET_STS_FAIL(x)		(x & ~0x01)
886e112132382b6442b636ee39b02951d771408e8frobbiew#define TST_wFST_TIME(x)	(x & 0x02)	/* first write lba access */
896e112132382b6442b636ee39b02951d771408e8frobbiew#define SET_wFST_TIME(x)	(x | 0x02)
906e112132382b6442b636ee39b02951d771408e8frobbiew#define CLR_wFST_TIME(x)	(x & ~0x02)
916e112132382b6442b636ee39b02951d771408e8frobbiew#define TST_rFST_TIME(x)	(x & 0x04)	/* first read lba access */
926e112132382b6442b636ee39b02951d771408e8frobbiew#define SET_rFST_TIME(x)	(x | 0x04)
936e112132382b6442b636ee39b02951d771408e8frobbiew#define CLR_rFST_TIME(x)	(x & ~0x04)
946e112132382b6442b636ee39b02951d771408e8frobbiew#define TST_DIRCTN(x)	(x & 0x08)		/* lba inc/dec 1 is inc, 0 is dec */
956e112132382b6442b636ee39b02951d771408e8frobbiew#define DIRCT_INC(x)    (x | 0x08)
966e112132382b6442b636ee39b02951d771408e8frobbiew#define DIRCT_DEC(x)    (x & ~0x08)
976e112132382b6442b636ee39b02951d771408e8frobbiew#define DIRCT_CNG(x)    (x & 0x08) ? (x & ~0x08) : (x | 0x08)
986e112132382b6442b636ee39b02951d771408e8frobbiew#define TST_OPER(x) (short) ((x & 0x10) >> 4)	/* last transfer operation (write = 0, read = 1) */
996e112132382b6442b636ee39b02951d771408e8frobbiew#define SET_OPER_R(x)	(x | 0x10)
1006e112132382b6442b636ee39b02951d771408e8frobbiew#define SET_OPER_W(x)	(x & ~0x10)
1016e112132382b6442b636ee39b02951d771408e8frobbiew#define CNG_OPER(x)		(x & 0x10) ? (x & ~0x10) : (x | 0x10)
1026e112132382b6442b636ee39b02951d771408e8frobbiew
10377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_CMPR		0x0000000000000001ULL	/* will cause readers to compare data read */
10477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_MBLK		0x0000000000000002ULL	/* will add header info to first block, fc lun, lba, etc */
10577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_OFFSET		0x0000000000000004ULL	/* specifies that an offset up to 2^31 LBAs has been given */
10677e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_RTRSIZ		0x0000000000000008ULL	/* Ignore weither a block has been written */
1076e112132382b6442b636ee39b02951d771408e8frobbiew
1086e112132382b6442b636ee39b02951d771408e8frobbiew/* Perforamnce Flags */
10977e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_XFERS		0x0000000000000010ULL	/* reports # of transfers */
11077e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_TPUTS		0x0000000000000020ULL	/* reports calculated throughtput */
11177e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_RUNT		0x0000000000000040ULL	/* reports run time */
11277e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_PCYC		0x0000000000000080ULL	/* report cycle data */
113d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge#define CLD_FLG_PRFTYPS	(CLD_FLG_XFERS|CLD_FLG_TPUTS|CLD_FLG_RUNT|CLD_FLG_PCYC)
1146e112132382b6442b636ee39b02951d771408e8frobbiew
1156e112132382b6442b636ee39b02951d771408e8frobbiew/* Seek Flags */
11677e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_RANDOM		0x0000000000000100ULL	/* child seeks are random */
11777e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_LINEAR		0x0000000000000200ULL	/* child seeks are linear */
11877e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_NTRLVD		0x0000000000000400ULL	/* reads and writes are interleaved */
1196b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew#define CLD_FLG_SKTYPS	(CLD_FLG_RANDOM|CLD_FLG_LINEAR)
1206b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew
12177e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_VSIZ		0x0000000000000800ULL	/* Volume size is user specified */
1226e112132382b6442b636ee39b02951d771408e8frobbiew
1236e112132382b6442b636ee39b02951d771408e8frobbiew/* IO Type Flags */
12477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_RAW			0x0000000000001000ULL	/* child IO is to a raw/character device */
12577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_BLK			0x0000000000002000ULL	/* child IO is to a block device */
12677e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_FILE		0x0000000000004000ULL	/* child IO is to a file */
12777e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_DIRECT		0x0000000000008000ULL	/* child IO has direct disk access */
1286e112132382b6442b636ee39b02951d771408e8frobbiew#define CLD_FLG_IOTYPS	(CLD_FLG_RAW|CLD_FLG_BLK|CLD_FLG_FILE|CLD_FLG_DIRECT)
1296e112132382b6442b636ee39b02951d771408e8frobbiew
1306e112132382b6442b636ee39b02951d771408e8frobbiew/* Pattern Flags */
13177e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_RPTYPE		0x0000000000010000ULL	/* random pattern */
13277e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_FPTYPE		0x0000000000020000ULL	/* fixed pattern */
13377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_CPTYPE		0x0000000000040000ULL	/* counting pattern */
13477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_LPTYPE		0x0000000000080000ULL	/* lba pattern */
1356e112132382b6442b636ee39b02951d771408e8frobbiew#define CLD_FLG_PTYPS	(CLD_FLG_RPTYPE|CLD_FLG_FPTYPE|CLD_FLG_CPTYPE|CLD_FLG_LPTYPE)
1366e112132382b6442b636ee39b02951d771408e8frobbiew
1376e112132382b6442b636ee39b02951d771408e8frobbiew/* Duration Flags */
13877e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_TMD			0x0000000000100000ULL	/* set if using time */
13977e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_SKS			0x0000000000200000ULL	/* set if seeks are used */
14077e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_CYC			0x0000000000400000ULL	/* set if cycles are used */
14177e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_DUTY		0x0000000000800000ULL	/* set if a duty cycle is used while running */
14277e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak
14377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_LBA_RNG		0x0000000001000000ULL	/* write multipule read multipule, must define multiple */
14477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_BLK_RNG		0x0000000002000000ULL	/* write once read multiple, must define multiple */
14577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_ALLDIE		0x0000000004000000ULL	/* will force all children to die on any error if set */
14677e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_DUMP		0x0000000008000000ULL	/* will dump formatted data */
14777e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak
14877e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_LUNU		0x0000000010000000ULL	/* seek start/end and then start/end */
14977e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_LUND		0x0000000020000000ULL	/* seek start/end and then end/start */
15077e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_W			0x0000000040000000ULL	/* there are child writers */
15177e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_R			0x0000000080000000ULL	/* there are child readers */
15277e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak
15377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_FSLIST		0x0000000100000000ULL	/* the filespec is a list of targets */
15477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_HBEAT		0x0000000200000000ULL	/* if performance heartbeat is being used */
15577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_WFSYNC		0x0000000400000000ULL	/* do an fsync on write for file IO */
15677e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define FLAG_NOT_DEFINED	0x0000000800000000ULL	/* NOT DEFINED */
1576e112132382b6442b636ee39b02951d771408e8frobbiew
15877e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_WRITE_ONCE	0x0000001000000000ULL	/* only write once to each LBA */
15977e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_ERR_REREAD	0x0000002000000000ULL	/* On miscompare, reread the miscompare transfer */
16077e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_LBA_SYNC	0x0000004000000000ULL	/* LBA syncronizion */
16177e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_IO_SERIAL	0x0000008000000000ULL	/* serialize IO at the IO operation level */
1626e112132382b6442b636ee39b02951d771408e8frobbiew
16377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_MRK_LBA		0x0000010000000000ULL	/* enable adding LBA to mark data */
16477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_MRK_PASS	0x0000020000000000ULL	/* enable adding pass count to mark data */
16577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_MRK_TIME	0x0000040000000000ULL	/* enable adding start time to mark data */
16677e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_MRK_SEED	0x0000080000000000ULL	/* enable adding seed to mark data */
16777e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_MRK_HOST	0x0000100000000000ULL	/* enable adding hostname to mark data */
16877e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_MRK_TARGET	0x0000200000000000ULL	/* enable adding target name to mark data */
16977e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_MRK_ALL	(CLD_FLG_MRK_LBA|CLD_FLG_MRK_PASS|CLD_FLG_MRK_TIME|CLD_FLG_MRK_SEED|CLD_FLG_MRK_HOST|CLD_FLG_MRK_TARGET)
170d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge
17177e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_ALT_MARK	0x0000400000000000ULL	/* override time marker, with data in alt_mark, in mark header */
17277e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_ERR_MARK	0x0000800000000000ULL	/* On error, write a special MARKER to LBA 0 on the target */
17377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak
17477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_TMO_ERROR	0x0001000000000000ULL	/* make an IO TIMEOUT warning, fail the IO test */
17577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#define CLD_FLG_UNIQ_WRT	0x0002000000000000ULL	/* garentees that every write is unique */
1766e112132382b6442b636ee39b02951d771408e8frobbiew
1776e112132382b6442b636ee39b02951d771408e8frobbiew/* startup defaults */
1786e112132382b6442b636ee39b02951d771408e8frobbiew#define TRSIZ	1		/* default transfer size in blocks */
1796e112132382b6442b636ee39b02951d771408e8frobbiew#define VSIZ	2000	/* default volume capacity in LBAs */
1806e112132382b6442b636ee39b02951d771408e8frobbiew#define SEEKS	1000	/* default seeks */
1816e112132382b6442b636ee39b02951d771408e8frobbiew#define KIDS	4		/* default number of children */
1826e112132382b6442b636ee39b02951d771408e8frobbiew
183d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge#ifdef WINDOWS
184d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridgetypedef HANDLE hThread_t;
185d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge#else
186d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridgetypedef pthread_t hThread_t;
187d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge#endif
188d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge
189d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridgetypedef struct thread_struct {
190d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	hThread_t hThread;
191d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	BOOL bCanBeJoined;
192d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	struct thread_struct *next; /* pointer to next thread */
193d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge} thread_struct_t;
194d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge
195d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridgetypedef struct stats {
196d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T wcount;
197d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T rcount;
198d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T wbytes;
199d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T rbytes;
200d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	time_t wtime;
201d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	time_t rtime;
202d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge} stats_t;
203d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge
2046e112132382b6442b636ee39b02951d771408e8frobbiewtypedef struct child_args {
205d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	char device[DEV_NAME_LEN];	/* device name */
206d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	char argstr[MAX_ARG_LEN];	/* human readable argument string /w assumtions */
207d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T vsiz;					/* volume size in blocks */
208d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned long ltrsiz;		/* low bound of transfer size in blocks */
209d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned long htrsiz;		/* high bound of transfer size in blocks */
21077e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	long offset;				/* the lba offset to shift IO alignment by */
211d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T pattern;				/* pattern data */
212d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	time_t run_time;			/* run time in seconds */
213d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T seeks;				/* number of seeks */
214d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned long cycles;		/* number of cycles */
215d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T start_blk;			/* starting transfer block */
216d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T stop_blk;				/* ending transfer block */
217d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T start_lba;			/* starting LBA */
218d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T stop_lba;				/* ending LBA */
219d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned int retries;		/* number of retries */
220d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	time_t hbeat;				/* Statistics will be reported every hbeats seconds */
221d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned long long flags;	/* common flags that a child uses */
222d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned long rcount;		/* number of reads a child should perform, 0 is unbound  */
223d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned long wcount;		/* number of writes a child should perform, 0 is unbound  */
224d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	short rperc;				/* percent of IO that should be reads */
225d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	short wperc;				/* percent of IO that should be write */
226d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned short t_kids;		/* total children, max is 64k */
227d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned int cmp_lng;		/* how much of the data should be compared */
228d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	OFF_T test_state;			/* current test state */
229d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned int seed;			/* test seed */
230d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	pid_t pid;					/* the process_id used for this environment */
23177e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	OFF_T alt_mark;				/* alternate marker the start time */
23277e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	unsigned long delayTimeMin;	/* the minimum time (msec) to delay on each IO */
23377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	unsigned long delayTimeMax;	/* the maximum time (msec) to delay on each IO */
23477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	time_t ioTimeout;			/* the time (sec) before failure do to possible hung IO */
23577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	unsigned long sync_interval;/* number of write IOs before issuing a sync */
23677e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	long retry_delay;			/* number of msec to wait before retrying an IO */
2376e112132382b6442b636ee39b02951d771408e8frobbiew} child_args_t;
2386e112132382b6442b636ee39b02951d771408e8frobbiew
23977e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modaktypedef struct mutexs {
24077e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#ifdef WINDOWS
24177e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	HANDLE MutexACTION;			/* mutex for the entire target device */
24277e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	HANDLE MutexIO;				/* mutex for the IO to the device */
24377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#else
24477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	pthread_mutex_t MutexACTION; /* mutex for the entire target device */
24577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	pthread_mutex_t MutexIO;	/* mutex for the IO to the device */
24677e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak#endif
24777e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak} mutexs_t;
24877e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak
249d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridgetypedef struct test_env {
250d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	void *shared_mem;           /* global pointer to shared memory */
251d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned char *data_buffer; /* global data buffer */
252d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	size_t bmp_siz;             /* size of bitmask */
25377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	BOOL bContinue;             /* global that when set to false will force exit for this environment */
25477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	OFF_T pass_count;           /* pass counters */
25577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	stats_t hbeat_stats;        /* per heartbeat statistics */
256d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	stats_t cycle_stats;        /* per cycle statistics */
25777e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	stats_t global_stats;       /* per env statistics */
25877e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	OFF_T rcount;				/* number of read IO operations */
25977e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	OFF_T wcount;				/* number of write IO operations */
260d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	unsigned short kids;		/* number of test child processes */
261d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	thread_struct_t *pThreads;  /* List of child test processes */
26277e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	time_t start_time;			/*	overall start time of test	*/
26377e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	time_t end_time;			/*	overall end time of test	*/
26477e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	action_t lastAction;		/* when interleaving tests, tells the threads whcih action was last */
26577e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	action_t *action_list;		/* pointer to list of actions that are currently in use */
26677e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	int action_list_entry;		/* where in the action_list we are */
26777e42cafa8942eba6e7706c9d9c25a04ec7cdda5subrata_modak	mutexs_t mutexs;
268d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge} test_env_t;
269d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge
270d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridgetypedef struct test_ll {
271d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	test_env_t *env;			/* pointer to the environment structure */
272d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	child_args_t *args;			/* pointer to the argument structure */
273d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	hThread_t hThread;
274d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge	struct test_ll *next;		/* pointer to the next test */
275d18ffdd88be3c62d027fd49a115bc9c4fe4b910cmridge} test_ll_t;
2766b98df5129acc12aad3167a9c6c12fda5afc6c31robbiew
2776e112132382b6442b636ee39b02951d771408e8frobbiew#endif /* _DISKTEST_H */
278