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 174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew */ 19bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 20bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew/* 21bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * NAME 22bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * diotest3.c 23bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 24bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * DESCRIPTION 25bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * Fork given number of children. Each child opens the same file, but 26bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * uses its own file descriptiors. The child does writes and reads from 27bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * its segment in the file. The segment to which the child writes is 28bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * determined by childnumber * bufsize. There is no need to use any locks. 294bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * Program tests the combinations of buffered/buffered read(), write() 30bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * calls. 31bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * Test blocks: 32bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * [1] Direct Read, Buffered write 33bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * [2] Direct Write, Buffered read 34bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * [3] Direct Read, Direct Write 35bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 36bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * USAGE 37bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * diotest3 [-b bufsize] [-o offset] [-n numchild] 38bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * [-i iterations [-f filename] 394bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 40bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * History 41bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * 04/22/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 <errno.h> 55bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 56f7dc1be5b85cd32072dcae2db569bf11d115f27frobbiew#include "diotest_routines.h" 57f7dc1be5b85cd32072dcae2db569bf11d115f27frobbiew 5896f4bb38da69c681481f337d099ee4b6cdbba102robbiew#include "test.h" 5996f4bb38da69c681481f337d099ee4b6cdbba102robbiew 60354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *TCID = "diotest03"; /* Test program identifier. */ 61354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint TST_TOTAL = 3; /* Total number of test conditions */ 628680e9b72836f1cc465d424e0dcc9e54e4eda32brobbiew 6396f4bb38da69c681481f337d099ee4b6cdbba102robbiew#ifdef O_DIRECT 6496f4bb38da69c681481f337d099ee4b6cdbba102robbiew 65bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define BUFSIZE 4096 66bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define TRUE 1 67bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define LEN 30 68bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define READ_DIRECT 1 69bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define WRITE_DIRECT 2 70bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew#define RDWR_DIRECT 3 71bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 72354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int iter = 100; /* Iterations. Default 100 */ 73354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int bufsize = BUFSIZE; /* Buffersize. Default 4k */ 74354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int offset = 0; /* Offset. Default 0 */ 75354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic char filename[LEN]; 76bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 77bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew/* 78bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * prg_usage: display the program usage 79bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew*/ 80354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid prg_usage() 81bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew{ 82354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fprintf(stderr, 83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Usage: diotest3 [-b bufsize] [-o offset] [-n numchild] [-i iterations] [-f filename]\n"); 84bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew exit(1); 85bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew} 86bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 87bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew/* 888c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew * runtest: write the data to the file. Read the data from the file and compare. 894bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * For each iteration, write data starting at offse+iter*bufsize 908c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew * location in the file and read from there. 918dca42291762e7db715a406e79dc048f696f5067Garrett Cooper * 928dca42291762e7db715a406e79dc048f696f5067Garrett Cooper * XXX (garrcoop): shouldn't use libltp APIs because it runs forked. 938dca42291762e7db715a406e79dc048f696f5067Garrett Cooper */ 94354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint runtest(int fd_r, int fd_w, int childnum, int action) 958c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew{ 96354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char *buf1; 97354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char *buf2; 98354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao off_t seekoff; 99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int bufsize = BUFSIZE; 100354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int i; 1018c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew 1028c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew /* Allocate for buffers */ 103354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao seekoff = offset + bufsize * childnum; 1048c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if ((buf1 = valloc(bufsize)) == 0) { 105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL | TERRNO, "valloc for buf1 failed"); 106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 1078c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1088c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if ((buf2 = valloc(bufsize)) == 0) { 109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL | TERRNO, "valloc for buf2 failed"); 110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 1118c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1128c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew 1138c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew /* seek, write, read and verify */ 1148c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew for (i = 0; i < iter; i++) { 115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fillbuf(buf1, bufsize, childnum + i); 1168c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (lseek(fd_w, seekoff, SEEK_SET) < 0) { 117354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL | TERRNO, "lseek (fd_w, ..) failed"); 118354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 1198c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1208c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (write(fd_w, buf1, bufsize) < bufsize) { 121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL | TERRNO, "write failed"); 122354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 1238c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1248c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (action == READ_DIRECT) { 1258c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew /* Make sure data is on to disk before read */ 1268c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (fsync(fd_w) < 0) { 127354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL | TERRNO, "fsync failed"); 128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 1298c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1308c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1318c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (lseek(fd_r, seekoff, SEEK_SET) < 0) { 132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL | TERRNO, "lseek(fd_r, ..) failed"); 133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 1348c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1358c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (read(fd_r, buf2, bufsize) < bufsize) { 136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL | TERRNO, "read failed"); 137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 1388c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1398c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew if (bufcmp(buf1, buf2, bufsize) != 0) { 1408dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_resm(TFAIL, 141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "comparsion failed; child=%d offset=%d", 142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao childnum, (int)seekoff); 143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 1448c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1458c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew } 1468dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_exit(); 1478c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew} 1488c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew 1498c64d1bbc89d3c6155f3f6bcdb974756d3b7919frobbiew/* 150bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew * child_function: open the file for read and write. Call the runtest routine. 151bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew*/ 152354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint child_function(int childnum, int action) 153bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew{ 154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int fd_w, fd_r; 155bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 156354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao switch (action) { 1578dca42291762e7db715a406e79dc048f696f5067Garrett Cooper case READ_DIRECT: 158354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((fd_w = open(filename, O_WRONLY | O_CREAT, 0666)) < 0) { 159354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL | TERRNO, 160354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "open(%s, O_WRONLY|O_CREAT, ..) failed", 161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao filename); 162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 163bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 164354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((fd_r = open(filename, O_DIRECT | O_RDONLY, 0666)) < 0) { 165354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL | TERRNO, 166354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "open(%s, O_DIRECT|O_RDONLY, ..) failed", 167354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao filename); 168bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 169354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 170bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 171bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (runtest(fd_r, fd_w, childnum, action) == -1) { 1720bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "Read Direct-child %d failed", 173354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao childnum); 174bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 175bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 176354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 177bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 178bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 179354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao case WRITE_DIRECT: 180354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((fd_w = 181354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao open(filename, O_DIRECT | O_WRONLY | O_CREAT, 0666)) < 0) { 182354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, "fd_w open failed for %s: %s", filename, 183354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao strerror(errno)); 184354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 185bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 186bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((fd_r = open(filename, O_RDONLY, 0666)) < 0) { 1870bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "fd_r open failed for %s: %s", 188354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao filename, strerror(errno)); 189bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 190354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 191bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 192bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (runtest(fd_r, fd_w, childnum, action) == -1) { 1930bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "Write Direct-child %d failed", 194354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao childnum); 195bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 196bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 197354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 198bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 199bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 200354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao case RDWR_DIRECT: 201354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((fd_w = 202354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao open(filename, O_DIRECT | O_WRONLY | O_CREAT, 0666)) < 0) { 203354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, "fd_w open failed for %s: %s", filename, 204354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao strerror(errno)); 205354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 206bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 207354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((fd_r = open(filename, O_DIRECT | O_RDONLY, 0666)) < 0) { 2080bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "fd_r open failed for %s: %s", 209354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao filename, strerror(errno)); 210bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 211354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 212bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 213bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (runtest(fd_r, fd_w, childnum, action) == -1) { 2140bdbaa31acb9640b8ac63f17e5af999a124519d3vapier tst_resm(TFAIL, "RDWR Direct-child %d failed", 215354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao childnum); 216bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 217bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 218354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 219bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 220bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 2218dca42291762e7db715a406e79dc048f696f5067Garrett Cooper default: 222354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fprintf(stderr, "Invalid Action Value\n"); 223354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 224bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 225bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_w); 226bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew close(fd_r); 227bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew exit(0); 228bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew} 229bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 23004e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modakstatic void setup(void); 23104e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modakstatic void cleanup(void); 23204e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modakstatic int fd1 = -1; 233bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 234354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(int argc, char *argv[]) 235bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew{ 236354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int *pidlst; 237354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int numchild = 1; /* Number of children. Default 5 */ 238354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int i, fail_count = 0, failed = 0, total = 0; 239bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 240bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Options */ 241d97f51dc8278ac024bccac7c64bc30f3b3f7bbbeJeff Layton sprintf(filename, "testdata-3.%ld", syscall(__NR_gettid)); 242bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew while ((i = getopt(argc, argv, "b:o:i:n:f:")) != -1) { 243354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao switch (i) { 244bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'b': 245bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((bufsize = atoi(optarg)) <= 0) { 246bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "bufsize must be > 0\n"); 247bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 248bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 249bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (bufsize % 4096 != 0) { 250354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fprintf(stderr, 251354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "bufsize must be multiple of 4k\n"); 252bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 253bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 254bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 255bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'o': 256bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((offset = atoi(optarg)) <= 0) { 257bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "offset must be > 0\n"); 258bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 259bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 260bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 261bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'i': 262bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((iter = atoi(optarg)) <= 0) { 263bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "iterations must be > 0\n"); 264bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 265bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 266bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 267bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'n': 268bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if ((numchild = atoi(optarg)) <= 0) { 269bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fprintf(stderr, "no of children must be > 0\n"); 270bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 271bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 272bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 273bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew case 'f': 274bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew strcpy(filename, optarg); 275bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew break; 276bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew default: 277bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew prg_usage(); 278bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 279bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 280bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 28104e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak setup(); 2828680e9b72836f1cc465d424e0dcc9e54e4eda32brobbiew 283bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Testblock-1: Read with Direct IO, Write without */ 2848fb1cdb0538640f295691929650408688537fb7fGarrett Cooper if (forkchldrn(&pidlst, numchild, READ_DIRECT, child_function) < 0) { 285bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 286bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 2878dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_resm(TFAIL, "Read with Direct IO, Write without"); 288354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } else { 289bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (waitchldrn(&pidlst, numchild) < 0) { 290bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 291bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 2928dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_resm(TFAIL, "Read with Direct IO, Write without"); 293354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } else 2948dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_resm(TPASS, "Read with Direct IO, Write without"); 29592b688b8340e2424643c5d33dcacfbb109529402robbiew 296bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 297bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew unlink(filename); 298bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew free(pidlst); 299bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total++; 300bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 301bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Testblock-2: Write with Direct IO, Read without */ 302bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (forkchldrn(&pidlst, numchild, WRITE_DIRECT, child_function) < 0) { 303bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 304bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 3058dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_resm(TFAIL, "Write with Direct IO, Read without"); 306354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } else { 307bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (waitchldrn(&pidlst, numchild) < 0) { 308bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 309bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 3108dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_resm(TFAIL, "Write with Direct IO, Read without"); 311354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } else 3128dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_resm(TPASS, "Write with Direct IO, Read without"); 313bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 314bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew unlink(filename); 315bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew free(pidlst); 316bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total++; 317bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 318bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew /* Testblock-3: Read, Write with Direct IO. */ 319bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (forkchldrn(&pidlst, numchild, RDWR_DIRECT, child_function) < 0) { 320bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 321bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 322354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, "Read, Write with Direct IO"); 323354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } else { 324bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew if (waitchldrn(&pidlst, numchild) < 0) { 325bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew failed = TRUE; 326bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew fail_count++; 3278dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_resm(TFAIL, "Read, Write with Direct IO"); 3288dca42291762e7db715a406e79dc048f696f5067Garrett Cooper } else 3298dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_resm(TPASS, "Read, Write with Direct IO"); 330bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew } 331bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew unlink(filename); 332bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew free(pidlst); 333bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew total++; 334bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 3358dca42291762e7db715a406e79dc048f696f5067Garrett Cooper if (failed) 336354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TINFO, "%d/%d testblocks failed", fail_count, total); 33704e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak else 338354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TINFO, 339354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "%d testblocks %d iterations with %d children completed", 340354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao total, iter, numchild); 34104e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak cleanup(); 3422c28215423293e443469a07ae7011135d058b671Garrett Cooper 3438dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_exit(); 3448dca42291762e7db715a406e79dc048f696f5067Garrett Cooper 345bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew} 346bfb98f98f0ebdcdeac4e628eeed3206bd1e451abrobbiew 34704e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modakstatic void setup(void) 34804e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak{ 34904e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak tst_tmpdir(); 35004e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak 351354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((fd1 = open(filename, O_CREAT | O_EXCL, 0600)) < 0) 352354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 353354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "open(%s, O_CREAT|O_EXCL, ..) failed", filename); 35404e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak close(fd1); 35504e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak 35604e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak /* Test for filesystem support of O_DIRECT */ 3578dca42291762e7db715a406e79dc048f696f5067Garrett Cooper if ((fd1 = open(filename, O_DIRECT, 0600)) < 0) 35872521cf0741034f67dd17107453cda9a9819264cGarrett Cooper tst_brkm(TCONF, cleanup, "open(%s, O_DIRECT, ..) failed", 359354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao filename); 36076a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak close(fd1); 36104e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak} 36204e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak 36304e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modakstatic void cleanup(void) 36404e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak{ 365df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (fd1 != -1) 36604e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak unlink(filename); 36704e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak 36804e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak tst_rmdir(); 36996f4bb38da69c681481f337d099ee4b6cdbba102robbiew 37004e0bfa9661a9d9caca9f2683b925b66ca5a7cb2subrata_modak} 37196f4bb38da69c681481f337d099ee4b6cdbba102robbiew#else /* O_DIRECT */ 37296f4bb38da69c681481f337d099ee4b6cdbba102robbiew 373354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main() 3748dca42291762e7db715a406e79dc048f696f5067Garrett Cooper{ 3758dca42291762e7db715a406e79dc048f696f5067Garrett Cooper tst_brkm(TCONF, NULL, "O_DIRECT is not defined."); 37696f4bb38da69c681481f337d099ee4b6cdbba102robbiew} 377ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman#endif /* O_DIRECT */ 378