ftest03.c revision 354ebb48db8e66a853a58379a4808d5dcd1ceac3
124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew/* 224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Copyright (c) International Business Machines Corp., 2002 404f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak * Copyright (c) Cyril Hrubis chrubis@suse.cz 2009 524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * This program is free software; you can redistribute it and/or modify 724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * it under the terms of the GNU General Public License as published by 824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * the Free Software Foundation; either version 2 of the License, or 924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * (at your option) any later version. 1024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 1124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * This program is distributed in the hope that it will be useful, 1224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * but WITHOUT ANY WARRANTY; without even the implied warranty of 1324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 1424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * the GNU General Public License for more details. 1524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 1624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * You should have received a copy of the GNU General Public License 1724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * along with this program; if not, write to the Free Software 184548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 1924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 2024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 2124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew/* 2224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * NAME 2324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * ftest03.c -- test file I/O with readv and writev (ported from SPIE section2/filesuite/ftest4.c, by Airong Zhang) 2424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 2524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * CALLS 2624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * lseek, readv, writev, 2724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * truncate, ftruncate, fsync, sync, fstat 2824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 2924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * ALGORITHM 3024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * A bitmap is used to map pieces of a file. 3124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Loop: pick a random piece of the file 3224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * if we haven't seen it before make sure it is zero, 3324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * write pattern 3424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * if we have seen it before make sure correct pattern. 3524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 3624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * This was originally written by rbk - was program tfio.c 3724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Modified by dale to integrate with test suites. 3824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Modified by G. Stevens to use readv and writev. 3924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Modofied by K. Hakim to integrate with SPIES. 4024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 4124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * RESTRICTIONS 4224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 1. Runs a long time with default args - can take others on input 4324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * line. Use with "term mode". 4424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * If run on vax the ftruncate will not be random - will always go to 4524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * start of file. NOTE: produces a very high load average!! 4624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 4724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 2. The "csize" argument must be evenly divisible by MAXIOVCNT. 4824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 4924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * CAUTION!! 5024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * If a file is supplied to this program with the "-f" option 5124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * it will be removed with a system("rm -rf filename") call. 52bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak * 5324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 5424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 5524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define _XOPEN_SOURCE 500 5624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#include <sys/types.h> 5724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#include <sys/param.h> 5824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#include <sys/wait.h> 5924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#include <sys/stat.h> 60f81795e0876f9dd0d95b42aec99a9a5de04d883dvapier#include <errno.h> 6124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#include <sys/uio.h> 6224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#include <fcntl.h> 63f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak#include <signal.h> 64f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak#include <stdio.h> 65f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak#include <inttypes.h> 6624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#include "test.h" 6724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#include "usctest.h" 6804f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak#include "libftest.h" 6924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 7024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiewchar *TCID = "ftest03"; 7124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiewint TST_TOTAL = 1; 7224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 7324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define PASSED 1 7424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define FAILED 0 7524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 76f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void setup(void); 77f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void runtest(void); 78f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void dotest(int, int, int); 79354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void domisc(int, int, char *); 80f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void term(int sig); 8124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 8204f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak#define MAXCHILD 25 8324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define K_1 1024 8424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define K_2 2048 8524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define K_4 4096 8624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define MAXIOVCNT 16 8724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 88354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int csize; /* chunk size */ 89354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int iterations; /* # total iterations */ 90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int max_size; /* max file size */ 91354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int misc_intvl; /* for doing misc things; 0 ==> no */ 92354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int nchild; /* how many children */ 93354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int fd; /* file descriptor used by child */ 9404f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int parent_pid; 9504f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int pidlist[MAXCHILD]; 96354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic char test_name[2]; /* childs test directory name */ 9724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 98354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic char fuss[MAXPATHLEN]; /* directory to do this in */ 99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic char homedir[MAXPATHLEN]; /* where we started */ 10024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 10104f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int local_flag; 102f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 103354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(int ac, char *av[]) 10424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{ 105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int lc; 106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char *msg; 10724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao /* 109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * parse standard options 110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao */ 111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) { 1127a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 11424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 11524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew setup(); 116bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 11724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew for (lc = 0; TEST_LOOPING(lc); lc++) { 11824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 11924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew local_flag = PASSED; 12024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao runtest(); 12224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 12324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (local_flag == PASSED) { 124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TPASS, "Test passed."); 125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } else { 126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, "Test failed."); 127354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 128bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 12924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_rmdir(); 130f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak /* ??? so we are doing only one loop here ??? */ 13124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 132f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak } 133f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 1342c28215423293e443469a07ae7011135d058b671Garrett Cooper tst_exit(); 13524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew} 13624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 137f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void setup(void) 13824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{ 139f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak char wdbuf[MAXPATHLEN]; 14024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 14124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 14224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Make a directory to do this in; ignore error if already exists. 14324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Save starting directory. 14424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 14524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_tmpdir(); 146f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 147f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if (getcwd(homedir, sizeof(homedir)) == NULL) { 148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, NULL, "getcwd() failed"); 14924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 15024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 15124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew parent_pid = getpid(); 15224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 15324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (!fuss[0]) 154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sprintf(fuss, "%s/ftest03.%d", getcwd(wdbuf, sizeof(wdbuf)), 155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao getpid()); 15624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 15724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew mkdir(fuss, 0755); 15824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 15924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (chdir(fuss) < 0) { 160354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TBROK, "\tCan't chdir(%s), error %d.", fuss, errno); 161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_exit(); 16224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 16324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 16424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 16524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Default values for run conditions. 16624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 16724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew iterations = 10; 16824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew nchild = 5; 16924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew csize = K_2; /* should run with 1, 2, and 4 K sizes */ 17024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew max_size = K_1 * K_1; 17124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew misc_intvl = 10; 17224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 173f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if (sigset(SIGTERM, term) == SIG_ERR) { 17424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew perror("sigset failed"); 175354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TBROK, " sigset failed: signo = 15"); 176354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_exit(); 17724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 17824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew} 17924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 180f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void runtest(void) 18124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{ 1827a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper pid_t pid; 1837a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper int child, count, i, nwait, status; 1847a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper 1857a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper nwait = 0; 18624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 187df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper for (i = 0; i < nchild; i++) { 188f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 18924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew test_name[0] = 'a' + i; 19024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew test_name[1] = '\0'; 191f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 192354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fd = open(test_name, O_RDWR | O_CREAT | O_TRUNC, 0666); 193f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 19424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (fd < 0) { 195354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TBROK, "\tError %d creating %s/%s.", errno, 196354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fuss, test_name); 19724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 19824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 199f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 200f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if ((child = fork()) == 0) { 201f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak dotest(nchild, i, fd); 202f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak tst_exit(); 20324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 20424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 20524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew close(fd); 20624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 20724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (child < 0) { 208354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, NULL, "fork failed"); 20924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } else { 21024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew pidlist[i] = child; 21124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew nwait++; 21224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 21324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 21424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 21524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 21624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Wait for children to finish. 21724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 21824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew count = 0; 219f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 220f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak while (1) { 221f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if ((child = wait(&status)) >= 0) { 222f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak //tst_resm(TINFO, "\tTest{%d} exited status = 0x%x", child, status); 223f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if (status) { 224354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 225354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest{%d} failed, expected 0 exit.", 226354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao child); 227f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak local_flag = FAILED; 228f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak } 229f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak ++count; 230f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak } else { 231f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if (errno != EINTR) 232f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak break; 23324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 23424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 23524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 23624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 23724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Should have collected all children. 23824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 23924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (count != nwait) { 240354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, "\tWrong # children waited on, count = %d", 241354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao count); 24224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew local_flag = FAILED; 24324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 24424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 24524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew chdir(homedir); 24624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 24724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew pid = fork(); 248f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 24924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (pid < 0) { 250354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, sync, "fork failed"); 25124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 25224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 25324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 25424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (pid == 0) { 2557fdd5140a541cba0961c35161e2fa43426dce653robbiew execl("/bin/rm", "rm", "-rf", fuss, NULL); 2567a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper exit(1); 25724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } else 25824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew wait(&status); 259f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 26024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (status) { 261354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TINFO, "CAUTION - ftest03, '%s' may not be removed", 262354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fuss); 26324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 264bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 265f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak sync(); 26624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew} 26724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 26824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew/* 26924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * dotest() 27024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Children execute this. 27124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * 27224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Randomly read/mod/write chunks with known pattern and check. 27324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * When fill sectors, iterate. 27424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 27524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 27624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define NMISC 4 277354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoenum m_type { m_fsync, m_trunc, m_fstat }; 278354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *m_str[] = { 279354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "fsync", "trunc", "sync", "fstat" 28024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew}; 28124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 282354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint misc_cnt[NMISC]; /* counts # of each kind of misc */ 283354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint file_max; /* file-max size */ 284354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint nchunks; 285354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint last_trunc = -1; 286354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint tr_flag; 287354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoenum m_type type = m_fsync; 28824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 28924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define CHUNK(i) ((i) * csize) 29024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define NEXTMISC ((rand() % misc_intvl) + 5) 29124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 292f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void dotest(int testers, int me, int fd) 29324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{ 294f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak char *bits, *hold_bits; 295f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak char val; 296f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak int chunk, whenmisc, xfr, count, collide, i; 29724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 29824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* Stuff for the readv call */ 299354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao struct iovec r_iovec[MAXIOVCNT]; 300354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int r_ioveclen; 30124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 30224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* Stuff for the writev call */ 303354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao struct iovec val_iovec[MAXIOVCNT]; 304354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao struct iovec zero_iovec[MAXIOVCNT]; 305354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int w_ioveclen; 30624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 30724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew nchunks = max_size / csize; 308f01306bdffecc3a419acf0d6f2ce5ea248a0617fGarrett Cooper whenmisc = 0; 309f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 310354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((bits = malloc((nchunks + 7) / 8)) == 0) { 311af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_resm(TBROK, "\tmalloc failed"); 31224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 31324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 314f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 315354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((hold_bits = malloc((nchunks + 7) / 8)) == 0) { 316af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_resm(TBROK, "\tmalloc failed"); 31724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 31824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 31924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 320354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao /*Allocate memory for the iovec buffers and init the iovec arrays */ 32124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew r_ioveclen = w_ioveclen = csize / MAXIOVCNT; 32224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 323f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak /* Please note that the above statement implies that csize 324f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak * be evenly divisible by MAXIOVCNT. 325f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak */ 32624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew for (i = 0; i < MAXIOVCNT; i++) { 327f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if ((r_iovec[i].iov_base = calloc(r_ioveclen, 1)) == 0) { 328af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_brkm(TBROK, NULL, "\tmalloc failed"); 32924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* tst_exit(); */ 33024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 33124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew r_iovec[i].iov_len = r_ioveclen; 33224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 33324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* Allocate unused memory areas between all the buffers to 33424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * make things more diffult for the OS. 33524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 336354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (malloc((i + 1) * 8) == NULL) { 337354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK, NULL, "\tmalloc failed"); 33824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 339f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 340f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if ((val_iovec[i].iov_base = calloc(w_ioveclen, 1)) == 0) { 341af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_resm(TBROK, "\tmalloc failed"); 34224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 34324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 344f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 34524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew val_iovec[i].iov_len = w_ioveclen; 3462c28215423293e443469a07ae7011135d058b671Garrett Cooper 347354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (malloc((i + 1) * 8) == NULL) { 348af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_resm(TBROK, "\tmalloc failed"); 34924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 35024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 351f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 352f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if ((zero_iovec[i].iov_base = calloc(w_ioveclen, 1)) == 0) { 353af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_resm(TBROK, "\tmalloc failed"); 35424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 35524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 356f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 35724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew zero_iovec[i].iov_len = w_ioveclen; 35824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 359354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (malloc((i + 1) * 8) == NULL) { 360af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_resm(TBROK, "\tmalloc failed"); 36124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 36224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 36324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 36424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 36524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * No init sectors; allow file to be sparse. 36624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 367354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao val = (64 / testers) * me + 1; 36824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 3694bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak /* 3704bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * For each iteration: 371354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * zap bits array 372354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * loop 373354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * pick random chunk, read it. 374354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * if corresponding bit off { 375354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * verify = 0. (sparse file) 376354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * ++count; 377354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * } else 378354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * verify = val. 379354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * write "val" on it. 380354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * repeat unitl count = nchunks. 381354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * ++val. 382354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao */ 38324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 384f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak srand(getpid()); 385f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 386f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if (misc_intvl) 387f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak whenmisc = NEXTMISC; 388f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 389f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak while (iterations-- > 0) { 390f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 391df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper for (i = 0; i < NMISC; i++) 39224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew misc_cnt[i] = 0; 393f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 394354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ftruncate(fd, 0); 39524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew file_max = 0; 396354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao memset(bits, 0, (nchunks + 7) / 8); 397354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao memset(hold_bits, 0, (nchunks + 7) / 8); 39824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 39924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* Have to fill the val and zero iov buffers in a different manner 40024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 401f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak for (i = 0; i < MAXIOVCNT; i++) { 402354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao memset(val_iovec[i].iov_base, val, 403354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao val_iovec[i].iov_len); 404354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao memset(zero_iovec[i].iov_base, 0, 405354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao zero_iovec[i].iov_len); 40624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 40724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 408f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 40924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew count = 0; 41024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew collide = 0; 411f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 412f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak while (count < nchunks) { 41324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew chunk = rand() % nchunks; 41424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 41524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Read it. 41624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 417f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if (lseek(fd, CHUNK(chunk), 0) < 0) { 418354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 419354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: lseek(0) fail at %x, errno = %d.", 420354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, CHUNK(chunk), errno); 42124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 42224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 42324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if ((xfr = readv(fd, &r_iovec[0], MAXIOVCNT)) < 0) { 424354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 425354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: readv fail at %x, errno = %d.", 426354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, CHUNK(chunk), errno); 42724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 42824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 42924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 43024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * If chunk beyond EOF just write on it. 43124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Else if bit off, haven't seen it yet. 43224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Else, have. Verify values. 43324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 43424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (CHUNK(chunk) >= file_max) { 435354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao bits[chunk / 8] |= (1 << (chunk % 8)); 43624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew ++count; 437354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } else if ((bits[chunk / 8] & (1 << (chunk % 8))) == 0) { 43824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (xfr != csize) { 439354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 440354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: xfr=%d != %d, zero read.", 441354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, xfr, csize); 44224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 44324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 444354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (i = 0; i < MAXIOVCNT; i++) { 445354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (memcmp 446354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (r_iovec[i].iov_base, 447354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao zero_iovec[i].iov_base, 448354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao r_iovec[i].iov_len)) { 44924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_resm(TFAIL, 450354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d] bad verify @ 0x%x for val %d count %d xfr %d file_max 0x%x, should be 0.", 451354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, CHUNK(chunk), val, 452354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao count, xfr, file_max); 453354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TINFO, 454354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: last_trunc = 0x%x.", 455354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, last_trunc); 45624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew sync(); 45704f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak ft_dumpiov(&r_iovec[i]); 458354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ft_dumpbits(bits, 459354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (nchunks + 7) / 8); 460354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ft_orbits(hold_bits, bits, 461354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (nchunks + 7) / 8); 4624bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TINFO, "\tHold "); 463354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ft_dumpbits(hold_bits, 464354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (nchunks + 7) / 8); 46524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 46624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 46724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 468354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao bits[chunk / 8] |= (1 << (chunk % 8)); 46924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew ++count; 47024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } else { 47124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (xfr != csize) { 472354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 473354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: xfr=%d != %d, val read.", 474354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, xfr, csize); 47524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 47624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 47724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew ++collide; 478354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (i = 0; i < MAXIOVCNT; i++) { 479354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (memcmp 480354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (r_iovec[i].iov_base, 481354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao val_iovec[i].iov_base, 482354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao r_iovec[i].iov_len)) { 483354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 484354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d] bad verify @ 0x%x for val %d count %d xfr %d file_max 0x%x.", 485354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, CHUNK(chunk), val, 486354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao count, xfr, file_max); 487354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TINFO, 488354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: last_trunc = 0x%x.", 489354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, last_trunc); 49024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew sync(); 49104f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak ft_dumpiov(&r_iovec[i]); 492354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ft_dumpbits(bits, 493354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (nchunks + 7) / 8); 494354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ft_orbits(hold_bits, bits, 495354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (nchunks + 7) / 8); 4964bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TINFO, "\tHold "); 497354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ft_dumpbits(hold_bits, 498354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (nchunks + 7) / 8); 49924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 50024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 50124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 50224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 50324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 50424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Writev it. 50524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 506354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (lseek(fd, -xfr, 1) < 0) { 507354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 508354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: lseek(1) fail at %x, errno = %d.", 509354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, CHUNK(chunk), errno); 51024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 51124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 512354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((xfr = 513354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao writev(fd, &val_iovec[0], MAXIOVCNT)) < csize) { 51424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (errno == ENOSPC) { 515354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 516354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: no space, exiting.", 517354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me); 51824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew fsync(fd); 51924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 52024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 521354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 522354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: writev fail at %x xfr %d, errno = %d.", 523354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, CHUNK(chunk), xfr, errno); 52424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 52524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 52624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (CHUNK(chunk) + csize > file_max) 52724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew file_max = CHUNK(chunk) + csize; 52824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 52924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * If hit "misc" interval, do it. 53024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 53124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (misc_intvl && --whenmisc <= 0) { 532354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ft_orbits(hold_bits, bits, (nchunks + 7) / 8); 53324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew domisc(me, fd, bits); 53424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew whenmisc = NEXTMISC; 53524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 53624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (count + collide > 2 * nchunks) 53724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew break; 53824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 53924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 54024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 54124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * End of iteration, maybe before doing all chunks. 54224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 54324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 54424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew fsync(fd); 545f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak ++misc_cnt[m_fsync]; 546af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier //tst_resm(TINFO, "\tTest{%d} val %d done, count = %d, collide = {%d}", 547354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao // me, val, count, collide); 548df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper //for (i = 0; i < NMISC; i++) 549354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao // tst_resm(TINFO, "\t\tTest{%d}: {%d} %s's.", me, misc_cnt[i], m_str[i]); 55024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew ++val; 55124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 55224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew} 55324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 55424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew/* 55524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Inject misc syscalls into the thing. 55624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 557f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void domisc(int me, int fd, char *bits) 55824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{ 559f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak int chunk; 560f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak struct stat sb; 56124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 562f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if (type > m_fstat) 56324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew type = m_fsync; 564f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 565354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao switch (type) { 56624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew case m_fsync: 56724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (fsync(fd) < 0) { 568354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, "\tTest[%d]: fsync error %d.", me, 569354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao errno); 57024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 57124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 57224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew break; 57324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew case m_trunc: 57424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew chunk = rand() % (file_max / csize); 57524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew file_max = CHUNK(chunk); 57624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew last_trunc = file_max; 57724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (tr_flag) { 57824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (ftruncate(fd, file_max) < 0) { 579354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 580354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: ftruncate error %d @ 0x%x.", 581354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, errno, file_max); 58224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 58324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 58424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tr_flag = 0; 58524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } else { 58624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (truncate(test_name, file_max) < 0) { 587354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 588354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: truncate error %d @ 0x%x.", 589354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao me, errno, file_max); 59024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 59124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 59224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tr_flag = 1; 59324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 594354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (; chunk % 8 != 0; chunk++) 595354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao bits[chunk / 8] &= ~(1 << (chunk % 8)); 596df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper for (; chunk < nchunks; chunk += 8) 597354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao bits[chunk / 8] = 0; 59824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew break; 59924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew case m_fstat: 60024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (fstat(fd, &sb) < 0) { 601354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, "\tTest[%d]: fstat() error %d.", me, 602354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao errno); 60324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 60424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 60524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (sb.st_size != file_max) { 606354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 607354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "\tTest[%d]: fstat() mismatch; st_size=%" 608354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PRIx64 ",file_max=%x.", me, 609354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (int64_t) sb.st_size, file_max); 61024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 61124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 61224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew break; 61324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 614f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 615f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak ++misc_cnt[type]; 616f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak ++type; 61724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew} 61824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 619f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak/* 620f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak * SIGTERM signal handler. 62124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 62204f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic void term(int sig LTP_ATTRIBUTE_UNUSED) 62324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{ 624f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak int i; 62524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 626af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_resm(TINFO, "\tterm -[%d]- got sig term.", getpid()); 62724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 62824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew /* 62924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * If run by hand we like to have the parent send the signal to 63024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * the child processes. This makes life easy. 63124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */ 63224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (parent_pid == getpid()) { 633f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak for (i = 0; i < nchild; i++) 634f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak if (pidlist[i]) 63524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew kill(pidlist[i], SIGTERM); 636f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak return; 63724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew } 63824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 639af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_resm(TINFO, "\tunlinking '%s'", test_name); 64024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew 64124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew close(fd); 642f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 64324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew if (unlink(test_name)) 644af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_resm(TBROK, "Unlink of '%s' failed, errno = %d.", 645354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao test_name, errno); 64624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew else 647af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier tst_resm(TBROK, "Unlink of '%s' successful.", test_name); 648f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak 64924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew tst_exit(); 650ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 651