diotest6.c revision 8fb1cdb0538640f295691929650408688537fb7f
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] 394bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 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> 53b48651d2444c180f7db691b11a56cc6d57444d10mridge#include <sys/syscall.h> 54bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#include <sys/uio.h> 55bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#include <errno.h> 56bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 57f7dc1be5b85cd32072dcae2db569bf11d115f27frobbiew#include "diotest_routines.h" 58f7dc1be5b85cd32072dcae2db569bf11d115f27frobbiew 5996f4bb38da69c681481f337d099ee4b6cdbba102robbiew#include "test.h" 6096f4bb38da69c681481f337d099ee4b6cdbba102robbiew#include "usctest.h" 6196f4bb38da69c681481f337d099ee4b6cdbba102robbiew 628680e9b72836f1cc465d424e0dcc9e54e4eda32brobbiewchar *TCID="diotest06"; /* Test program identifier. */ 6392b688b8340e2424643c5d33dcacfbb109529402robbiewint TST_TOTAL=3; /* Total number of test conditions */ 648680e9b72836f1cc465d424e0dcc9e54e4eda32brobbiew 6596f4bb38da69c681481f337d099ee4b6cdbba102robbiew#ifdef O_DIRECT 6696f4bb38da69c681481f337d099ee4b6cdbba102robbiew 67bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define BUFSIZE 4096 68bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define TRUE 1 69bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define LEN 30 70bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define READ_DIRECT 1 71bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define WRITE_DIRECT 2 72bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define RDWR_DIRECT 3 73bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 74bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewstatic int iter = 100; /* Iterations. Default 100 */ 75bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewstatic int bufsize = BUFSIZE; /* Buffersize. Default 4k */ 76bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewstatic off64_t offset = 0; /* Offset. Default 0 */ 77bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewstatic int nvector = 20; /* Vector array. Default 20 */ 78bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewstatic char filename[LEN]; /* Test data file */ 7904e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modakstatic int fd1 = -1; 8004e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak 8104e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modakstatic void setup(void); 8204e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modakstatic void cleanup(void); 83bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 84bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew/* 85bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * prg_usage: display the program usage 86bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew*/ 87bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewvoid 88bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewprg_usage() 89bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew{ 90bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "Usage: diotest6 [-b bufsize] [-o offset] [-n numchild] [-i iterations] [-v nvector] [-f filename]\n"); 91bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew exit(1); 92bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew} 93bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 94bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew/* 958c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew * runtest: write the data to the file. Read the data from the file and compare. 964bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * For each iteration, write data starting at offse+iter*bufsize 978c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew * location in the file and read from there. 988c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew*/ 998c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiewint 1008c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiewruntest(int fd_r, int fd_w, int childnum, int action) 1018c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew{ 1028c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew off64_t seekoff; 1038c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew int i, bufsize = BUFSIZE; 1048c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew struct iovec *iov1, *iov2, *iovp; 1058c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew 1068c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew /* Allocate for buffers and data pointers */ 1078c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew seekoff = offset+bufsize * childnum; 1088c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if ((iov1 = (struct iovec *)valloc(sizeof(struct iovec)*nvector)) == NULL) { 1090bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "valloc buf1 failed: %s", strerror(errno)); 1108c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew return(-1); 1118c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1128c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if ((iov2 = (struct iovec *)valloc(sizeof(struct iovec)*nvector)) == NULL) { 1130bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "valloc buf2 failed: %s", strerror(errno)); 1148c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew return(-1); 1158c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1168c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew for (i = 0, iovp = iov1; i < nvector; iovp++, i++) { 1178c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if ((iovp->iov_base = valloc(bufsize)) == NULL) { 1180bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "valloc for iovp->iov_base: %s", 1198c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew strerror(errno)); 1208c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew return(-1); 1218c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1228c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew iovp->iov_len = bufsize; 1238c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1248c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew for (i = 0, iovp = iov2; i < nvector; iovp++, i++) { 1258c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if ((iovp->iov_base = valloc(bufsize)) == NULL) { 1260bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "valloc, iov2 for iovp->iov_base: %s", 1278c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew strerror(errno)); 1288c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew return(-1); 1298c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1308c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew iovp->iov_len = bufsize; 1318c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1328c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew 1338c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew /* seek, write, read and verify */ 1348c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew for (i = 0; i < iter; i++) { 1358c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew /* 1368c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew fillbuf(buf1, bufsize, childnum+i); 1378c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew */ 1388c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew vfillbuf(iov1, nvector, childnum+i); 1398c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (lseek(fd_w, seekoff, SEEK_SET) < 0) { 1404bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "lseek before write failed: %s", 1418c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew strerror(errno)); 1428c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew return(-1); 1438c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1448c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (write(fd_w, iov1, bufsize) < bufsize) { 1450bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "write failed: %s", strerror(errno)); 1468c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew return(-1); 1478c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1488c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (action == READ_DIRECT) { 1498c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew /* Make sure data is on to disk before read */ 1508c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (fsync(fd_w) < 0) { 1510bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "fsync failed: %s", 1528c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew strerror(errno)); 1538c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew return(-1); 1548c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1558c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1568c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (lseek(fd_r, seekoff, SEEK_SET) < 0) { 1574bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "lseek before read failed: %s", 1588c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew strerror(errno)); 1598c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew return(-1); 1608c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1618c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (read(fd_r, iov2, bufsize) < bufsize) { 1620bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "read failed: %s", strerror(errno)); 1638c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew return(-1); 1648c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1658c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (bufcmp((char*)iov1, (char*)iov2, bufsize) != 0) { 1664bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "comparsion failed. Child=%d offset=%d", 1678c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew childnum, (int)seekoff); 1688c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew return(-1); 1698c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1708c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 17143337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak return 0; 1728c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew} 1738c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew/* 174bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * child_function: open the file for read and write. Call the runtest routine. 175bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew*/ 176bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewint 177bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewchild_function(int childnum, int action) 178bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew{ 179bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew int fd_w, fd_r; 180bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 181bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew switch(action) { 182bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case READ_DIRECT: 183bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_w = open(filename, O_WRONLY|O_CREAT, 0666)) < 0) { 1840bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "fd_w open failed for %s: %s", 185bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 186bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 187bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 188bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_r = open(filename, O_DIRECT|O_RDONLY, 0666)) < 0) { 1890bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "fd_r open failed for %s: %s", 190bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 191bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 19204e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak unlink(filename); 193bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 194bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 195bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (runtest(fd_r, fd_w, childnum, action) == -1) { 1960bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "Read Direct-child %d failed", 197bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew childnum); 198bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 199bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 200bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 201bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 202bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 203bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case WRITE_DIRECT: 204bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_w = open(filename, O_DIRECT|O_WRONLY|O_CREAT, 0666)) < 0) { 2050bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "fd_w open failed for %s: %s", 206bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 207bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 208bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 209bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_r = open(filename, O_RDONLY, 0666)) < 0) { 2100bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "fd_r open failed for %s: %s", 211bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 212bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 21304e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak unlink(filename); 214bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 215bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 216bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (runtest(fd_r, fd_w, childnum, action) == -1) { 2170bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "Write Direct-child %d failed", 218bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew childnum); 219bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 220bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 221bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 222bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 223bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 224bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case RDWR_DIRECT: 225bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_w = open(filename, O_DIRECT|O_WRONLY|O_CREAT, 0666)) < 0) { 2260bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "fd_w open failed for %s: %s", 227bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 228bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 229bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 230bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_r = open(filename, O_DIRECT|O_RDONLY, 0666)) < 0) { 2310bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "fd_r open failed for %s: %s", 232bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew filename, strerror(errno)); 233bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 234bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 235bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 236bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (runtest(fd_r, fd_w, childnum, action) == -1) { 2370bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "RDWR Direct-child %d failed", 238bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew childnum); 239bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 240bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 241bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 242bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 243bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 244bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew default: 245bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr,"Invalid Action Value\n"); 246bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew return(-1); 247bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 248bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 249bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 250bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew exit(0); 251bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew} 252bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 253bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 254bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewint 255bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiewmain(int argc, char *argv[]) 256bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew{ 257bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew int *pidlst; 258bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew int numchild = 1; /* Number of children. Default 5 */ 259bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew int i, fail_count = 0, failed = 0, total = 0; 260bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 261bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Options */ 262b48651d2444c180f7db691b11a56cc6d57444d10mridge sprintf(filename,"testdata-6.%ld", syscall(__NR_gettid)); 263bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew while ((i = getopt(argc, argv, "b:o:i:n:v:f:")) != -1) { 264bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew switch(i) { 265bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'b': 266bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((bufsize = atoi(optarg)) <= 0) { 267bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "bufsize must be > 0\n"); 268bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 269bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 270bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (bufsize % 4096 != 0) { 271bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "bufsize must be multiple of 4k\n"); 272bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 273bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 274bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 275bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'o': 276bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((offset = atoi(optarg)) <= 0) { 277bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "offset must be > 0\n"); 278bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 279bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 280bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 281bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'i': 282bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((iter = atoi(optarg)) <= 0) { 283bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "iterations must be > 0\n"); 284bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 285bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 286bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 287bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'n': 288bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((numchild = atoi(optarg)) <= 0) { 289bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "no of children must be > 0\n"); 290bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 291bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 292bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 293bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'v': 294bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((nvector = atoi(optarg)) <= 0) { 295bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "vectory array must be > 0\n"); 296bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 297bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 298bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 299bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'f': 300bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew strcpy(filename, optarg); 301bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 302bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew default: 303bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 304bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 305bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 306bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 30704e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak setup(); 3088680e9b72836f1cc465d424e0dcc9e54e4eda32brobbiew 309bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Testblock-1: Read with Direct IO, Write without */ 3108fb1cdb0538640f295691929650408688537fb7fGarrett Cooper if (forkchldrn(&pidlst, numchild, READ_DIRECT, child_function) < 0) { 311bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 312bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 31392b688b8340e2424643c5d33dcacfbb109529402robbiew tst_resm (TFAIL, "Read with Direct IO, Write without"); 314bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 315bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew else { 316bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (waitchldrn(&pidlst, numchild) < 0) { 317bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 318bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 31992b688b8340e2424643c5d33dcacfbb109529402robbiew tst_resm (TFAIL, "Read with Direct IO, Write without"); 320bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 32192b688b8340e2424643c5d33dcacfbb109529402robbiew else 32292b688b8340e2424643c5d33dcacfbb109529402robbiew tst_resm (TPASS, "Read with Direct IO, Write without"); 32392b688b8340e2424643c5d33dcacfbb109529402robbiew 324bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 325bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew unlink(filename); 326bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew free(pidlst); 327bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total++; 328bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 329bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Testblock-2: Write with Direct IO, Read without */ 330bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (forkchldrn(&pidlst, numchild, WRITE_DIRECT, child_function) < 0) { 331bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 332bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 33392b688b8340e2424643c5d33dcacfbb109529402robbiew tst_resm (TFAIL, "Write with Direct IO, Read without"); 334bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 335bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew else { 336bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (waitchldrn(&pidlst, numchild) < 0) { 337bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 338bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 33992b688b8340e2424643c5d33dcacfbb109529402robbiew tst_resm (TFAIL, "Write with Direct IO, Read without"); 340bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 34192b688b8340e2424643c5d33dcacfbb109529402robbiew else 34292b688b8340e2424643c5d33dcacfbb109529402robbiew tst_resm (TPASS, "Write with Direct IO, Read without"); 343bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 344bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew unlink(filename); 345bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew free(pidlst); 346bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total++; 347bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 348bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Testblock-3: Read, Write with Direct IO. */ 349bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (forkchldrn(&pidlst, numchild, RDWR_DIRECT, child_function) < 0) { 350bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 351bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 35292b688b8340e2424643c5d33dcacfbb109529402robbiew tst_resm (TFAIL, "Read, Write with Direct IO"); 353bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 354bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew else { 355bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (waitchldrn(&pidlst, numchild) < 0) { 356bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 357bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 35892b688b8340e2424643c5d33dcacfbb109529402robbiew tst_resm (TFAIL, "Read, Write with Direct IO"); 359bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 36092b688b8340e2424643c5d33dcacfbb109529402robbiew else 36192b688b8340e2424643c5d33dcacfbb109529402robbiew tst_resm (TPASS, "Read, Write with Direct IO"); 362bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 363bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew unlink(filename); 364bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew free(pidlst); 365bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total++; 366bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 36792b688b8340e2424643c5d33dcacfbb109529402robbiew if (failed) 3684bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TINFO, "%d/%d testblocks failed", 369bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count, total); 37092b688b8340e2424643c5d33dcacfbb109529402robbiew else 3714bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TINFO, "%d testblocks %d iterations with %d children completed", 372bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total, iter, numchild); 37304e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak cleanup(); 37492b688b8340e2424643c5d33dcacfbb109529402robbiew return 0; 375bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew} 376bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 37704e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modakstatic void setup(void) 37804e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak{ 37904e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak tst_tmpdir(); 38004e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak 38104e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak if ((fd1 = open(filename, O_CREAT|O_EXCL, 0600)) < 0) { 38204e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak tst_brkm(TBROK, cleanup, "Couldn't create test file %s: %s", filename, strerror(errno)); 38304e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak } 38404e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak close(fd1); 38504e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak 38604e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak /* Test for filesystem support of O_DIRECT */ 38704e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak if ((fd1 = open(filename, O_DIRECT, 0600)) < 0) { 38804e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak tst_brkm(TCONF, cleanup, "O_DIRECT is not supported by this filesystem. %s", strerror(errno)); 38904e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak } 39076a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak close(fd1); 39104e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak} 39204e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak 39304e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modakstatic void cleanup(void) 39404e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak{ 395df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (fd1 != -1) 39604e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak unlink(filename); 39704e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak 39804e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak tst_rmdir(); 39904e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak 40004e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak tst_exit(); 40104e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak} 40296f4bb38da69c681481f337d099ee4b6cdbba102robbiew 40396f4bb38da69c681481f337d099ee4b6cdbba102robbiew#else /* O_DIRECT */ 40496f4bb38da69c681481f337d099ee4b6cdbba102robbiew 40596f4bb38da69c681481f337d099ee4b6cdbba102robbiewint 40696f4bb38da69c681481f337d099ee4b6cdbba102robbiewmain() { 40796f4bb38da69c681481f337d099ee4b6cdbba102robbiew 40896f4bb38da69c681481f337d099ee4b6cdbba102robbiew tst_resm(TCONF,"O_DIRECT is not defined."); 40996f4bb38da69c681481f337d099ee4b6cdbba102robbiew return 0; 41096f4bb38da69c681481f337d099ee4b6cdbba102robbiew} 41196f4bb38da69c681481f337d099ee4b6cdbba102robbiew#endif /* O_DIRECT */ 412