ftest03.c revision 4548c6cf9bcdd96d8303caa4130ab638b61f8a30
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);
79f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic 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
8804f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int csize;             /* chunk size */
8904f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int iterations;        /* # total iterations */
9004f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int max_size;          /* max file size */
9104f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int misc_intvl;        /* for doing misc things; 0 ==> no */
9204f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int nchild;            /* how many children */
9304f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int fd;                /* file descriptor used by child */
9404f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int parent_pid;
9504f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int pidlist[MAXCHILD];
9604f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic char test_name[2];     /* childs test directory name */
9724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
98fde5772340983308ebf6ed707bcae78f9a71f2baGarrett Cooperstatic char fuss[MAXPATHLEN];         /* directory to do this in */
99fde5772340983308ebf6ed707bcae78f9a71f2baGarrett Cooperstatic char homedir[MAXPATHLEN];     /* where we started */
10024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
10104f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic int local_flag;
102f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
103f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakint main (int ac, char *av[])
10424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{
105f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak        int lc;
106f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak        char *msg;
10724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
10824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew        /*
10924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew         * parse standard options
11024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew         */
111f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak        if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) {
1127a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
11324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew        }
11424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
11524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	setup();
116bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
11724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	for (lc = 0; TEST_LOOPING(lc); lc++) {
11824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
11924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		local_flag = PASSED;
12024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
12124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 	runtest();
12224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
12324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		if (local_flag == PASSED) {
124af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier                        tst_resm(TPASS, "Test passed.");
12524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew                } else {
126af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier                        tst_resm(TFAIL, "Test failed.");
12724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew                }
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) {
1487a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper		tst_brkm(TBROK|TERRNO, NULL, "getcwd() failed");
14924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
15024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
15124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	parent_pid = getpid();
15224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
15324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	if (!fuss[0])
15424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		sprintf(fuss, "%s/ftest03.%d", getcwd(wdbuf, sizeof( wdbuf)), getpid());
15524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
15624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	mkdir(fuss, 0755);
15724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
15824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	if (chdir(fuss) < 0) {
159af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier		tst_resm(TBROK,"\tCan't chdir(%s), error %d.", fuss, errno);
16024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		tst_exit() ;
16124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
16224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
16324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	/*
16424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 * Default values for run conditions.
16524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 */
16624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	iterations = 10;
16724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	nchild = 5;
16824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	csize = K_2;		/* should run with 1, 2, and 4 K sizes */
16924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	max_size = K_1 * K_1;
17024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	misc_intvl = 10;
17124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
172f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	if (sigset(SIGTERM, term) == SIG_ERR) {
17324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		perror("sigset failed");
174af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier		tst_resm(TBROK, " sigset failed: signo = 15") ;
17524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		tst_exit() ;
17624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
17724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew}
17824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
179f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void runtest(void)
18024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{
1817a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper	pid_t pid;
1827a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper	int child, count, i, nwait, status;
1837a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper
1847a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper	nwait = 0;
18524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
186df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	for (i = 0; i < nchild; i++) {
187f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
18824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		test_name[0] = 'a' + i;
18924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		test_name[1] = '\0';
190f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
19124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		fd = open(test_name, O_RDWR|O_CREAT|O_TRUNC, 0666);
192f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
19324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		if (fd < 0) {
194af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier			tst_resm(TBROK, "\tError %d creating %s/%s.", errno, fuss, test_name);
19524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			tst_exit();
19624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
197f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
198f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		if ((child = fork()) == 0) {
199f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			dotest(nchild, i, fd);
200f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			tst_exit();
20124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
20224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
20324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		close(fd);
20424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
20524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		if (child < 0) {
2067a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper			tst_brkm(TBROK|TERRNO, NULL, "fork failed");
20724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		} else {
20824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			pidlist[i] = child;
20924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			nwait++;
21024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
21124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
21224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
21324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	/*
21424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 * Wait for children to finish.
21524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 */
21624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	count = 0;
217f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
218f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	while (1) {
219f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		if ((child = wait(&status)) >= 0) {
220f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			//tst_resm(TINFO, "\tTest{%d} exited status = 0x%x", child, status);
221f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			if (status) {
222f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak				tst_resm(TFAIL, "\tTest{%d} failed, expected 0 exit.", child);
223f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak				local_flag = FAILED;
224f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			}
225f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			++count;
226f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		} else {
227f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			if (errno != EINTR)
228f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak				break;
22924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
23024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
23124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
23224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	/*
23324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 * Should have collected all children.
23424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 */
23524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	if (count != nwait) {
236af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier		tst_resm(TFAIL, "\tWrong # children waited on, count = %d", count);
23724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		local_flag = FAILED;
23824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
23924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
24024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	chdir(homedir);
24124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
24224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	pid = fork();
243f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
24424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	if (pid < 0) {
2457a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper		tst_brkm(TBROK|TERRNO, sync, "fork failed");
24624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		tst_exit();
24724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
24824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
24924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	if (pid == 0) {
2507fdd5140a541cba0961c35161e2fa43426dce653robbiew		execl("/bin/rm", "rm", "-rf", fuss, NULL);
2517a73eab97ffec8b44079586a2cc74b28b52f9959Garrett Cooper		exit(1);
25224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	} else
25324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		wait(&status);
254f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
25524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	if (status) {
256af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier		tst_resm(TINFO, "CAUTION - ftest03, '%s' may not be removed", fuss);
25724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
258bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
259f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	sync();
26024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew}
26124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
26224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew/*
26324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * dotest()
26424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew *	Children execute this.
26524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew *
26624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * Randomly read/mod/write chunks with known pattern and check.
26724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew * When fill sectors, iterate.
26824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */
26924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
27024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define	NMISC	4
27124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiewenum	m_type { m_fsync, m_trunc, m_fstat };
27224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiewchar	*m_str[] = {
27324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		"fsync",   "trunc", "sync", "fstat"
27424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew};
27524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
27624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiewint	misc_cnt[NMISC];		/* counts # of each kind of misc */
27724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiewint	file_max;			/* file-max size */
27824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiewint	nchunks;
27924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiewint	last_trunc = -1;
28024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiewint	tr_flag;
28124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiewenum	m_type type = m_fsync;
28224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
28324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define	CHUNK(i)	((i) * csize)
28424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew#define	NEXTMISC	((rand() % misc_intvl) + 5)
28524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
286f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void dotest(int testers, int me, int fd)
28724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{
288f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	char *bits, *hold_bits;
289f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	char val;
290f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	int chunk, whenmisc, xfr, count, collide, i;
29124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
29224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	/* Stuff for the readv call */
29324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	struct	iovec	r_iovec[MAXIOVCNT];
29424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	int	r_ioveclen;
29524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
29624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	/* Stuff for the writev call */
29724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	struct	iovec	val_iovec[MAXIOVCNT];
29824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	struct	iovec	zero_iovec[MAXIOVCNT];
29924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	int	w_ioveclen;
30024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
30124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	nchunks = max_size / csize;
302f01306bdffecc3a419acf0d6f2ce5ea248a0617fGarrett Cooper	whenmisc = 0;
303f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
304f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	if ((bits = malloc((nchunks+7) / 8)) == 0) {
305af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier		tst_resm(TBROK, "\tmalloc failed");
30624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		tst_exit();
30724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
308f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
309df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	if ((hold_bits = malloc((nchunks+7) / 8)) == 0) {
310af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier		tst_resm(TBROK, "\tmalloc failed");
31124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		tst_exit();
31224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
31324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
314f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	/*Allocate memory for the iovec buffers and init the iovec arrays*/
31524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	r_ioveclen = w_ioveclen = csize / MAXIOVCNT;
31624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
317f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	/* Please note that the above statement implies that csize
318f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	 * be evenly divisible by MAXIOVCNT.
319f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	 */
32024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	for (i = 0; i < MAXIOVCNT; i++) {
321f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		if ((r_iovec[i].iov_base = calloc(r_ioveclen, 1)) == 0) {
322af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier			tst_brkm(TBROK, NULL, "\tmalloc failed");
32324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			/* tst_exit(); */
32424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
32524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		r_iovec[i].iov_len = r_ioveclen;
32624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
32724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		/* Allocate unused memory areas between all the buffers to
32824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		 * make things more diffult for the OS.
32924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		 */
330f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		if (malloc((i+1)*8) == NULL) {
331af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier			tst_brkm(TBROK,NULL, "\tmalloc failed");
33224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
333f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
334f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		if ((val_iovec[i].iov_base = calloc(w_ioveclen, 1)) == 0) {
335af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier			tst_resm(TBROK, "\tmalloc failed");
33624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			tst_exit();
33724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
338f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
33924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		val_iovec[i].iov_len = w_ioveclen;
3402c28215423293e443469a07ae7011135d058b671Garrett Cooper
341f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		if (malloc((i+1)*8) == NULL) {
342af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier			tst_resm(TBROK, "\tmalloc failed");
34324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			tst_exit();
34424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
345f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
346f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		if ((zero_iovec[i].iov_base = calloc(w_ioveclen, 1)) == 0) {
347af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier			tst_resm(TBROK, "\tmalloc failed");
34824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			tst_exit();
34924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
350f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
35124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		zero_iovec[i].iov_len = w_ioveclen;
35224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
353f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		if (malloc((i+1)*8) == NULL) {
354af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier			tst_resm(TBROK, "\tmalloc failed");
35524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			tst_exit();
35624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
35724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
35824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	/*
35924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 * No init sectors; allow file to be sparse.
36024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 */
36124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	val = (64/testers) * me + 1;
36224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
3634bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak	/*
3644bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak	 * For each iteration:
3654bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak	 *	zap bits array
3664bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak	 *	loop
3672c28215423293e443469a07ae7011135d058b671Garrett Cooper	 *		pick random chunk, read it.
3684bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak	 *		if corresponding bit off {
36924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 *			verify = 0. (sparse file)
37024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 *			++count;
37124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 *		} else
37224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 *			verify = val.
37324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 *		write "val" on it.
37424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 *		repeat unitl count = nchunks.
37524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 *	++val.
37624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew         */
37724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
378f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	srand(getpid());
379f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
380f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	if (misc_intvl)
381f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		whenmisc = NEXTMISC;
382f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
383f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	while (iterations-- > 0) {
384f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
385df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper		for (i = 0; i < NMISC; i++)
38624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			misc_cnt[i] = 0;
387f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
38824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		ftruncate(fd,0);
38924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		file_max = 0;
39004f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak		memset(bits, 0, (nchunks+7) / 8);
39104f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak		memset(hold_bits, 0, (nchunks+7) / 8);
39224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
39324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		/* Have to fill the val and zero iov buffers in a different manner
39424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		 */
395f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		for (i = 0; i < MAXIOVCNT; i++) {
39604f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak			memset(val_iovec[i].iov_base,val,val_iovec[i].iov_len);
39704f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak			memset(zero_iovec[i].iov_base,0,zero_iovec[i].iov_len);
39824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
39924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
400f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
40124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		count = 0;
40224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		collide = 0;
403f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
404f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		while (count < nchunks) {
40524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			chunk = rand() % nchunks;
40624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			/*
40724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			 * Read it.
40824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			 */
409f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			if (lseek(fd, CHUNK(chunk), 0) < 0) {
410af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier				tst_resm(TFAIL, "\tTest[%d]: lseek(0) fail at %x, errno = %d.",
41124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					me, CHUNK(chunk), errno);
41224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				tst_exit();
41324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			}
41424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			if ((xfr = readv(fd, &r_iovec[0], MAXIOVCNT)) < 0) {
415af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier				tst_resm(TFAIL, "\tTest[%d]: readv fail at %x, errno = %d.",
41624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					me, CHUNK(chunk), errno);
41724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				tst_exit();
41824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			}
41924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			/*
42024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			 * If chunk beyond EOF just write on it.
42124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			 * Else if bit off, haven't seen it yet.
42224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			 * Else, have.  Verify values.
42324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			 */
42424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			if (CHUNK(chunk) >= file_max) {
42524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				bits[chunk/8] |= (1<<(chunk%8));
42624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				++count;
42724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			} else if ((bits[chunk/8] & (1<<(chunk%8))) == 0) {
42824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				if (xfr != csize) {
429af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier					tst_resm(TFAIL, "\tTest[%d]: xfr=%d != %d, zero read.",
43024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew						me, xfr, csize);
43124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					tst_exit();
43224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				}
433df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper				for (i=0;i<MAXIOVCNT; i++) {
43424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					if (memcmp(r_iovec[i].iov_base, zero_iovec[i].iov_base, r_iovec[i].iov_len)) {
43524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew						tst_resm(TFAIL,
436af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier					  	"\tTest[%d] bad verify @ 0x%x for val %d count %d xfr %d file_max 0x%x, should be 0.",
43724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew							me, CHUNK(chunk), val, count, xfr, file_max);
438af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier						tst_resm(TINFO, "\tTest[%d]: last_trunc = 0x%x.",
43924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew							me, last_trunc);
44024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew						sync();
44104f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak						ft_dumpiov(&r_iovec[i]);
44204f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak						ft_dumpbits(bits, (nchunks+7)/8);
44304f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak						ft_orbits(hold_bits, bits, (nchunks+7)/8);
4444bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak						tst_resm(TINFO, "\tHold ");
44504f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak						ft_dumpbits(hold_bits, (nchunks+7)/8);
44624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew						tst_exit();
44724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					}
44824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				}
44924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				bits[chunk/8] |= (1<<(chunk%8));
45024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				++count;
45124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			} else {
45224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				if (xfr != csize) {
453af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier					tst_resm(TFAIL, "\tTest[%d]: xfr=%d != %d, val read.",
45424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew						me, xfr, csize);
45524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					tst_exit();
45624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				}
45724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				++collide;
458df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper				for (i=0; i<MAXIOVCNT; i++) {
45924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					if (memcmp(r_iovec[i].iov_base, val_iovec[i].iov_base, r_iovec[i].iov_len)) {
460af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier						tst_resm(TFAIL, "\tTest[%d] bad verify @ 0x%x for val %d count %d xfr %d file_max 0x%x.",
46124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew							me, CHUNK(chunk), val, count, xfr, file_max);
462af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier						tst_resm(TINFO, "\tTest[%d]: last_trunc = 0x%x.",
46324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew							me, last_trunc);
46424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew						sync();
46504f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak						ft_dumpiov(&r_iovec[i]);
46604f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak						ft_dumpbits(bits, (nchunks+7)/8);
46704f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak						ft_orbits(hold_bits, bits, (nchunks+7)/8);
4684bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak						tst_resm(TINFO, "\tHold ");
46904f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak						ft_dumpbits(hold_bits, (nchunks+7)/8);
47024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew						tst_exit();
47124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					}
47224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				}
47324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			}
47424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			/*
47524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			 * Writev it.
47624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			 */
477f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			if (lseek(fd, -xfr, 1) <  0) {
478af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier				tst_resm(TFAIL, "\tTest[%d]: lseek(1) fail at %x, errno = %d.",
47924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					me, CHUNK(chunk), errno);
48024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				tst_exit();
48124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			}
48224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			if ((xfr = writev(fd, &val_iovec[0], MAXIOVCNT)) < csize) {
48324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				if (errno == ENOSPC) {
484af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier					tst_resm(TFAIL, "\tTest[%d]: no space, exiting.", me);
48524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					fsync(fd);
48624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					tst_exit();
48724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				}
488af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier				tst_resm(TFAIL, "\tTest[%d]: writev fail at %x xfr %d, errno = %d.",
48924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew					me, CHUNK(chunk), xfr, errno);
49024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				tst_exit();
49124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			}
49224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			if (CHUNK(chunk) + csize > file_max)
49324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				file_max = CHUNK(chunk) + csize;
49424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			/*
49524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			 * If hit "misc" interval, do it.
49624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			 */
49724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			if (misc_intvl && --whenmisc <= 0) {
49804f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modak				ft_orbits(hold_bits, bits, (nchunks+7)/8);
49924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				domisc(me, fd, bits);
50024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				whenmisc = NEXTMISC;
50124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			}
50224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			if (count + collide > 2 * nchunks)
50324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				break;
50424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
50524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
50624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		/*
50724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		 * End of iteration, maybe before doing all chunks.
50824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		 */
50924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
51024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		fsync(fd);
511f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		++misc_cnt[m_fsync];
512af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier		//tst_resm(TINFO, "\tTest{%d} val %d done, count = %d, collide = {%d}",
51324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	        //		me, val, count, collide);
514df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper		//for (i = 0; i < NMISC; i++)
515af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier		//	tst_resm(TINFO, "\t\tTest{%d}: {%d} %s's.", me, misc_cnt[i], m_str[i]);
51624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		++val;
51724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
51824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew}
51924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
52024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew/*
52124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew *	Inject misc syscalls into the thing.
52224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */
523f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modakstatic void domisc(int me, int fd, char *bits)
52424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{
525f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	int chunk;
526f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	struct stat sb;
52724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
528f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	if (type > m_fstat)
52924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		type = m_fsync;
530f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
53124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	switch(type) {
53224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	case m_fsync:
53324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		if (fsync(fd) < 0) {
534af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier			tst_resm(TFAIL, "\tTest[%d]: fsync error %d.", me, errno);
53524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			tst_exit();
53624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
53724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		break;
53824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	case m_trunc:
53924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		chunk = rand() % (file_max / csize);
54024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		file_max = CHUNK(chunk);
54124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		last_trunc = file_max;
54224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		if (tr_flag) {
54324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			if (ftruncate(fd, file_max) < 0) {
544af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier				tst_resm(TFAIL, "\tTest[%d]: ftruncate error %d @ 0x%x.", me, errno, file_max);
54524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				tst_exit();
54624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			}
54724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			tr_flag = 0;
54824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		} else {
54924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			if (truncate(test_name, file_max) < 0) {
550af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier				tst_resm(TFAIL, "\tTest[%d]: truncate error %d @ 0x%x.", me, errno, file_max);
55124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				tst_exit();
55224e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			}
55324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			tr_flag = 1;
55424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
555df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper		for (; chunk%8 != 0; chunk++)
55624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			bits[chunk/8] &= ~(1<<(chunk%8));
557df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper		for (; chunk < nchunks; chunk += 8)
55824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			bits[chunk/8] = 0;
55924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		break;
56024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	case m_fstat:
56124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		if (fstat(fd, &sb) < 0) {
562af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier			tst_resm(TFAIL, "\tTest[%d]: fstat() error %d.", me, errno);
56324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			tst_exit();
56424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
56524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		if (sb.st_size != file_max) {
566f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			tst_resm(TFAIL, "\tTest[%d]: fstat() mismatch; st_size=%"PRIx64",file_max=%x.",
567f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak				me, (int64_t)sb.st_size, file_max);
56824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew			tst_exit();
56924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		}
57024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		break;
57124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
572f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
573f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	++misc_cnt[type];
574f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	++type;
57524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew}
57624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
577f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak/*
578f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak * SIGTERM signal handler.
57924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew */
58004f47a16e2a3c646d0b0b1e67ef14bf29342620dsubrata_modakstatic void term(int sig LTP_ATTRIBUTE_UNUSED)
58124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew{
582f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak	int i;
58324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
584af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier	tst_resm(TINFO, "\tterm -[%d]- got sig term.", getpid());
58524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
58624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	/*
58724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 * If run by hand we like to have the parent send the signal to
58824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 * the child processes.  This makes life easy.
58924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	 */
59024e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	if (parent_pid == getpid()) {
591f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		for (i = 0; i < nchild; i++)
592f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak			if (pidlist[i])
59324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew				kill(pidlist[i], SIGTERM);
594f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak		return;
59524e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	}
59624e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
597af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier	tst_resm(TINFO, "\tunlinking '%s'", test_name);
59824e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew
59924e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	close(fd);
600f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
60124e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	if (unlink(test_name))
602af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier		tst_resm(TBROK, "Unlink of '%s' failed, errno = %d.",
60324e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew		  test_name, errno);
60424e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	else
605af64a878a5f86f98675e1d00691f12f9fa57bd8fvapier		tst_resm(TBROK, "Unlink of '%s' successful.", test_name);
606f17ac84cca81829c4588e59b42495b8aea0fa362subrata_modak
60724e30ab69eb6e1b128ea1eb2dc12df4066c2227erobbiew	tst_exit();
608ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
609