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