diotest6.c revision f7dc1be5b85cd32072dcae2db569bf11d115f27f
1bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew/* 2bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 3bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * Copyright (c) International Business Machines Corp., 2002 4bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 5bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * This program is free software; you can redistribute it and/or modify 6bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * it under the terms of the GNU General Public License as published by 7bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * the Free Software Foundation; either version 2 of the License, or 8bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * (at your option) any later version. 9bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 10bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * This program is distributed in the hope that it will be useful, 11bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * but WITHOUT ANY WARRANTY; without even the implied warranty of 12bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * the GNU General Public License for more details. 14bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 15bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * You should have received a copy of the GNU General Public License 16bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * along with this program; if not, write to the Free Software 17bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew */ 19bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 20bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 21bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew/* 22bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * NAME 23bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * diotest6.c 24bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 25bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * DESCRIPTION 26bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * Fork given number of children. Each child opens the same file, but 27bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * uses its own file descriptior. The child does writes and reads from 28bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * its segment in the file. The segment to which the child writes is 29bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * determined by childnumber * bufsize. There is no need to use any locks. 30bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * Tests the combinations of buffered/direct readv(), writev() calls. 31bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * Test program contains the following test blocks: 32bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * [1] Direct Read, Buffered write 33bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * [2] Direct Write, Buffered read 34bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * [3] Direct Read, Direct Write 35bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 36bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * USAGE 37bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * diotest6 [-b bufsize] [-o offset] [-n numchild] [-i iterations] 38bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * [-v nvector] [-f fileaname] 39bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 40bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * History 41bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 04/30/2002 Narasimha Sharoff nsharoff@us.ibm.com 42bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 43bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * RESTRICTIONS 44bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * None 45bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew*/ 46bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 47bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#include <stdio.h> 48bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#include <stdlib.h> 49bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#include <unistd.h> 50bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#include <string.h> 51bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#include <sys/file.h> 52bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#include <sys/fcntl.h> 53bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#include <sys/uio.h> 54bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#include <errno.h> 55bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 56f7dc1be5b85cd32072dcae2db569bf11d115f27frobbiew#include "diotest_routines.h" 57f7dc1be5b85cd32072dcae2db569bf11d115f27frobbiew 5896f4bb38da69c681481f337d099ee4b6cdbba102robbiew#include "test.h" 5996f4bb38da69c681481f337d099ee4b6cdbba102robbiew#include "usctest.h" 6096f4bb38da69c681481f337d099ee4b6cdbba102robbiew 6196f4bb38da69c681481f337d099ee4b6cdbba102robbiew#ifdef O_DIRECT 6296f4bb38da69c681481f337d099ee4b6cdbba102robbiew 63bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define BUFSIZE 4096 64bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define TRUE 1 65bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define LEN 30 66bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define READ_DIRECT 1 67bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define WRITE_DIRECT 2 68bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define RDWR_DIRECT 3 69bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 70bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewstatic int iter = 100; /* Iterations. Default 100 */ 71bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewstatic int bufsize = BUFSIZE; /* Buffersize. Default 4k */ 72bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewstatic off64_t offset = 0; /* Offset. Default 0 */ 73bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewstatic int nvector = 20; /* Vector array. Default 20 */ 74bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewstatic char filename[LEN]; /* Test data file */ 75bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 76bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewchar *valloc(); 77bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 78bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew/* 79bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * prg_usage: display the program usage 80bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew*/ 81bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewvoid 82bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewprg_usage() 83bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew{ 84bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "Usage: diotest6 [-b bufsize] [-o offset] [-n numchild] [-i iterations] [-v nvector] [-f filename]\n"); 85bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew exit(1); 86bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew} 87bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 88bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew/* 89bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * child_function: open the file for read and write. Call the runtest routine. 90bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew*/ 91bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewint 92bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewchild_function(int childnum, int action) 93bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew{ 94bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew int fd_w, fd_r; 95bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 96bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew switch(action) { 97bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case READ_DIRECT: 98bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_w = open(filename, O_WRONLY|O_CREAT, 0666)) < 0) { 99bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "[1] fd_w open failed for %s: %s\n", 100bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 101bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 102bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 103bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_r = open(filename, O_DIRECT|O_RDONLY, 0666)) < 0) { 104bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "[1] fd_r open failed for %s: %s\n", 105bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 106bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 107bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 108bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 109bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (runtest(fd_r, fd_w, childnum, action) == -1) { 110bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "[1] Read Direct-child %d failed\n", 111bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew childnum); 112bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 113bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 114bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 115bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 116bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 117bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case WRITE_DIRECT: 118bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_w = open(filename, O_DIRECT|O_WRONLY|O_CREAT, 0666)) < 0) { 119bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "[2] fd_w open failed for %s: %s\n", 120bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 121bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 122bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 123bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_r = open(filename, O_RDONLY, 0666)) < 0) { 124bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "[2] fd_r open failed for %s: %s\n", 125bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 126bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 127bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 128bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 129bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (runtest(fd_r, fd_w, childnum, action) == -1) { 130bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "[2] Write Direct-child %d failed\n", 131bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew childnum); 132bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 133bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 134bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 135bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 136bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 137bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case RDWR_DIRECT: 138bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_w = open(filename, O_DIRECT|O_WRONLY|O_CREAT, 0666)) < 0) { 139bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "[3] fd_w open failed for %s: %s\n", 140bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 141bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 142bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 143bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_r = open(filename, O_DIRECT|O_RDONLY, 0666)) < 0) { 144bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "[3] fd_r open failed for %s: %s\n", 145bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 146bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 147bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 148bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 149bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (runtest(fd_r, fd_w, childnum, action) == -1) { 150bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "[3] RDWR Direct-child %d failed\n", 151bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew childnum); 152bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 153bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 154bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 155bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 156bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 157bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew default: 158bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr,"Invalid Action Value\n"); 159bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 160bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 161bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 162bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 163bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew exit(0); 164bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew} 165bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 166bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew/* 167bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * runtest: write the data to the file. Read the data from the file and compare. 168bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * For each iteration, write data starting at offse+iter*bufsize 169bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * location in the file and read from there. 170bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew*/ 171bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewint 172bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewruntest(int fd_r, int fd_w, int childnum, int action) 173bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew{ 174bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew char *buf1, *buf2; 175bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew off64_t seekoff; 176bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew int i, bufsize = BUFSIZE; 177bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew struct iovec *iov1, *iov2, *iovp; 178bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 179bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Allocate for buffers and data pointers */ 180bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew seekoff = offset+bufsize * childnum; 181bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((iov1 = (struct iovec *)valloc(sizeof(struct iovec)*nvector)) == NULL) { 182bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "valloc buf1 failed:%s\n", strerror(errno)); 183bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 184bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 185bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((iov2 = (struct iovec *)valloc(sizeof(struct iovec)*nvector)) == NULL) { 186bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "valloc buf2 failed:%s\n", strerror(errno)); 187bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 188bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 189bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew for (i = 0, iovp = iov1; i < nvector; iovp++, i++) { 190bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((iovp->iov_base = valloc(bufsize)) == NULL) { 191bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "valloc for iovp->iov_base:%s\n", 192bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew strerror(errno)); 193bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 194bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 195bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew iovp->iov_len = bufsize; 196bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 197bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew for (i = 0, iovp = iov2; i < nvector; iovp++, i++) { 198bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((iovp->iov_base = valloc(bufsize)) == NULL) { 199bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "valloc, iov2 for iovp->iov_base:%s\n", 200bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew strerror(errno)); 201bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 202bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 203bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew iovp->iov_len = bufsize; 204bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 205bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 206bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* seek, write, read and verify */ 207bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew for (i = 0; i < iter; i++) { 208bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* 209bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fillbuf(buf1, bufsize, childnum+i); 210bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew */ 211bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew vfillbuf(iov1, nvector, childnum+i); 212bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (lseek(fd_w, seekoff, SEEK_SET) < 0) { 213bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "lseek before write failed:%s\n", 214bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew strerror(errno)); 215bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 216bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 217bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (write(fd_w, iov1, bufsize) < bufsize) { 218bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "write failed:%s\n", strerror(errno)); 219bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 220bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 221bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (action == READ_DIRECT) { 222bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Make sure data is on to disk before read */ 223bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (fsync(fd_w) < 0) { 224bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "fsync failed:%s\n", 225bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew strerror(errno)); 226bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 227bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 228bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 229bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (lseek(fd_r, seekoff, SEEK_SET) < 0) { 230bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "lseek before read failed:%s\n", 231bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew strerror(errno)); 232bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 233bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 234bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (read(fd_r, iov2, bufsize) < bufsize) { 235bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "read failed:%s\n", strerror(errno)); 236bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 237bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 238bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (bufcmp(iov1, iov2, bufsize) != 0) { 239bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "comparsion failed. Child=%d offset=%d\n", 240bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew childnum, seekoff); 241bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 242bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 243bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 244bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(0); 245bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew} 246bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 247bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewint 248bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewmain(int argc, char *argv[]) 249bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew{ 250bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew int *pidlst; 251bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew int numchild = 1; /* Number of children. Default 5 */ 252bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew int i, fail_count = 0, failed = 0, total = 0; 253bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 254bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Options */ 255bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew sprintf(filename,"testdata-6.%d", getpid()); 256bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew while ((i = getopt(argc, argv, "b:o:i:n:v:f:")) != -1) { 257bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew switch(i) { 258bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'b': 259bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((bufsize = atoi(optarg)) <= 0) { 260bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "bufsize must be > 0\n"); 261bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 262bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 263bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (bufsize % 4096 != 0) { 264bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "bufsize must be multiple of 4k\n"); 265bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 266bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 267bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 268bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'o': 269bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((offset = atoi(optarg)) <= 0) { 270bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "offset must be > 0\n"); 271bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 272bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 273bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 274bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'i': 275bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((iter = atoi(optarg)) <= 0) { 276bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "iterations must be > 0\n"); 277bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 278bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 279bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 280bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'n': 281bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((numchild = atoi(optarg)) <= 0) { 282bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "no of children must be > 0\n"); 283bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 284bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 285bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 286bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'v': 287bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((nvector = atoi(optarg)) <= 0) { 288bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "vectory array must be > 0\n"); 289bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 290bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 291bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 292bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'f': 293bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew strcpy(filename, optarg); 294bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 295bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew default: 296bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 297bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 298bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 299bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 300bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Testblock-1: Read with Direct IO, Write without */ 301bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (forkchldrn(&pidlst, numchild, READ_DIRECT, child_function) < 0 ) { 302bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 303bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 304bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 305bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew else { 306bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (waitchldrn(&pidlst, numchild) < 0) { 307bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 308bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 309bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 310bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 311bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew unlink(filename); 312bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew free(pidlst); 313bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total++; 314bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 315bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Testblock-2: Write with Direct IO, Read without */ 316bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (forkchldrn(&pidlst, numchild, WRITE_DIRECT, child_function) < 0) { 317bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 318bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 319bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 320bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew else { 321bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (waitchldrn(&pidlst, numchild) < 0) { 322bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 323bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 324bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 325bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 326bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew unlink(filename); 327bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew free(pidlst); 328bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total++; 329bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 330bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Testblock-3: Read, Write with Direct IO. */ 331bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (forkchldrn(&pidlst, numchild, RDWR_DIRECT, child_function) < 0) { 332bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 333bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 334bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 335bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew else { 336bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (waitchldrn(&pidlst, numchild) < 0) { 337bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 338bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 339bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 340bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 341bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew unlink(filename); 342bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew free(pidlst); 343bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total++; 344bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 345bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (failed) { 346bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stdout, "diotest6: %d/%d testblocks failed\n", 347bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count, total); 348bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew exit(1); 349bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 350bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stdout, "diotest6: %d testblocks %d iterations with %d children completed\n", 351bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total, iter, numchild); 352bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew exit(0); 353bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew} 354bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 35596f4bb38da69c681481f337d099ee4b6cdbba102robbiew 35696f4bb38da69c681481f337d099ee4b6cdbba102robbiew#else /* O_DIRECT */ 35796f4bb38da69c681481f337d099ee4b6cdbba102robbiew 35896f4bb38da69c681481f337d099ee4b6cdbba102robbiewchar *TCID="diotest06"; /* Test program identifier. */ 35996f4bb38da69c681481f337d099ee4b6cdbba102robbiewint TST_TOTAL=1; /* Total number of test conditions */ 36096f4bb38da69c681481f337d099ee4b6cdbba102robbiew 36196f4bb38da69c681481f337d099ee4b6cdbba102robbiewint 36296f4bb38da69c681481f337d099ee4b6cdbba102robbiewmain() { 36396f4bb38da69c681481f337d099ee4b6cdbba102robbiew 36496f4bb38da69c681481f337d099ee4b6cdbba102robbiew tst_resm(TCONF,"O_DIRECT is not defined."); 36596f4bb38da69c681481f337d099ee4b6cdbba102robbiew return 0; 36696f4bb38da69c681481f337d099ee4b6cdbba102robbiew} 36796f4bb38da69c681481f337d099ee4b6cdbba102robbiew#endif /* O_DIRECT */ 368