18a272653SPeter Holm#!/bin/sh 28a272653SPeter Holm 38a272653SPeter Holm# 48a272653SPeter Holm# Copyright (c) 2010 Peter Holm <pho@FreeBSD.org> 58a272653SPeter Holm# All rights reserved. 68a272653SPeter Holm# 78a272653SPeter Holm# Redistribution and use in source and binary forms, with or without 88a272653SPeter Holm# modification, are permitted provided that the following conditions 98a272653SPeter Holm# are met: 108a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright 118a272653SPeter Holm# notice, this list of conditions and the following disclaimer. 128a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 138a272653SPeter Holm# notice, this list of conditions and the following disclaimer in the 148a272653SPeter Holm# documentation and/or other materials provided with the distribution. 158a272653SPeter Holm# 168a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 178a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 188a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 198a272653SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 208a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 218a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 228a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 238a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 248a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 258a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 268a272653SPeter Holm# SUCH DAMAGE. 278a272653SPeter Holm# 288a272653SPeter Holm 298a272653SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 308a272653SPeter Holm 318a272653SPeter Holm# Variation of suj5.sh 328a272653SPeter Holm# "panic: indir_trunc: Index out of range -2 parent -2061 lbn -2060" seen 338a272653SPeter Holm 348a272653SPeter Holm. ../default.cfg 358a272653SPeter Holm 368a272653SPeter Holmhere=`pwd` 378a272653SPeter Holmcd /tmp 388a272653SPeter Holmsed '1,/^EOF/d' < $here/$0 > suj6.c 398a272653SPeter Holmmycc -o suj6 -Wall -O2 suj6.c 408a272653SPeter Holmrm -f suj6.c 418a272653SPeter Holmcd $here 428a272653SPeter Holm 438a272653SPeter Holmmount | grep $mntpoint | grep -q /dev/md && umount -f $mntpoint 448a272653SPeter Holmmdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart 458a272653SPeter Holmmdconfig -a -t swap -s 1g -u $mdstart 46*608c97bfSPeter Holmnewfs -j md$mdstart > /dev/null 47*608c97bfSPeter Holmmount /dev/md$mdstart $mntpoint 488a272653SPeter Holmchmod 777 $mntpoint 498a272653SPeter Holm 508a272653SPeter Holmsu $testuser -c "cd $mntpoint; /tmp/suj6" > /dev/null 518a272653SPeter Holm 528a272653SPeter Holmwhile mount | grep $mntpoint | grep -q /dev/md; do 538a272653SPeter Holm umount $mntpoint || sleep 1 548a272653SPeter Holmdone 558a272653SPeter Holmmdconfig -d -u $mdstart 568a272653SPeter Holmrm -f /tmp/suj6 578a272653SPeter Holmexit 588a272653SPeter HolmEOF 598a272653SPeter Holm#include <err.h> 608a272653SPeter Holm#include <fcntl.h> 618a272653SPeter Holm#include <stdio.h> 628a272653SPeter Holm#include <stdlib.h> 638a272653SPeter Holm#include <sys/mount.h> 648a272653SPeter Holm#include <sys/param.h> 658a272653SPeter Holm#include <sys/stat.h> 668a272653SPeter Holm#include <unistd.h> 678a272653SPeter Holm#include <sys/wait.h> 688a272653SPeter Holm 698a272653SPeter Holm#define PARALLEL 10 708a272653SPeter Holm 718a272653SPeter Holmstatic int 728a272653SPeter Holmrandom_int(int mi, int ma) 738a272653SPeter Holm{ 748a272653SPeter Holm return (arc4random() % (ma - mi + 1) + mi); 758a272653SPeter Holm} 768a272653SPeter Holm 778a272653SPeter Holmstatic int64_t 788a272653SPeter Holmdf(void) 798a272653SPeter Holm{ 808a272653SPeter Holm char path[MAXPATHLEN+1]; 818a272653SPeter Holm struct statfs buf; 828a272653SPeter Holm 838a272653SPeter Holm if (getcwd(path, sizeof(path)) == NULL) 848a272653SPeter Holm err(1, "getcwd()"); 858a272653SPeter Holm 868a272653SPeter Holm if (statfs(path, &buf) < 0) 878a272653SPeter Holm err(1, "statfs(%s)", path); 888a272653SPeter Holm printf("Free space on %s: %jd Mb\n", path, buf.f_bavail * buf.f_bsize / 1024 / 1024); 898a272653SPeter Holm return (buf.f_bavail * buf.f_bsize); 908a272653SPeter Holm} 918a272653SPeter Holm 928a272653SPeter Holmstatic void 938a272653SPeter Holmtest(int size) 948a272653SPeter Holm{ 958a272653SPeter Holm int buf[1024], index, to; 968a272653SPeter Holm#ifdef TEST 978a272653SPeter Holm int i; 988a272653SPeter Holm#endif 998a272653SPeter Holm int fd; 1008a272653SPeter Holm char file[128]; 1018a272653SPeter Holm 1028a272653SPeter Holm sprintf(file,"p%05d", getpid()); 1038a272653SPeter Holm if ((fd = creat(file, 0660)) == -1) 1048a272653SPeter Holm err(1, "creat(%s)", file); 1058a272653SPeter Holm 1068a272653SPeter Holm to = sizeof(buf); 1078a272653SPeter Holm index = 0; 1088a272653SPeter Holm while (index < size) { 1098a272653SPeter Holm if (index + to > size) 1108a272653SPeter Holm to = size - index; 1118a272653SPeter Holm#ifdef TEST 1128a272653SPeter Holm for (i = 0; i < to; i++) 1138a272653SPeter Holm buf[i] = index + i; 1148a272653SPeter Holm#endif 1158a272653SPeter Holm index += to; 1168a272653SPeter Holm if (write(fd, buf, to) != to) 1178a272653SPeter Holm err(1, "write(%s), %s:%d", file, __FILE__, __LINE__); 1188a272653SPeter Holm } 1198a272653SPeter Holm if (close(fd) == -1) 1208a272653SPeter Holm err(1, "close(%s), %s:%d", file, __FILE__, __LINE__); 1218a272653SPeter Holm 1228a272653SPeter Holm#if 0 1238a272653SPeter Holm if ((fd = open(file, O_RDONLY)) == -1) 1248a272653SPeter Holm err(1, "open(%s), %s:%d", file, __FILE__, __LINE__); 1258a272653SPeter Holm 1268a272653SPeter Holm index = 0; 1278a272653SPeter Holm while (index < size) { 1288a272653SPeter Holm if (index + to > size) 1298a272653SPeter Holm to = size - index; 1308a272653SPeter Holm if (read(fd, buf, to) != to) 1318a272653SPeter Holm err(1, "rw read. %s.%d", __FILE__, __LINE__); 1328a272653SPeter Holm#ifdef TEST 1338a272653SPeter Holm for (i = 0; i < to; i++) { 1348a272653SPeter Holm if (buf[i] != index + i) { 1358a272653SPeter Holm fprintf(stderr, 1368a272653SPeter Holm "%s, pid %d: expected %d @ %d, got %d\n", 1378a272653SPeter Holm getprogname(), getpid(), index+i, index+i, 1388a272653SPeter Holm buf[i]); 1398a272653SPeter Holm exit(EXIT_FAILURE); 1408a272653SPeter Holm } 1418a272653SPeter Holm } 1428a272653SPeter Holm#endif 1438a272653SPeter Holm index += to; 1448a272653SPeter Holm } 1458a272653SPeter Holm if (close(fd) == -1) 1468a272653SPeter Holm err(1, "close(%s), %s:%d", file, __FILE__, __LINE__); 1478a272653SPeter Holm#endif 1488a272653SPeter Holm if (unlink(file) == -1) 1498a272653SPeter Holm err(1, "unlink(%s), %s:%d", file, __FILE__, __LINE__); 1508a272653SPeter Holm exit(0); 1518a272653SPeter Holm} 1528a272653SPeter Holm 1538a272653SPeter Holmint 1548a272653SPeter Holmmain() 1558a272653SPeter Holm{ 1568a272653SPeter Holm int i, j, pct; 1578a272653SPeter Holm int size; /* in k */ 1588a272653SPeter Holm int64_t bl; 1598a272653SPeter Holm 1608a272653SPeter Holm bl = df(); 1618a272653SPeter Holm if (bl > (int64_t)INT_MAX * PARALLEL) 1628a272653SPeter Holm bl = (int64_t)INT_MAX * PARALLEL; 1638a272653SPeter Holm size = bl / PARALLEL / 1024; 1648a272653SPeter Holm 1658a272653SPeter Holm pct = random_int(1, 50); 1668a272653SPeter Holm size = size / 100 * pct + 1; 1678a272653SPeter Holm if (random_int(1, 100) <= 50) 1688a272653SPeter Holm size = 34 * 1024; /* Known good deadlock value */ 1698a272653SPeter Holm printf("Max file size: %d Mb\n", size / 1024); 1708a272653SPeter Holm 1718a272653SPeter Holm for (i = 0; i < 100; i++) { 1728a272653SPeter Holm for (j = 0; j < PARALLEL; j++) { 1738a272653SPeter Holm if (fork() == 0) { 1748a272653SPeter Holm test(random_int(1, size) * 1024); 1758a272653SPeter Holm } 1768a272653SPeter Holm } 1778a272653SPeter Holm for (j = 0; j < PARALLEL; j++) 1788a272653SPeter Holm wait(NULL); 1798a272653SPeter Holm } 1808a272653SPeter Holm 1818a272653SPeter Holm return (0); 1828a272653SPeter Holm} 183