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