1e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/* IBM Corporation */
2e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/* 01/02/2003	Port to LTP avenkat@us.ibm.com */
3e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/* 06/30/2001	Port to Linux	nsharoff@us.ibm.com */
4e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/*
5e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *   This program is free software;  you can redistribute it and/or modify
6e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *   it under the terms of the GNU General Public License as published by
7e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *   the Free Software Foundation; either version 2 of the License, or
8e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *   (at your option) any later version.
9e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *
10e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *   This program is distributed in the hope that it will be useful,
114bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *   the GNU General Public License for more details.
142c28215423293e443469a07ae7011135d058b671Garrett Cooper *
15e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *   You should have received a copy of the GNU General Public License
16e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *   along with this program;  if not, write to the Free Software
174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew */
19e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
204bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak#define _GNU_SOURCE 1
21e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <stdio.h>
22e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <fcntl.h>
23e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <signal.h>
24e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <sys/mman.h>
25e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <sys/wait.h>
26e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <sys/stat.h>
27e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <unistd.h>
28e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <stdlib.h>
29e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <errno.h>
30e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <sys/types.h>
31e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include <limits.h>
32e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/*****  LTP Port        *****/
33e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#include "test.h"
34e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#define FAILED 0
35e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#define PASSED 1
36e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
37e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewint local_flag = PASSED;
384bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modakchar *TCID = "mmapstress10";
39e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewFILE *temp;
40e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewint TST_TOTAL = 1;
41e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
42e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewint anyfail();
43e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewvoid ok_exit();
44e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/*****  **      **      *****/
45e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
46e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/*
47e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  This test stresses mmaps, specifically the code dealing with
48e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  mapping of fragments.  It forks a specified number of children,
49e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  all of whom mmap the same file, make a given number of accesses
50e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  to random pages in the map (reading & writing and comparing data).
51e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  Then the child exits and the parent forks another to take its place.
52e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  Each time a child is forked, it stats the file and maps the full
53e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  length of the file.  Meanwhile, another child is forked which
544bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *  continually writes to the file.  It loops writing some bytes (default
55e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  20), then sleeps some seconds (default 1).  This causes the file
56e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  to gradually grow, crossing fragment boundaries, etc.
57e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  Then it forks yet *another* child who maps the file in extend
58e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  mode, just to check out interaction.  (Because this will cause
59e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  0 padding at end of file, children can't test as exactly as in tmmap -
60e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  have to check for zero or pattern...)
61e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *
62e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  This program continues to run until it either receives a SIGINT,
63e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  or times out (if a timeout value is specified).  When either of
64e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  these things happens, it cleans up its kids, then checks the
65e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  file to make sure it has the correct data.
66e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *
67e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  usage:
68e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	mmapstress10 -p nprocs [-t minutes -w nbytes -s secs -f filesize
69e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			 -S sparseoffset -r -o -m -l -d]
70e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  where:
71e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-p nprocs	- specifies the number of mapping children
72e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  to create.  (nprocs + 1 children actually
73e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  get created, since one is the writer child)
74e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-t minutes	- specifies minutes to run.  If not specified,
75e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  default is to run forever until a SIGINT
76e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  is received.
77e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-w nbytes	- specifies number of bytes for writer process
78e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  to write at a time (i.e. between sleeps).
79e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  defaults to GROWSIZE bytes.
80e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-s secs		- specifies number of seconds for writer process
81e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  to sleep between writes.  Defaults to
82e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  SLEEPTIME seconds.
83e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-f filesize	- initial filesize (defaults to FILESIZE)
84e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-S sparseoffset - when non-zero, causes a sparse area to
85e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  be left before the data, meaning that the
86e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  actual initial file size is sparseoffset +
87e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  filesize.  Useful for testing large files.
88e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  (default is 0).
89e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-r		- randomize number of pages map children check.
90e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  (random % MAXLOOPS).  If not specified, each
91e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  child checks MAXLOOPS pages.
92e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-o		- randomize offset of file to map. (default is 0)
93e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-m		- do random msync/fsyncs as well
94e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-l		- if set, the output file is not removed on
95e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *			  program exit.
96e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	-d		- enable debug outputd
97e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *
98e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  Compile with -DLARGE_FILE to enable file sizes > 2 GB.
99e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew */
100e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
101e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#define MAXLOOPS	500	/* max pages for map children to write */
102e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#define GROWSIZE	20	/* # bytes to write per write call */
103e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#define SLEEPTIME	1	/* # secs to sleep between writes */
104bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak#define	FILESIZE	4096	/* initial filesize set up by parent */
1054be9098fe01462b9b79fb7ac54faee6a0663e6d3robbiew#ifdef roundup
1064be9098fe01462b9b79fb7ac54faee6a0663e6d3robbiew#undef roundup
1074be9098fe01462b9b79fb7ac54faee6a0663e6d3robbiew#endif
108e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#define roundup(x, y)	((((x)+((y)-1))/(y))*(y))
109e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#define min(x, y)	(((x) < (y)) ? (x) : (y))
110e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
111e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#define SIZE_MAX UINT_MAX
112e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoextern time_t time(time_t *);
114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoextern char *ctime(const time_t *);
115e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewextern void *malloc(size_t);
116e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewextern void exit(int);
117e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewextern long lrand48(void);
118e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewextern void srand(unsigned);
119e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewextern void srand48(long);
120354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoextern int rand(void);
121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoextern int atoi(const char *);
122e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *usage =
124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao    "-p nprocs [-t minutes -w nbytes -s secs -f fsize -S sparseoffset -r -o -m -l -d]";
125e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaotypedef unsigned char uchar_t;	//Ananda 12/17/02
127e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
128e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewvoid child_mapper(char *file, unsigned procno, unsigned nprocs);
129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid child_writer(char *file, uchar_t * buf);
130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint fileokay(char *file, uchar_t * expbuf);
131e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewunsigned int initrand(void);
132e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewvoid finish(int sig);
133e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewvoid clean_up_file(int sig);
134e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewint finished = 0;
135e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewint leavefile = 0;
136e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
137e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewint debug = 0;
138e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewint growsize = GROWSIZE;
139e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewint sleeptime = SLEEPTIME;
140e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
141e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewoff64_t filesize = FILESIZE;
142e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewoff64_t sparseoffset = 0;
143e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
144e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewoff_t filesize = FILESIZE;
145e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewoff_t sparseoffset = 0;
146e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
147e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewunsigned randloops = 0;
148e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewunsigned dosync = 0;
149e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewunsigned do_offset = 0;
150e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewunsigned pattern = 0;
1514e628a195f289ab8ba699933d317b80a5664b0a6Cyril Hrubisstatic const char *filename = "mmapstress10.out";
152e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
15376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modakvoid clean_mapper(int sig);
15476a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modakvoid clean_writer(int sig);
15576a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak
15676a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modakint fd_mapper = 0;
15776a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modakcaddr_t maddr_mapper;
15876a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modaksize_t mapsize_mapper;
15976a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak
16076a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modakint fd_writer = 0;
16176a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak
162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(int argc, char *argv[])
163e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew{
164e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	char *progname;
165e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int fd;
166e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int c;
167e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	extern char *optarg;
168e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned nprocs = 0;
169e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned procno;
170354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	pid_t *pidarray = NULL;
171e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	pid_t pid;
172e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	pid_t wr_pid = 0;
173354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	uchar_t *buf = NULL;
174e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned int seed;
175e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int pagesize = sysconf(_SC_PAGE_SIZE);
176ae1b395fd799ccc9b9fc153e043078bb415f823fsubrata_modak	float alarmtime = 0;
177e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	struct sigaction sa;
178e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned i;
179e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int write_cnt;
180e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	uchar_t data;
181e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int no_prob = 0;
182e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int wait_stat;
183e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	time_t t;
184e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
185e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	off64_t bytes_left;
186e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
187e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	off_t bytes_left;
188e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
189e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
190e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	progname = *argv;
191e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	tst_tmpdir();
192e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (argc < 2) {
193e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		(void)fprintf(stderr, "usage: %s %s\n", progname, usage);
194e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		exit(1);
195e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
196e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
197e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	while ((c = getopt(argc, argv, "S:omdlrf:p:t:w:s:")) != -1) {
198e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		switch (c) {
199e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 'd':
200e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			debug = 1;
201e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
202e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 't':
203ae1b395fd799ccc9b9fc153e043078bb415f823fsubrata_modak			alarmtime = atof(optarg) * 60;
204e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
205e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 'p':
206e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			nprocs = atoi(optarg);
207e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
208e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 'l':
209e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			leavefile = 1;
210e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
211e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 's':
212e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			sleeptime = atoi(optarg);
213e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if (sleeptime < 0) {
214e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				(void)fprintf(stderr, "error: negative "
215354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      "sleeptime\n");
216354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				anyfail();
217e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
218e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
219e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 'w':
220e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			growsize = atoi(optarg);
221e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if (growsize < 0) {
222e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				(void)fprintf(stderr, "error: negative write "
223354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      "size\n");
224354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				anyfail();
225e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
226e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
227e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 'f':
228e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
229e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			filesize = atoll(optarg);
230e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
231e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			filesize = atoi(optarg);
232e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
233e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if (filesize < 0) {
234e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				(void)fprintf(stderr, "error: negative "
235354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      "filesize\n");
236354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				anyfail();
237e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
238e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
239e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 'r':
240e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			randloops = 1;
241e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
242e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 'm':
243e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			dosync = 1;
244e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
245e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 'o':
246e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			do_offset = 1;
247e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
248e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 'S':
249e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
250e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			sparseoffset = atoll(optarg);
251e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
252e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			sparseoffset = atoi(optarg);
253e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
254e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if (sparseoffset % pagesize != 0) {
2554bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak				fprintf(stderr,
256354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					"sparseoffset must be pagesize multiple\n");
257354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				anyfail();
258e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
259e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			break;
260e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		default:
261e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			(void)fprintf(stderr, "usage: %s %s\n", progname,
262354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				      usage);
263e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			anyfail();
264e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
265e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
266e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
267e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (nprocs > 255) {
268e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		(void)fprintf(stderr, "invalid nprocs %d - (range 0-255)\n",
269354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			      nprocs);
270354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
271e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
272e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	(void)time(&t);
273e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
274e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	seed = initrand();
275e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	pattern = seed & 0xff;
276e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
277e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (debug) {
278e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
2794bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak		(void)printf("creating file <%s> with %Ld bytes, pattern %d\n",
280354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     filename, filesize, pattern);
281e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
2824bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak		(void)printf("creating file <%s> with %ld bytes, pattern %d\n",
283354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     filename, filesize, pattern);
284e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
285e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (alarmtime)
286354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			(void)printf("running for %f minutes\n",
287354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     alarmtime / 60);
288e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		else
289e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			(void)printf("running with no time limit\n");
290e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
291e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
292e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	/*
293e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  Plan for death by signal.  User may have specified
294e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  a time limit, in which case set an alarm and catch SIGALRM.
295e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  Also catch and cleanup with SIGINT, SIGQUIT, and SIGTERM.
296e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 */
297e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	sa.sa_handler = finish;
298e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	sa.sa_flags = 0;
299e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (sigemptyset(&sa.sa_mask)) {
300e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("sigempty error");
301e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		goto cleanup;
302e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
303e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
304e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (sigaction(SIGINT, &sa, 0) == -1) {
305e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("sigaction error SIGINT");
306e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		goto cleanup;
307e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
308e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (alarmtime) {
309e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (sigaction(SIGALRM, &sa, 0) == -1) {
310e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			perror("sigaction error");
311e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			goto cleanup;
312e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
313e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		(void)alarm(alarmtime);
314e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
315e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	/* If we get a SIGQUIT or SIGTERM, clean up and exit immediately. */
316e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	sa.sa_handler = clean_up_file;
317e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (sigaction(SIGQUIT, &sa, 0) == -1) {
318e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("sigaction error SIGQUIT");
319e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		goto cleanup;
320e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
321e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (sigaction(SIGTERM, &sa, 0) == -1) {
322e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("sigaction error SIGTERM");
323e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		goto cleanup;
324e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
325e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
326354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((fd = open64(filename, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1) {
327e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
328354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1) {
329e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
330e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("open error");
331354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
332e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
333e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
334d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis	if ((buf = malloc(pagesize + growsize)) == NULL
335d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis	    || (pidarray = malloc(nprocs * sizeof(pid_t))) == NULL) {
336e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("malloc error");
337354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
338e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
339e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
340e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	for (i = 0; i < nprocs; i++)
341354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		*(pidarray + i) = 0;
342e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
343e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	for (i = 0, data = 0; i < pagesize; i++) {
344354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		*(buf + i) = (data + pattern) & 0xff;
345e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (++data == nprocs)
346e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			data = 0;
347e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
348354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (data = 0; i < pagesize + growsize; i++) {
349354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		*(buf + i) = (data + pattern) & 0xff;
350e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (++data == nprocs)
351e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			data = 0;
352e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
353e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
354e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
355e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (lseek64(fd, sparseoffset, SEEK_SET) < 0) {
356e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
357e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (lseek(fd, sparseoffset, SEEK_SET) < 0) {
358e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
359e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("lseek");
360354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
361e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
362e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
363e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	for (bytes_left = filesize; bytes_left; bytes_left -= c) {
364e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		write_cnt = min(pagesize, bytes_left);
365e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if ((c = write(fd, (char *)buf, write_cnt)) != write_cnt) {
366e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if (c == -1) {
367e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				perror("write error");
368e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			} else {
369e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				(void)fprintf(stderr, "write: wrote %d of %d "
370354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      "bytes\n", c, write_cnt);
371e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
372e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			(void)close(fd);
373e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			(void)unlink(filename);
374e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			anyfail();
375e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
376e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
377e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
378e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	(void)close(fd);
379e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
380e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	/*
381e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  Fork off mmap children.
382e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 */
383e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	for (procno = 0; procno < nprocs; procno++) {
384e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		switch (pid = fork()) {
385e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
386e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case -1:
387e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			perror("fork error");
388e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			goto cleanup;
389e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
390e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		case 0:
391e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			child_mapper(filename, procno, nprocs);
392e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			exit(0);
393e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
394e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		default:
395e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			pidarray[procno] = pid;
396e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
397e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
398e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
399e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	/*
400e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  Now fork off an additional process to continually
401e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  write to (and grow) the file.
402e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 */
403e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if ((wr_pid = fork()) == -1) {
404e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("fork error");
405e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		goto cleanup;
406e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	} else if (wr_pid == 0) {	/* child */
407e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		child_writer(filename, buf);
408e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		exit(0);
409e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
410e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
411e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	/*
412e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  Now wait for children and refork them as needed.
413e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 */
414bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
415e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	while (!finished) {
416e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		pid = wait(&wait_stat);
417e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		/*
418e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 *  Block signals while processing child exit.
419e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 */
420e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
421e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (sighold(SIGALRM) || sighold(SIGINT)) {
422e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			perror("sighold error");
423e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			goto cleanup;
424e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
425e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
426e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (pid != -1) {
427e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			/*
428e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			 *  Check exit status, then refork with the
429e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			 *  appropriate procno.
430e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			 */
4314bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak			if (!WIFEXITED(wait_stat)
432e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			    || WEXITSTATUS(wait_stat) != 0) {
433e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				(void)fprintf(stderr, "child exit with err "
434354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      "<x%x>\n", wait_stat);
435e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				goto cleanup;
436e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
437e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			for (i = 0; i < nprocs; i++)
438e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				if (pid == pidarray[i])
439e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew					break;
440e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if (i == nprocs) {
441e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				if (pid == wr_pid) {
4424bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak					(void)fprintf(stderr,
443354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						      "writer child unexpected exit <x%x>\n",
444354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						      wait_stat);
445e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew					wr_pid = 0;
446e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				} else
447e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew					(void)fprintf(stderr, "unknown child "
448354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						      "pid %d, <x%x>\n",
449354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						      pid, wait_stat);
450e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				goto cleanup;
451e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
452e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
453e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if ((pid = fork()) == -1) {
454e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				perror("fork error");
455e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				pidarray[i] = 0;
456e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				goto cleanup;
457354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			} else if (pid == 0) {	/* child */
458e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				child_mapper(filename, i, nprocs);
459e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				exit(0);
460e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			} else
461e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				pidarray[i] = pid;
462e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		} else {
463e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			/*
464e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			 *  wait returned an error.  If EINTR, then
465e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			 *  normal finish, else it's an unexpected
466e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			 *  error...
467e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			 */
468e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if (errno != EINTR || !finished) {
469e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				perror("unexpected wait error");
470e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				goto cleanup;
471e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
472e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
473e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (sigrelse(SIGALRM) || sigrelse(SIGINT)) {
474e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			perror("sigrelse error");
475e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			goto cleanup;
476e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
477e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
478bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
479e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	/*
480e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  Finished!  Check the file for sanity, then kill all
481e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  the children and done!.
482e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 */
483e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
484e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	(void)alarm(0);
485e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	no_prob = 1;
486e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
487e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiewcleanup:
488e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	for (i = 0; i < nprocs; i++)
48976a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		(void)kill(pidarray[i], SIGUSR1);
49076a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	(void)kill(wr_pid, SIGUSR1);
491e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
492e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	while (wait(&wait_stat) != -1 || errno != ECHILD)
493e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		continue;
494e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
495e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (no_prob) {		/* only check file if no errors */
496e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (!fileokay(filename, buf)) {
497e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			(void)fprintf(stderr, "file data incorrect!\n");
498e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			(void)printf("  leaving file <%s>\n", filename);
499354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			anyfail();
500e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
501e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		} else {
502e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			(void)printf("file data okay\n");
503e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if (!leavefile)
504e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				(void)unlink(filename);
505e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
506e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	} else
507e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		(void)printf("  leaving file <%s>\n", filename);
508bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
509e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	(void)time(&t);
510354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao//      (void)printf("%s: Finished %s", argv[0], ctime(&t)); LTP Port
511e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	ok_exit();
5122c28215423293e443469a07ae7011135d058b671Garrett Cooper	tst_exit();
513e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew}
514e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
515e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/*
516e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  Child process that reads/writes map.  The child stats the file
517e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  to determine the size, maps the size of the file, then reads/writes
518e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  its own locations on random pages of the map (its locations being
519e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  determined based on nprocs & procno).  After a specific number of
520e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  iterations, it exits.
521e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew */
522354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid child_mapper(char *file, unsigned procno, unsigned nprocs)
523e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew{
524e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
525e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	struct stat64 statbuf;
526e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	off64_t filesize;
527e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	off64_t offset;
528e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
529e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	struct stat statbuf;
530e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	off_t filesize;
531e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	off_t offset;
532e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
533e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	size_t validsize;
53476a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	caddr_t paddr;
535e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int pagesize = sysconf(_SC_PAGE_SIZE);
536e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned randpage;
537e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned int seed;
538e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned loopcnt;
539e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned nloops;
5404bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak	unsigned mappages;
541e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned mapflags;
542e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned i;
54376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	struct sigaction sa_mapper;
544e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
545e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	mapflags = MAP_SHARED;
546e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
547354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	seed = initrand();	/* initialize random seed */
548e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
54976a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	sa_mapper.sa_handler = clean_mapper;
55076a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	sa_mapper.sa_flags = 0;
55176a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if (sigemptyset(&sa_mapper.sa_mask)) {
55276a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		perror("sigempty error");
553354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
55476a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	}
55576a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak
55676a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if (sigaction(SIGUSR1, &sa_mapper, 0) == -1) {
55776a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		perror("sigaction error SIGUSR1");
558354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
55976a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	}
560e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
56176a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if ((fd_mapper = open64(file, O_RDWR)) == -1) {
562e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
56376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if ((fd_mapper = open(file, O_RDWR)) == -1) {
564e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
565e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("open error");
566354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
567e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
568e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
56976a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if (fstat64(fd_mapper, &statbuf) == -1) {
570e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
57176a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if (fstat(fd_mapper, &statbuf) == -1) {
572e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
573e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("stat error");
574354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
575e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
576e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	filesize = statbuf.st_size;
577e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
578e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (statbuf.st_size - sparseoffset > SIZE_MAX) {
579e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		fprintf(stderr, "size_t overflow when setting up map\n");
580354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
581e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
582354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	mapsize_mapper = (size_t) (statbuf.st_size - sparseoffset);
58376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	mappages = roundup(mapsize_mapper, pagesize) / pagesize;
584e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	offset = sparseoffset;
585e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (do_offset) {
586e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		int pageoffset = lrand48() % mappages;
587e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		int byteoffset = pageoffset * pagesize;
588e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		offset += byteoffset;
58976a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		mapsize_mapper -= byteoffset;
590e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		mappages -= pageoffset;
591e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
592e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
593354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((maddr_mapper = mmap64(0, mapsize_mapper, PROT_READ | PROT_WRITE,
594354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				   mapflags, fd_mapper,
595354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				   offset)) == (caddr_t) - 1) {
596e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
597354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((maddr_mapper = mmap(0, mapsize_mapper, PROT_READ | PROT_WRITE,
598354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 mapflags, fd_mapper,
599354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 offset)) == (caddr_t) - 1) {
600e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
601e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("mmap error");
602354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
603e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
604e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
60576a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	(void)close(fd_mapper);
606e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
607e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	nloops = (randloops) ? (lrand48() % MAXLOOPS) : MAXLOOPS;
608e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
609e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (debug) {
610e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
611e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		(void)printf("child %d (pid %ld): seed %d, fsize %Ld, "
612354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     "mapsize %d, off %Ld, loop %d\n",
613354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     procno, getpid(), seed, filesize, mapsize_mapper,
614354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     offset / pagesize, nloops);
615e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
616e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		(void)printf("child %d (pid %d): seed %d, fsize %ld, "
617354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     "mapsize %ld, off %ld, loop %d\n",
618354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     procno, getpid(), seed, filesize,
619354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     (long)mapsize_mapper, offset / pagesize, nloops);
620e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
621e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
622e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
623e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	/*
624e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  Now loop read/writing random pages.
625e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 */
626e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	for (loopcnt = 0; loopcnt < nloops; loopcnt++) {
627e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		randpage = lrand48() % mappages;
628354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		paddr = maddr_mapper + (randpage * pagesize);	/* page address */
629e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
630354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (randpage < mappages - 1 || !(mapsize_mapper % pagesize))
631e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			validsize = pagesize;
632e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		else
63376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak			validsize = mapsize_mapper % pagesize;
634e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
635e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		/*
636e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 * Because one child is mapping file in extend mode,
637e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 * it may be padded with zeros at end.  So we can't
638e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 * do an exact check -- accept known pattern OR zeros.
639e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 */
640e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		for (i = procno; i < validsize; i += nprocs) {
641354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (*((unsigned char *)(paddr + i))
642e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			    != ((procno + pattern) & 0xff)
643354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    && *((unsigned char *)(paddr + i)) != 0) {
644e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				(void)fprintf(stderr, "child %d: invalid data "
645354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      "<x%x>", procno,
646354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      *((unsigned char *)(paddr + i)));
647354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				(void)fprintf(stderr,
648354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      " at pg %d off %d, exp "
649354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      "<x%x>\n", randpage, i,
650354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      (procno + pattern) & 0xff);
651354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				anyfail();
652e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
653e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			/*
654e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			 *  Now write it.
655e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			 */
656e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
657354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			*(paddr + i) = (procno + pattern) & 0xff;
658e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
659e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
660e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (dosync) {
661e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		/*
662e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 * Exercise msync() as well!
663e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 */
664e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		randpage = lrand48() % mappages;
665354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		paddr = maddr_mapper + (randpage * pagesize);	/* page address */
666354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (msync(paddr, (mappages - randpage) * pagesize,
667354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			  MS_SYNC) == -1) {
668e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			perror("msync error");
669354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			anyfail();
670e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
671e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
672354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (munmap(maddr_mapper, mapsize_mapper) == -1) {
67376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		perror("munmap failed");
67476a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		anyfail();
67576a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	}
676e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	exit(0);
677e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew}
678e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
679e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/*
680e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  child_writer
681e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew * 	The child process that continually (and slowly!!) grows
682e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	the file.  The purpose of this is to exercise the code
6834bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *	supporting mapping of fragments.  The map children are
684e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	constantly reforking and will pick up the map changes, etc.
685e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *	This process executes until signalled (i.e. has no exit!)
686bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak *	unless error.
687e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew */
688354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid child_writer(char *file, uchar_t * buf)
689354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{				/* buf already set up in main */
69076a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	struct sigaction sa_writer;
69176a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak
69276a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	sa_writer.sa_handler = clean_writer;
69376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	sa_writer.sa_flags = 0;
69476a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if (sigemptyset(&sa_writer.sa_mask)) {
69576a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		perror("sigempty error");
696354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
69776a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	}
69876a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak
69976a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if (sigaction(SIGUSR1, &sa_writer, 0) == -1) {
70076a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		perror("sigaction error SIGUSR1");
701354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
70276a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	}
703e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
704e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	struct stat64 statbuf;
705e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	off64_t off;
706e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
707e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	struct stat statbuf;
708e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	off_t off;
709e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
710e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int pagesize = sysconf(_SC_PAGE_SIZE);
711e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	uchar_t *p;
712e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int cnt;
713e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
714e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
71576a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if ((fd_writer = open64(file, O_RDWR)) == -1) {
716e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
71776a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if ((fd_writer = open(file, O_RDWR)) == -1) {
718e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
719e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("open error");
720354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
721e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
722e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
72376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if ((off = lseek64(fd_writer, 0, SEEK_END)) == -1) {
724e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
72576a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if ((off = lseek(fd_writer, 0, SEEK_END)) == -1) {
726e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
727e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("lseek error");
728354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
729e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
730e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
731e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	for (;;) {
732e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
73376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		if (fstat64(fd_writer, &statbuf) == -1) {
734e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
73576a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		if (fstat(fd_writer, &statbuf) == -1) {
736e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
737e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			perror("fstat error");
738354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			anyfail();
739e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
740e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
741e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (debug)
7424bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak			(void)printf("writer %d bytes at off %Ld, size %Ld\n",
743354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     growsize, off, statbuf.st_size);
744e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
745e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (debug)
7464bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak			(void)printf("writer %d bytes at off %ld, size %ld\n",
747354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     growsize, off, statbuf.st_size);
748e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
749e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
750e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		/*
751e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 *  Write some number of bytes, then sleep some
752e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 *  number of seconds...
753e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 *  Need to keep track of our offset so write the
754e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 *  right bytes.
755e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 */
756e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
757e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		p = buf + (off % pagesize);
758e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
75976a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		if ((cnt = write(fd_writer, p, growsize)) != growsize) {
760e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if (cnt == -1)
761e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				perror("write error");
762e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			else
763e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				(void)fprintf(stderr, "wrote %d of %d bytes\n",
764354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      cnt, growsize);
765354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			anyfail();
766e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
767e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
768e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		off += growsize;
769e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
770e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		(void)sleep(sleeptime);
771e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (dosync) {
77276a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak			if (fsync(fd_writer) == -1) {
773e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				perror("fsync error");
774354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				anyfail();
775e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
776e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
777e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
77876a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	close(fd_writer);
779e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew}
780e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
781e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/*
782e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew *  Make sure file has all the correct data.
783e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
784e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew */
785354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint fileokay(char *file, uchar_t * expbuf)
786e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew{
787e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
788e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	struct stat64 statbuf;
789e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
790e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	struct stat statbuf;
791e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
792e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	size_t mapsize;
793e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	uchar_t *readbuf;
794e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned mappages;
795e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned pagesize = sysconf(_SC_PAGE_SIZE);
796e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int fd;
797e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	int cnt;
798e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned i, j;
799e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
800e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
801e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if ((fd = open64(file, O_RDONLY)) == -1) {
802e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
803e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if ((fd = open(file, O_RDONLY)) == -1) {
804e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
805e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("open error");
806354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
807e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
808e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
809e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (fstat64(fd, &statbuf) == -1) {
810e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
811e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (fstat(fd, &statbuf) == -1) {
812e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
813e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("stat error");
814354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		anyfail();
815e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
816e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
817e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (lseek64(fd, sparseoffset, SEEK_SET) < 0) {
818e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
819e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (lseek(fd, sparseoffset, SEEK_SET) < 0) {
820e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
821e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		perror("lseek");
822e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		exit(1);
823e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
824e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
825d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis	readbuf = malloc(pagesize);
826e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
827e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (statbuf.st_size - sparseoffset > SIZE_MAX) {
828e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		fprintf(stderr, "size_t overflow when setting up map\n");
829e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		exit(1);
830e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
831354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	mapsize = (size_t) (statbuf.st_size - sparseoffset);
832e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	mappages = roundup(mapsize, pagesize) / pagesize;
833e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
834e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	for (i = 0; i < mappages; i++) {
835e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		cnt = read(fd, (char *)readbuf, pagesize);
836e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		if (cnt == -1) {
837e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			perror("read error");
83876a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak			close(fd);
839bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak			return 0;
840e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		} else if (cnt != pagesize) {
841e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			/*
8424bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak			 *  Okay if at last page in file...
843e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			 */
844e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if ((i * pagesize) + cnt != mapsize) {
845d764fa29e8efbcd1b8aad6852a200f927d3e45derobbiew				(void)fprintf(stderr, "read %d of %ld bytes\n",
846354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      (i * pagesize) + cnt,
847354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      (long)mapsize);
84876a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak				close(fd);
84943337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak				return 0;
850e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
851e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
852e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		/*
853e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 *  Compare read bytes of data.
854e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 *  May have zeros from map extend...
855e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		 */
856e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		for (j = 0; j < cnt; j++) {
857e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			if (expbuf[j] != readbuf[j] && readbuf[j] != 0) {
8584bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak				(void)fprintf(stderr,
859354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      "read bad data: exp %c got %c",
860354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      expbuf[j], readbuf[j]);
861e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#ifdef LARGE_FILE
862e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				(void)fprintf(stderr, ", pg %d off %d, "
863354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      "(fsize %Ld)\n", i, j,
864354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      statbuf.st_size);
865e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#else /* LARGE_FILE */
866e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew				(void)fprintf(stderr, ", pg %d off %d, "
867354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      "(fsize %ld)\n", i, j,
868354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      statbuf.st_size);
869e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew#endif /* LARGE_FILE */
87076a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak				close(fd);
87143337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak				return 0;
872e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew			}
873e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		}
874e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	}
8752c28215423293e443469a07ae7011135d058b671Garrett Cooper
87629d35aee162665c7ac1c4126dbe72bec635b2aa7Shuang Qiu	close(fd);
877134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak	return 1;
878e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew}
879e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
880354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao /*ARGSUSED*/ void finish(int sig)
881e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew{
882e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	finished++;
883e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	/* finish nicely and check the file contents */
884e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew}
885e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
886354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao /*ARGSUSED*/ void clean_up_file(int sig)
887e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew{
888e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	if (!leavefile)
889e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew		(void)unlink(filename);
890e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	exit(1);
891e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew}
892e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
89376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modakvoid clean_mapper(int sig)
89476a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak{
89576a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if (fd_mapper)
89676a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		close(fd_mapper);
897354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	munmap(maddr_mapper, mapsize_mapper);
898354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	exit(0);
89976a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak}
90076a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak
90176a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modakvoid clean_writer(int sig)
90276a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak{
90376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	if (fd_writer)
90476a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak		close(fd_writer);
90576a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak	exit(0);
90676a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak}
90776a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak
908354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaounsigned int initrand(void)
909e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew{
910e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	unsigned int seed;
911e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
912e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	/*
913e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  Initialize random seed...  Got this from a test written
914e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 *  by scooter:
915354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 *      Use srand/rand to diffuse the information from the
916354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 *      time and pid.  If you start several processes, then
917354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 *      the time and pid information don't provide much
918354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 *      variation.
919e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	 */
920e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	srand((unsigned int)getpid());
921e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	seed = rand();
9224e2bab8415bfd5ddd552220203ed22c93a4617e5Cyril Hrubis	srand((unsigned int)time(NULL));
923e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	seed = (seed ^ rand()) % 100000;
924e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	srand48((long int)seed);
925e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	return (seed);
926e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew}
927e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
928e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew/*****  LTP Port        *****/
929829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingervoid ok_exit(void)
930e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew{
931354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	tst_resm(TPASS, "Test passed\n");
932e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	tst_rmdir();
933e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew	tst_exit();
934e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew}
935e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
936829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerint anyfail(void)
937e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew{
9389fa8ad01f33c6390cc08626a185111631c8df495Cyril Hrubis	tst_brkm(TFAIL, tst_rmdir, "Test failed\n");
939e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew}
940e093b824bec9fb9342f82fed7d49bc60fdd35c5brobbiew
941ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman/*****  **      **      *****/
942