xref: /freebsd/tools/test/stress2/misc/suj23.sh (revision 8a272653d9fbd9fc37691c9aad6a05089b4ecb4d)
1*8a272653SPeter Holm#!/bin/sh
2*8a272653SPeter Holm
3*8a272653SPeter Holm#
4*8a272653SPeter Holm# Copyright (c) 2011 Peter Holm <pho@FreeBSD.org>
5*8a272653SPeter Holm# All rights reserved.
6*8a272653SPeter Holm#
7*8a272653SPeter Holm# Redistribution and use in source and binary forms, with or without
8*8a272653SPeter Holm# modification, are permitted provided that the following conditions
9*8a272653SPeter Holm# are met:
10*8a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright
11*8a272653SPeter Holm#    notice, this list of conditions and the following disclaimer.
12*8a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright
13*8a272653SPeter Holm#    notice, this list of conditions and the following disclaimer in the
14*8a272653SPeter Holm#    documentation and/or other materials provided with the distribution.
15*8a272653SPeter Holm#
16*8a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*8a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*8a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*8a272653SPeter Holm# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20*8a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*8a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*8a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*8a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*8a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*8a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8a272653SPeter Holm# SUCH DAMAGE.
27*8a272653SPeter Holm#
28*8a272653SPeter Holm
29*8a272653SPeter Holm# Scenario from kern/159971
30*8a272653SPeter Holm# bstg0003.c by Kirk Russell <kirk ba23 org>
31*8a272653SPeter Holm
32*8a272653SPeter Holm# panic: ino 0xc84c9b00(0x3C8209) 65554, 32780 != 65570
33*8a272653SPeter Holm# https://people.freebsd.org/~pho/stress/log/suj23.txt
34*8a272653SPeter Holm
35*8a272653SPeter Holm# panic: first_unlinked_inodedep: prev != next. inodedep = 0xcadf9e00
36*8a272653SPeter Holm# https://people.freebsd.org/~pho/stress/log/jeff091.txt
37*8a272653SPeter Holm
38*8a272653SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
39*8a272653SPeter Holm
40*8a272653SPeter Holm. ../default.cfg
41*8a272653SPeter Holm
42*8a272653SPeter Holmhere=`pwd`
43*8a272653SPeter Holmcd /tmp
44*8a272653SPeter Holmsed '1,/^EOF/d' < $here/$0 > suj23.c
45*8a272653SPeter Holmmycc -o suj23 -Wall -Wextra -O2 suj23.c
46*8a272653SPeter Holmrm -f suj23.c
47*8a272653SPeter Holm
48*8a272653SPeter Holmmount | grep "on $mntpoint " | grep -q md$mdstart && umount $mntpoint
49*8a272653SPeter Holm[ -c /dev/md$mdstart ] && mdconfig -d -u $mdstart
50*8a272653SPeter Holm
51*8a272653SPeter Holmmdconfig -a -t swap -s 1g -u $mdstart
52*8a272653SPeter Holmbsdlabel -w md$mdstart auto
53*8a272653SPeter Holmnewfs -j md${mdstart}$part > /dev/null
54*8a272653SPeter Holmmount /dev/md${mdstart}$part $mntpoint
55*8a272653SPeter Holmchmod 777 $mntpoint
56*8a272653SPeter Holm
57*8a272653SPeter Holmsu $testuser -c '/tmp/suj23'
58*8a272653SPeter Holm
59*8a272653SPeter Holmwhile mount | grep -q "on $mntpoint "; do
60*8a272653SPeter Holm	umount $mntpoint || sleep 1
61*8a272653SPeter Holmdone
62*8a272653SPeter Holmmdconfig -d -u $mdstart
63*8a272653SPeter Holmrm -f /tmp/suj23
64*8a272653SPeter Holmexit 0
65*8a272653SPeter HolmEOF
66*8a272653SPeter Holm/*
67*8a272653SPeter Holm * Copyright 2011 Kirk J. Russell
68*8a272653SPeter Holm *
69*8a272653SPeter Holm * Licensed under the Apache License, Version 2.0 (the "License"); you may not
70*8a272653SPeter Holm * use this file except in compliance with the License. You may obtain a copy
71*8a272653SPeter Holm * of the License at http://www.apache.org/licenses/LICENSE-2.0
72*8a272653SPeter Holm *
73*8a272653SPeter Holm * Unless required by applicable law or agreed to in writing, software
74*8a272653SPeter Holm * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
75*8a272653SPeter Holm * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
76*8a272653SPeter Holm * License for the specific language governing permissions and limitations
77*8a272653SPeter Holm * under the License.
78*8a272653SPeter Holm */
79*8a272653SPeter Holm
80*8a272653SPeter Holm#include <unistd.h>
81*8a272653SPeter Holm#include <assert.h>
82*8a272653SPeter Holm#include <err.h>
83*8a272653SPeter Holm#include <fcntl.h>
84*8a272653SPeter Holm#include <signal.h>
85*8a272653SPeter Holm#include <stdio.h>
86*8a272653SPeter Holm#include <stdlib.h>
87*8a272653SPeter Holm#include <string.h>
88*8a272653SPeter Holm#include <time.h>
89*8a272653SPeter Holm#include <sys/stat.h>
90*8a272653SPeter Holm#include <sys/uio.h>
91*8a272653SPeter Holm#include <sys/wait.h>
92*8a272653SPeter Holm
93*8a272653SPeter Holm#define RUNTIME 600
94*8a272653SPeter Holm
95*8a272653SPeter Holmstatic char *bstg_pathstore[] = {
96*8a272653SPeter Holm	"/mnt/111/z",
97*8a272653SPeter Holm	"/mnt/111/aaaa",
98*8a272653SPeter Holm	"/mnt/111/bbbbb",
99*8a272653SPeter Holm	"/mnt/111/ccccc",
100*8a272653SPeter Holm	"/mnt/111/d",
101*8a272653SPeter Holm	"/mnt/111/e",
102*8a272653SPeter Holm	"/mnt/111/ffffff.fff.f",
103*8a272653SPeter Holm	"/mnt/111/gggggggggggg",
104*8a272653SPeter Holm	"/mnt/111/hhhh",
105*8a272653SPeter Holm	"/mnt/111/iiiii.ii",
106*8a272653SPeter Holm	"/mnt/111/jjjj.jj.jjjjjjjj",
107*8a272653SPeter Holm	"/mnt/111/kkkk.kkkkkkkk",
108*8a272653SPeter Holm	"/mnt/111/lllll",
109*8a272653SPeter Holm	"/mnt/222/z",
110*8a272653SPeter Holm	"/mnt/222/aaaa",
111*8a272653SPeter Holm	"/mnt/222/bbbbb",
112*8a272653SPeter Holm	"/mnt/222/ccccc",
113*8a272653SPeter Holm	"/mnt/222/d",
114*8a272653SPeter Holm	"/mnt/222/e",
115*8a272653SPeter Holm	"/mnt/222/ffffff.fff.f",
116*8a272653SPeter Holm	"/mnt/222/gggggggggggg",
117*8a272653SPeter Holm	"/mnt/222/hhhh",
118*8a272653SPeter Holm	"/mnt/222/iiiii.ii",
119*8a272653SPeter Holm	"/mnt/222/jjjj.jj.jjjjjjjj",
120*8a272653SPeter Holm	"/mnt/222/kkkk.kkkkkkkk",
121*8a272653SPeter Holm	"/mnt/222/lllll",
122*8a272653SPeter Holm	"/mnt/333/z",
123*8a272653SPeter Holm	"/mnt/333/aaaa",
124*8a272653SPeter Holm	"/mnt/333/bbbbb",
125*8a272653SPeter Holm	"/mnt/333/ccccc",
126*8a272653SPeter Holm	"/mnt/333/d",
127*8a272653SPeter Holm	"/mnt/333/e",
128*8a272653SPeter Holm	"/mnt/333/ffffff.fff.f",
129*8a272653SPeter Holm	"/mnt/333/gggggggggggg",
130*8a272653SPeter Holm	"/mnt/333/hhhh",
131*8a272653SPeter Holm	"/mnt/333/iiiii.ii",
132*8a272653SPeter Holm	"/mnt/333/jjjj.jj.jjjjjjjj",
133*8a272653SPeter Holm	"/mnt/333/kkkk.kkkkkkkk",
134*8a272653SPeter Holm	"/mnt/333/lllll",
135*8a272653SPeter Holm	"/mnt/444/z",
136*8a272653SPeter Holm	"/mnt/444/aaaa",
137*8a272653SPeter Holm	"/mnt/444/bbbbb",
138*8a272653SPeter Holm	"/mnt/444/ccccc",
139*8a272653SPeter Holm	"/mnt/444/d",
140*8a272653SPeter Holm	"/mnt/444/e",
141*8a272653SPeter Holm	"/mnt/444/ffffff.fff.f",
142*8a272653SPeter Holm	"/mnt/444/gggggggggggg",
143*8a272653SPeter Holm	"/mnt/444/hhhh",
144*8a272653SPeter Holm	"/mnt/444/iiiii.ii",
145*8a272653SPeter Holm	"/mnt/444/jjjj.jj.jjjjjjjj",
146*8a272653SPeter Holm	"/mnt/444/kkkk.kkkkkkkk",
147*8a272653SPeter Holm	"/mnt/444/lllll",
148*8a272653SPeter Holm	"/mnt/555/z",
149*8a272653SPeter Holm	"/mnt/555/aaaa",
150*8a272653SPeter Holm	"/mnt/555/bbbbb",
151*8a272653SPeter Holm	"/mnt/555/ccccc",
152*8a272653SPeter Holm	"/mnt/555/d",
153*8a272653SPeter Holm	"/mnt/555/e",
154*8a272653SPeter Holm	"/mnt/555/ffffff.fff.f",
155*8a272653SPeter Holm	"/mnt/555/gggggggggggg",
156*8a272653SPeter Holm	"/mnt/555/hhhh",
157*8a272653SPeter Holm	"/mnt/555/iiiii.ii",
158*8a272653SPeter Holm	"/mnt/555/jjjj.jj.jjjjjjjj",
159*8a272653SPeter Holm	"/mnt/555/kkkk.kkkkkkkk",
160*8a272653SPeter Holm	"/mnt/555/lllll",
161*8a272653SPeter Holm	"/mnt/666/z",
162*8a272653SPeter Holm	"/mnt/666/aaaa",
163*8a272653SPeter Holm	"/mnt/666/bbbbb",
164*8a272653SPeter Holm	"/mnt/666/ccccc",
165*8a272653SPeter Holm	"/mnt/666/d",
166*8a272653SPeter Holm	"/mnt/666/e",
167*8a272653SPeter Holm	"/mnt/666/ffffff.fff.f",
168*8a272653SPeter Holm	"/mnt/666/gggggggggggg",
169*8a272653SPeter Holm	"/mnt/666/hhhh",
170*8a272653SPeter Holm	"/mnt/666/iiiii.ii",
171*8a272653SPeter Holm	"/mnt/666/jjjj.jj.jjjjjjjj",
172*8a272653SPeter Holm	"/mnt/666/kkkk.kkkkkkkk",
173*8a272653SPeter Holm	"/mnt/666/lllll",
174*8a272653SPeter Holm	"/mnt/777/z",
175*8a272653SPeter Holm	"/mnt/777/aaaa",
176*8a272653SPeter Holm	"/mnt/777/bbbbb",
177*8a272653SPeter Holm	"/mnt/777/ccccc",
178*8a272653SPeter Holm	"/mnt/777/d",
179*8a272653SPeter Holm	"/mnt/777/e",
180*8a272653SPeter Holm	"/mnt/777/ffffff.fff.f",
181*8a272653SPeter Holm	"/mnt/777/gggggggggggg",
182*8a272653SPeter Holm	"/mnt/777/hhhh",
183*8a272653SPeter Holm	"/mnt/777/iiiii.ii",
184*8a272653SPeter Holm	"/mnt/777/jjjj.jj.jjjjjjjj",
185*8a272653SPeter Holm	"/mnt/777/kkkk.kkkkkkkk",
186*8a272653SPeter Holm	"/mnt/777/lllll",
187*8a272653SPeter Holm	"/mnt/888/z",
188*8a272653SPeter Holm	"/mnt/888/aaaa",
189*8a272653SPeter Holm	"/mnt/888/bbbbb",
190*8a272653SPeter Holm	"/mnt/888/ccccc",
191*8a272653SPeter Holm	"/mnt/888/d",
192*8a272653SPeter Holm	"/mnt/888/e",
193*8a272653SPeter Holm	"/mnt/888/ffffff.fff.f",
194*8a272653SPeter Holm	"/mnt/888/gggggggggggg",
195*8a272653SPeter Holm	"/mnt/888/hhhh",
196*8a272653SPeter Holm	"/mnt/888/iiiii.ii",
197*8a272653SPeter Holm	"/mnt/888/jjjj.jj.jjjjjjjj",
198*8a272653SPeter Holm	"/mnt/888/kkkk.kkkkkkkk",
199*8a272653SPeter Holm	"/mnt/888/lllll",
200*8a272653SPeter Holm	"/mnt/999/z",
201*8a272653SPeter Holm	"/mnt/999/aaaa",
202*8a272653SPeter Holm	"/mnt/999/bbbbb",
203*8a272653SPeter Holm	"/mnt/999/ccccc",
204*8a272653SPeter Holm	"/mnt/999/d",
205*8a272653SPeter Holm	"/mnt/999/e",
206*8a272653SPeter Holm	"/mnt/999/ffffff.fff.f",
207*8a272653SPeter Holm	"/mnt/999/gggggggggggg",
208*8a272653SPeter Holm	"/mnt/999/hhhh",
209*8a272653SPeter Holm	"/mnt/999/iiiii.ii",
210*8a272653SPeter Holm	"/mnt/999/jjjj.jj.jjjjjjjj",
211*8a272653SPeter Holm	"/mnt/999/kkkk.kkkkkkkk",
212*8a272653SPeter Holm	"/mnt/999/lllll",
213*8a272653SPeter Holm	"/mnt/aaa/z",
214*8a272653SPeter Holm	"/mnt/aaa/aaaa",
215*8a272653SPeter Holm	"/mnt/aaa/bbbbb",
216*8a272653SPeter Holm	"/mnt/aaa/ccccc",
217*8a272653SPeter Holm	"/mnt/aaa/d",
218*8a272653SPeter Holm	"/mnt/aaa/e",
219*8a272653SPeter Holm	"/mnt/aaa/ffffff.fff.f",
220*8a272653SPeter Holm	"/mnt/aaa/gggggggggggg",
221*8a272653SPeter Holm	"/mnt/aaa/hhhh",
222*8a272653SPeter Holm	"/mnt/aaa/iiiii.ii",
223*8a272653SPeter Holm	"/mnt/aaa/jjjj.jj.jjjjjjjj",
224*8a272653SPeter Holm	"/mnt/aaa/kkkk.kkkkkkkk",
225*8a272653SPeter Holm	"/mnt/aaa/lllll",
226*8a272653SPeter Holm	"/mnt/bbb/z",
227*8a272653SPeter Holm	"/mnt/bbb/aaaa",
228*8a272653SPeter Holm	"/mnt/bbb/bbbbb",
229*8a272653SPeter Holm	"/mnt/bbb/ccccc",
230*8a272653SPeter Holm	"/mnt/bbb/d",
231*8a272653SPeter Holm	"/mnt/bbb/e",
232*8a272653SPeter Holm	"/mnt/bbb/ffffff.fff.f",
233*8a272653SPeter Holm	"/mnt/bbb/gggggggggggg",
234*8a272653SPeter Holm	"/mnt/bbb/hhhh",
235*8a272653SPeter Holm	"/mnt/bbb/iiiii.ii",
236*8a272653SPeter Holm	"/mnt/bbb/jjjj.jj.jjjjjjjj",
237*8a272653SPeter Holm	"/mnt/bbb/kkkk.kkkkkkkk",
238*8a272653SPeter Holm	"/mnt/bbb/lllll",
239*8a272653SPeter Holm	"/mnt/ccc/z",
240*8a272653SPeter Holm	"/mnt/ccc/aaaa",
241*8a272653SPeter Holm	"/mnt/ccc/bbbbb",
242*8a272653SPeter Holm	"/mnt/ccc/ccccc",
243*8a272653SPeter Holm	"/mnt/ccc/d",
244*8a272653SPeter Holm	"/mnt/ccc/e",
245*8a272653SPeter Holm	"/mnt/ccc/ffffff.fff.f",
246*8a272653SPeter Holm	"/mnt/ccc/gggggggggggg",
247*8a272653SPeter Holm	"/mnt/ccc/hhhh",
248*8a272653SPeter Holm	"/mnt/ccc/iiiii.ii",
249*8a272653SPeter Holm	"/mnt/ccc/jjjj.jj.jjjjjjjj",
250*8a272653SPeter Holm	"/mnt/ccc/kkkk.kkkkkkkk",
251*8a272653SPeter Holm	"/mnt/ccc/lllll",
252*8a272653SPeter Holm	"/mnt/ddd/z",
253*8a272653SPeter Holm	"/mnt/ddd/aaaa",
254*8a272653SPeter Holm	"/mnt/ddd/bbbbb",
255*8a272653SPeter Holm	"/mnt/ddd/ccccc",
256*8a272653SPeter Holm	"/mnt/ddd/d",
257*8a272653SPeter Holm	"/mnt/ddd/e",
258*8a272653SPeter Holm	"/mnt/ddd/ffffff.fff.f",
259*8a272653SPeter Holm	"/mnt/ddd/gggggggggggg",
260*8a272653SPeter Holm	"/mnt/ddd/hhhh",
261*8a272653SPeter Holm	"/mnt/ddd/iiiii.ii",
262*8a272653SPeter Holm	"/mnt/ddd/jjjj.jj.jjjjjjjj",
263*8a272653SPeter Holm	"/mnt/ddd/kkkk.kkkkkkkk",
264*8a272653SPeter Holm	"/mnt/ddd/lllll",
265*8a272653SPeter Holm	"/mnt/eee/z",
266*8a272653SPeter Holm	"/mnt/eee/aaaa",
267*8a272653SPeter Holm	"/mnt/eee/bbbbb",
268*8a272653SPeter Holm	"/mnt/eee/ccccc",
269*8a272653SPeter Holm	"/mnt/eee/d",
270*8a272653SPeter Holm	"/mnt/eee/e",
271*8a272653SPeter Holm	"/mnt/eee/ffffff.fff.f",
272*8a272653SPeter Holm	"/mnt/eee/gggggggggggg",
273*8a272653SPeter Holm	"/mnt/eee/hhhh",
274*8a272653SPeter Holm	"/mnt/eee/iiiii.ii",
275*8a272653SPeter Holm	"/mnt/eee/jjjj.jj.jjjjjjjj",
276*8a272653SPeter Holm	"/mnt/eee/kkkk.kkkkkkkk",
277*8a272653SPeter Holm	"/mnt/eee/lllll",
278*8a272653SPeter Holm	"/mnt/fff/z",
279*8a272653SPeter Holm	"/mnt/fff/aaaa",
280*8a272653SPeter Holm	"/mnt/fff/bbbbb",
281*8a272653SPeter Holm	"/mnt/fff/ccccc",
282*8a272653SPeter Holm	"/mnt/fff/d",
283*8a272653SPeter Holm	"/mnt/fff/e",
284*8a272653SPeter Holm	"/mnt/fff/ffffff.fff.f",
285*8a272653SPeter Holm	"/mnt/fff/gggggggggggg",
286*8a272653SPeter Holm	"/mnt/fff/hhhh",
287*8a272653SPeter Holm	"/mnt/fff/iiiii.ii",
288*8a272653SPeter Holm	"/mnt/fff/jjjj.jj.jjjjjjjj",
289*8a272653SPeter Holm	"/mnt/fff/kkkk.kkkkkkkk",
290*8a272653SPeter Holm	"/mnt/fff/lllll"
291*8a272653SPeter Holm};
292*8a272653SPeter Holm
293*8a272653SPeter Holmchar *
294*8a272653SPeter Holmbstg_pathstore_get()
295*8a272653SPeter Holm{
296*8a272653SPeter Holm	return bstg_pathstore[rand() %
297*8a272653SPeter Holm		     ((sizeof(bstg_pathstore) / sizeof(bstg_pathstore[0])))];
298*8a272653SPeter Holm}
299*8a272653SPeter Holm
300*8a272653SPeter Holmvoid
301*8a272653SPeter Holmdogcore()
302*8a272653SPeter Holm{
303*8a272653SPeter Holm	pid_t sleepchild, gcorechild;
304*8a272653SPeter Holm	extern char **environ;
305*8a272653SPeter Holm
306*8a272653SPeter Holm	/* create a child for the gcore target */
307*8a272653SPeter Holm	if ((sleepchild = fork()) == 0) {
308*8a272653SPeter Holm		sleep(30);
309*8a272653SPeter Holm		_exit(1);
310*8a272653SPeter Holm	} else if (sleepchild > 0) {
311*8a272653SPeter Holm		char *token[] = {NULL, NULL, NULL, NULL, NULL};
312*8a272653SPeter Holm		char buf[64];
313*8a272653SPeter Holm		int status;
314*8a272653SPeter Holm
315*8a272653SPeter Holm		/* use the first process as the target */
316*8a272653SPeter Holm		snprintf(buf, sizeof(buf), "%d", sleepchild);
317*8a272653SPeter Holm		token[0] = "gcore";
318*8a272653SPeter Holm		token[1] = "-c";
319*8a272653SPeter Holm		token[2] = bstg_pathstore_get();
320*8a272653SPeter Holm		token[3] = buf;
321*8a272653SPeter Holm		assert(token[4] == NULL);
322*8a272653SPeter Holm
323*8a272653SPeter Holm		if ((gcorechild = fork()) > 0) {
324*8a272653SPeter Holm			waitpid(gcorechild, &status, 0);
325*8a272653SPeter Holm		} else if (gcorechild == 0) {
326*8a272653SPeter Holm			execve("/usr/bin/gcore", token, environ);
327*8a272653SPeter Holm			_exit(1);
328*8a272653SPeter Holm		}
329*8a272653SPeter Holm		kill(sleepchild, SIGKILL);
330*8a272653SPeter Holm		waitpid(sleepchild, &status, 0);
331*8a272653SPeter Holm	}
332*8a272653SPeter Holm}
333*8a272653SPeter Holm
334*8a272653SPeter Holmvoid
335*8a272653SPeter Holmdowrite()
336*8a272653SPeter Holm{
337*8a272653SPeter Holm	struct iovec data[] = {
338*8a272653SPeter Holm		{"12", 2},
339*8a272653SPeter Holm		{NULL, 0},
340*8a272653SPeter Holm		{"12345678", 8},
341*8a272653SPeter Holm	};
342*8a272653SPeter Holm	static int fd = -1;
343*8a272653SPeter Holm
344*8a272653SPeter Holm	if (fd == -1) {
345*8a272653SPeter Holm		/* keep existing file open during life of this process */
346*8a272653SPeter Holm		fd = open(bstg_pathstore_get(), O_RDWR | O_NONBLOCK | O_NOCTTY);
347*8a272653SPeter Holm	}
348*8a272653SPeter Holm	data[1].iov_base = bstg_pathstore_get();
349*8a272653SPeter Holm	data[1].iov_len = strlen((char *)data[1].iov_base);
350*8a272653SPeter Holm	ftruncate(fd, 0);
351*8a272653SPeter Holm	pwritev(fd, data, 3, 0);
352*8a272653SPeter Holm}
353*8a272653SPeter Holm
354*8a272653SPeter Holmvoid
355*8a272653SPeter Holmdounlink()
356*8a272653SPeter Holm{
357*8a272653SPeter Holm	unlink(bstg_pathstore_get());
358*8a272653SPeter Holm}
359*8a272653SPeter Holm
360*8a272653SPeter Holmvoid
361*8a272653SPeter Holmdolink()
362*8a272653SPeter Holm{
363*8a272653SPeter Holm	link(bstg_pathstore_get(), bstg_pathstore_get());
364*8a272653SPeter Holm}
365*8a272653SPeter Holm
366*8a272653SPeter Holmvoid
367*8a272653SPeter Holmdomkdir()
368*8a272653SPeter Holm{
369*8a272653SPeter Holm	char **pdir;
370*8a272653SPeter Holm	static char *bstg_dirs[] = {
371*8a272653SPeter Holm		"/mnt/111", "/mnt/222", "/mnt/333", "/mnt/444",
372*8a272653SPeter Holm		"/mnt/555", "/mnt/666", "/mnt/777", "/mnt/888",
373*8a272653SPeter Holm		"/mnt/999", "/mnt/aaa", "/mnt/bbb", "/mnt/ccc",
374*8a272653SPeter Holm		"/mnt/ddd", "/mnt/eee", "/mnt/fff", NULL
375*8a272653SPeter Holm	};
376*8a272653SPeter Holm
377*8a272653SPeter Holm	for (pdir = bstg_dirs; *pdir; pdir++) {
378*8a272653SPeter Holm		if (mkdir(*pdir, 0777) == -1)
379*8a272653SPeter Holm			err(1, "mkdir(%s)", *pdir);
380*8a272653SPeter Holm	}
381*8a272653SPeter Holm}
382*8a272653SPeter Holm
383*8a272653SPeter Holmvoid
384*8a272653SPeter Holmdosync()
385*8a272653SPeter Holm{
386*8a272653SPeter Holm	sync();
387*8a272653SPeter Holm}
388*8a272653SPeter Holm
389*8a272653SPeter Holmint
390*8a272653SPeter Holmmain()
391*8a272653SPeter Holm{
392*8a272653SPeter Holm	time_t start;
393*8a272653SPeter Holm	unsigned x;
394*8a272653SPeter Holm	int i, status;
395*8a272653SPeter Holm	void (*funcs[]) () = {
396*8a272653SPeter Holm		dogcore,
397*8a272653SPeter Holm		dowrite,
398*8a272653SPeter Holm		dounlink,
399*8a272653SPeter Holm		dolink,
400*8a272653SPeter Holm		dowrite,
401*8a272653SPeter Holm		dounlink,
402*8a272653SPeter Holm		dolink,
403*8a272653SPeter Holm		dowrite,
404*8a272653SPeter Holm		dosync,
405*8a272653SPeter Holm		dowrite,
406*8a272653SPeter Holm		dounlink,
407*8a272653SPeter Holm		dolink,
408*8a272653SPeter Holm		dowrite,
409*8a272653SPeter Holm		dounlink,
410*8a272653SPeter Holm		dolink,
411*8a272653SPeter Holm		dowrite,
412*8a272653SPeter Holm	};
413*8a272653SPeter Holm
414*8a272653SPeter Holm	/* we only can domkdir() once at startup */
415*8a272653SPeter Holm	domkdir();
416*8a272653SPeter Holm
417*8a272653SPeter Holm	/* create 128 children that loop forever running 4 operations */
418*8a272653SPeter Holm	dosync();
419*8a272653SPeter Holm	for (x = 0; x < 128; x++) {
420*8a272653SPeter Holm		if (fork() == 0) {
421*8a272653SPeter Holm			/* give child a new seed for the pathname selection */
422*8a272653SPeter Holm			srand(x);
423*8a272653SPeter Holm
424*8a272653SPeter Holm			start = time(NULL);
425*8a272653SPeter Holm			for (i = 0; i < 1000; i++) {
426*8a272653SPeter Holm				/* each child will start looping at different
427*8a272653SPeter Holm				 * function */
428*8a272653SPeter Holm				(*funcs[x++ % 16]) ();
429*8a272653SPeter Holm				if (time(NULL) - start > RUNTIME)
430*8a272653SPeter Holm					break;
431*8a272653SPeter Holm			}
432*8a272653SPeter Holm			/* we never expect this code to run */
433*8a272653SPeter Holm			_exit(1);
434*8a272653SPeter Holm		}
435*8a272653SPeter Holm	}
436*8a272653SPeter Holm
437*8a272653SPeter Holm	/* block forever for all our children */
438*8a272653SPeter Holm	while (wait(&status) > 0);
439*8a272653SPeter Holm	return 0;
440*8a272653SPeter Holm}
441