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