Bring in FreeBSD's stress2 stress testing suite.
authorSascha Wildner <saw@online.de>
Wed, 4 Aug 2010 23:36:53 +0000 (01:36 +0200)
committerSascha Wildner <saw@online.de>
Wed, 4 Aug 2010 23:39:11 +0000 (01:39 +0200)
Great for crashing the system.

See test/stress/stress2/README for instructions.

Thanks to Peter Holm <pho@FreeBSD.org> for writing it.

Thanks to Damian Lubosch <dl@xiqit.de> for helping with testing
on DragonFly.

This might need further adjustment in the future.

251 files changed:
test/stress/stress2/Makefile [new file with mode: 0644]
test/stress/stress2/Makefile.gnu [new file with mode: 0644]
test/stress/stress2/README [new file with mode: 0644]
test/stress/stress2/all.cfg [new file with mode: 0644]
test/stress/stress2/beaver1.sentex.ca [new file with mode: 0644]
test/stress/stress2/creat.cfg [new file with mode: 0644]
test/stress/stress2/default.cfg [new file with mode: 0644]
test/stress/stress2/df.cfg [new file with mode: 0644]
test/stress/stress2/disk.cfg [new file with mode: 0644]
test/stress/stress2/doc/README [new file with mode: 0644]
test/stress/stress2/doc/linuxforum06.pdf [new file with mode: 0644]
test/stress/stress2/doc/stress.pdf [new file with mode: 0644]
test/stress/stress2/hydra1.netperf.freebsd.org [new file with mode: 0644]
test/stress/stress2/hydra2.netperf.freebsd.org [new file with mode: 0644]
test/stress/stress2/include/stress.h [new file with mode: 0644]
test/stress/stress2/io.cfg [new file with mode: 0644]
test/stress/stress2/jeff.cfg [new file with mode: 0644]
test/stress/stress2/lib/Makefile [new file with mode: 0644]
test/stress/stress2/lib/main.c [new file with mode: 0644]
test/stress/stress2/lib/options.c [new file with mode: 0644]
test/stress/stress2/lib/random_int.c [new file with mode: 0644]
test/stress/stress2/lib/resources.c [new file with mode: 0644]
test/stress/stress2/link.cfg [new file with mode: 0644]
test/stress/stress2/load.cfg [new file with mode: 0644]
test/stress/stress2/lockf.cfg [new file with mode: 0644]
test/stress/stress2/marcus.cfg [new file with mode: 0644]
test/stress/stress2/misc/README [new file with mode: 0644]
test/stress/stress2/misc/all.sh [new file with mode: 0755]
test/stress/stress2/misc/altbufferflushes.sh [new file with mode: 0755]
test/stress/stress2/misc/alternativeFlushPath.sh [new file with mode: 0755]
test/stress/stress2/misc/backingstore.sh [new file with mode: 0755]
test/stress/stress2/misc/backingstore2.sh [new file with mode: 0755]
test/stress/stress2/misc/backingstore3.sh [new file with mode: 0755]
test/stress/stress2/misc/cdevsw.sh [new file with mode: 0755]
test/stress/stress2/misc/cleanup.sh [new file with mode: 0755]
test/stress/stress2/misc/core.sh [new file with mode: 0755]
test/stress/stress2/misc/crossmp.sh [new file with mode: 0755]
test/stress/stress2/misc/crossmp2.sh [new file with mode: 0755]
test/stress/stress2/misc/datamove.sh [new file with mode: 0755]
test/stress/stress2/misc/datamove2.sh [new file with mode: 0755]
test/stress/stress2/misc/datamove3.sh [new file with mode: 0755]
test/stress/stress2/misc/devfs.sh [new file with mode: 0755]
test/stress/stress2/misc/devfs2.sh [new file with mode: 0755]
test/stress/stress2/misc/extattr.sh [new file with mode: 0755]
test/stress/stress2/misc/extattrctl.sh [new file with mode: 0755]
test/stress/stress2/misc/fdescfs.sh [new file with mode: 0755]
test/stress/stress2/misc/fpclone.sh [new file with mode: 0755]
test/stress/stress2/misc/fpclone2.sh [new file with mode: 0755]
test/stress/stress2/misc/fpu.sh [new file with mode: 0755]
test/stress/stress2/misc/fragments.sh [new file with mode: 0755]
test/stress/stress2/misc/fs.sh [new file with mode: 0755]
test/stress/stress2/misc/fullpath.sh [new file with mode: 0755]
test/stress/stress2/misc/fuzz.sh [new file with mode: 0755]
test/stress/stress2/misc/inversion.sh [new file with mode: 0755]
test/stress/stress2/misc/isofs.sh [new file with mode: 0755]
test/stress/stress2/misc/jail.sh [new file with mode: 0755]
test/stress/stress2/misc/jail2.sh [new file with mode: 0755]
test/stress/stress2/misc/jail3.sh [new file with mode: 0755]
test/stress/stress2/misc/jail4.sh [new file with mode: 0755]
test/stress/stress2/misc/kevent.sh [new file with mode: 0755]
test/stress/stress2/misc/kevent2.sh [new file with mode: 0755]
test/stress/stress2/misc/kevent3.sh [new file with mode: 0755]
test/stress/stress2/misc/kevent4.sh [new file with mode: 0755]
test/stress/stress2/misc/kevent5.sh [new file with mode: 0755]
test/stress/stress2/misc/kinfo.sh [new file with mode: 0755]
test/stress/stress2/misc/kinfo2.sh [new file with mode: 0755]
test/stress/stress2/misc/kinfo3.sh [new file with mode: 0755]
test/stress/stress2/misc/ldt.sh [new file with mode: 0755]
test/stress/stress2/misc/ldt2.sh [new file with mode: 0755]
test/stress/stress2/misc/libMicro.sh [new file with mode: 0755]
test/stress/stress2/misc/lockf.sh [new file with mode: 0755]
test/stress/stress2/misc/lookup_shared.sh [new file with mode: 0755]
test/stress/stress2/misc/mac.sh [new file with mode: 0755]
test/stress/stress2/misc/mac_chkexec.sh [new file with mode: 0755]
test/stress/stress2/misc/md.sh [new file with mode: 0755]
test/stress/stress2/misc/md2.sh [new file with mode: 0755]
test/stress/stress2/misc/md3.sh [new file with mode: 0755]
test/stress/stress2/misc/mlockall.sh [new file with mode: 0755]
test/stress/stress2/misc/mmap.sh [new file with mode: 0755]
test/stress/stress2/misc/mmap2.sh [new file with mode: 0755]
test/stress/stress2/misc/mmap3.sh [new file with mode: 0755]
test/stress/stress2/misc/mmap4.sh [new file with mode: 0755]
test/stress/stress2/misc/mount.sh [new file with mode: 0755]
test/stress/stress2/misc/mount2.sh [new file with mode: 0755]
test/stress/stress2/misc/mountro.sh [new file with mode: 0755]
test/stress/stress2/misc/mountro2.sh [new file with mode: 0755]
test/stress/stress2/misc/mountro3.sh [new file with mode: 0755]
test/stress/stress2/misc/msdos.sh [new file with mode: 0755]
test/stress/stress2/misc/msdos2.sh [new file with mode: 0755]
test/stress/stress2/misc/msdos3.sh [new file with mode: 0755]
test/stress/stress2/misc/msdos4.sh [new file with mode: 0755]
test/stress/stress2/misc/namecache.sh [new file with mode: 0755]
test/stress/stress2/misc/nbufkv.sh [new file with mode: 0755]
test/stress/stress2/misc/newfs.sh [new file with mode: 0755]
test/stress/stress2/misc/newfs2.sh [new file with mode: 0755]
test/stress/stress2/misc/newfs3.sh [new file with mode: 0755]
test/stress/stress2/misc/newfs4.sh [new file with mode: 0755]
test/stress/stress2/misc/nfs.sh [new file with mode: 0755]
test/stress/stress2/misc/nfs2.sh [new file with mode: 0755]
test/stress/stress2/misc/nfs3.sh [new file with mode: 0755]
test/stress/stress2/misc/nfs4.sh [new file with mode: 0755]
test/stress/stress2/misc/nfs5.sh [new file with mode: 0755]
test/stress/stress2/misc/nfs6.sh [new file with mode: 0755]
test/stress/stress2/misc/nfs7.sh [new file with mode: 0755]
test/stress/stress2/misc/nfs8.sh [new file with mode: 0755]
test/stress/stress2/misc/nfs9.sh [new file with mode: 0755]
test/stress/stress2/misc/nfsrename.sh [new file with mode: 0755]
test/stress/stress2/misc/nullfs.sh [new file with mode: 0755]
test/stress/stress2/misc/nullfs2.sh [new file with mode: 0755]
test/stress/stress2/misc/nullfs3.sh [new file with mode: 0755]
test/stress/stress2/misc/nullfs4.sh [new file with mode: 0755]
test/stress/stress2/misc/nullfs5.sh [new file with mode: 0755]
test/stress/stress2/misc/nullfs6.sh [new file with mode: 0755]
test/stress/stress2/misc/pmc.sh [new file with mode: 0755]
test/stress/stress2/misc/procfs.sh [new file with mode: 0755]
test/stress/stress2/misc/pthread.sh [new file with mode: 0755]
test/stress/stress2/misc/quota1.sh [new file with mode: 0755]
test/stress/stress2/misc/quota10.sh [new file with mode: 0755]
test/stress/stress2/misc/quota2.sh [new file with mode: 0755]
test/stress/stress2/misc/quota3.sh [new file with mode: 0755]
test/stress/stress2/misc/quota4.sh [new file with mode: 0755]
test/stress/stress2/misc/quota5.sh [new file with mode: 0755]
test/stress/stress2/misc/quota6.sh [new file with mode: 0755]
test/stress/stress2/misc/quota7.sh [new file with mode: 0755]
test/stress/stress2/misc/quota8.sh [new file with mode: 0755]
test/stress/stress2/misc/quota9.sh [new file with mode: 0755]
test/stress/stress2/misc/recursiveflushes.sh [new file with mode: 0755]
test/stress/stress2/misc/rename.sh [new file with mode: 0755]
test/stress/stress2/misc/rename2.sh [new file with mode: 0755]
test/stress/stress2/misc/rename3.sh [new file with mode: 0755]
test/stress/stress2/misc/rename4.sh [new file with mode: 0755]
test/stress/stress2/misc/revoke.sh [new file with mode: 0755]
test/stress/stress2/misc/sem.sh [new file with mode: 0755]
test/stress/stress2/misc/sendfile.sh [new file with mode: 0755]
test/stress/stress2/misc/snap.sh [new file with mode: 0755]
test/stress/stress2/misc/snap2-1.sh [new file with mode: 0755]
test/stress/stress2/misc/snap2.sh [new file with mode: 0755]
test/stress/stress2/misc/snap3.sh [new file with mode: 0755]
test/stress/stress2/misc/snap4.sh [new file with mode: 0755]
test/stress/stress2/misc/snap5-1.sh [new file with mode: 0755]
test/stress/stress2/misc/snap5.sh [new file with mode: 0755]
test/stress/stress2/misc/snap6.sh [new file with mode: 0755]
test/stress/stress2/misc/snap7.sh [new file with mode: 0755]
test/stress/stress2/misc/snap8.sh [new file with mode: 0755]
test/stress/stress2/misc/snapbackup.sh [new file with mode: 0755]
test/stress/stress2/misc/softupdate.sh [new file with mode: 0755]
test/stress/stress2/misc/statfs.sh [new file with mode: 0755]
test/stress/stress2/misc/suj.sh [new file with mode: 0755]
test/stress/stress2/misc/symlink.sh [new file with mode: 0755]
test/stress/stress2/misc/symlink2.sh [new file with mode: 0755]
test/stress/stress2/misc/syscall.sh [new file with mode: 0755]
test/stress/stress2/misc/syscall2.sh [new file with mode: 0755]
test/stress/stress2/misc/tmpfs.sh [new file with mode: 0755]
test/stress/stress2/misc/tmpfs2.sh [new file with mode: 0755]
test/stress/stress2/misc/tmpfs3.sh [new file with mode: 0755]
test/stress/stress2/misc/tmpfs4.sh [new file with mode: 0755]
test/stress/stress2/misc/truncate.sh [new file with mode: 0755]
test/stress/stress2/misc/truncate2.sh [new file with mode: 0755]
test/stress/stress2/misc/ucom.sh [new file with mode: 0755]
test/stress/stress2/misc/umount.sh [new file with mode: 0755]
test/stress/stress2/misc/umountf.sh [new file with mode: 0755]
test/stress/stress2/misc/umountf2.sh [new file with mode: 0755]
test/stress/stress2/misc/umountf3.sh [new file with mode: 0755]
test/stress/stress2/misc/umountf4.sh [new file with mode: 0755]
test/stress/stress2/misc/union.sh [new file with mode: 0755]
test/stress/stress2/misc/unionfs.sh [new file with mode: 0755]
test/stress/stress2/misc/unionfs2.sh [new file with mode: 0755]
test/stress/stress2/misc/unionfs3.sh [new file with mode: 0755]
test/stress/stress2/misc/zfs.sh [new file with mode: 0755]
test/stress/stress2/misc/zfs2.sh [new file with mode: 0755]
test/stress/stress2/misc/zfs3.sh [new file with mode: 0755]
test/stress/stress2/misc/zfs4.sh [new file with mode: 0755]
test/stress/stress2/misc/zfs5.sh [new file with mode: 0755]
test/stress/stress2/mkdir.cfg [new file with mode: 0644]
test/stress/stress2/mkfifo.cfg [new file with mode: 0644]
test/stress/stress2/norw.cfg [new file with mode: 0644]
test/stress/stress2/noswap.cfg [new file with mode: 0644]
test/stress/stress2/orangutan.netperf.freebsd.org [new file with mode: 0644]
test/stress/stress2/pty.cfg [new file with mode: 0644]
test/stress/stress2/run.sh [new file with mode: 0755]
test/stress/stress2/rw.cfg [new file with mode: 0644]
test/stress/stress2/syscall.cfg [new file with mode: 0644]
test/stress/stress2/sysctl.cfg [new file with mode: 0644]
test/stress/stress2/testcases/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/Makefile.inc [new file with mode: 0644]
test/stress/stress2/testcases/README [new file with mode: 0644]
test/stress/stress2/testcases/badcode/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/badcode/badcode.c [new file with mode: 0644]
test/stress/stress2/testcases/creat/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/creat/creat.c [new file with mode: 0644]
test/stress/stress2/testcases/fts/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/fts/fts.c [new file with mode: 0644]
test/stress/stress2/testcases/link/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/link/link.c [new file with mode: 0644]
test/stress/stress2/testcases/lockf/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/lockf/lockf.c [new file with mode: 0644]
test/stress/stress2/testcases/lockf2/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/lockf2/lockf2.c [new file with mode: 0644]
test/stress/stress2/testcases/mkdir/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/mkdir/mkdir.c [new file with mode: 0644]
test/stress/stress2/testcases/mkfifo/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/mkfifo/mkfifo.c [new file with mode: 0644]
test/stress/stress2/testcases/mmap/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/mmap/mmap.c [new file with mode: 0644]
test/stress/stress2/testcases/openat/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/openat/doat.c [new file with mode: 0644]
test/stress/stress2/testcases/openat/openat.c [new file with mode: 0644]
test/stress/stress2/testcases/pty/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/pty/pty.c [new file with mode: 0644]
test/stress/stress2/testcases/rename/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/rename/rename.c [new file with mode: 0644]
test/stress/stress2/testcases/run/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/run/run.c [new file with mode: 0644]
test/stress/stress2/testcases/rw/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/rw/rw.c [new file with mode: 0644]
test/stress/stress2/testcases/shm/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/shm/shm.c [new file with mode: 0644]
test/stress/stress2/testcases/socket/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/socket/socket.c [new file with mode: 0644]
test/stress/stress2/testcases/swap/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/swap/swap.c [new file with mode: 0644]
test/stress/stress2/testcases/symlink/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/symlink/symlink.c [new file with mode: 0644]
test/stress/stress2/testcases/syscall/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/syscall/syscall.c [new file with mode: 0644]
test/stress/stress2/testcases/sysctl/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/sysctl/sysctl.c [new file with mode: 0644]
test/stress/stress2/testcases/tcp/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/tcp/tcp.c [new file with mode: 0644]
test/stress/stress2/testcases/thr1/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/thr1/thr1.c [new file with mode: 0644]
test/stress/stress2/testcases/thr2/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/thr2/thr2.c [new file with mode: 0644]
test/stress/stress2/testcases/udp/Makefile [new file with mode: 0644]
test/stress/stress2/testcases/udp/udp.c [new file with mode: 0644]
test/stress/stress2/tools/df.sh [new file with mode: 0755]
test/stress/stress2/tools/freeze.sh [new file with mode: 0755]
test/stress/stress2/tools/freeze2.sh [new file with mode: 0755]
test/stress/stress2/tools/fstool.c [new file with mode: 0644]
test/stress/stress2/tools/iwatch.sh [new file with mode: 0755]
test/stress/stress2/tools/l3.sh [new file with mode: 0755]
test/stress/stress2/tools/leaks.sh [new file with mode: 0755]
test/stress/stress2/tools/leaks2.sh [new file with mode: 0755]
test/stress/stress2/tools/module/Makefile [new file with mode: 0644]
test/stress/stress2/tools/module/ptest.c [new file with mode: 0644]
test/stress/stress2/tools/monitor.sh [new file with mode: 0755]
test/stress/stress2/tools/ptsleak.sh [new file with mode: 0755]
test/stress/stress2/tools/ptyleak.sh [new file with mode: 0755]
test/stress/stress2/tools/rwatch.sh [new file with mode: 0755]
test/stress/stress2/udp.cfg [new file with mode: 0644]
test/stress/stress2/vfs.cfg [new file with mode: 0644]

diff --git a/test/stress/stress2/Makefile b/test/stress/stress2/Makefile
new file mode 100644 (file)
index 0000000..02987a1
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+SUBDIR= lib testcases
+
+.include <bsd.subdir.mk>
diff --git a/test/stress/stress2/Makefile.gnu b/test/stress/stress2/Makefile.gnu
new file mode 100644 (file)
index 0000000..06f8c7a
--- /dev/null
@@ -0,0 +1,28 @@
+#MAKE=gmake
+
+# Gnu Makefile by "Brad Knotwell" <bknotwell@yahoo.com>
+
+LIBOBJS=$(subst .c,.o,$(wildcard lib/*.c))
+TESTDIRS=run swap mkdir creat thr1 syscall rw sysctl tcp udp
+EXES=$(foreach dir,$(TESTDIRS),testcases/$(dir)/$(dir).test)
+OBJS=$(subst .test,.o,$(EXES))
+SRCS=$(subst .o,.c,$(OBJS))
+LIBS=./lib/libstress.a
+CFLAGS=-g -Wall -I./include
+
+all: $(EXES)
+
+lib/libstress.a: lib/libstress.a($(LIBOBJS))
+       ranlib lib/libstress.a
+
+lib/libstress.a(*.o): $(LIBOBJS)
+
+$(OBJS): %.o: %.c
+
+$(EXES): %.test: %.o lib/libstress.a
+
+%.test: %.o
+       $(CC) $(CFLAGS) $(LIBS) $< -o $@
+
+clean:
+       rm -fr $(LIBOBJS) lib/libstress.a $(EXES) $(OBJS)
diff --git a/test/stress/stress2/README b/test/stress/stress2/README
new file mode 100644 (file)
index 0000000..f430533
--- /dev/null
@@ -0,0 +1,59 @@
+$FreeBSD$
+
+This is the FreeBSD kernel stress test suite. The purpose is to crash the
+computer, by stressing selected parts of the kernel, thus exposing inadequate
+error handling.
+
+Do not run the syscall test as root.
+
+To build and use:
+
+make
+sh ./run.sh
+
+The "run.sh" script accepts an optional configuration file in order to test specific areas.
+For example:
+
+./run.sh vfs.sh
+
+
+To run all of the different test scenarios type:
+
+./run.sh -a
+
+You may have to tune the stress test to make sure that your test box run low
+on resources.  For example:
+
+INCARNATIONS=125 ./run.sh
+
+The following sub-directories exists:
+
+./doc          Documentation
+./include      Include file for building the test programs in ./testcases
+./lib          Common support files for the test programs
+./misc         Various test scenarios. Mostly regression tests
+./testcases    Test programs
+./tools                Supplementary tools used in stress testing
+
+The name stress2 indicates that this is the second generation of the Kernel Stress Test Suite.
+The first version (stress) was based mostly on scripts.
+
+
+20090120: des@ pointed out it would be nice to be able to set the
+       random seed in order to be able to reproduce errors in time.
+       A test of this show that the occurrence of panics are still
+       non-deterministic even with a fixed seed. The known broken
+       unionfs was used to test this:
+       http://people.freebsd.org/~pho/stress/log/marcus006.txt.
+       First panic occurred after 29 loops and the second after 8
+       with a seed of "123".
+
+       The randomness that is provided by lack of synchronization
+       with timer interrupt, disk block layout and disk access
+       latencies caused by platter and heads speed changes, disk
+       firmware internal operations, and so on are _much_ bigger
+       then the undeterminism caused by the non-repeatable random
+       seed.
+
+       Anyway, I have always view the this issue as only a slight
+       inconvenience.
diff --git a/test/stress/stress2/all.cfg b/test/stress/stress2/all.cfg
new file mode 100644 (file)
index 0000000..74db0bb
--- /dev/null
@@ -0,0 +1,8 @@
+# $FreeBSD$
+
+# Stress Test Suite Configuration: run all test programs
+
+# Default values
+. ./default.cfg
+
+export TESTPROGS=""
diff --git a/test/stress/stress2/beaver1.sentex.ca b/test/stress/stress2/beaver1.sentex.ca
new file mode 100644 (file)
index 0000000..f1733eb
--- /dev/null
@@ -0,0 +1,15 @@
+# $FreeBSD$
+
+# Configuration needed for the beaver1 test box
+
+export RUNDIR=/usr/tmp/stressX
+TZ=Europe/Copenhagen; export TZ
+
+###export BLASTHOST=192.168.5.105      # orangutan
+export BLASTHOST=127.0.0.1     #
+
+export DISKIMAGE=/usr/tmp/diskimage    # Location of 1G disk image
+export MNTPOINT=/mnt           # Disk image mount point
+export TESTUSER=test           # Name of non root test user
+###export MDSTART=5            # Start of free md units
+###INCARNATIONS=125
diff --git a/test/stress/stress2/creat.cfg b/test/stress/stress2/creat.cfg
new file mode 100644 (file)
index 0000000..ef62b9d
--- /dev/null
@@ -0,0 +1,10 @@
+# $FreeBSD$
+
+# Stress Test Suite Configuration
+
+# Default values
+. ./default.cfg
+
+export TESTPROGS="testcases/creat/creat"
+export creatNODELAY=1
+export creatLOAD=100
diff --git a/test/stress/stress2/default.cfg b/test/stress/stress2/default.cfg
new file mode 100644 (file)
index 0000000..5096b69
--- /dev/null
@@ -0,0 +1,76 @@
+# $FreeBSD$
+
+# Stress Test Suite Configuration
+
+# Default values
+export RUNDIR=${RUNDIR:-/tmp/stressX}
+export RUNTIME=${RUNTIME:-2m}
+export VERBOSE=${VERBOSE:-1}
+export LOAD=20
+
+# The INCARNATIONS variable should be set to match the number of CPUs and
+# the amount of RAM in the test box.
+# 10  for a 1,8 GHz Celeron with 256 Mb of RAM
+# 100 for a dual Xeon 1,8 GHz with 1024 Gb of RAM
+
+export INCARNATIONS=${INCARNATIONS:-20}
+
+# Change hostname!
+#export BLASTHOST=192.168.1.2  # host with udp disacard enabled in inetd.conf
+export BLASTHOST=192.168.1.3   # host with udp disacard enabled in inetd.conf
+
+
+# Run all test cases:
+export runRUNTIME=${runRUNTIME:-3d}            # Run tests for three days
+export runINCARNATIONS=1
+export runLOAD=100
+
+export swapINCARNATIONS=$((2 * INCARNATIONS))
+export swapLOAD=80
+
+export syscallKILL=1
+
+export rwLOAD=70
+export mkdirLOAD=80
+export creatLOAD=80
+
+export symlinkLOAD=20
+
+export tcpKILL=1
+#export shmKILL=1
+export shmINCARNATIONS=5
+
+export TESTPROGS="
+testcases/rw/rw
+testcases/swap/swap
+testcases/creat/creat
+testcases/mkdir/mkdir
+testcases/thr1/thr1
+testcases/udp/udp
+testcases/tcp/tcp
+"
+
+[ -r default.cfg ] && ulimit -t 200    # Do not run this for the misc sub directory
+
+#
+# Defaults for ./misc tests
+#
+
+diskimage=/var/tmp/diskimage   # Location of 1G disk image
+mntpoint=/mnt                  # Disk image mount point
+testuser=pho                   # Name of non root test user
+mdstart=5                      # Start of free md units
+part=a                         # partitition to use on a md FS
+
+# Wrapper for dd
+dede () {        # file, blocksize, count
+   local log=/tmp/$0.$$
+   dd if=/dev/zero of=$1 bs=$2 count=$3 > $log 2>&1
+   local status=$?
+   egrep -v "records in|records out|bytes transferred" $log
+   rm -f $log
+   return $status
+}
+
+[ -f  "./`hostname`" ] && .  "./`hostname`"    # source in local configuration
+[ -f "../`hostname`" ] && . "../`hostname`"    # source in local configuration
diff --git a/test/stress/stress2/df.cfg b/test/stress/stress2/df.cfg
new file mode 100644 (file)
index 0000000..c3731be
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD$
+
+# Stress Test Suite Configuration
+
+# Default values
+. ./default.cfg
+###export creatVERBOSE=3       # Remove comments for test
+###export rwVERBOSE=3          # Remove comments for test
+
+# Only run these two test programs for VFS tests
+
+export TESTPROGS="testcases/creat/creat testcases/rw/rw"
diff --git a/test/stress/stress2/disk.cfg b/test/stress/stress2/disk.cfg
new file mode 100644 (file)
index 0000000..3f621a0
--- /dev/null
@@ -0,0 +1,10 @@
+# $FreeBSD$
+
+# Stress Test Suite Configuration
+
+# Default values
+. ./default.cfg
+
+export TESTPROGS="testcases/rw/rw testcases/creat/creat testcases/mkdir/mkdir"
+export rwNODELAY=1
+export rwLOAD=100
diff --git a/test/stress/stress2/doc/README b/test/stress/stress2/doc/README
new file mode 100644 (file)
index 0000000..100905e
--- /dev/null
@@ -0,0 +1,5 @@
+$FreeBSD$
+
+stress.pdf             An old (and out of date) document escribing the first
+                       generation of the test suite.
+linuxforum06.pdf       The slides from a presentation at Linux Forum 2006
diff --git a/test/stress/stress2/doc/linuxforum06.pdf b/test/stress/stress2/doc/linuxforum06.pdf
new file mode 100644 (file)
index 0000000..ab9d685
Binary files /dev/null and b/test/stress/stress2/doc/linuxforum06.pdf differ
diff --git a/test/stress/stress2/doc/stress.pdf b/test/stress/stress2/doc/stress.pdf
new file mode 100644 (file)
index 0000000..8c82924
Binary files /dev/null and b/test/stress/stress2/doc/stress.pdf differ
diff --git a/test/stress/stress2/hydra1.netperf.freebsd.org b/test/stress/stress2/hydra1.netperf.freebsd.org
new file mode 100644 (file)
index 0000000..a212dc9
--- /dev/null
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+# Configuration needed for the hydra1 test box
+
+export RUNDIR=/var/tmp/stressX
+
+export BLASTHOST=192.168.5.105 # orangutan
+
+export DISKIMAGE=/var/tmp/diskimage    # Location of 1G disk image
+export MNTPOINT=/mnt           # Disk image mount point
+export TESTUSER=test           # Name of non root test user
+export MDSTART=5               # Start of free md units
+INCARNATIONS=150
diff --git a/test/stress/stress2/hydra2.netperf.freebsd.org b/test/stress/stress2/hydra2.netperf.freebsd.org
new file mode 100644 (file)
index 0000000..ccdf18a
--- /dev/null
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+# Configuration needed for the hydra1 test box
+
+export RUNDIR=/m2/stressX
+
+export BLASTHOST=192.168.5.105 # orangutan
+
+export DISKIMAGE=/m2/tmp/diskimage     # Location of 1G disk image
+export MNTPOINT=/mnt           # Disk image mount point
+export TESTUSER=test           # Name of non root test user
+export MDSTART=5               # Start of free md units
+INCARNATIONS=125
diff --git a/test/stress/stress2/include/stress.h b/test/stress/stress2/include/stress.h
new file mode 100644 (file)
index 0000000..cf93d0c
--- /dev/null
@@ -0,0 +1,66 @@
+/*-
+ * Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _STRESS_H_
+#define _STRESS_H_
+extern int setup(int);
+extern int test(void);
+extern void cleanup(void);
+extern void options(int, char **);
+extern int random_int(int, int);
+/*extern void limits(void);*/
+
+typedef struct {
+       int argc;
+       char **argv;
+       int run_time;
+       int load;
+       char *wd;
+       char *cd;
+       int verbose;
+       int incarnations;
+       int hog;
+       int nodelay;
+       int kill;
+       int kblocks;
+       int inodes;
+} opt_t;
+
+extern opt_t *op;
+
+extern volatile int done_testing;
+extern char *home;
+extern void rmval(void);
+extern void putval(unsigned long);
+extern unsigned long getval(void);
+extern void getdf(int64_t *, int64_t *);
+extern void reservedf(int64_t, int64_t);
+extern void show_status(void);
+extern int64_t swap(void);
+extern unsigned long usermem(void);
+#endif
diff --git a/test/stress/stress2/io.cfg b/test/stress/stress2/io.cfg
new file mode 100644 (file)
index 0000000..d14b31f
--- /dev/null
@@ -0,0 +1,11 @@
+# $FreeBSD$
+
+# Stress Test Suite Configuration
+
+# Default values
+. ./default.cfg
+
+# Only run these three test programs for VFS tests
+
+export TESTPROGS="testcases/swap/swap testcases/creat/creat testcases/mkdir/mkdir testcases/rw/rw"
+export swapLOAD=10
diff --git a/test/stress/stress2/jeff.cfg b/test/stress/stress2/jeff.cfg
new file mode 100644 (file)
index 0000000..2290c7a
--- /dev/null
@@ -0,0 +1,10 @@
+# $FreeBSD$
+
+# Stress Test Suite Configuration
+
+# Default values
+. ./default.cfg
+
+# Only run these two test programs for VFS tests
+
+export TESTPROGS="testcases/creat/creat testcases/mkdir/mkdir"
diff --git a/test/stress/stress2/lib/Makefile b/test/stress/stress2/lib/Makefile
new file mode 100644 (file)
index 0000000..945dd83
--- /dev/null
@@ -0,0 +1,8 @@
+# $FreeBSD$
+
+LIB=stress
+SRCS=main.c options.c random_int.c resources.c
+
+.include "../testcases/Makefile.inc"
+
+.include <bsd.lib.mk>
diff --git a/test/stress/stress2/lib/main.c b/test/stress/stress2/lib/main.c
new file mode 100644 (file)
index 0000000..7f7fda2
--- /dev/null
@@ -0,0 +1,204 @@
+/*-
+ * Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/* Main program for all test programs */
+
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <err.h>
+#include <errno.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+
+#include "stress.h"
+
+static char const rcsid[] = "$Name:  $ $FreeBSD$";
+
+volatile int done_testing;
+static int cleanupcalled = 0;
+char *home;
+
+static pid_t *r;
+
+void
+handler(int i)
+{
+       int j;
+
+       done_testing = 1;
+       for (j = 0; j < op->incarnations; j++) {
+               if (op->verbose > 2)
+                       printf("handler: kill -HUP %d\n", r[j]);
+               if (r[j] != 0 && kill(r[j], SIGHUP) == -1)
+                       if (errno != ESRCH)
+                               warn("kill(%d, SIGHUP), %s:%d", r[j], __FILE__, __LINE__);
+       }
+       if (op->kill == 1) {
+               sleep(5);
+               /* test programs may have blocked for the SIGHUP, so try harder */
+               for (j = 0; j < op->incarnations; j++) {
+                       if (op->verbose > 2)
+                               printf("handler: kill -KILL %d\n", r[j]);
+                       if (r[j] != 0)
+                               (void) kill(r[j], SIGKILL);
+               }
+       }
+}
+
+void
+run_test_handler(int i)
+{
+
+       done_testing = 1;
+}
+
+void
+exit_handler(int i)
+{
+
+       exit(1);
+}
+
+void
+callcleanup(void)
+{
+       if (cleanupcalled == 0)
+               cleanup();
+       cleanupcalled = 1;
+}
+
+static void
+run_tests(int i)
+{
+       time_t start;
+
+       signal(SIGHUP, run_test_handler);
+       signal(SIGINT, exit_handler);
+       atexit(callcleanup);
+       setup(i);
+       if ((strcmp(getprogname(), "run") != 0) && (op->nodelay == 0))
+               sleep(random_int(1,10));
+       start = time(NULL);
+       while (done_testing == 0 &&
+                       (time(NULL) - start) < op->run_time) {
+               test();
+       }
+       callcleanup();
+       exit(EXIT_SUCCESS);
+}
+
+static void
+run_incarnations(void)
+{
+       int i;
+       int s;
+
+       signal(SIGHUP, handler);
+       for (i = 0; i < op->incarnations && done_testing == 0; i++) {
+               if ((r[i] = fork()) == 0) {
+                       run_tests(i);
+               }
+               if (r[i] < 0) {
+                       warn("fork(), %s:%d", __FILE__, __LINE__);
+                       r[i] = 0;
+                       break;
+               }
+       }
+       for (i = 0; i < op->incarnations; i++)
+               if (r[i] != 0 && waitpid(r[i], &s, 0) == -1)
+                       warn("waitpid(%d), %s:%d", r[i], __FILE__, __LINE__);
+
+       exit(EXIT_SUCCESS);
+}
+
+static int
+run_test(void)
+{
+       pid_t p;
+       time_t start;
+       int status = 0;
+
+       if (random_int(1,100) > op->load)
+               return (status);
+
+       show_status();
+
+       start = time(NULL);
+       done_testing = 0;
+       fflush(stdout);
+       rmval();
+       p = fork();
+       if (p == 0)
+               run_incarnations();
+       if (p < 0)
+               err(1, "fork() in %s:%d", __FILE__, __LINE__);
+       while (done_testing != 1 &&
+                       (time(NULL) - start) < op->run_time)
+               sleep(1);
+       if (kill(p, SIGHUP) == -1)
+               warn("kill(%d, SIGHUP), %s:%d", p, __FILE__, __LINE__);
+
+       if (waitpid(p, &status, 0) == -1)
+               err(1, "waitpid(%d), %s:%d", p, __FILE__, __LINE__);
+
+       return (status);
+}
+
+int
+main(int argc, char **argv)
+{
+       struct stat sb;
+       int status = 0;
+
+       options(argc, argv);
+
+       umask(0);
+       if (stat(op->wd, &sb) == -1) {
+               if (mkdir(op->wd, 0770) == -1)
+                       if (errno != EEXIST)
+                               err(1, "mkdir(%s) %s:%d", op->wd, __FILE__, __LINE__);
+       }
+       if (stat(op->cd, &sb) == -1) {
+               if (mkdir(op->cd, 0770) == -1)
+                       if (errno != EEXIST)
+                               err(1, "mkdir(%s) %s:%d", op->cd, __FILE__, __LINE__);
+       }
+       if ((home = getcwd(NULL, 0)) == NULL)
+               err(1, "getcwd(), %s:%d",  __FILE__, __LINE__);
+       if (chdir(op->wd) == -1)
+               err(1, "chdir(%s) %s:%d", op->wd, __FILE__, __LINE__);
+
+       r = (pid_t *)calloc(1, op->incarnations * sizeof(pid_t));
+
+       status = run_test();
+
+       return (status);
+}
diff --git a/test/stress/stress2/lib/options.c b/test/stress/stress2/lib/options.c
new file mode 100644 (file)
index 0000000..ce37227
--- /dev/null
@@ -0,0 +1,262 @@
+/*-
+ * Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sysexits.h>
+#include <string.h>
+#include <time.h>
+#include <err.h>
+
+#include "stress.h"
+
+opt_t opt;
+opt_t *op;
+
+static char path[64];
+
+static void
+usage(char *where)
+{
+       char *help;
+
+       if (where != NULL)
+               printf("Error in \"%s\"\n", where);
+       fprintf(stderr, "Usage: %s [-t | -l | -i | -d | -h | -k | -v]\n", getprogname());
+       help =  " t <number><s|m|h|d> : time to run test\n"
+               " l <pct>             : load factor 0 - 100%\n"
+               " i <number>          : max # of parallel incarnations\n"
+               " d <path>            : working directory\n"
+               " h                   : hog resources\n"
+               " k                   : terminate with SIGHUP + SIGKILL\n"
+               " n                   : no startup delay\n"
+               " v                   : verbose\n";
+       printf(help);
+       exit(EX_USAGE);
+}
+
+static int
+time2sec(const char *string)
+{
+       int r, s = 0;
+       char modifier;
+       r = sscanf(string, "%d%c", &s, &modifier);
+       if (r == 2)
+               switch(modifier) {
+               case 's': break;
+               case 'm': s = s * 60; break;
+               case 'h': s = s * 60 * 60; break;
+               case 'd': s = s * 60 * 60 * 24; break;
+               default:
+                       usage("-t");
+               }
+       else
+               usage("-t");
+       return (s);
+}
+
+static char *gete(char *name)
+{
+       char *cp;
+       char help[128];
+
+       snprintf(help, sizeof(help), "%s%s", getprogname(), name);
+       cp = getenv(help);
+       if (cp == NULL)
+               cp = getenv(name);
+       return (cp);
+}
+
+static void
+environment(void)
+{
+       char *cp;
+
+       if ((cp = gete("INCARNATIONS")) != NULL) {
+               if (sscanf(cp, "%d", &op->incarnations) != 1)
+                       usage("INCARNATIONS");
+       }
+       if ((cp = gete("LOAD")) != NULL) {
+               if (sscanf(cp, "%d", &op->load) != 1)
+                       usage("LOAD");
+       }
+       if ((cp = gete("RUNTIME")) != NULL) {
+               op->run_time = time2sec(cp);
+       }
+       if ((cp = gete("RUNDIR")) != NULL) {
+               op->wd = cp;
+       }
+       if ((cp = gete("CTRLDIR")) != NULL) {
+               op->cd = cp;
+       }
+       if ((cp = gete("HOG")) != NULL) {
+               op->hog = 1;
+       }
+       if ((cp = gete("KILL")) != NULL) {
+               op->kill = 1;
+       }
+       if ((cp = gete("NODELAY")) != NULL) {
+               op->nodelay = 1;
+       }
+       if ((cp = gete("VERBOSE")) != NULL) {
+               if (sscanf(cp, "%d", &op->verbose) != 1)
+                       usage("VERBOSE");
+       }
+       if ((cp = gete("KBLOCKS")) != NULL) {
+               if (sscanf(cp, "%d", &op->kblocks) != 1)
+                       usage("KBLOCKS");
+       }
+       if ((cp = gete("INODES")) != NULL) {
+               if (sscanf(cp, "%d", &op->inodes) != 1)
+                       usage("INODES");
+       }
+}
+
+void
+options(int argc, char **argv)
+{
+       int ch;
+
+       op = &opt;
+
+       op->run_time    = 60;
+       op->load        = 100;
+       op->wd          = "/tmp/stressX";
+       op->cd          = "/tmp/stressX.control";
+       op->incarnations        = 1;
+       op->hog         = 0;
+       op->kill        = 0;
+       op->nodelay     = 0;
+       op->verbose     = 0;
+       op->kblocks     = 0;
+       op->inodes      = 0;
+
+       environment();
+
+       while ((ch = getopt(argc, argv, "t:l:i:d:hknv")) != -1)
+               switch(ch) {
+               case 't':       /* run time */
+                       op->run_time = time2sec(optarg);
+                       break;
+               case 'l':       /* load factor in pct */
+                       if (sscanf(optarg, "%d", &op->load) != 1)
+                               usage("-l");
+                       break;
+               case 'i':       /* max incarnations */
+                       if (sscanf(optarg, "%d", &op->incarnations) != 1)
+                               usage("-i");
+                       break;
+               case 'd':       /* working directory */
+                       op->wd = strdup(optarg);
+                       break;
+               case 'h':       /* hog flag */
+                       op->hog += 1;
+                       break;
+               case 'k':       /* kill flag */
+                       op->kill = 1;
+                       break;
+               case 'n':       /* no delay flag */
+                       op->nodelay = 1;
+                       break;
+               case 'v':       /* verbose flag */
+                       op->verbose += 1;
+                       break;
+               default:
+                       usage(NULL);
+               }
+       op->argc = argc -= optind;
+       op->argv = argv += optind;
+
+       if (op->incarnations < 1)
+               op->incarnations = 1;
+       if (op->hog == 0)
+               op->incarnations = random_int(1, op->incarnations);
+       if (op->run_time < 15)
+               op->run_time = 15;
+       if (op->load < 0 || op->load > 100)
+               op->load = 100;
+}
+
+void
+show_status(void)
+{
+       char buf[80];
+       int days;
+       time_t t;
+
+       if (op->verbose > 0) {
+               t = op->run_time;
+               days = t / (60 * 60 * 24);
+               t = t % (60 * 60 * 24);
+               strftime(buf, sizeof(buf), "%T", gmtime(&t));
+               printf("%8s: run time %2d+%s, incarnations %3d, load %3d, verbose %d\n",
+                       getprogname(), days, buf, op->incarnations, op->load,
+                       op->verbose);
+       }
+}
+
+void
+rmval(void)
+{
+       if (snprintf(path, sizeof(path), "%s/%s.conf", op->cd, getprogname()) < 0)
+               err(1, "snprintf path");
+       (void) unlink(path);
+}
+
+void
+putval(unsigned long v)
+{
+       char buf[64];
+
+       rmval();
+       snprintf(buf, sizeof(buf), "%lu", v);
+       if (symlink(buf, path) < 0)
+               err(1, "symlink(%s, %s)", path, buf);
+}
+
+unsigned long
+getval(void)
+{
+       int i, n;
+       unsigned long val;
+       char buf[64];
+
+       if ((n = readlink(path, buf, sizeof(buf) -1)) < 0) {
+               for (i = 0; i < 60; i++) {
+                       sleep(1);
+                       if ((n = readlink(path, buf, sizeof(buf) -1)) > 0)
+                               break;
+               }
+               if (n < 0)
+                       err(1, "readlink(%s). %s:%d", path, __FILE__, __LINE__);
+       }
+       buf[n] = '\0';
+       if (sscanf(buf, "%ld", &val) != 1)
+               err(1, "sscanf(%s)", buf);
+       return val;
+}
diff --git a/test/stress/stress2/lib/random_int.c b/test/stress/stress2/lib/random_int.c
new file mode 100644 (file)
index 0000000..9d82782
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <stdlib.h>
+
+int
+random_int(int mi, int ma)
+{
+       return (arc4random()  % (ma - mi + 1) + mi);
+}
+
+#ifdef TEST
+#include <stdio.h>
+int
+main()
+{
+       int i, j, min, max, r;
+       min = 100;
+       max = 1;
+       for (i = 0; i < 10000; i++) {
+               j += (r = random_int(1,100));
+               if (max < r)
+                       max = r;
+               if (min > r)
+                       min = r;
+       }
+       printf("Average is %d, min = %d, max = %d\n", j / 10000, min, max);
+       return (0);
+}
+#endif
diff --git a/test/stress/stress2/lib/resources.c b/test/stress/stress2/lib/resources.c
new file mode 100644 (file)
index 0000000..c4c638c
--- /dev/null
@@ -0,0 +1,283 @@
+/*-
+ * Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/* Get various resource limits for the tests */
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <kvm.h>
+#include <vm/vm_param.h>
+#include <errno.h>
+#include <err.h>
+#include <stdarg.h>
+#include <libutil.h>
+
+#include "stress.h"
+
+static int lockfd;
+static int dffd;
+static int flags;
+static char lockpath[128];
+static char dfpath[128];
+
+static int64_t
+inodes(void)
+{
+       char path[MAXPATHLEN+1];
+       struct statfs buf;
+
+       if (op->inodes != 0)
+               return (op->inodes);
+       if (getcwd(path, sizeof(path)) == NULL)
+               err(1, "getcwd()");
+
+       if (statfs(path, &buf) < 0)
+               err(1, "statfs(%s)", path);
+       if (!strcmp(buf.f_fstypename, "msdosfs"))
+                       buf.f_ffree = 9999;
+       flags = buf.f_flags & MNT_VISFLAGMASK;
+       if (op->verbose > 2)
+               printf("Free inodes on %s (%s): %jd\n", path, buf.f_mntonname,
+                   (intmax_t)buf.f_ffree);
+       return (buf.f_ffree);
+}
+
+static int64_t
+df(void)
+{
+       char path[MAXPATHLEN+1];
+       struct statfs buf;
+
+       if (op->kblocks != 0)
+               return (op->kblocks * (uint64_t)1024);
+
+       if (getcwd(path, sizeof(path)) == NULL)
+               err(1, "getcwd()");
+
+       if (statfs(path, &buf) < 0)
+               err(1, "statfs(%s)", path);
+       if (buf.f_bavail > buf.f_blocks || buf.f_bavail < 0) {
+               warnx("Corrupt statfs(%s). f_bavail = %jd!", path,
+                   (intmax_t)buf.f_bavail);
+               buf.f_bavail = 100;
+       }
+       if (op->verbose > 2)
+               printf("Free space on %s: %jd Mb\n", path,
+                   (intmax_t)(buf.f_bavail * buf.f_bsize / 1024 / 1024));
+       return (buf.f_bavail * buf.f_bsize);
+}
+
+
+int64_t
+swap(void)
+{
+#error "please put the amount of free swap (in bytes) in sz" /* REMOVE HERE! */
+       /*
+        * Currently, DragonFly has no way of determining free swap as non-root
+        *
+        * Please remove the #error line above this comment and modify the
+        * line below it with the amount of free swap you have (in bytes).
+        */
+       int64_t sz = 1073741824; /* EDIT HERE! */
+
+       if (op->verbose > 2)
+               printf("Total free swap space %jd Mb\n",
+                   (intmax_t)(sz / 1024 / 1024));
+
+       return (sz);
+}
+
+unsigned long
+usermem(void)
+{
+       unsigned long mem;
+       size_t nlen = sizeof(mem);
+
+       if (sysctlbyname("hw.usermem", &mem, &nlen, NULL, 0) == -1)
+               err(1, "sysctlbyname() %s:%d", __FILE__, __LINE__);
+
+       if (op->verbose > 2)
+               printf("Total free user memory %lu Mb\n",
+                       mem / 1024 / 1024);
+
+       return (mem);
+}
+
+void cleanupdf()
+{
+       unlink(dfpath);
+}
+
+void
+getdf(int64_t *block, int64_t *inode)
+{
+       int i, j;
+       char buf[128];
+
+       snprintf(lockpath, sizeof(lockpath), "%s/lock", op->cd);
+       for (j = 0; j < 10; j++) {
+               for (i = 0; i < 10000; i++) {
+                       if ((lockfd = open(lockpath,
+                                       O_CREAT | O_TRUNC | O_WRONLY | O_EXCL, 0644)) != -1)
+                               break;
+                       usleep(10000); /* sleep 1/100 sec */
+               }
+               if (lockfd != -1)
+                       break;
+               fprintf(stderr, "%s. Removing stale %s\n", getprogname(), lockpath);
+               unlink(lockpath);
+       }
+       if (lockfd == -1)
+                       errx(1, "%s. Can not create %s\n", getprogname(), lockpath);
+       snprintf(dfpath, sizeof(dfpath), "%s/df", op->cd);
+       if ((dffd = open(dfpath, O_RDWR, 0644)) == -1) {
+               if ((dffd = open(dfpath,
+                               O_CREAT | O_TRUNC | O_WRONLY, 0644)) == -1) {
+                       unlink(lockpath);
+                       err(1, "creat(%s) %s:%d", dfpath, __FILE__, __LINE__);
+               }
+               atexit(cleanupdf);
+               *block = df();
+               *inode = inodes();
+               snprintf(buf, sizeof(buf), "%jd %jd", *block, *inode);
+
+               if (write(dffd, buf, strlen(buf) + 1) != strlen(buf) +1)
+                       err(1, "write df. %s:%d", __FILE__, __LINE__);
+       } else {
+               if (read(dffd, buf, sizeof(buf)) < 1) {
+                       system("ls -l /tmp/stressX.control");
+                       unlink(lockpath);
+                       err(1, "read df. %s:%d", __FILE__, __LINE__);
+               }
+               sscanf(buf, "%jd %jd", block, inode);
+       }
+       close(dffd);
+}
+
+
+void
+reservedf(int64_t blks, int64_t inos)
+{
+       char buf[128];
+       int64_t blocks, inodes;
+
+       if ((dffd = open(dfpath, O_RDWR, 0644)) == -1) {
+               warn("open(%s) %s:%d. %s", dfpath, __FILE__, __LINE__, getprogname());
+               goto err;
+       }
+       if (read(dffd, buf, sizeof(buf)) < 1) {
+               warn("read df. %s:%d", __FILE__, __LINE__);
+               goto err;
+       }
+       sscanf(buf, "%jd %jd", &blocks, &inodes);
+
+       if (op->verbose > 2)
+               printf("%-8s: reservefd(%9jdK, %6jd) out of (%9jdK, %6jd)\n",
+                               getprogname(), blks/1024, inos, blocks/1024, inodes);
+       blocks -= blks;
+       inodes -= inos;
+
+       snprintf(buf, sizeof(buf), "%jd %jd", blocks, inodes);
+       if (blocks < 0 || inodes < 0)
+               printf("******************************** %s: %s\n", getprogname(), buf);
+       if (lseek(dffd, 0, 0) == -1)
+               err(1, "lseek. %s:%d", __FILE__, __LINE__);
+       if (write(dffd, buf, strlen(buf) + 1) != strlen(buf) +1)
+               warn("write df. %s:%d", __FILE__, __LINE__);
+err:
+       close(dffd);
+       close(lockfd);
+       if (unlink(lockpath) == -1)
+               err(1, "unlink(%s)", lockpath);
+}
+
+/* The UFS2 soft update lag problem causes a lot of confusion, so for now add the err() function here */
+
+static void
+vpr(int code, const char *fmt, va_list ap)
+{
+       char path[MAXPATHLEN+1];
+       char siz[5], ino[5];
+       int64_t s, i;
+
+       s = df();
+       i = inodes();
+
+       if (errno == ENOSPC && (flags & MNT_SOFTDEP) && (flags & MNT_QUOTA) == 0 &&
+                       s > 100 && i > 100) {
+               if (getcwd(path, sizeof(path)) == NULL)
+                       err(1, "getcwd()");
+
+               humanize_number(siz, sizeof(siz), s, "",
+                       HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
+               humanize_number(ino, sizeof(ino), i, "",
+                       HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
+
+               printf("A syscall has failed with ENOSPC even though free disk "
+                       "space for %s is reported as %s and %s inodes.\n",
+                       path, siz, ino);
+       }
+
+
+       fprintf(stderr, "%s: ", getprogname());
+       if (fmt != NULL) {
+               vfprintf(stderr, fmt, ap);
+               fprintf(stderr, ": ");
+       }
+       fprintf(stderr, "%s\n", strerror(code));
+}
+
+void
+err(int eval, const char *fmt, ...)
+{
+       va_list ap;
+       int code = errno;
+
+       va_start(ap, fmt);
+       vpr(code, fmt, ap);
+       va_end(ap);
+       exit(eval);
+}
+
+void
+warn(const char *fmt, ...)
+{
+       va_list ap;
+       int code = errno;
+
+       va_start(ap, fmt);
+       vpr(code, fmt, ap);
+       va_end(ap);
+}
diff --git a/test/stress/stress2/link.cfg b/test/stress/stress2/link.cfg
new file mode 100644 (file)
index 0000000..59c1f30
--- /dev/null
@@ -0,0 +1,11 @@
+# $FreeBSD$
+
+# Stress Test Suite Configuration
+
+# Default values
+. ./default.cfg
+
+export TESTPROGS="testcases/link/link testcases/swap/swap"
+export linkHOG=1
+export linkLOAD=100
+export linkINCARNATIONS=100
diff --git a/test/stress/stress2/load.cfg b/test/stress/stress2/load.cfg
new file mode 100644 (file)
index 0000000..d4d7016
--- /dev/null
@@ -0,0 +1,18 @@
+# Just a test of the EXCLUDETESTS feature
+
+# Default values
+. ./default.cfg
+
+###export TESTPROGS=""         # Remove comments for test
+###export HOG=1                        # Remove comments for test
+
+###export LOAD=100             # Remove comments for test
+###export swapLOAD=100         # Remove comments for test
+###export rwLOAD=100           # Remove comments for test
+###export mkdirLOAD=100                # Remove comments for test
+###export creatLOAD=100                # Remove comments for test
+###export symlinkLOAD=100      # Remove comments for test
+###export swapLOAD=100         # Remove comments for test
+###export linkLOAD=100         # Remove comments for test
+
+EXCLUDETESTS="sysctl|swap|tcp|udp|syscall|mmap|socket|thr|thr1|thr2|shm|badcode"
diff --git a/test/stress/stress2/lockf.cfg b/test/stress/stress2/lockf.cfg
new file mode 100644 (file)
index 0000000..ded73ee
--- /dev/null
@@ -0,0 +1,11 @@
+# $FreeBSD$
+
+# Stress Test Suite Configuration
+
+# Default values
+. ./default.cfg
+
+export TESTPROGS="testcases/lockf2/lockf2 testcases/lockf/lockf testcases/swap/swap"
+export lockf2HOG=1
+export lockf2LOAD=100
+export lockf2INCARNATIONS=100
diff --git a/test/stress/stress2/marcus.cfg b/test/stress/stress2/marcus.cfg
new file mode 100644 (file)
index 0000000..dcd93e4
--- /dev/null
@@ -0,0 +1,25 @@
+# $FreeBSD$
+
+# Stress Test Suite Configuration
+
+# Default values
+. ./default.cfg
+
+# Test configuration for the vop_stdvptocnp implementation
+
+export LOAD=80
+export symlinkLOAD=80
+export TESTPROGS="
+testcases/lockf2/lockf2
+testcases/symlink/symlink
+testcases/openat/openat
+testcases/rw/rw
+testcases/fts/fts
+testcases/link/link
+testcases/lockf/lockf
+testcases/creat/creat
+testcases/mkdir/mkdir
+testcases/rename/rename
+testcases/swap/swap
+testcases/mkfifo/mkfifo
+"
diff --git a/test/stress/stress2/misc/README b/test/stress/stress2/misc/README
new file mode 100644 (file)
index 0000000..d87e594
--- /dev/null
@@ -0,0 +1,6 @@
+$FreeBSD$
+
+This directory contains various test scenarios. Most are regression
+tests for problems fixed.
+
+The script "all.sh" will run all the test scenarios for ever.
diff --git a/test/stress/stress2/misc/all.sh b/test/stress/stress2/misc/all.sh
new file mode 100755 (executable)
index 0000000..c8cdd96
--- /dev/null
@@ -0,0 +1,139 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Run all the scripts in stress2/misc
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+# Start of list                        Run     Known problems                                  Verified
+
+# altbufferflushes.sh          Y
+# alternativeFlushPath.sh      Y
+# backingstore.sh              Y
+# cdevsw.sh                    N
+# core.sh                      N       No problems seen
+# crossmp.sh                   Y
+# crossmp2.sh                  N       panic: sx lock still held                       20071101
+# devfs.sh                     Y
+# devfs2.sh                    Y                                                       20070503
+# fdescfs.sh                   Y
+# fpclone.sh                   N       No problem seen
+# fpclone2.sh                  N       No problem seen
+# fs.sh                                Y
+# fullpath.sh                  Y                                                       20081212
+# fuzz.sh                      N                                                       20080413
+# inversion.sh                 N       Problem not seen lately
+# isofs.sh                     Y
+# kevent.sh                    Y       panic: KN_INFLUX set when not suppose to be     20080501
+# kevent2.sh                   Y
+# kevent3.sh                   Y
+# kevent4.sh                   Y
+# kevent5.sh                   Y
+# kinfo.sh                     Y
+# kinfo2.sh                    Y
+# libMicro.sh                  Y
+# lockf.sh                     Y       Page fault in nfs_advlock                       20080413
+# lookup_shared.sh             N       The default, now
+# mac.sh                       Y
+# md.sh                                N       Waiting for fix                                 20071208
+# md2.sh                       N       Waiting for fix                                 20071208
+# mmap.sh                      N       Waiting for fix                                 20080222
+# mount.sh                     N       Known problem                                   20070505
+# mount2.sh                    Y
+# mountro.sh                   N       Waiting for commit                              20080725
+# mountro2.sh                  N       Waiting for commit                              20080725
+# mountro3.sh                  N       Waiting for commit                              20080725
+# msdos.sh                     Y
+# newfs.sh                     Y       Problem not seen lately                         20080513
+# newfs2.sh                    Y
+# newfs3.sh                    N       panic: lockmgr: locking against myself          20070505
+# newfs4.sh                    N       Livelock                                        20080725
+# nfs.sh                       Y
+# nfs2.sh                      N       panic: wrong diroffset                          20080801
+# nfs3.sh                      Y
+# nfs4.sh                      Y
+# nfs5.sh                      N       Page fault in ufs/ffs/ffs_vfsops.c:1501         20080913
+# nfs6.sh                      N       Page fault in ffs_fhtovp+0x18                   20080913
+# nfsrename.sh                 Y
+# nullfs.sh                    N       panic: xdrmbuf_create with NULL mbuf chain      20081122
+# pthread.sh                   Y       panic: spin lock held too long                  20081109
+# quota1.sh                    Y
+# quota10.sh                   N       Deadlock                                        20081212
+# quota2.sh                    Y
+# quota3.sh                    Y
+# quota4.sh                    N       Known backing store problem                     20070703
+# quota5.sh                    Y
+# quota6.sh                    N       Known problem with snapshots and no disk space
+# quota7.sh                    Y                                                       20070505
+# quota8.sh                    Y                                                       20070505
+# quota9.sh                    N                                                       20070505
+# recursiveflushes.sh          Y
+# revoke.sh                    Y
+# snap.sh                      N       Waiting for snap3.sh fix
+# snap2-1.sh                   Y
+# snap2.sh                     Y
+# snap3.sh                     N       Reported as kostik033.html
+# snap4.sh                     Y
+# snap5-1.sh                   Y
+# snap5.sh                     Y
+# snap6.sh                     Y
+# snap7.sh                     N       Waiting for snap3.sh fix                        20070508
+# snapbackup.sh                        N       WIP
+# softupdate.sh                        Y
+# statfs.sh                    Y
+# symlink.sh                   Y
+# syscall.sh                   Y
+# ucom.sh                      N
+# umount.sh                    Y
+# umountf.sh                   Y
+# umountf2.sh                  N       Waiting for commit of fix
+# umountf3.sh                  N       Deadlock. Waiting for commit of fix             20081212
+# umountf4.sh                  Y       Page fault in ufs/ufs/ufs_dirhash.c:204         20081003
+# unionfs.sh                   N       Page fault                                      20070503
+# unionfs2.sh                  N       Reported as cons224                             20070504
+# unionfs3.sh                  N       Page fault in vfs_statfs                        20070504
+
+# End of list
+
+list=`sed -n '/^# Start of list/,/^# End of list/p' < $0 | awk '$3 ~ /Y/ {print $2}'`
+[ $# -ne 0 ] && list=$*
+
+
+rm -f /tmp/misc.log
+while true; do
+#      Shuffle the list
+       list=`perl -e 'print splice(@ARGV,rand(@ARGV),1), " " while @ARGV;' $list`
+       for i in $list; do
+               ./cleanup.sh
+               echo "`date '+%Y%m%d %T'` all: $i" | tee /dev/tty >> /tmp/misc.log
+               logger "Starting test all: $i"
+               ./$i
+       done
+done
diff --git a/test/stress/stress2/misc/altbufferflushes.sh b/test/stress/stress2/misc/altbufferflushes.sh
new file mode 100755 (executable)
index 0000000..7d5c41b
--- /dev/null
@@ -0,0 +1,99 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Regression test. This script caused this panic:
+
+# panic: lockmgr: locking against myself
+# cpuid = 2
+# KDB: enter: panic
+# [thread pid 2526 tid 100070 ]
+# Stopped at      kdb_enter+0x2b: nop
+# db> bt
+# Tracing pid 2526 tid 100070 td 0xc46f8360
+# kdb_enter(c094247f) at kdb_enter+0x2b
+# panic(c09402b6,c46f8360,0,12,c06af5d9,...) at panic+0x14b
+# _lockmgr(d864a748,202122,c479f788,c46f8360,c094b01c,12d) at _lockmgr+0x41a
+# getblk(c479f6b8,5d51940,0,4000,0,...) at getblk+0x13c
+# breadn(c479f6b8,5d51940,0,4000,0,...) at breadn+0x2f
+# bread(c479f6b8,5d51940,0,4000,0,e6d13544,c4743eac,0,c095a185,56d) at bread+0x20
+# ffs_alloccg(c47408c4,104,1754628,0,4000,c4743eac,1,c095a185,4d8) at ffs_alloccg+0x11d
+# ffs_hashalloc(c47408c4,104,1754628,0,4000,...) at ffs_hashalloc+0x45
+# ffs_alloc(c47408c4,3f2cd,0,1754628,0,4000,c42fd400,e6d13674) at ffs_alloc+0x1a5
+# ffs_balloc_ufs2(c4735d70,fcb34000,0,4000,c42fd400,...) at ffs_balloc_ufs2+0x1619
+# ffs_copyonwrite(c479f6b8,d84e3d08) at ffs_copyonwrite+0x3d3
+# ffs_geom_strategy(c479f7c0,d84e3d08) at ffs_geom_strategy+0xbd
+# bufwrite(d84e3d08,4000,d84e3d08,e6d137e4,c070b7a9,...) at bufwrite+0x17a
+# ffs_bufwrite(d84e3d08) at ffs_bufwrite+0x282
+# vfs_bio_awrite(d84e3d08) at vfs_bio_awrite+0x235
+# bdwrite(d864a6e8,c4743eac,0,c095a185,57c,...) at bdwrite+0x237
+# ffs_alloccg(c4b54a50,104,1754628,0,4000,c4743eac,1,c095a185,4d8) at ffs_alloccg+0x1f6
+# ffs_hashalloc(c4b54a50,104,1754628,0,4000,...) at ffs_hashalloc+0x45
+# ffs_alloc(c4b54a50,1b00c,0,1754628,0,4000,c4b22a80,e6d139ac) at ffs_alloc+0x1a5
+# ffs_balloc_ufs2(c4e72158,6c030000,0,4000,c4b22a80,...) at ffs_balloc_ufs2+0x1619
+# ffs_write(e6d13b98) at ffs_write+0x2ac
+# VOP_WRITE_APV(c0a00e80,e6d13b98) at VOP_WRITE_APV+0x132
+# vn_write(c46c65a0,e6d13c60,c4b22a80,0,c46f8360) at vn_write+0x1f6
+# dofilewrite(c46f8360,4,c46c65a0,e6d13c60,ffffffff,...) at dofilewrite+0x77
+# kern_writev(c46f8360,4,e6d13c60,8430000,d0000,...) at kern_writev+0x36
+# write(c46f8360,e6d13d00) at write+0x45
+# syscall(e6d13d38) at syscall+0x256
+
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+persist () {
+       false
+       while [ $? -ne 0 ]; do
+               $1 > /dev/null 2>&1
+               sleep 1
+       done
+}
+
+diskfree=`df -k /var/tmp | tail -1 | awk '{print $4}'`
+[ $((diskfree / 1024 / 1024)) -lt 5 ] && echo "Not enough disk space" && exit 1
+
+rm -f /var/.snap/pho /var/tmp/big.?
+trap "rm -f /var/.snap/pho /var/tmp/big.?" 0
+persist 'mksnap_ffs /var /var/.snap/pho'
+sysctl vfs.dirtybufthresh=10 > /dev/null 2>&1
+
+cd /var/tmp
+for j in `jot 10`; do
+       old=`sysctl  vfs.altbufferflushes | awk '{print $NF}'`
+       for i in `jot 4`; do
+               echo "`date '+%T'` Create big.$i"
+               dd if=/dev/zero of=big.$i bs=1m count=4k 2>&1 | egrep -v "records|transferred"
+       done
+       sleep 1
+       rm -rf /var/tmp/big.?
+       new=`sysctl  vfs.altbufferflushes | awk '{print $NF}'`
+       [ $new -ne $old ] && echo "vfs.altbufferflushes changed from $old to $new."
+done
+rm -f /var/.snap/pho
diff --git a/test/stress/stress2/misc/alternativeFlushPath.sh b/test/stress/stress2/misc/alternativeFlushPath.sh
new file mode 100755 (executable)
index 0000000..444c5d4
--- /dev/null
@@ -0,0 +1,108 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Alternate buffer flush path test (Not verified)
+# Apply this patch to amplyfy the problem:
+#
+# diff -r1.520 vfs_bio.c
+# 894c894
+# <       if (bo->bo_dirty.bv_cnt > dirtybufthresh + 10) {
+# ---
+# >       if (bo->bo_dirty.bv_cnt > dirtybufthresh /*+ 10*/) {
+
+odir=`pwd`
+dir=/var/tmp/alternativeFlushPath
+
+find $dir -type f | xargs rm
+[ ! -d $dir ] && mkdir -p $dir
+cd $dir
+sed '1,/^EOF/d' < $odir/$0 > $dir/alternativeFlushPath.c
+cc -o alternativeFlushPath -Wall alternativeFlushPath.c -lthr
+rm -f alternativeFlushPath.c
+
+for j in `jot 10`; do
+   ./alternativeFlushPath&
+done
+for j in `jot 20`; do
+   wait
+done
+sysctl -a | grep dirtybuf
+
+rm alternativeFlushPath
+
+exit
+
+EOF
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <err.h>
+
+int
+main()
+{
+        char name[80];
+        int i, j, k;
+        pid_t mypid;
+        int *fd;
+        struct rlimit rlp;
+
+
+        if (getrlimit(RLIMIT_NOFILE, &rlp) == -1)
+                err(1, "getrlimit(RLIMIT_NOFILE)");
+       rlp.rlim_cur /= 10;
+        mypid = getpid();
+        fd = malloc(rlp.rlim_cur * sizeof(int));
+
+       for (k = 0; k < 100; k++) {
+        for (i = 0, j = 0; i < (rlp.rlim_cur - 10); i++, j++) {
+                sprintf(name, "f%05d.%05d", mypid, i);
+                if ((fd[i] = open(name, O_CREAT|O_WRONLY, 0666)) == -1) {
+                        warn("open(%s)", name);
+                        break;
+                }
+        }
+        for (i = 0; i < j; i++) {
+                sprintf(name, "f%05d.%05d", mypid, i);
+                if (unlink(name) == -1)
+                        warn("unlink(%s)", name);
+        }
+        for (i = 0; i < j; i++) {
+                if (close(fd[i]) == -1)
+                        warn("close(%d)", i);
+        }
+       }
+
+        exit(0);
+}
diff --git a/test/stress/stress2/misc/backingstore.sh b/test/stress/stress2/misc/backingstore.sh
new file mode 100755 (executable)
index 0000000..493a3f3
--- /dev/null
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test sparse backing store
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+D=$diskimage
+export here=`pwd`
+
+m=$mdstart
+
+mount | grep "${mntpoint}" | grep -q md$m && umount ${mntpoint}$m
+mdconfig -l | grep -q md$m &&  mdconfig -d -u $m
+
+dede $D$m 100m 1 || exit 1
+
+mdconfig -a -t vnode -f $D$m -u $m
+
+bsdlabel -w md$m auto
+newfs md${m}${part} > /dev/null 2>&1
+mount $opt /dev/md${m}${part} ${mntpoint}$m
+
+n=$m
+m=$((m + 1))
+
+mount | grep "${mntpoint}" | grep -q md$m && umount ${mntpoint}$m
+mdconfig -l | grep -q md$m &&  mdconfig -d -u $m
+
+truncate -s 500M ${mntpoint}$n/diskimage
+mdconfig -a -t vnode -f ${mntpoint}$n/diskimage -u $m
+
+bsdlabel -w md$m auto
+newfs md${m}${part} > /dev/null 2>&1
+mount $opt /dev/md${m}${part} ${mntpoint}$m
+
+export RUNDIR=${mntpoint}$m/stressX
+../testcases/rw/rw -t 5m -i 200 -h -n
+
+while mount | grep -q ${mntpoint}$m; do
+       flag=$([ $((`date '+%s'` % 2)) -eq 0 ] && echo "-f" || echo "")
+       umount $flag ${mntpoint}$m > /dev/null 2>&1
+done
+mdconfig -l | grep -q md$m &&  mdconfig -d -u $m
+
+m=$((m - 1))
+while mount | grep -q ${mntpoint}$m; do
+       umount $([ $((`date '+%s'` % 2)) -eq 0 ] && \
+               echo "-f" || echo "") ${mntpoint}$m > /dev/null 2>&1
+done
+mdconfig -l | grep -q md$m &&  mdconfig -d -u $m
+rm -f $D
diff --git a/test/stress/stress2/misc/backingstore2.sh b/test/stress/stress2/misc/backingstore2.sh
new file mode 100755 (executable)
index 0000000..fbc2684
--- /dev/null
@@ -0,0 +1,73 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test unmount of a device that is already gone
+
+# Leaves /mnt6 unmountable and leads to a "panic: 1 vncache entries remaining"
+# during shut down.
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+D=$diskimage
+export here=`pwd`
+
+m1=$mdstart
+m2=$((m1 + 1))
+mount | grep "${mntpoint}" | grep -q md$m2 && umount ${mntpoint}$m2
+mdconfig -l | grep -q md$m2 &&  mdconfig -d -u $m2
+mount | grep "${mntpoint}" | grep -q md$m1 && umount ${mntpoint}$m1
+mdconfig -l | grep -q md$m1 &&  mdconfig -d -u $m1
+
+dede $D$m1 100m 1 || exit 1
+
+mdconfig -a -t vnode -f $D$m1 -u $m1
+
+bsdlabel -w md$m1 auto
+newfs md${m1}${part} > /dev/null 2>&1
+mount /dev/md${m1}${part} ${mntpoint}$m1
+
+
+truncate -s 500M ${mntpoint}$m1/diskimage
+mdconfig -a -t vnode -f ${mntpoint}$m1/diskimage -u $m2
+
+bsdlabel -w md$m2 auto
+newfs md${m2}${part} > /dev/null 2>&1
+mount /dev/md${m2}${part} ${mntpoint}$m2
+
+# Reversed umount sequence:
+umount -f /dev/md${m1}${part}
+umount -f /dev/md${m2}${part}
+
+mount | grep "${mntpoint}" | grep -q md$m2 && umount ${mntpoint}$m2
+mdconfig -l | grep -q md$m2 &&  mdconfig -d -u $m2
+mount | grep "${mntpoint}" | grep -q md$m1 && umount ${mntpoint}$m1
+mdconfig -l | grep -q md$m1 &&  mdconfig -d -u $m1
diff --git a/test/stress/stress2/misc/backingstore3.sh b/test/stress/stress2/misc/backingstore3.sh
new file mode 100755 (executable)
index 0000000..d65c1ea
--- /dev/null
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test unmount of a device that is already gone
+
+# Caused "panic: bundirty: buffer 0xdafaf2c4 still on queue 1"
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+D=$diskimage
+export here=`pwd`
+
+m1=$mdstart
+m2=$((m1 + 1))
+mount | grep "${mntpoint}" | grep -q md$m2 && umount ${mntpoint}$m2
+mdconfig -l | grep -q md$m2 &&  mdconfig -d -u $m2
+mount | grep "${mntpoint}" | grep -q md$m1 && umount ${mntpoint}$m1
+mdconfig -l | grep -q md$m1 &&  mdconfig -d -u $m1
+
+dede $D$m1 25m 1 || exit 1
+
+mdconfig -a -t vnode -f $D$m1 -u $m1
+
+bsdlabel -w md$m1 auto
+newfs md${m1}${part} > /dev/null 2>&1
+mount /dev/md${m1}${part} ${mntpoint}$m1
+
+
+truncate -s 500M ${mntpoint}$m1/diskimage
+mdconfig -a -t vnode -f ${mntpoint}$m1/diskimage -u $m2
+
+bsdlabel -w md$m2 auto
+newfs md${m2}${part} > /dev/null 2>&1
+mount /dev/md${m2}${part} ${mntpoint}$m2
+
+dd if=/dev/zero of=${mntpoint}$m2/file bs=1m > /dev/null 2>&1
+
+# Reversed umount sequence:
+umount -f /dev/md${m1}${part}
+umount -f /dev/md${m2}${part}
+
+mount | grep "${mntpoint}" | grep -q md$m2 && umount ${mntpoint}$m2
+mdconfig -l | grep -q md$m2 &&  mdconfig -d -u $m2
+mount | grep "${mntpoint}" | grep -q md$m1 && umount ${mntpoint}$m1
+mdconfig -l | grep -q md$m1 &&  mdconfig -d -u $m1
diff --git a/test/stress/stress2/misc/cdevsw.sh b/test/stress/stress2/misc/cdevsw.sh
new file mode 100755 (executable)
index 0000000..b300daa
--- /dev/null
@@ -0,0 +1,220 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test scenario by kib@freebsd.org
+
+# Test of patch for Giant trick in cdevsw
+
+exit   # Test moved to fpclone*.sh
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+odir=`pwd`
+dir=$RUNDIR/tclone
+[ ! -d $dir ] && mkdir -p $dir
+
+cd $dir
+cat > Makefile <<EOF
+KMOD= tclone
+SRCS= tclone.c
+
+.include <bsd.kmod.mk>
+EOF
+
+sed '1,/^EOF2/d' < $odir/$0 > tclone.c
+make
+kldload $dir/tclone.ko
+
+cd $odir
+dd if=/dev/tclone bs=1m count=5k > /dev/null 2>&1 &
+
+export runRUNTIME=2m
+cd /home/pho/stress2; ./run.sh pty.cfg
+
+kldstat
+kldunload $dir/tclone.ko
+rm -rf $dir
+exit
+
+EOF2
+/* $FreeBSD$ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/conf.h>
+#include <sys/uio.h>
+#include <sys/malloc.h>
+
+static d_open_t                tclone_open;
+static d_close_t       tclone_close;
+static d_read_t                tclone_read;
+
+static struct cdevsw tclone_cdevsw = {
+       .d_open =       tclone_open,
+       .d_close =      tclone_close,
+       .d_read =       tclone_read,
+       .d_name =       "tclone",
+       .d_version =    D_VERSION,
+       .d_flags =      D_TRACKCLOSE|D_NEEDGIANT
+};
+
+static eventhandler_tag tclone_ehtag;
+static struct clonedevs *tclone_clones;
+
+MALLOC_DEFINE(M_TCLONESC, "tclone memory", "tclone memory");
+
+struct tclone_sc
+{
+       int pos;
+};
+
+static void
+tclone_clone(void *arg, struct ucred *cred,
+            char *name, int namelen, struct cdev **dev)
+{
+       int i, clone;
+
+       if (*dev != NULL)
+               return;
+       if (strcmp(name, "tclone") != 0)
+               return;
+
+       clone = 0;
+       do {
+               i = clone_create(&tclone_clones, &tclone_cdevsw,
+                                &clone, dev, 0);
+               if (i == 0)
+                       clone++;
+       } while ((clone <= CLONE_UNITMASK) && (i == 0));
+
+       if ((i != 0) && (clone <= CLONE_UNITMASK)) {
+               *dev = make_dev_credf(MAKEDEV_REF,
+                   &tclone_cdevsw, unit2minor(clone),
+                   cred, UID_ROOT, GID_WHEEL, 0666,
+                   "tclone.%u", clone);
+               if (*dev != NULL) {
+                       (*dev)->si_flags |= SI_CHEAPCLONE;
+                       (*dev)->si_drv1 = (void *)1;
+               }
+       }
+}
+
+static int
+tclone_open(struct cdev *dev, int oflags, int devtype, d_thread_t *td)
+{
+       int status;
+
+       if (!dev->si_drv2) {
+               /* only allow one open() of this file */
+               dev->si_drv2 = malloc(sizeof(struct tclone_sc), M_TCLONESC,
+                   M_WAITOK | M_ZERO);
+               status = 0;
+       } else
+               status = EBUSY;
+
+       if (status == 0) {
+               /* XXX Fix me? (clear of SI_CHEAPCLONE) */
+               dev->si_flags &= ~SI_CHEAPCLONE;
+       }
+
+       return (status);
+}
+
+static int
+tclone_close(struct cdev *dev, int fflag, int devtype, d_thread_t *td)
+{
+       void *x;
+
+       x = dev->si_drv2;
+       dev->si_drv2 = &tclone_cdevsw;
+       if (x != &tclone_cdevsw)
+               free(x, M_TCLONESC);
+       destroy_dev_sched(dev);
+       return (0);
+}
+
+static char rdata[] = "tclone sample data string\n";
+
+static int
+tclone_read(struct cdev *dev, struct uio *uio, int ioflag)
+{
+       struct tclone_sc *sc;
+       int rv, amnt;
+
+       sc = dev->si_drv2;
+       rv = 0;
+       while (uio->uio_resid > 0) {
+               amnt = MIN(uio->uio_resid, sizeof(rdata) - sc->pos);
+               rv = uiomove(rdata + sc->pos, amnt, uio);
+               if (rv != 0)
+                       break;
+               sc->pos += amnt;
+               sc->pos %= sizeof(rdata);
+       }
+       return (rv);
+}
+
+static int
+tclone_modevent(module_t mod, int what, void *arg)
+{
+       switch (what) {
+        case MOD_LOAD:
+               clone_setup(&tclone_clones);
+               tclone_ehtag = EVENTHANDLER_REGISTER(dev_clone,
+                                                    tclone_clone, 0, 0);
+               if (tclone_ehtag == NULL)
+                       return ENOMEM;
+               return(0);
+
+        case MOD_UNLOAD:
+               EVENTHANDLER_DEREGISTER(dev_clone, tclone_ehtag);
+               drain_dev_clone_events();
+               clone_cleanup(&tclone_clones);
+               destroy_dev_drain(&tclone_cdevsw);
+               return (0);
+        default:
+               break;
+       }
+
+       return (0);
+}
+
+moduledata_t tclone_mdata = {
+       "tclone",
+       tclone_modevent,
+       NULL
+};
+
+DECLARE_MODULE(tclone, tclone_mdata, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
+MODULE_VERSION(tclone, 1);
diff --git a/test/stress/stress2/misc/cleanup.sh b/test/stress/stress2/misc/cleanup.sh
new file mode 100755 (executable)
index 0000000..66858d4
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+[ ! -z "$mntpoint" ] && rm -rf ${mntpoint}*/*
+rm -f /tmp/.snap/pho* /var/.snap/pho*
+rm -rf /tmp/stressX.control
+
+mount | grep -wq $mntpoint && umount $mntpoint
+m=$mdstart
+for i in `jot 15`; do
+   while mount | grep -q ${mntpoint}$m; do
+      rm -rf ${mntpoint}$m
+      umount -f ${mntpoint}$m > /dev/null 2>&1
+   done
+   mdconfig -l | grep -q md$m &&  mdconfig -d -u $m
+   m=$((m + 1))
+done
diff --git a/test/stress/stress2/misc/core.sh b/test/stress/stress2/misc/core.sh
new file mode 100755 (executable)
index 0000000..87af822
--- /dev/null
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test multiple (parallel) core dumps
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+rm -f core
+sed '1,/^EOF/d' < $odir/$0 > core.c
+cc -o core -Wall core.c
+rm -f core.c
+cd $RUNDIR
+
+for i in `jot 2`; do
+       for j in `jot 4`; do
+               /tmp/core &
+       done
+       for j in `jot 4`; do
+               wait
+       done
+done
+rm -f core
+exit
+EOF
+#include <string.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <err.h>
+
+#define SIZ 10*1024*1024
+
+int
+main(int argc, char **argv)
+{
+       char *cp = 0;
+
+       if ((cp = malloc(SIZ)) == NULL)
+               err(1, "Could not malloc 10Mb!");
+
+       memset(cp, 1, SIZ);
+
+//     printf("sleep %d\n", (120 - (time(NULL) % 120))); fflush(stdout);
+       sleep(120 - (time(NULL) % 120));
+       raise(SIGSEGV);
+//     printf(".\n");
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/crossmp.sh b/test/stress/stress2/misc/crossmp.sh
new file mode 100755 (executable)
index 0000000..d5bc951
--- /dev/null
@@ -0,0 +1,88 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Copy of crossmp.sh, but with SU enabled.
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+mounts=15              # Number of parallel scripts
+mdstart=$mdstart       # Use md unit numbers from this point
+D=$diskimage
+
+if [ $# -eq 0 ]; then
+       for i in `jot $mounts`; do
+               m=$(( i + mdstart - 1 ))
+               [ ! -d ${mntpoint}$m ] && mkdir ${mntpoint}$m
+               mount | grep "$mntpoint" | grep -q md$m && umount ${mntpoint}$m
+               mdconfig -l | grep -q md$m &&  mdconfig -d -u $m
+
+               dede $D$m 1m 1
+               mdconfig -a -t vnode -f $D$m -u $m
+               bsdlabel -w md$m auto
+               newfs md${m}${part} > /dev/null 2>&1
+       done
+
+       # start the parallel tests
+       for i in `jot $mounts`; do
+               m=$(( i + mdstart - 1 ))
+               ./$0 $m &
+               ./$0 find &
+       done
+
+       for i in `jot $mounts`; do
+               wait; wait
+       done
+
+       for i in `jot $mounts`; do
+               m=$(( i + mdstart - 1 ))
+               mdconfig -d -u $m
+               rm -f $D$m
+       done
+
+else
+       if [ $1 = find ]; then
+               for i in `jot 1024`; do
+                       find ${mntpoint}* -type f > /dev/null 2>&1
+               done
+       else
+
+               # The test: Parallel mount and unmounts
+               for i in `jot 1024`; do
+                       m=$1
+                       mount /dev/md${m}${part} ${mntpoint}$m
+                       while mount | grep -qw $mntpoint$m; do
+                               opt=$([ $((`date '+%s'` % 2)) -eq 0 ] && echo "-f")
+                               umount $opt ${mntpoint}$m > /dev/null 2>&1
+                       done
+               done
+       fi
+fi
diff --git a/test/stress/stress2/misc/crossmp2.sh b/test/stress/stress2/misc/crossmp2.sh
new file mode 100755 (executable)
index 0000000..961c6d6
--- /dev/null
@@ -0,0 +1,76 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Panic in getdirentries+0x21a
+# Run with stress: disk.cfg
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+mounts=10      # Number of parallel scripts
+
+if [ $# -eq 0 ]; then
+       for i in `jot $mounts`; do
+               [ ! -d ${mntpoint}$i ] && mkdir ${mntpoint}$i
+               mount | grep -qw "${mntpoint}$i" && umount ${mntpoint}$i
+       done
+
+       # start the parallel tests
+       for i in `jot $mounts`; do
+               ./$0 $i &
+               ./$0 find &
+       done
+
+       for i in `jot $mounts`; do
+               wait; wait
+       done
+else
+       if [ $1 = find ]; then
+               for i in `jot 64`; do
+                       find ${mntpoint}* -maxdepth 1 -type f > /dev/null 2>&1
+               done
+       else
+
+               # The test: Parallel mount and unmounts
+               for i in `jot 64`; do
+                       m=$1
+                       mount -t nfs -o tcp -o nfsv3 -o retrycnt=3 -o intr -o soft -o rw 127.0.0.1:/tmp ${mntpoint}$m
+                       opt=`[ $(( m % 2 )) -eq 0 ] && echo -f`
+                       n=0
+                       while mount | grep -qw ${mntpoint}$m; do
+                               umount $opt ${mntpoint}$m > /dev/null 2>&1
+                               n=$((n + 1))
+                               [ $n -gt 99 ] && umount -f ${mntpoint}$m > /dev/null 2>&1
+                               [ $n -gt 100 ] && exit
+                       done
+               done
+       fi
+fi
diff --git a/test/stress/stress2/misc/datamove.sh b/test/stress/stress2/misc/datamove.sh
new file mode 100755 (executable)
index 0000000..da2fb20
--- /dev/null
@@ -0,0 +1,208 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# There is a well-known problem in FreeBSD, caused by allowing page faults
+# while doing filesystem data move to or from userspace during read(2) and
+# write(2). The issue is that if the userspace address being read or write
+# from/to is backed by the mapping of the same file we are doing i/o to,
+# we deadlock.
+
+# Test scenario by ups
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+here=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $here/$0 > dl.c
+cc -o dl -Wall dl.c
+rm -f dl.c
+
+n=5
+old=`sysctl vm.old_msync | awk '{print $NF}'`
+sysctl vm.old_msync=1
+for i in `jot $n`; do
+       mkdir -p /tmp/dl.dir.$i
+       cd /tmp/dl.dir.$i
+       /tmp/dl &
+done
+cd /tmp
+for i in `jot $n`; do
+       wait
+done
+for i in `jot $n`; do
+       rm -rf /tmp/dl.dir.$i
+done
+sysctl vm.old_msync=$old
+
+rm -rf /tmp/dl
+exit 0
+EOF
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+
+
+int prepareFile(char* filename,int* fdp);
+int mapBuffer(char** bufferp,int fd1,int fd2);
+int startIO(int fd,char *buffer);
+
+int pagesize;
+
+#define FILESIZE (32*1024)
+char wbuffer[FILESIZE];
+
+/* Create a FILESIZE sized file - then remove file data from the cache*/
+int prepareFile(char* filename,int* fdp)
+{
+  int fd;
+  int len;
+  int status;
+  void *addr;
+
+  fd = open(filename,O_CREAT | O_TRUNC | O_RDWR,S_IRWXU);
+  if (fd == -1)
+    {
+      perror("Creating file");
+      return fd;
+    }
+
+  len = write(fd,wbuffer,FILESIZE);
+  if (len < 0)
+    {
+      perror("Write failed");
+      return 1;
+    }
+
+  status = fsync(fd);
+   if (status != 0)
+    {
+        perror("fsync failed");
+       return 1;
+    }
+
+  addr = mmap(NULL,FILESIZE, PROT_READ | PROT_WRITE , MAP_SHARED, fd, 0);
+  if (addr == MAP_FAILED)
+    {
+      perror("Mmap failed");
+      return 1;
+    }
+
+  status = msync(addr,FILESIZE,MS_INVALIDATE | MS_SYNC);
+  if (status != 0)
+    {
+        perror("Msync failed");
+       return 1;
+    }
+
+  munmap(addr,FILESIZE);
+
+  *fdp = fd;
+  return 0;
+}
+
+
+/* mmap a 2 page buffer - first page is from fd1, second page from fd2 */
+int mapBuffer(char** bufferp,int fd1,int fd2)
+{
+  void* addr;
+  char *buffer;
+
+  addr = mmap(NULL,pagesize*2, PROT_READ | PROT_WRITE , MAP_SHARED, fd1, 0);
+  if (addr == MAP_FAILED)
+    {
+      perror("Mmap failed");
+      return 1;
+    }
+
+  buffer = addr;
+  addr = mmap(buffer + pagesize,pagesize, PROT_READ | PROT_WRITE , MAP_FIXED |
+MAP_SHARED, fd2, 0);
+
+  if (addr == MAP_FAILED)
+    {
+      perror("Mmap2 failed");
+      return 1;
+    }
+  *bufferp = buffer;
+  return 0;
+}
+
+
+int startIO(int fd,char *buffer)
+{
+  ssize_t len;
+  len = write(fd,buffer,2*pagesize);
+  if (len == -1)
+    {
+      perror("write failed");
+      return 1;
+    }
+  return 0;
+}
+
+
+int main(int argc,char *argv[],char *envp[])
+{
+
+  int fdA,fdB,fdDelayA,fdDelayB;
+  int status;
+  char *bufferA,*bufferB;
+  pid_t pid;
+
+  pagesize = getpagesize();
+
+  if ((prepareFile("A",&fdA))
+      || (prepareFile("B",&fdB))
+      || (prepareFile("DelayA",&fdDelayA))
+      || (prepareFile("DelayB",&fdDelayB))
+      || (mapBuffer(&bufferA,fdDelayA,fdB))
+      || (mapBuffer(&bufferB,fdDelayB,fdA)))
+    exit(1);
+
+  pid = fork();
+
+  if (pid == 0)
+    {
+      status = startIO(fdA,bufferA);
+      exit(status);
+    }
+
+  if (pid == -1)
+    {
+      exit(1);
+    }
+  status = startIO(fdB,bufferB);
+  exit(status);
+
+}
diff --git a/test/stress/stress2/misc/datamove2.sh b/test/stress/stress2/misc/datamove2.sh
new file mode 100755 (executable)
index 0000000..ad321cc
--- /dev/null
@@ -0,0 +1,210 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Variation of the datamove.sh scenario by not using "sysctl vm.old_msync=1"
+
+# Deadlock seen
+
+# Test scenario by ups
+
+here=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $here/$0 > dl.c
+cc -o dl -Wall dl.c
+rm -f dl.c
+
+for i in `jot 3`; do
+       $here/../testcases/swap/swap -t 10m -i 200 -h &
+       /tmp/dl
+       ps | grep swap | grep -v swap | awk '{print $1}' | xargs kill
+done
+rm -rf /tmp/dl
+exit 0
+EOF
+#include <err.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+
+int    prepareFile(char *filename, int *fdp);
+int    mapBuffer  (char **bufferp, int fd1, int fd2);
+int    startIO    (int fd, char *buffer);
+
+int    pagesize;
+
+#define FILESIZE (32*1024)
+char   wbuffer   [FILESIZE];
+
+/* Create a FILESIZE sized file - then remove file data from the cache */
+int
+prepareFile(char *filename, int *fdp)
+{
+       int     fd;
+       int     len;
+       int     status;
+       void    *addr;
+
+       fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, S_IRWXU);
+       if (fd == -1) {
+               perror("Creating file");
+               return fd;
+       }
+       len = write(fd, wbuffer, FILESIZE);
+       if (len < 0) {
+               perror("Write failed");
+               return 1;
+       }
+       status = fsync(fd);
+       if (status != 0) {
+               perror("fsync failed");
+               return 1;
+       }
+       addr = mmap(NULL, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+       if (addr == MAP_FAILED) {
+               perror("Mmap failed");
+               return 1;
+       }
+       status = msync(addr, FILESIZE, MS_INVALIDATE | MS_SYNC);
+       if (status != 0) {
+               perror("Msync failed");
+               return 1;
+       }
+       if (munmap(addr, FILESIZE) == -1) {
+               perror("munmap failed");
+               return 1;
+       }
+
+       *fdp = fd;
+       return 0;
+}
+
+
+/* mmap a 2 page buffer - first page is from fd1, second page from fd2 */
+int
+mapBuffer(char **bufferp, int fd1, int fd2)
+{
+       void *addr;
+       char *buffer;
+
+       addr = mmap(NULL, pagesize * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd1, 0);
+       if (addr == MAP_FAILED) {
+               perror("Mmap failed");
+               return 1;
+       }
+       buffer = addr;
+       addr = mmap(buffer + pagesize, pagesize, PROT_READ | PROT_WRITE, MAP_FIXED |
+                   MAP_SHARED, fd2, 0);
+
+       if (addr == MAP_FAILED) {
+               perror("Mmap2 failed");
+               return 1;
+       }
+       *bufferp = buffer;
+       return 0;
+}
+
+void
+unmapBuffer(char *bufferp)
+{
+       if (munmap(bufferp, pagesize * 2) == -1)
+               err(1, "unmap 1. buffer");
+       if (munmap(bufferp + pagesize * 2, pagesize * 2) == -1)
+               err(1, "unmap 2. buffer");
+}
+
+int
+startIO(int fd, char *buffer)
+{
+       ssize_t len;
+
+       len = write(fd, buffer, 2 * pagesize);
+       if (len == -1) {
+               perror("write failed");
+               return 1;
+       }
+       return 0;
+}
+
+
+int
+main(int argc, char *argv[], char *envp[])
+{
+
+       int     fdA, fdB, fdDelayA, fdDelayB;
+       int     status;
+       int     i;
+       char    *bufferA, *bufferB;
+       pid_t   pid;
+
+       pagesize = getpagesize();
+
+       for (i = 0; i < 1000; i++) {
+               if ((prepareFile("A", &fdA))
+                   || (prepareFile("B", &fdB))
+                   || (prepareFile("DelayA", &fdDelayA))
+                   || (prepareFile("DelayB", &fdDelayB))
+                   || (mapBuffer(&bufferA, fdDelayA, fdB))
+                   || (mapBuffer(&bufferB, fdDelayB, fdA)))
+                       exit(1);
+
+               pid = fork();
+
+               if (pid == 0) {
+                       status = startIO(fdA, bufferA);
+                       exit(status);
+               }
+               if (pid == -1) {
+                       perror("fork");
+                       exit(1);
+               }
+               status = startIO(fdB, bufferB);
+               if (wait(&status) == -1)
+                       err(1, "wait");
+
+               close(fdA);
+               close(fdB);
+               close(fdDelayA);
+               close(fdDelayB);
+               unmapBuffer(bufferA);
+               unmapBuffer(bufferB);
+               unlink("A");
+               unlink("B");
+               unlink("DelayA");
+               unlink("DelayB");
+       }
+       exit(status);
+
+}
diff --git a/test/stress/stress2/misc/datamove3.sh b/test/stress/stress2/misc/datamove3.sh
new file mode 100755 (executable)
index 0000000..0afb42d
--- /dev/null
@@ -0,0 +1,219 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Threaded variation of datamove.sh
+
+# Based on a test scenario by ups and suggestions by kib
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+here=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $here/$0 > dl.c
+cc -o dl -Wall dl.c -lpthread
+rm -f dl.c
+
+n=5
+old=`sysctl vm.old_msync | awk '{print $NF}'`
+sysctl vm.old_msync=1
+for i in `jot $n`; do
+       mkdir -p /tmp/dl.dir.$i
+       cd /tmp/dl.dir.$i
+       /tmp/dl &
+done
+cd /tmp
+for i in `jot $n`; do
+       wait
+done
+for i in `jot $n`; do
+       rm -rf /tmp/dl.dir.$i
+done
+sysctl vm.old_msync=$old
+
+rm -rf /tmp/dl
+exit 0
+EOF
+#include <err.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+struct args {
+       char *bp;
+       int fd1;
+       int fd2;
+} a[2];
+
+int prepareFile(char *, int *);
+void * mapBuffer(void *);
+int startIO(int, char *);
+
+int pagesize;
+
+#define FILESIZE (32*1024)
+char wbuffer   [FILESIZE];
+
+/* Create a FILESIZE sized file - then remove file data from the cache */
+int
+prepareFile(char *filename, int *fdp)
+{
+       int fd;
+       int len;
+       int status;
+       void *addr;
+
+       fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, S_IRWXU);
+       if (fd == -1) {
+               perror("Creating file");
+               return fd;
+       }
+       len = write(fd, wbuffer, FILESIZE);
+       if (len < 0) {
+               perror("Write failed");
+               return 1;
+       }
+       status = fsync(fd);
+       if (status != 0) {
+               perror("fsync failed");
+               return 1;
+       }
+       addr = mmap(NULL, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+       if (addr == MAP_FAILED) {
+               perror("Mmap failed");
+               return 1;
+       }
+       status = msync(addr, FILESIZE, MS_INVALIDATE | MS_SYNC);
+       if (status != 0) {
+               perror("Msync failed");
+               return 1;
+       }
+       munmap(addr, FILESIZE);
+
+       *fdp = fd;
+       return 0;
+}
+
+
+/* mmap a 2 page buffer - first page is from fd1, second page from fd2 */
+void *
+mapBuffer(void *ar)
+{
+       void *addr;
+       char *buffer;
+       int i;
+
+       i = (int )ar;
+       addr = mmap(NULL, pagesize * 2, PROT_READ | PROT_WRITE, MAP_SHARED, a[i].fd1, 0);
+       if (addr == MAP_FAILED) {
+               err(1, "Mmap failed");
+       }
+       buffer = addr;
+       addr = mmap(buffer + pagesize, pagesize, PROT_READ | PROT_WRITE, MAP_FIXED |
+                   MAP_SHARED, a[i].fd2, 0);
+
+       if (addr == MAP_FAILED) {
+               err(1, "Mmap2 failed");
+       }
+       a[i].bp = buffer;
+       sleep(1);
+       return (NULL);
+}
+
+
+int
+startIO(int fd, char *buffer)
+{
+       ssize_t len;
+
+       len = write(fd, buffer, 2 * pagesize);
+       if (len == -1) {
+               warn("startIO(%d, %p): write failed", fd, buffer);
+               return 1;
+       }
+       return 0;
+}
+
+
+
+int
+main(int argc, char *argv[], char *envp[])
+{
+
+       int fdA, fdB, fdDelayA, fdDelayB;
+       int r, status;
+       char *bufferA, *bufferB;
+       pid_t pid;
+       pthread_t threads[2];
+
+       pagesize = getpagesize();
+
+       if ((prepareFile("A", &fdA))
+           || (prepareFile("B", &fdB))
+           || (prepareFile("DelayA", &fdDelayA))
+           || (prepareFile("DelayB", &fdDelayB)))
+               exit(1);
+
+       a[0].fd1 = fdDelayA;
+       a[0].fd2 = fdB;
+
+       a[1].fd1 = fdDelayB;
+       a[1].fd2 = fdA;
+
+       if ((r = pthread_create(&threads[0], NULL, mapBuffer, (void *)0)) != 0)
+               err(1, "pthread_create(): %s\n", strerror(r));
+       if ((r = pthread_create(&threads[1], NULL, mapBuffer, (void *)1)) != 0)
+               err(1, "pthread_create(): %s\n", strerror(r));
+
+       while (a[0].bp == NULL || a[1].bp == NULL)
+               pthread_yield();
+
+       bufferA = a[0].bp;
+       bufferB = a[1].bp;
+
+       pid = fork();
+
+       if (pid == 0) {
+               status = startIO(fdA, bufferA);
+               exit(status);
+       }
+       if (pid == -1) {
+               exit(1);
+       }
+       status = startIO(fdB, bufferB);
+       exit(status);
+
+}
diff --git a/test/stress/stress2/misc/devfs.sh b/test/stress/stress2/misc/devfs.sh
new file mode 100755 (executable)
index 0000000..8f33828
--- /dev/null
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+mounts=10      # Number of parallel scripts
+D=/usr/tmp/diskimage
+
+if [ $# -eq 0 ]; then
+       for i in `jot $mounts`; do
+               [ ! -d ${mntpoint}$i ] && mkdir ${mntpoint}$i
+               mount | grep -q "${mntpoint}$i" && umount ${mntpoint}$i
+       done
+
+       # start the parallel tests
+       for i in `jot $mounts`; do
+               ./$0 $i &
+               ./$0 find &
+       done
+
+       for i in `jot $mounts`; do
+               wait; wait
+       done
+else
+       if [ $1 = find ]; then
+               for i in `jot 64`; do
+                       find ${mntpoint}* -maxdepth 1 -type f > /dev/null 2>&1
+               done
+       else
+
+               # The test: Parallel mount and unmounts
+               for i in `jot 64`; do
+                       m=$1
+                       mount -t devfs none ${mntpoint}$m
+                       opt=`[ $(( m % 2 )) -eq 0 ] && echo -f`
+                       while mount | grep -q ${mntpoint}$m; do
+                               umount $opt ${mntpoint}$m > /dev/null 2>&1
+                       done
+               done
+       fi
+fi
diff --git a/test/stress/stress2/misc/devfs2.sh b/test/stress/stress2/misc/devfs2.sh
new file mode 100755 (executable)
index 0000000..b9b23b9
--- /dev/null
@@ -0,0 +1,108 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Stopped at      devfs_open+0x23f:       pushl   0x14(%ebx)
+# db> where
+# Tracing pid 46017 tid 100350 td 0xc4c08510
+# devfs_open(e6d06a10) at devfs_open+0x23f
+# VOP_OPEN_APV(c09edda0,e6d06a10) at VOP_OPEN_APV+0x9b
+# vn_open_cred(e6d06b78,e6d06c78,0,c4883900,3,...) at vn_open_cred+0x41e
+# vn_open(e6d06b78,e6d06c78,0,3) at vn_open+0x1e
+# kern_open(c4c08510,8048887,0,1,0,...) at kern_open+0xb7
+# open(c4c08510,e6d06d00) at open+0x18
+# syscall(e6d06d38) at syscall+0x252
+
+# Test scenario by kib@freebsd.org
+
+odir=`pwd`
+dir=/tmp
+
+cd $dir
+sed '1,/^EOF/d' < $odir/$0 > $dir/devfs2.c
+cc -o devfs2 -Wall devfs2.c -lthr
+rm -f devfs2.c
+
+./devfs2
+
+rm devfs2
+
+exit
+
+EOF
+#include <pthread.h>
+#include <stdio.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <err.h>
+
+void *
+thr1(void *arg)
+{
+       int fd;
+       int i;
+
+       for (i = 0; i < 1024; i++) {
+               if ((fd = open("/dev/zero", O_RDONLY)) == -1)
+                       perror("open /dev/zero");
+               close(fd);
+       }
+       return (0);
+}
+
+void *
+thr2(void *arg)
+{
+       int i;
+       for (i = 0; i < 1024; i++)
+               close(3);
+       return (0);
+}
+
+int
+main()
+{
+       pthread_t threads[2];
+       int i;
+       int r;
+
+       if ((r = pthread_create(&threads[0], NULL, thr1, 0)) != 0)
+               err(1, "pthread_create(): %s\n", strerror(r));
+       if ((r = pthread_create(&threads[1], NULL, thr2, 0)) != 0)
+               err(1, "pthread_create(): %s\n", strerror(r));
+
+       for (i = 0; i < 2; i++)
+               if (pthread_join(threads[i], NULL) != 0)
+                       err(1, "pthread_join(%d)", i);
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/extattr.sh b/test/stress/stress2/misc/extattr.sh
new file mode 100755 (executable)
index 0000000..37dcc70
--- /dev/null
@@ -0,0 +1,96 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Regression test of extattr on a UFS2 FS using ACLs
+# Caused a "Duplicate free" panic.
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > extattr.c
+cc -o extattr -Wall extattr.c
+rm -f extattr.c
+cd $odir
+
+mount | grep "${mntpoint}" | grep -q md${mdstart}${part} && umount $mntpoint
+mdconfig -l | grep -q md$mdstart &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t swap -s 20m -u $mdstart
+bsdlabel -w md$mdstart auto
+
+newfs -O 2 md${mdstart}${part} > /dev/null
+mount /dev/md${mdstart}${part} $mntpoint
+
+mkdir -p ${mntpoint}/.attribute/system
+cd ${mntpoint}/.attribute/system
+
+extattrctl initattr -p . 388 posix1e.acl_access
+extattrctl initattr -p . 388 posix1e.acl_default
+cd /
+umount /mnt
+tunefs -a enable /dev/md${mdstart}${part}
+mount /dev/md${mdstart}${part} $mntpoint
+mount | grep md${mdstart}${part}
+
+touch $mntpoint/acl-test
+setfacl -b $mntpoint/acl-test
+setfacl -m user:nobody:rw-,group:wheel:rw- $mntpoint/acl-test
+
+for i in `jot 5`; do
+       /tmp/extattr $mntpoint/acl-test &
+done
+for i in `jot 5`; do
+       wait
+done
+
+umount $mntpoint
+mdconfig -d -u $mdstart
+rm -f /tmp/extattr
+exit
+EOF
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <err.h>
+
+int
+main(int argc, char **argv)
+{
+       int i;
+       struct stat sb;
+
+       for (i = 0; i < 100000; i++)
+               if (lstat(argv[1], &sb) == -1)
+                       err(1, "lstat(%s)", argv[1]);
+       return (0);
+}
diff --git a/test/stress/stress2/misc/extattrctl.sh b/test/stress/stress2/misc/extattrctl.sh
new file mode 100755 (executable)
index 0000000..98a522b
--- /dev/null
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Regression test of extattrctl and ACLs on UFS1 FS
+# Kernel must be compiled with options UFS_EXTATTR and UFS_EXTATTR_AUTOSTART
+
+# Scenario by rwatson@ from:
+#
+# Newsgroups: lucky.freebsd.current
+# Subject: Re: setfacl requirements?
+# Date: Thu, 5 Dec 2002 15:50:02 +0000 (UTC)
+
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+sysctl -a | ! grep -q ufs_extattr && echo "Missing options UFS_EXTATTR" && exit 1
+
+mount | grep "${mntpoint}" | grep -q md${mdstart}${part} && umount $mntpoint
+mdconfig -l | grep -q md$mdstart &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t swap -s 20m -u $mdstart
+bsdlabel -w md$mdstart auto
+
+newfs -O 1 md${mdstart}${part} > /dev/null
+mount /dev/md${mdstart}${part} $mntpoint
+
+mkdir -p ${mntpoint}/.attribute/system
+cd ${mntpoint}/.attribute/system
+
+extattrctl initattr -p . 388 posix1e.acl_access
+extattrctl initattr -p . 388 posix1e.acl_default
+cd /
+umount /mnt
+tunefs -a enable /dev/md${mdstart}${part}
+mount /dev/md${mdstart}${part} $mntpoint
+mount | grep md${mdstart}${part}
+
+touch $mntpoint/acl-test
+setfacl -b $mntpoint/acl-test
+setfacl -m user:nobody:rw-,group:wheel:rw- $mntpoint/acl-test
+getfacl $mntpoint/acl-test
+ls -l $mntpoint/acl-test
+
+umount $mntpoint
+mdconfig -d -u $mdstart
diff --git a/test/stress/stress2/misc/fdescfs.sh b/test/stress/stress2/misc/fdescfs.sh
new file mode 100755 (executable)
index 0000000..a01ab93
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+#
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+mounts=15              # Number of parallel scripts
+mdstart=$mdstart       # Use md unit numbers from this point
+D=$diskimage
+
+if [ $# -eq 0 ]; then
+       # start the parallel tests
+       for i in `jot $mounts`; do
+               ./$0 $i &
+               ./$0 find &
+       done
+
+       for i in `jot $mounts`; do
+               wait; wait
+       done
+else
+       if [ $1 = find ]; then
+               exec 6< /dev/zero
+               exec 7< /dev/zero
+               exec 8< /dev/zero
+               exec 9< /dev/zero
+               for i in `jot 128`; do
+                       ls -l ${mntpoint}* > /dev/null 2>&1
+               done
+       else
+
+               # The test: Parallel mount and unmounts
+               for i in `jot 128`; do
+#                      mount -t fdescfs null  ${mntpoint}$1    # This causes mound to complain
+                       mount_fdescfs null ${mntpoint}$1
+                       while mount | grep -wq ${mntpoint}$1; do
+                               umount -f ${mntpoint}$1 > /dev/null 2>&1
+                       done
+               done
+       fi
+fi
diff --git a/test/stress/stress2/misc/fpclone.sh b/test/stress/stress2/misc/fpclone.sh
new file mode 100755 (executable)
index 0000000..907f5a0
--- /dev/null
@@ -0,0 +1,197 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test scenario by kib@freebsd.org
+
+# Test of
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+odir=`pwd`
+dir=$RUNDIR/fpclone
+[ ! -d $dir ] && mkdir -p $dir
+
+cd $dir
+cat > Makefile <<EOF
+KMOD= fpclone
+SRCS= fpclone.c
+
+.include <bsd.kmod.mk>
+EOF
+
+sed '1,/^EOF2/d' < $odir/$0 > fpclone.c
+make
+kldload $dir/fpclone.ko
+
+cd $odir
+for i in `jot 10`; do
+       dd if=/dev/fpclone bs=1m count=10 > /dev/null 2>&1 &
+done
+
+export runRUNTIME=2m
+cd /home/pho/stress2; ./run.sh pty.cfg
+
+for i in `jot 10`; do
+       wait
+done
+kldstat
+dd if=/dev/fpclone bs=1m count=1k > /dev/null 2>&1 &
+kldunload $dir/fpclone.ko
+rm -rf $dir
+exit
+
+EOF2
+/* $FreeBSD$ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/conf.h>
+#include <sys/uio.h>
+#include <sys/malloc.h>
+
+typedef       void (*cdevpriv_dtr_t)(void *data);
+int   devfs_get_cdevpriv(void **datap);
+int   devfs_set_cdevpriv(void *priv, cdevpriv_dtr_t dtr);
+void  devfs_clear_cdevpriv(void);
+void  devfs_fpdrop(struct file *fp);  /* XXX This is not public KPI */
+
+
+static d_open_t                fpclone_open;
+static d_close_t       fpclone_close;
+static d_read_t                fpclone_read;
+
+static struct cdevsw fpclone_cdevsw = {
+       .d_open =       fpclone_open,
+       .d_close =      fpclone_close,
+       .d_read =       fpclone_read,
+       .d_name =       "fpclone",
+       .d_version =    D_VERSION,
+       .d_flags =      D_TRACKCLOSE
+};
+
+MALLOC_DEFINE(M_FPCLONESC, "fpclone memory", "fpclone memory");
+
+struct fpclone_sc
+{
+       int pos;
+};
+
+static struct cdev *fpclone_dev;
+static struct mtx me;
+
+static void
+fpclone_cdevpriv_dtr(void *data)
+{
+       free(data, M_FPCLONESC);
+}
+
+static int
+fpclone_open(struct cdev *dev, int oflags, int devtype, d_thread_t *td)
+{
+       struct fpclone_sc *sc;
+       int error;
+
+       sc = malloc(sizeof(struct fpclone_sc), M_FPCLONESC,
+                M_WAITOK | M_ZERO);
+       error = devfs_set_cdevpriv(sc, fpclone_cdevpriv_dtr);
+       if (error)
+               fpclone_cdevpriv_dtr(sc);
+       return (error);
+}
+
+static int
+fpclone_close(struct cdev *dev, int fflag, int devtype, d_thread_t *td)
+{
+
+       devfs_clear_cdevpriv();
+       return (0);
+}
+
+static char rdata[] = "fpclone sample data string\n";
+
+static int
+fpclone_read(struct cdev *dev, struct uio *uio, int ioflag)
+{
+       struct fpclone_sc *sc;
+       int rv, amnt, svpos, error;
+
+       error = devfs_get_cdevpriv((void **)&sc);
+       if (error)
+               return (error);
+
+       rv = 0;
+       while (uio->uio_resid > 0) {
+               svpos = sc->pos;
+               amnt = MIN(uio->uio_resid, sizeof(rdata) - svpos);
+               rv = uiomove(rdata + svpos, amnt, uio);
+               if (rv != 0)
+                       break;
+               mtx_lock(&me);
+               sc->pos += amnt;
+               sc->pos %= sizeof(rdata);
+               mtx_unlock(&me);
+       }
+       return (rv);
+}
+
+static int
+fpclone_modevent(module_t mod, int what, void *arg)
+{
+       switch (what) {
+        case MOD_LOAD:
+               mtx_init(&me, "fp_ref", NULL, MTX_DEF);
+               fpclone_dev = make_dev(&fpclone_cdevsw, 0, 0, 0, 0666,
+                   "fpclone");
+               return(0);
+
+        case MOD_UNLOAD:
+               destroy_dev(fpclone_dev);
+               mtx_destroy(&me);
+               return (0);
+
+        default:
+               break;
+       }
+
+       return (0);
+}
+
+moduledata_t fpclone_mdata = {
+       "fpclone",
+       fpclone_modevent,
+       NULL
+};
+
+DECLARE_MODULE(fpclone, fpclone_mdata, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
+MODULE_VERSION(fpclone, 1);
diff --git a/test/stress/stress2/misc/fpclone2.sh b/test/stress/stress2/misc/fpclone2.sh
new file mode 100755 (executable)
index 0000000..cbbc79c
--- /dev/null
@@ -0,0 +1,115 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test scenario by kib@freebsd.org
+
+# Test of
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+odir=`pwd`
+dir=$RUNDIR/fpclone
+[ ! -d $dir ] && mkdir -p $dir
+
+cd $dir
+cat > Makefile <<EOF
+KMOD= fpclone
+SRCS= fpclone.c
+
+.include <bsd.kmod.mk>
+EOF
+
+sed '1,/^EOF2/d' < $odir/fpclone.sh > fpclone.c
+make
+kldload $dir/fpclone.ko
+
+sed '1,/^EOF2/d' < $odir/$0 > fpclone2.c
+cc -o fpclone2 -Wall fpclone2.c
+rm -f fpclone2.c
+
+cd $odir
+for i in `jot 10`; do
+       $dir/fpclone2 &
+done
+
+for i in `jot 10`; do
+       wait
+done
+kldstat
+kldunload $dir/fpclone.ko
+rm -rf $dir fpclone2
+exit
+
+EOF2
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <err.h>
+
+int
+main(int argc, char **argv)
+{
+       int fd;
+       int i;
+       char buf[80];
+
+       for (i = 0; i < 10000; i++) {
+               if ((fd = open("/dev/fpclone", O_RDONLY)) == -1)
+                       err(1, "open(/dev/fpclone");
+               if (read(fd, buf, sizeof(buf)) <= 0)
+                       err(1, "read");
+               if (dup2(fd, 10) == -1)
+                       err(1, "dup");
+               if (dup2(fd, 11) == -1)
+                       err(1, "dup");
+               if (dup2(fd, 12) == -1)
+                       err(1, "dup");
+               if (close(fd) == -1)
+                       err(1, "close(%d)", fd);
+               if (close(10) == -1)
+                       err(1, "close(%d)", 10);
+               if (close(11) == -1)
+                       err(1, "close(%d)", 11);
+               if (close(12) == -1)
+                       err(1, "close(%d)", 12);
+       }
+       if ((fd = open("/dev/fpclone", O_WRONLY)) == -1)
+                       err(1, "open(/dev/fpclone");
+       if (write(fd, "xxx", 3) == -1 && errno != ENODEV)
+                       err(1, "write");
+       if (close(fd) == -1)
+               err(1, "close(%d)", fd);
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/fpu.sh b/test/stress/stress2/misc/fpu.sh
new file mode 100755 (executable)
index 0000000..e69ac61
--- /dev/null
@@ -0,0 +1,105 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2010 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Regression test for FPU changes in r208833
+
+. ../default.cfg
+
+here=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $here/$0 > fpu.c
+cc -o fpu -Wall -O2 fpu.c
+rm -f fpu.c
+[ -d $RUNDIR ] || mkdir -p $RUNDIR
+cd $RUNDIR
+
+r=`/tmp/fpu`
+[ "$r" = "-0.000000017, 0.000000000, 0.000000000" ] || echo $r
+
+cd $here
+rm -f /tmp/fpu
+
+exit 0
+EOF
+#include <sys/types.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+void
+handler(int i)
+{
+}
+
+void
+test()
+{
+       float val = 0;
+       double lval = 0;
+       long double llval = 0;
+       int i, j;
+
+       for (i = 0; i < 100000; i++) {
+               for (j = 0; j < 100000; j++) {
+                       val   = val   + 0.00001;
+                       lval  = lval  + 0.00001;
+                       llval = llval + 0.00001;
+               }
+               for (j = 0; j < 100000; j++) {
+                       val   = val   - 0.00001;
+                       lval  = lval  - 0.00001;
+                       llval = llval - 0.00001;
+               }
+       }
+       printf("%.9f, %.9f, %.9Lf\n", val, lval, llval);
+       exit(0);
+
+}
+
+int
+main()
+{
+       pid_t pid;
+       int i;
+
+       signal(SIGHUP, handler);
+
+       if ((pid = fork()) == 0)
+               test();
+
+       for (i = 0; i < 10000; i++)
+               kill(pid, SIGHUP);
+
+       wait(NULL);
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/fragments.sh b/test/stress/stress2/misc/fragments.sh
new file mode 100755 (executable)
index 0000000..743633f
--- /dev/null
@@ -0,0 +1,266 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2010 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Scenario that causes "panic: brelse: free buffer onto another queue???"
+# Idea for scenario by kib@. Fixed in r203818
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+here=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $here/$0 > fragments.c
+rm -f /tmp/fragments
+cc -o fragments -Wall -Wextra -O2 -g fragments.c
+rm -f fragments.c
+cd $here
+
+mount | grep "$mntpoint" | grep -q md$mdstart && umount -f ${mntpoint}
+mdconfig -l | grep -q md$mdstart &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t swap -s 1g -u $mdstart
+bsdlabel -w md$mdstart auto
+newfs -U -m 0 md${mdstart}${part} > /dev/null 2>&1
+mount /dev/md${mdstart}${part} /mnt
+chmod 777 /mnt
+
+cd /mnt
+su ${testuser} -c "/tmp/fragments"
+cd $here
+
+umount /mnt
+mount | grep "$mntpoint" | grep -q md$mdstart && umount -f ${mntpoint}
+mdconfig -l | grep -q md$mdstart &&  mdconfig -d -u $mdstart
+
+rm -f /tmp/fragments
+exit
+EOF
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mount.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#define LOOPS 50000
+#define PARALLEL 8
+
+static pid_t pid;
+static char *buf;
+
+void
+cleanup(int n)
+{
+       int i, j, start;
+       int nb = 0;
+       char file[128];
+       struct statfs sbuf;
+       struct stat sb;
+
+       if (n == -1) {
+               for (i = 0; i < LOOPS; i++) {
+                       sprintf(file,"t%05d", i);
+                       unlink(file);
+               }
+               return;
+       }
+
+       start = arc4random() % n;
+       for (i = 0; i < LOOPS; i++) {
+               j = (start + i) % LOOPS;
+               sprintf(file,"t%05d", j);
+               if (stat(file, &sb) != 0)
+                       continue;
+
+               if (sb.st_size == 0) {
+                       unlink(file);
+                       continue;
+               }
+               if (truncate(file, 0) == 0) {
+                       nb++;
+                       continue;
+               }
+               if (nb > 10)
+                       break;
+       }
+
+
+       for (i = 0; i < 10; i++) {
+               if (statfs(".", &sbuf) < 0)
+                       err(1, "statfs(%s)", ".");
+
+               if (sbuf.f_bfree > 8)
+                       return;
+       }
+
+       for (i = 0; i < LOOPS; i++) {
+               j = (start + i) % LOOPS;
+               sprintf(file,"t%05d", j);
+               if (unlink(file) == 0) {
+                       return;
+               }
+       }
+}
+
+void
+fragments(void)
+{
+       int i, len;
+       char file[128];
+       int fd;
+
+       for (i = 0;; i++) {
+               sprintf(file,"d%d/f%05d.%05d", i/1000, pid, i);
+
+               if ((fd = open(file, O_RDWR | O_CREAT | O_TRUNC, 0600)) < 0) {
+                       if (errno != ENOSPC)
+                               warn("open(%s)", file);
+                       break;
+               }
+
+               len =  2 * 1024;
+               if (write(fd, buf, len) != len) {
+               }
+
+               close(fd);
+       }
+}
+
+void
+blocks(void)
+{
+       int i, len;
+       char file[128];
+       int fd;
+
+       for (i = 0;; i++) {
+               sprintf(file,"d%d/b%05d.%05d", i/1000, pid, i);
+
+               if ((fd = open(file, O_RDWR | O_CREAT | O_TRUNC, 0600)) < 0) {
+                       if (errno != ENOSPC)
+                               warn("open(%s)", file);
+                       break;
+               }
+
+               len =  16 * 1024;
+               if (write(fd, buf, len) != len) {
+               }
+
+               close(fd);
+       }
+}
+
+void
+setup(void)
+{
+       int i;
+       char file[128];
+
+       for (i = 0; i < 300; i++) {
+               sprintf(file,"d%d", i);
+               if (mkdir(file, 0700) == -1)
+                       warn("mkdir(%s)", file);
+       }
+
+       blocks();
+       fragments();
+
+       for (i = 0;i < 8; i++) {
+               sprintf(file,"d%d/b%05d.%05d", i/1000, pid, i);
+               unlink(file);
+               unlink(file);
+       }
+       for (i = 0;i < 1; i++) {
+               sprintf(file,"d%d/f%05d.%05d", i/1000, pid, i);
+               unlink(file);
+       }
+
+}
+
+int
+test(void)
+{
+       int i, len, n;
+       char file[128];
+       int fd;
+
+       for (i = 0; i < LOOPS; i++) {
+               sprintf(file,"t%05d", i);
+
+               if ((fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0600)) < 0) {
+                       continue;
+               }
+//             n = arc4random() % (12 + 1);
+               n = 0;
+                len = (arc4random() % (16 * 1024) + 1) + n * 16;
+               while (len > 0) {
+                       if (write(fd, buf, len) == len)
+                               break;
+                       len = len / 2;
+                       usleep(1000);
+               }
+               close(fd);
+               if (len == 0) {
+                       cleanup(i);
+               }
+       }
+
+       exit(0);
+
+       return (0);
+}
+
+int
+main()
+{
+       int i, j, status;
+
+       pid = getpid();
+       if ((buf = malloc(12 * 16 * 1024)) == NULL)
+               err(1, "malloc()");
+
+       setup();
+       for (j = 0; j < 50; j++) {
+               for (i = 0; i < PARALLEL; i++) {
+                       if (fork() == 0)
+                               test();
+               }
+               for (i = 0; i < PARALLEL; i++)
+                       wait(&status);
+               cleanup(-1);
+       }
+        return (0);
+}
diff --git a/test/stress/stress2/misc/fs.sh b/test/stress/stress2/misc/fs.sh
new file mode 100755 (executable)
index 0000000..1425e61
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Caused panic: ffs_truncate3
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+ftest () {     # fstype, soft update, disk full
+   echo "newfs -O $1 `[ $2 -eq 1 ] && echo \"-U\"` md${mdstart}${part}"
+   newfs -O $1 `[ $2 -eq 1 ] && echo "-U"` md${mdstart}${part} > /dev/null
+   mount /dev/md${mdstart}${part} ${mntpoint}
+
+   export RUNDIR=${mntpoint}/stressX
+   disk=$(($3 + 1))    # 1 or 2
+   set `df -ik ${mntpoint} | tail -1 | awk '{print $4,$7}'`
+   export KBLOCKS=$(($1 * disk))
+   export  INODES=$(($2 * disk))
+
+   for i in `jot 10`; do
+      (cd ../testcases/rw;./rw -t 2m -i 20)
+   done
+
+   while mount | grep -q ${mntpoint}; do
+      umount $([ $((`date '+%s'` % 2)) -eq 0 ] && echo "-f") ${mntpoint} > /dev/null 2>&1
+   done
+}
+
+
+mount | grep "${mntpoint}" | grep md${mdstart}${part} > /dev/null && umount ${mntpoint}
+mdconfig -l | grep md${mdstart} > /dev/null &&  mdconfig -d -u ${mdstart}
+
+mdconfig -a -t swap -s 20m -u ${mdstart}
+bsdlabel -w md${mdstart} auto
+
+ftest 1 0 0    # ufs1
+ftest 1 0 1    # ufs1, disk full
+ftest 2 0 0    # ufs2
+ftest 2 0 1    # ufs2, disk full
+ftest 2 1 0    # ufs2 + soft update
+ftest 2 1 1    # ufs2 + soft update, disk full
+
+mdconfig -d -u ${mdstart}
diff --git a/test/stress/stress2/misc/fullpath.sh b/test/stress/stress2/misc/fullpath.sh
new file mode 100755 (executable)
index 0000000..8c07e94
--- /dev/null
@@ -0,0 +1,113 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test scenario by marcus@freebsd.org
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+odir=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > fullpath.c
+cc -o fullpath -Wall fullpath.c
+rm -f fullpath.c
+cd /proc
+
+for i in `jot 5`; do
+       /tmp/fullpath &
+done
+
+for i in `jot 30`; do
+       for j in `jot 25`; do
+               pid=`perl -e 'print splice(@ARGV,rand(@ARGV),1), " ";' $(echo [0-9]*)`
+#              echo $pid
+               procstat -f $pid > /dev/null 2>&1
+               procstat -f $pid > /dev/null 2>&1
+               procstat -f $pid > /dev/null 2>&1
+               procstat -f $pid > /dev/null 2>&1
+               procstat -f $pid > /dev/null 2>&1
+       done
+done
+
+for i in `jot 5`; do
+       wait
+done
+
+rm -f /tmp/fullpath
+exit
+EOF
+
+#include <stdio.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <err.h>
+#include <strings.h>
+#include <sys/wait.h>
+
+char buf[4096];
+
+void
+handler(int i) {
+       exit(0);
+}
+
+int
+test(void) {
+       pid_t r;
+       int status;
+
+       for (;;) {
+               r = fork();
+               if (r == 0) {
+                       bzero(buf, sizeof(buf));
+                       exit(0); /*child dies */
+               }
+               if (r < 0) {
+                       perror("fork");
+                       exit(2);
+               }
+               wait(&status);
+       }
+       return 0;
+}
+
+int main(int argc, char **argv)
+{
+       int i;
+
+       i = 0;
+       signal(SIGALRM, handler);
+       alarm(60);
+
+
+       return test();
+}
diff --git a/test/stress/stress2/misc/fuzz.sh b/test/stress/stress2/misc/fuzz.sh
new file mode 100755 (executable)
index 0000000..b86281c
--- /dev/null
@@ -0,0 +1,180 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Stress test UFS2 file systems by introducing single bit errors in the FS
+# fsck fould fix the FS no matter how damaged, but f.x. this panic has been seen:
+#
+# panic(c0912b65,dfe96000,0,c09e4060,ef48c778,...) at panic+0x14b
+# vm_fault(c1868000,dfe96000,1,0) at vm_fault+0x1e0
+# trap_pfault(ef48c894,0,dfe96000) at trap_pfault+0x137
+# trap(dfe90008,ef480028,c0690028,d0560000,dfe96000,...) at trap+0x341
+# calltrap() at calltrap+0x5
+# --- trap 0xc, eip = 0xc08785a6, esp = 0xef48c8d4, ebp = 0xef48c958 ---
+# generic_bcopy(c81cd570,d0508000,c5ead600,c87b81c0,0,...) at generic_bcopy+0x1a
+# ffs_mount(d0508000,c5ead600,0,c09b0860,c5ecfc3c,...) at ffs_mount+0xa14
+# vfs_domount(c5ead600,cd8c7280,ccb75080,0,...) at vfs_domount+0x687
+# vfs_donmount(c5ead600,0,ef48cc04) at vfs_donmount+0x2ef
+# kernel_mount(c5660960,0,bfbfec86,0,fffffffe,...) at kernel_mount+0x6d
+# ffs_cmount(c5660960,bfbfde50,0,c5ead600,c09b0860,...) at ffs_cmount+0x5d
+# mount(c5ead600,ef48cd04) at mount+0x156
+# syscall(3b,3b,3b,804abcf,bfbfe8e4,...) at syscall+0x22f
+
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+D=$diskimage
+
+tst() {
+   rm -f $D
+   truncate -s 2M $D
+   mdconfig -a -t vnode -f $D -u $mdstart
+   bsdlabel -w md$mdstart auto
+   newfs -b 8192 -f 1024 -U /dev/md${mdstart}${part} > /dev/null 2>&1
+   mount /dev/md${mdstart}${part} $mntpoint
+   cp /etc/passwd /etc/group /etc/hosts $mntpoint
+   cp -r /usr/include/ufs $mntpoint
+   umount $mntpoint
+
+   for i in `jot 50`; do
+      ./fuzz -n 50 $D
+      if fsck -f -y /dev/md${mdstart}${part} 2>&1 | egrep "^[A-Z]" > /dev/null; then
+         if fsck -f -y /dev/md${mdstart}${part} 2>&1 | egrep "^[A-Z]" > /dev/null; then
+            if fsck -f -y /dev/md${mdstart}${part} 2>&1 | egrep "^[A-Z]" > /dev/null; then
+               echo "fsck is giving up in loop $i!"
+               break
+            fi
+         fi
+      fi
+      sync;sync;sync
+      if mount /dev/md${mdstart}${part} $mntpoint; then
+         ls -l $mntpoint > /dev/null
+         find $mntpoint  -exec dd if={} of=/dev/null bs=1m count=3 \; > /dev/null 2>&1
+         umount $mntpoint
+      else
+         echo "Giving up at loop $i"
+         break
+      fi
+   done
+   mdconfig -d -u ${mdstart}
+   rm -f $D
+}
+
+odir=`pwd`
+dir=/tmp
+
+cd $dir
+sed '1,/^EOF/d' < $odir/$0 > $dir/fuzz.c
+cc -o fuzz -Wall fuzz.c
+rm -f fuzz.c
+
+for j in `jot 10`; do
+   date '+%T'
+   tst
+done
+rm -f fuzz
+
+exit
+
+EOF
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <err.h>
+
+void
+usage(void)
+{
+       fprintf(stderr, "%s {-n <num|-v} <file>\n", getprogname());
+       exit(1);
+}
+
+long
+random_long(long mi, long ma)
+{
+       return (arc4random()  % (ma - mi + 1) + mi);
+}
+
+int
+main(int argc, char **argv)
+{
+       int ch, fd, i, times = 1, verbose = 0;
+       long pos;
+       unsigned char bit, buf, mask, old;
+       struct stat sb;
+
+       while ((ch = getopt(argc, argv, "n:v")) != -1)
+               switch(ch) {
+               case 'n':       /* Bits to alter */
+                       if (sscanf(optarg, "%d", &times) != 1)
+                               usage();
+                       break;
+               case 'v':       /* verbose flag */
+                       verbose += 1;
+                       break;
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc == 0)
+               usage();
+
+
+       if ((fd = open(argv[0], O_RDWR)) == -1)
+               err(1, "open(%s)", argv[0]);
+       if (fstat(fd, &sb) == -1)
+               err(1, "stat(%s)", argv[0]);
+
+       for (i = 0; i < times; i++) {
+               pos = random_long(0, sb.st_size - 1);
+               if (lseek(fd, pos, SEEK_SET) == -1)
+                       err(1, "fseek(%d, %ld)", fd, pos);
+               if (read(fd, &buf, 1) != 1)
+                       err(1, "read(%d)", fd);
+               bit = random_long(0,7);
+               mask = ~(1 << bit);
+               old = buf;
+               buf = (buf & mask) | (~buf & ~mask);
+               if (verbose > 0)
+                       printf("Change %2x to %2x at %4ld by flipping bit %d\n",
+                                       old, buf, pos, bit);
+               if (lseek(fd, pos, SEEK_SET) == -1)
+                       err(1, "fseek(%d, %ld)", fd, pos);
+               if (write(fd, &buf, 1) != 1)
+                       err(1, "write(%d)", fd);
+       }
+       close(fd);
+       return (0);
+}
diff --git a/test/stress/stress2/misc/inversion.sh b/test/stress/stress2/misc/inversion.sh
new file mode 100755 (executable)
index 0000000..5bb7a57
--- /dev/null
@@ -0,0 +1,91 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Provokes a deadlock by lower priority process holding a lock and
+# never beeing run
+
+dir=/tmp
+N=5    # Number of CPUs + 1
+M=25   # Number of lower priority jobs
+
+odir=`pwd`
+cd $dir
+sed '1,/^EOF/d' < $odir/$0 > $dir/inversion.c
+cc -o inversion -Wall inversion.c
+rm -f inversion.c
+
+for i in `jot $N`; do
+       ./inversion 3700&
+done
+
+while pgrep inversion > /dev/null; do
+       date '+%T'
+       (
+               for i in `jot $M`; do
+                       nice -n 20 lockf -s -t 0 .lock pwd > /dev/null &
+               done
+               for i in `jot $M`; do
+                       wait
+               done
+       )
+done
+
+for i in `jot $N`; do
+       wait
+done
+rm -f inversion
+exit
+
+EOF
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+void
+handler(int i)
+{
+       exit(0);
+}
+
+int
+main(int argc, char **argv)
+{
+
+       int t;
+       if (argc == 2)
+               t = atoi(argv[1]);
+       else
+               t = 60;
+       signal(SIGALRM, handler);
+       alarm(t);
+       for (;;)
+               ;
+       return (0);
+}
diff --git a/test/stress/stress2/misc/isofs.sh b/test/stress/stress2/misc/isofs.sh
new file mode 100755 (executable)
index 0000000..c51b1c4
--- /dev/null
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+[ `id -u ` -ne 0 ] && echo "Must not be root!" && exit 1
+
+[ -z "`type mkisofs 2>/dev/null`" ] && echo "mkisofs not found" && exit 1
+
+. ../default.cfg
+
+D=`dirname $diskimage`/dir
+I=`dirname $diskimage`/dir.iso
+export here=`pwd`
+cd /tmp
+
+cc -o fstool $here/../tools/fstool.c
+
+rm -rf $D $I
+mkdir $D
+
+(cd $D; /tmp/fstool -n 10 -l -f 512)
+
+mkisofs -o $I -r $D > /dev/null 2>&1
+
+mdconfig -a -t vnode -f $I -u ${mdstart}
+mount -t cd9660 /dev/md${mdstart} $mntpoint
+
+for i in `jot 64`; do
+   find /$mntpoint -type f > /dev/null 2>&1 &
+done
+for i in `jot 64`; do
+   wait
+done
+
+umount ${mntpoint}
+mdconfig -d -u ${mdstart}
+
+rm -rf $D $I fstool
diff --git a/test/stress/stress2/misc/jail.sh b/test/stress/stress2/misc/jail.sh
new file mode 100755 (executable)
index 0000000..8798d74
--- /dev/null
@@ -0,0 +1,68 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Regression test for problem found with the syscall.sh test
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > jail.c
+cc -o jail -Wall jail.c
+rm -f jail.c
+cd $RUNDIR
+/tmp/jail
+rm -f /tmp/jail
+exit
+EOF
+#include <sys/param.h>
+#include <sys/jail.h>
+#include <err.h>
+
+int
+main()
+{
+       struct jail j;
+
+       j.version = 2;
+       j.path = (char *)0xa000000;
+       j.hostname = (char *)1;
+       j.jailname = (char *)0;
+       j.ip4s = 0;
+       j.ip6s = 0;
+       j.ip4 = (struct in_addr *)0x58000000;
+       j.ip6 = (struct in6_addr *)0x33000001;
+
+        if (jail(&j) == -1)
+               err(1, "jail()");
+
+         return (0);
+}
diff --git a/test/stress/stress2/misc/jail2.sh b/test/stress/stress2/misc/jail2.sh
new file mode 100755 (executable)
index 0000000..94500b4
--- /dev/null
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Regression test for problem found with the syscall.sh test
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > jail2.c
+cc -o jail2 -Wall jail2.c
+rm -f jail2.c
+cd $odir
+/tmp/jail2
+rm -f /tmp/jail2
+exit
+EOF
+#include <sys/param.h>
+#include <sys/jail.h>
+#include <err.h>
+
+int
+main()
+{
+       struct jail j;
+
+       /*
+       version = 0x2,
+       path = 0x0,
+       hostname = 0x0,
+       jailname = 0x50000000 <Address 0x50000000 out of bounds>,
+       ip4s = 0xf7000004,
+       ip6s = 0x1,
+       ip4 = 0x0,
+       ip6 = 0x0
+        */
+       j.version = 2;
+       j.path = 0;
+       j.hostname = 0;
+       j.jailname = (char *)0x50000000;
+       j.ip4s = 0xf7000004;
+       j.ip6s = 1;
+       j.ip4 = 0;
+       j.ip6 = 0;
+
+        if (jail(&j) == -1)
+               err(1, "jail()");
+
+         return (0);
+}
diff --git a/test/stress/stress2/misc/jail3.sh b/test/stress/stress2/misc/jail3.sh
new file mode 100755 (executable)
index 0000000..eb7115d
--- /dev/null
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Regression test for problem found with the syscall.sh test
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > jail3.c
+cc -o jail3 -Wall jail3.c
+rm -f jail3.c
+cd $odir
+/tmp/jail3
+rm -f /tmp/jail3
+exit
+EOF
+#include <sys/param.h>
+#include <sys/jail.h>
+#include <err.h>
+
+int
+main()
+{
+       struct jail j;
+
+       /*
+       version = 0x0,
+       path = 0x2809cd61 <Address 0x2809cd61 out of bounds>,
+       hostname = 0x2809b650 <Address 0x2809b650 out of bounds>,
+       jailname = 0x0,
+       ip4s = 0x1,
+       ip6s = 0x0,
+       ip4 = 0x0,
+       ip6 = 0x0
+        */
+       j.version = 0;
+       j.path = (char *)0x2809cd61;
+       j.hostname = (char *)0x2809b650;
+       j.jailname = 0;
+       j.ip4s = 1;
+       j.ip6s = 0;
+       j.ip4 = 0;
+       j.ip6 = 0;
+
+        if (jail(&j) == -1)
+               err(1, "jail()");
+
+         return (0);
+}
diff --git a/test/stress/stress2/misc/jail4.sh b/test/stress/stress2/misc/jail4.sh
new file mode 100755 (executable)
index 0000000..48c56ef
--- /dev/null
@@ -0,0 +1,80 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Regression test for problem found with the syscall.sh test
+
+# "panic: kern_jail: too many iovecs (28)" seen.
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > jail4.c
+cc -o jail4 -Wall jail4.c
+rm -f jail4.c
+cd $odir
+/tmp/jail4
+rm -f /tmp/jail4
+exit
+EOF
+#include <sys/param.h>
+#include <sys/jail.h>
+#include <err.h>
+
+int
+main()
+{
+       struct jail j;
+
+       /*
+       version = 0x2,
+       path = 0x28190cb1 <Address 0x28190cb1 out of bounds>,
+       hostname = 0x28167b90 <Address 0x28167b90 out of bounds>,
+       jailname = 0x28198700 <Address 0x28198700 out of bounds>,
+       ip4s = 0x0,
+       ip6s = 0x0,
+       ip4 = 0x0,
+       ip6 = 0x0}
+        */
+       j.version = 2;
+       j.path = (char *)0x28190cb1;
+       j.hostname = (char *)0x28167b90;
+       j.jailname = (char *)0x28198700;
+       j.ip4s = 0;
+       j.ip6s = 0;
+       j.ip4 = 0;
+       j.ip6 = 0;
+
+        if (jail(&j) == -1)
+               err(1, "jail()");
+
+         return (0);
+}
diff --git a/test/stress/stress2/misc/kevent.sh b/test/stress/stress2/misc/kevent.sh
new file mode 100755 (executable)
index 0000000..deeb078
--- /dev/null
@@ -0,0 +1,173 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# panic: KN_INFLUX set when not suppose to be
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > kevent.c
+cc -o kevent -Wall kevent.c -pthread
+rm -f kevent.c
+cd $RUNDIR
+
+for i in `jot 10`; do
+       for j in `jot 12`; do
+               /tmp/kevent > /dev/null 2>&1 &
+       done
+       for j in `jot 12`; do
+               wait
+       done
+done
+exit
+EOF
+#include <pthread.h>
+#include <sys/types.h>
+#include <sys/event.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t  cond  = PTHREAD_COND_INITIALIZER;
+static int waiting;
+
+static int fd1[2];
+static int fd2[2];
+static int fd3[2];
+
+void *
+thr1(void *arg)
+{
+       int n;
+       int kq = -1;
+       struct kevent ev[3];
+
+       if ((kq = kqueue()) < 0)
+               err(1, "kqueue(). %s:%d", __FILE__, __LINE__);
+
+       n = 0;
+       EV_SET(&ev[n], fd1[1], EVFILT_WRITE,
+                   EV_ADD | EV_ENABLE | EV_CLEAR, 0, 0, 0);
+       n++;
+       EV_SET(&ev[n], fd2[1], EVFILT_WRITE,
+                   EV_ADD | EV_ENABLE | EV_CLEAR, 0, 0, 0);
+       n++;
+       EV_SET(&ev[n], fd3[1], EVFILT_WRITE,
+                   EV_ADD | EV_ENABLE | EV_CLEAR, 0, 0, 0);
+       n++;
+
+       if (kevent(kq, ev, n, NULL, 0, NULL) < 0)
+               err(1, "kevent(). %s:%d", __FILE__, __LINE__);
+
+       if (pthread_mutex_lock(&mutex) == -1)
+               err(1, "pthread_mutex_lock");
+       waiting = 0;
+       if (pthread_cond_signal(&cond) == -1)
+               err(1, "pthread_cond_signal");
+       if (pthread_mutex_unlock(&mutex) == -1)
+               err(1, "pthread_mutex_unlock");
+
+       n = 0;
+       EV_SET(&ev[n], fd1[1], EVFILT_WRITE,
+                   EV_DELETE, 0, 0, 0);
+       n++;
+       if (kevent(kq, ev, n, NULL, 0, NULL) < 0)
+               err(1, "kevent(). %s:%d", __FILE__, __LINE__);
+       close(kq);
+
+//     printf("%s:%d\n", __FILE__, __LINE__); fflush(stdout);
+       return (0);
+}
+
+void *
+thr2(void *arg)
+{
+       if (pthread_mutex_lock(&mutex) == -1)
+               err(1, "pthread_mutex_lock");
+       while (waiting == 1) {
+               if (pthread_cond_wait(&cond, &mutex) == -1)
+                       err(1, "pthread_cond_wait");
+       }
+       if (pthread_mutex_unlock(&mutex) == -1)
+               err(1, "pthread_mutex_unlock");
+//     printf("%s:%d\n", __FILE__, __LINE__); fflush(stdout);
+       close(fd1[0]);
+       close(fd1[1]);
+       close(fd2[0]);
+       close(fd2[1]);
+       close(fd3[0]);
+       close(fd3[1]);
+       return (0);
+}
+
+int
+main(int argc, char **argv)
+{
+       pthread_t threads[2];
+       int r;
+       int i;
+
+       for (i = 0; i < 1000; i++) {
+               waiting = 1;
+//             printf("%s:%d\n", __FILE__, __LINE__); fflush(stdout);
+               if (pipe(fd1) == -1)
+                       err(1, "pipe()");
+               if (pipe(fd2) == -1)
+                       err(1, "pipe()");
+               if (pipe(fd3) == -1)
+                       err(1, "pipe()");
+
+               if (pthread_mutex_init(&mutex, 0) == -1)
+                       err(1, "pthread_mutex_init");
+               if (pthread_cond_init(&cond, NULL) == -1)
+                       err(1, "pthread_cond_init");
+
+               if ((r = pthread_create(&threads[0], NULL, thr1, 0)) != 0)
+                       err(1, "pthread_create(): %s\n", strerror(r));
+               if ((r = pthread_create(&threads[1], NULL, thr2, 0)) != 0)
+                       err(1, "pthread_create(): %s\n", strerror(r));
+
+               if (pthread_join(threads[0], NULL) != 0)
+                       err(1, "pthread_join(%d)", 0);
+               if (pthread_join(threads[1], NULL) != 0)
+                       err(1, "pthread_join(%d)", 1);
+               if (pthread_mutex_destroy(&mutex) == -1)
+                       err(1, "pthread_mutex_destroy");
+               if (pthread_cond_destroy(&cond) == -1)
+                       err(1, "pthread_condattr_destroy");
+       }
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/kevent2.sh b/test/stress/stress2/misc/kevent2.sh
new file mode 100755 (executable)
index 0000000..1d448ca
--- /dev/null
@@ -0,0 +1,175 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > kevent.c
+cc -o kevent -Wall kevent.c -pthread
+rm -f kevent.c
+cd $RUNDIR
+
+for i in `jot 10`; do
+       for j in `jot 12`; do
+               /tmp/kevent > /dev/null 2>&1 &
+       done
+       for j in `jot 12`; do
+               wait
+       done
+done
+exit
+EOF
+#include <pthread.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/event.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t  cond  = PTHREAD_COND_INITIALIZER;
+static int waiting;
+
+static int fd1[2];
+static int fd2[2];
+static int fd3[2];
+
+void *
+thr1(void *arg)
+{
+       int n;
+       int kq = -1;
+       struct kevent ev[3];
+       struct timespec ts;
+
+       if ((kq = kqueue()) < 0)
+               err(1, "kqueue(). %s:%d", __FILE__, __LINE__);
+
+       n = 0;
+       EV_SET(&ev[n], fd1[1], EVFILT_WRITE,
+                   EV_ADD | EV_ENABLE | EV_CLEAR, 0, 0, 0);
+       n++;
+       EV_SET(&ev[n], fd2[1], EVFILT_WRITE,
+                   EV_ADD | EV_ENABLE | EV_CLEAR, 0, 0, 0);
+       n++;
+       EV_SET(&ev[n], fd3[1], EVFILT_WRITE,
+                   EV_ADD | EV_ENABLE | EV_CLEAR, 0, 0, 0);
+       n++;
+
+       if (kevent(kq, ev, n, NULL, 0, NULL) < 0)
+               err(1, "kevent(). %s:%d", __FILE__, __LINE__);
+
+       if (pthread_mutex_lock(&mutex) == -1)
+               err(1, "pthread_mutex_lock");
+       waiting = 0;
+       if (pthread_cond_signal(&cond) == -1)
+               err(1, "pthread_cond_signal");
+       if (pthread_mutex_unlock(&mutex) == -1)
+               err(1, "pthread_mutex_unlock");
+
+       n = 0;
+       EV_SET(&ev[n], fd1[1], EVFILT_WRITE,
+                   EV_DELETE, 0, 0, 0);
+       n++;
+       ts.tv_sec = 0;
+       ts.tv_nsec = 0;
+       if (kevent(kq, ev, n, NULL, 0, &ts) < 0)
+               err(1, "kevent(). %s:%d", __FILE__, __LINE__);
+       close(kq);
+
+//     printf("%s:%d\n", __FILE__, __LINE__); fflush(stdout);
+       close(fd1[1]);
+       close(fd2[1]);
+       close(fd3[1]);
+       return (0);
+}
+
+void *
+thr2(void *arg)
+{
+       if (pthread_mutex_lock(&mutex) == -1)
+               err(1, "pthread_mutex_lock");
+       while (waiting == 1) {
+               if (pthread_cond_wait(&cond, &mutex) == -1)
+                       err(1, "pthread_cond_wait");
+       }
+       if (pthread_mutex_unlock(&mutex) == -1)
+               err(1, "pthread_mutex_unlock");
+//     printf("%s:%d\n", __FILE__, __LINE__); fflush(stdout);
+       close(fd1[0]);
+       close(fd2[0]);
+       close(fd3[0]);
+       return (0);
+}
+
+int
+main(int argc, char **argv)
+{
+       pthread_t threads[2];
+       int r;
+       int i;
+
+       for (i = 0; i < 1000; i++) {
+               waiting = 1;
+//             printf("%s:%d\n", __FILE__, __LINE__); fflush(stdout);
+               if (pipe(fd1) == -1)
+                       err(1, "pipe()");
+               if (pipe(fd2) == -1)
+                       err(1, "pipe()");
+               if (pipe(fd3) == -1)
+                       err(1, "pipe()");
+
+               if (pthread_mutex_init(&mutex, 0) == -1)
+                       err(1, "pthread_mutex_init");
+               if (pthread_cond_init(&cond, NULL) == -1)
+                       err(1, "pthread_cond_init");
+
+               if ((r = pthread_create(&threads[0], NULL, thr1, 0)) != 0)
+                       err(1, "pthread_create(): %s\n", strerror(r));
+               if ((r = pthread_create(&threads[1], NULL, thr2, 0)) != 0)
+                       err(1, "pthread_create(): %s\n", strerror(r));
+
+               if (pthread_join(threads[0], NULL) != 0)
+                       err(1, "pthread_join(%d)", 0);
+               if (pthread_join(threads[1], NULL) != 0)
+                       err(1, "pthread_join(%d)", 1);
+               if (pthread_mutex_destroy(&mutex) == -1)
+                       err(1, "pthread_mutex_destroy");
+               if (pthread_cond_destroy(&cond) == -1)
+                       err(1, "pthread_condattr_destroy");
+       }
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/kevent3.sh b/test/stress/stress2/misc/kevent3.sh
new file mode 100755 (executable)
index 0000000..4cc7d37
--- /dev/null
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > kevent.c
+cc -o kevent -Wall kevent.c -pthread
+rm -f kevent.c
+cd $RUNDIR
+
+for i in `jot 64`; do
+       for j in `jot 12`; do
+               /tmp/kevent > /dev/null 2>&1 &
+       done
+       for j in `jot 12`; do
+               wait
+       done
+done
+exit
+EOF
+/*
+ *  Obtained from:
+ *  http://projects.info-pull.com/mokb/MOKB-24-11-2006.html
+ */
+#include <sys/types.h>
+#include <sys/event.h>
+#include <sys/time.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int main(void)
+{
+       struct kevent ke;
+       int kq;
+       kq = kqueue();
+       EV_SET(&ke, getpid(), EVFILT_PROC, EV_ADD,
+               NOTE_EXIT|NOTE_EXEC|NOTE_TRACK, 0, NULL);
+       kevent(kq, &ke, 1, NULL, 0, NULL);
+       if (fork() != 0)
+               kevent(kq, NULL, 0, &ke, 1, NULL);
+       return (0);
+}
diff --git a/test/stress/stress2/misc/kevent4.sh b/test/stress/stress2/misc/kevent4.sh
new file mode 100755 (executable)
index 0000000..e782783
--- /dev/null
@@ -0,0 +1,202 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+# Test scenario by kib@
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > kevent.c
+cc -o kevent -Wall kevent.c -pthread
+rm -f kevent.c
+
+cd $odir/..
+export runRUNTIME=3m
+./run.sh &
+rpid=$!
+
+cd $RUNDIR
+/tmp/kevent $rpid &
+
+sleep 120
+kill $rpid
+kill $!
+rm -f /tmp/kevent
+
+exit
+EOF
+// $FreeBSD$
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/event.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifndef true
+# define true 1
+#endif
+
+int kq;
+
+void
+err(const char *msg, int err_no)
+{
+       fprintf(stderr, "%s: %s\n", msg, strerror(err_no));
+       exit(1);
+}
+
+void
+init_kq()
+{
+       kq = kqueue();
+       if (kq == -1)
+               err("kqueue", errno);
+}
+
+void
+add_watch(pid_t pid)
+{
+       struct kevent kev;
+       bzero(&kev, sizeof(kev));
+       kev.ident = pid;
+       kev.flags = EV_ADD | EV_ENABLE;
+       kev.filter = EVFILT_PROC;
+       kev.fflags = NOTE_EXIT | NOTE_FORK | NOTE_EXEC | NOTE_TRACK;
+
+       while (true) {
+               int res = kevent(kq, &kev, 1, NULL, 0, NULL);
+               if (res == -1) {
+                       if (errno == EINTR)
+                               continue;
+                       if (errno == ESRCH)
+                               break;
+
+                       int err_no = errno;
+                       char msg[64];
+                       snprintf(msg, sizeof(msg),
+                                "kevent - add watch for pid %u", pid);
+                       err(msg, err_no);
+               }
+               else
+                       break;
+       }
+}
+
+void
+del_watch(pid_t pid)
+{
+       struct kevent kev;
+       bzero(&kev, sizeof(kev));
+       kev.ident = pid;
+       kev.flags = EV_DELETE;
+       kev.filter = EVFILT_PROC;
+
+       while (true) {
+               int res = kevent(kq, &kev, 1, NULL, 0, NULL);
+               if (res == -1) {
+                       if (errno == EINTR)
+                               continue;
+                       if (errno == ESRCH)
+                               break;
+
+                       int err_no = errno;
+                       char msg[64];
+                       snprintf(msg, sizeof(msg),
+                                "kevent - del watch for pid %u", pid);
+                       err(msg, err_no);
+               }
+               else
+                       break;
+       }
+}
+
+void polling()
+{
+       struct kevent kev[10];
+       pid_t pid;
+       int i;
+
+       while (true) {
+               bzero(&kev, sizeof(kev));
+               int res = kevent(kq, NULL, 0, kev,
+                                sizeof(kev) / sizeof(kev[0]), NULL);
+               if (res == -1) {
+                       if (errno == EINTR)
+                               continue;
+
+                       if (errno == ESRCH)
+                               continue;
+
+                       err("kevent", errno);
+               }
+
+               for (i = 0; i < res; i++) {
+                       pid = kev[i].ident;
+                       if (kev[i].fflags & NOTE_CHILD) {
+                               add_watch(pid);
+                               printf("%u - new process, parent %u\n", pid, kev[i].data);
+                       }
+                       if (kev[i].fflags & NOTE_FORK) {
+                               printf("%u forked\n", pid);
+                       }
+                       if (kev[i].fflags & NOTE_EXEC) {
+                               printf("%u called exec\n", pid);
+                       }
+                       if (kev[i].fflags & NOTE_EXIT) {
+                               printf("%u exited\n", pid);
+//                             del_watch(pid);
+                       }
+                       if (kev[i].fflags & NOTE_TRACK) {
+                               printf("%u forked - track\n", pid);
+                       }
+                       if (kev[i].fflags & NOTE_TRACKERR) {
+                               fprintf(stderr, "%u - track error\n", pid);
+                       }
+               }
+       }
+}
+
+int main(int argc, char *argv[])
+{
+       if (argc != 2) {
+               fprintf(stderr, "pid ?\n");
+               return (2);
+       }
+       pid_t parent = atoi(argv[1]);
+
+       init_kq();
+       add_watch(parent);
+       polling();
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/kevent5.sh b/test/stress/stress2/misc/kevent5.sh
new file mode 100755 (executable)
index 0000000..d3ff75a
--- /dev/null
@@ -0,0 +1,161 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+# Test EVFILT_VNODE. Found page fault in knlist_add+0x39
+#
+# Test scenario by kib@
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > kevent.c
+cc -o kevent -Wall kevent.c
+rm -f kevent.c
+
+cd $RUNDIR/..
+/tmp/kevent xxx yyy
+
+rm -f /tmp/kevent
+
+exit
+EOF
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/event.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+static char *file1, *file2;
+
+#define N 1000
+
+
+void
+test(test) {
+       int kq = -1;
+       int n;
+       struct kevent ev[2];
+       int fd;
+
+       if ((fd = open(file1, O_RDONLY, 0)) == -1)
+               err(1, "open(%s)(2)", file1);
+
+       if ((kq = kqueue()) < 0)
+               err(1, "kqueue()");
+
+       n = 0;
+       EV_SET(&ev[n], fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR,
+               NOTE_DELETE, 0, 0);
+       n++;
+
+       if (kevent(kq, ev, n, NULL, 0, NULL) < 0)
+               err(1, "kevent()");
+
+       memset(&ev, 0, sizeof(ev));
+       n = kevent(kq, NULL, 0, ev, 1, NULL);
+//     printf("Event 1\n");
+       close(fd);
+       close(kq);
+
+/* Once the rendezvous file is gone create a new kevent */
+
+       if ((fd = open(file2, O_RDONLY, 0)) == -1)
+               err(1, "open(%s)(2)", file2);
+
+       if ((kq = kqueue()) < 0)
+               err(1, "kqueue()");
+
+       n = 0;
+       EV_SET(&ev[n], fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR,
+               NOTE_DELETE, 0, 0);
+       n++;
+
+       if (kevent(kq, ev, n, NULL, 0, NULL) < 0)
+               err(1, "kevent()");
+
+       memset(&ev, 0, sizeof(ev));
+       n = kevent(kq, NULL, 0, ev, 1, NULL);
+//     printf("Event 2\n");
+       close(fd);
+       close(kq);
+}
+
+int
+main(int argc, char **argv) {
+       int i, j;
+       int fd;
+       int status;
+
+       if (argc != 3) {
+               fprintf(stderr, "Usage: %s <rendezvous file> <tail file>\n", argv[0]);
+               return (1);
+       }
+       file1 = argv[1];
+       file2 = argv[2];
+
+       for (j = 0; j < 100; j++) {
+               if ((fd = open(file1, O_CREAT | O_TRUNC | O_RDWR, 0660)) == -1)
+                       err(1, "open(%s)", file1);
+               close(fd);
+               if ((fd = open(file2, O_CREAT | O_TRUNC | O_RDWR, 0660)) == -1)
+                       err(1, "open(%s)", file2);
+               close(fd);
+
+               for (i = 0; i < N; i++) {
+                       if (fork() == 0) {
+                               test();
+                               return (0);
+                       }
+               }
+
+               sleep(1);
+               if (unlink(file1) == -1)
+                       err(1, "unlink(%s). %s:%d\n", file1, __FILE__, __LINE__);
+               sleep(1);
+               if (unlink(file2) == -1)
+                       err(1, "unlink(%s). %s:%d\n", file2, __FILE__, __LINE__);
+
+               for (i = 0; i < N; i++) {
+                       if (wait(&status) == -1)
+                               err(1, "wait(), %s:%d", __FILE__, __LINE__);
+               }
+       }
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/kinfo.sh b/test/stress/stress2/misc/kinfo.sh
new file mode 100755 (executable)
index 0000000..2f33255
--- /dev/null
@@ -0,0 +1,164 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test scenario by marcus@freebsd.org
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+odir=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > kinfo.c
+cc -o kinfo -Wall kinfo.c -lutil
+rm -f kinfo.c
+
+mount | grep -q procfs || mount -t procfs procfs /procfs
+for i in `jot 30`; do
+       for j in `jot 5`; do
+               /tmp/kinfo &
+       done
+
+       for j in `jot 5`; do
+               wait
+       done
+done
+
+rm -f /tmp/kinfo
+exit
+EOF
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/sysctl.h>
+#include <sys/param.h>
+#include <sys/user.h>
+#include <sys/signal.h>
+#include <fcntl.h>
+#include <err.h>
+#include <strings.h>
+#include <sys/wait.h>
+#include <libutil.h>
+
+char buf[8096];
+
+void
+handler(int i) {
+       exit(0);
+}
+
+/* Stir /dev/proc */
+int
+churning(void) {
+       pid_t r;
+       int fd, status;
+
+       for (;;) {
+               r = fork();
+               if (r == 0) {
+                       if ((fd = open("/proc/curproc/mem", O_RDONLY)) == -1)
+                               err(1, "open(/proc/curproc/mem)");
+                       bzero(buf, sizeof(buf));
+                       exit(0);
+               }
+               if (r < 0) {
+                       perror("fork");
+                       exit(2);
+               }
+               wait(&status);
+       }
+}
+
+/* Get files for each proc */
+void
+list(void)
+{
+        struct kinfo_file *freep;
+       struct kinfo_vmentry *freep_vm;
+       long i;
+       int cnt, name[4];
+       struct kinfo_proc *kipp;
+       size_t len;
+
+       name[0] = CTL_KERN;
+       name[1] = KERN_PROC;
+       name[2] = KERN_PROC_PROC;
+
+       len = 0;
+       if (sysctl(name, 3, NULL, &len, NULL, 0) < 0)
+               err(-1, "sysctl: kern.proc.all");
+
+       kipp = malloc(len);
+       if (kipp == NULL)
+               err(1, "malloc");
+
+       if (sysctl(name, 3, kipp, &len, NULL, 0) < 0) {
+               free(kipp);
+//             warn("sysctl: kern.proc.all");
+               return;
+       }
+
+       for (i = 0; i < len / sizeof(*kipp); i++) {
+
+               /* The test starts here */
+               freep = kinfo_getfile(kipp[i].ki_pid, &cnt);
+               free(freep);
+
+               freep_vm = kinfo_getvmmap(kipp[i].ki_pid, &cnt);
+               free(freep_vm);
+               /* End test */
+       }
+       free(kipp);
+}
+
+int
+main(int argc, char **argv)
+{
+       pid_t r;
+       signal(SIGALRM, handler);
+       alarm(60);
+
+       if ((r = fork()) == 0) {
+               alarm(60);
+               for (;;)
+                       churning();
+       }
+       if (r < 0) {
+               perror("fork");
+               exit(2);
+       }
+
+       for (;;)
+               list();
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/kinfo2.sh b/test/stress/stress2/misc/kinfo2.sh
new file mode 100755 (executable)
index 0000000..941b413
--- /dev/null
@@ -0,0 +1,176 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test scenario by marcus@freebsd.org
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+odir=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > kinfo.c
+cc -o kinfo -Wall kinfo.c -lutil
+rm -f kinfo.c
+
+mount | grep -q procfs || mount -t procfs procfs /procfs
+for i in `jot 30`; do
+       for j in `jot 5`; do
+               /tmp/kinfo &
+       done
+
+       for j in `jot 5`; do
+               wait
+       done
+done
+
+rm -f /tmp/kinfo
+exit
+EOF
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/signal.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <err.h>
+#include <strings.h>
+#include <sys/wait.h>
+#include <libutil.h>
+
+char buf[8096];
+
+void
+handler(int i) {
+       exit(0);
+}
+
+/* Stir /dev/proc */
+int
+churning(void) {
+       pid_t r;
+       int fd, status;
+
+       for (;;) {
+               r = fork();
+               if (r == 0) {
+                       if ((fd = open("/proc/curproc/mem", O_RDONLY)) == -1)
+                               err(1, "open(/proc/curproc/mem)");
+                       bzero(buf, sizeof(buf));
+                       exit(0);
+               }
+               if (r < 0) {
+                       perror("fork");
+                       exit(2);
+               }
+               wait(&status);
+       }
+}
+
+/* Get files for each proc */
+void
+list(void)
+{
+       int cnt, fd, n;
+       int space = sizeof(buf);
+       long base;
+       struct dirent *dp;
+        struct kinfo_file *freep;
+       struct kinfo_vmentry *freep_vm;
+       char *bp = buf;
+       pid_t pid;
+       long l;
+       char *dummy;
+
+       if ((fd = open("/proc", O_RDONLY)) == -1)
+               err(1, "open(%s)", "/proc");
+
+       do {
+               if ((n = getdirentries(fd, bp, space, &base)) == -1)
+                       err(1, "getdirentries");
+               space = space - n;
+               bp   = bp + n;
+       } while (n != 0);
+       close(fd);
+
+       bp = buf;
+       dp = (struct dirent *)bp;
+       for (;;) {
+#if 0
+               printf("name: %-10s, inode %7d, type %2d, namelen %d, d_reclen %d\n",
+                               dp->d_name, dp->d_fileno, dp->d_type, dp->d_namlen,
+                               dp->d_reclen); fflush(stdout);
+#endif
+
+               if (dp->d_type == DT_DIR &&
+                               (dp->d_name[0] >= '0' && dp->d_name[0] <= '9')) {
+                       l = strtol(dp->d_name, &dummy, 10);
+                       pid = l;
+
+                       /* The tests start here */
+                       freep = kinfo_getfile(pid, &cnt);
+                       free(freep);
+
+                       freep_vm = kinfo_getvmmap(pid, &cnt);
+                       free(freep_vm);
+                       /* End test */
+               }
+
+               bp = bp + dp->d_reclen;
+               dp = (struct dirent *)bp;
+               if (dp->d_reclen <= 0)
+                       break;
+       }
+}
+
+int
+main(int argc, char **argv)
+{
+       pid_t r;
+       signal(SIGALRM, handler);
+       alarm(60);
+
+       if ((r = fork()) == 0) {
+               alarm(60);
+               for (;;)
+                       churning();
+       }
+       if (r < 0) {
+               perror("fork");
+               exit(2);
+       }
+
+       for (;;)
+               list();
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/kinfo3.sh b/test/stress/stress2/misc/kinfo3.sh
new file mode 100755 (executable)
index 0000000..a8d4d3c
--- /dev/null
@@ -0,0 +1,191 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test scenario by marcus@freebsd.org and kib@freebsd.org
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+odir=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > kinfo.c
+cc -o kinfo -Wall kinfo.c -lutil -pthread
+rm -f kinfo.c
+
+mount | grep -q procfs || mount -t procfs procfs /procfs
+for i in `jot 30`; do
+       for j in `jot 5`; do
+               /tmp/kinfo &
+       done
+
+       for j in `jot 5`; do
+               wait
+       done
+done
+
+rm -f /tmp/kinfo
+exit
+EOF
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/sysctl.h>
+#include <sys/param.h>
+#include <sys/user.h>
+#include <sys/signal.h>
+#include <fcntl.h>
+#include <err.h>
+#include <strings.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <libutil.h>
+#include <pthread.h>
+
+char buf[8096];
+
+void
+handler(int i) {
+       exit(0);
+}
+
+void *
+thr(void *arg)
+{
+       int fd;
+       if ((fd = open("/proc/curproc/mem", O_RDONLY)) == -1)
+               err(1, "open(/proc/curproc/mem)");
+       close(fd);
+       return (0);
+}
+
+
+/* Stir /dev/proc */
+int
+churning(void) {
+       int i;
+       pid_t r;
+       int status;
+       pthread_t threads[5];
+
+
+       for (;;) {
+               r = fork();
+               if (r == 0) {
+                       for (i = 0; i < 5; i++) {
+                               if ((r = pthread_create(&threads[i], NULL, thr, 0)) != 0)
+                                       err(1, "pthread_create(): %s\n", strerror(r));
+                       }
+                       for (i = 0; i < 5; i++) {
+                               if (pthread_join(threads[i], NULL) != 0)
+                                               err(1, "pthread_join(%d)", 0);
+                       }
+
+                       bzero(buf, sizeof(buf));
+                       exit(0);
+               }
+               if (r < 0) {
+                       perror("fork");
+                       exit(2);
+               }
+               wait(&status);
+       }
+}
+
+/* Get files for each proc */
+void
+list(void)
+{
+        struct kinfo_file *freep, *kif;
+       struct kinfo_vmentry *freep_vm;
+       long i, j;
+       int cnt, name[4];
+       struct kinfo_proc *kipp;
+       size_t len;
+
+       name[0] = CTL_KERN;
+       name[1] = KERN_PROC;
+       name[2] = KERN_PROC_PROC;
+
+       len = 0;
+       if (sysctl(name, 3, NULL, &len, NULL, 0) < 0)
+               err(-1, "sysctl: kern.proc.all");
+
+       kipp = malloc(len);
+       if (kipp == NULL)
+               err(1, "malloc");
+
+       if (sysctl(name, 3, kipp, &len, NULL, 0) < 0) {
+               free(kipp);
+//             warn("sysctl: kern.proc.all");
+               return;
+       }
+
+       for (i = 0; i < len / sizeof(*kipp); i++) {
+
+               /* The test starts here */
+               freep = kinfo_getfile(kipp[i].ki_pid, &cnt);
+               for (j = 0; j < cnt && freep; j++) {
+                       kif = &freep[j];
+//                     printf("%d : %s\n", kif->kf_fd, kif->kf_path);
+               }
+               free(freep);
+
+               freep_vm = kinfo_getvmmap(kipp[i].ki_pid, &cnt);
+               free(freep_vm);
+               /* End test */
+       }
+       free(kipp);
+}
+
+int
+main(int argc, char **argv)
+{
+       pid_t r;
+       signal(SIGALRM, handler);
+       alarm(30);
+
+       if ((r = fork()) == 0) {
+               alarm(30);
+               for (;;)
+                       churning();
+       }
+       if (r < 0) {
+               perror("fork");
+               exit(2);
+       }
+
+       for (;;)
+               list();
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/ldt.sh b/test/stress/stress2/misc/ldt.sh
new file mode 100755 (executable)
index 0000000..e6910e2
--- /dev/null
@@ -0,0 +1,369 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test the amd64 implementation of:
+# 1. Per-process private ldt and corresponding i386 arch syscalls.
+# 2. Per-process private io permission bitmap and corresponding
+#    i386 arch syscalls.
+# 3. Sigcontext
+
+# The tests must be compiled on i386 and run on amd64
+
+# All tests by kib@
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+cd /tmp
+if [ "`uname -p`" = "i386" ]; then
+       cat > ldt.c <<EOF
+/* \$Id: ldt.c,v 1.8 2008/11/01 21:14:59 kostik Exp kostik \$ */
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <machine/segments.h>
+#include <machine/sysarch.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+char stack[64 * 1024];
+
+char a[1];
+
+int
+s2ds(int sel)
+{
+
+       return (LSEL(sel, SEL_UPL));
+}
+
+unsigned char
+readbyte(int sel, int offset)
+{
+       unsigned char res;
+
+       __asm__ volatile(
+           "\tpushl    %%es\n"
+           "\tmovl     %1,%%es\n"
+           "\tmovb     %%es:(%2),%0\n"
+           "\tpopl     %%es\n"
+           : "=r"(res) : "r"(s2ds(sel)), "r"(offset));
+
+       return (res);
+}
+
+void
+writebyte(int sel, int offset, unsigned char val)
+{
+
+       __asm__ volatile(
+           "\tpushl    %%es\n"
+           "\tmovl     %0,%%es\n"
+           "\tmovb     %2,%%es:(%1)\n"
+           "\tpopl     %%es\n"
+           : : "r"(s2ds(sel)), "r"(offset), "r"(val) : "memory");
+}
+
+int
+alloc_sel(char *base, size_t len, int type, int p)
+{
+       int sel;
+       union descriptor descs[1], descsk[1];
+       uintptr_t pb;
+
+       memset(descs, 0, sizeof(descs));
+       if (len > PAGE_SIZE) {
+               len = roundup(len, PAGE_SIZE);
+               len /= PAGE_SIZE;
+               descs[0].sd.sd_lolimit = len & 0xffff;
+               descs[0].sd.sd_hilimit = (len >> 16) & 0xf;
+               descs[0].sd.sd_gran = 1;
+       } else {
+               descs[0].sd.sd_lolimit = len;
+               descs[0].sd.sd_hilimit = 0;
+               descs[0].sd.sd_gran = 0;
+       }
+       pb = (uintptr_t)base;
+       descs[0].sd.sd_lobase = pb & 0xffffff;
+       descs[0].sd.sd_hibase = (pb >> 24) & 0xff;
+       descs[0].sd.sd_type = type;
+       descs[0].sd.sd_dpl = SEL_UPL;
+       descs[0].sd.sd_p = p;
+       descs[0].sd.sd_def32 = 1;
+
+       if ((sel = i386_set_ldt(LDT_AUTO_ALLOC, descs, 1)) == -1)
+               fprintf(stderr, "i386_set_ldt: %s\n", strerror(errno));
+       else if (i386_get_ldt(sel, descsk, 1) == -1) {
+               fprintf(stderr, "i386_get_ldt: %s\n", strerror(errno));
+               sel = -1;
+       } else if (memcmp(descs, descsk, sizeof(descs)) != 0) {
+               fprintf(stderr, "descs != descsk\n");
+               sel = -1;
+       } else
+               fprintf(stderr, "selector %d\n", sel);
+
+       return (sel);
+}
+
+int
+test1(int tnum, int sel)
+{
+       unsigned char ar;
+
+       writebyte(sel, 0, '1');
+       ar = readbyte(sel, 0);
+       if (ar == '1')
+               fprintf(stderr, "test %d.1 ok\n", tnum);
+       else
+               fprintf(stderr, "test%d.1 failed, ar %x\n", tnum, ar);
+       writebyte(sel, 0, '2');
+       ar = readbyte(sel, 0);
+       if (ar == '2')
+               fprintf(stderr, "test %d.2 ok\n", tnum);
+       else
+               fprintf(stderr, "test%d.2 failed, ar %x\n", tnum, ar);
+       return (sel);
+}
+
+int
+test2_func(void *arg)
+{
+       int *sel;
+
+       sel = arg;
+       test1(2, *sel);
+       rfork(0);
+       test1(3, *sel);
+       return (0);
+}
+
+void
+test2(int sel)
+{
+       pid_t r;
+       int status;
+
+       r = rfork_thread(RFPROC | RFMEM, stack + sizeof(stack),
+           test2_func, &sel);
+       if (r == -1) {
+               fprintf(stderr, "rfork(RFPROC): %s\n", strerror(errno));
+               return;
+       } else {
+               waitpid(r, &status, 0);
+               if (WIFSIGNALED(status)) {
+                       fprintf(stderr, "test2: child terminated by %s\n",
+                           strsignal(WTERMSIG(status)));
+               }
+       }
+}
+
+int
+main(int argc, char *argv[])
+{
+       int sel;
+
+       sel = alloc_sel(a, 1, SDT_MEMRWA, 1);
+       if (sel == -1)
+               return (1);
+
+       test1(1, sel);
+       test2(sel);
+       return (0);
+}
+EOF
+       cc -o ldt_static_i386 -Wall -static ldt.c
+       rm ldt.c
+
+       cat > ioperm.c <<EOF
+/* \$Id: ioperm.c,v 1.3 2008/11/02 15:43:33 kostik Exp \$ */
+
+#include <machine/sysarch.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static const unsigned int port_num = 0x130;
+
+unsigned char
+inb(unsigned int port)
+{
+       unsigned char data;
+
+       __asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port));
+       return (data);
+}
+
+void
+sigbus_handler(int signo)
+{
+
+       fprintf(stderr, "Got SIGBUS\n");
+       exit(0);
+}
+
+int
+main(int argc, char *argv[])
+{
+       struct sigaction sa;
+       unsigned int length1;
+       int enable1;
+
+       if (i386_get_ioperm(port_num, &length1, &enable1) == -1) {
+               fprintf(stderr, "get 1: %s\n", strerror(errno));
+               return (1);
+       }
+       if (length1 != 0 && enable1 != 0) {
+               fprintf(stderr, "enable1: enabled\n");
+               return (1);
+       }
+       if (i386_set_ioperm(port_num, 1, 1) == -1) {
+               fprintf(stderr, "set 1: %s\n", strerror(errno));
+               return (1);
+       }
+       inb(port_num);
+       if (i386_set_ioperm(port_num, 1, 0) == -1) {
+               fprintf(stderr, "set 2: %s\n", strerror(errno));
+               return (1);
+       }
+       if (i386_get_ioperm(port_num, &length1, &enable1) == -1) {
+               fprintf(stderr, "get 1: %s\n", strerror(errno));
+               return (1);
+       }
+       if (enable1 != 0) {
+               fprintf(stderr, "enable2: enabled\n");
+               return (1);
+       }
+       fprintf(stderr, "And now we should get SIGBUS\n");
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_handler = sigbus_handler;
+       if (sigaction(SIGBUS, &sa, NULL) == -1) {
+               fprintf(stderr, "sigaction(SIGBUS): %s\n", strerror(errno));
+               return (1);
+       }
+       inb(port_num);
+
+       return (0);
+}
+EOF
+       cc -o ioperm_static_i386 -Wall -static ioperm.c
+       rm ioperm.c
+
+       cat > fault.c <<EOF
+/* \$Id: fault.c,v 1.5 2008/10/28 17:39:16 kostik Exp \$ */
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/ucontext.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+extern char *fault_instr;
+int run;
+
+void
+sigsegv_sigaction(int signo, siginfo_t *si, void *c)
+{
+       ucontext_t *uc;
+       mcontext_t *mc;
+
+       uc = c;
+       mc = &uc->uc_mcontext;
+       printf("SIGSEGV run %d err %x ds %x ss %x es %x fs %x gs %x\n",
+           run, mc->mc_err, mc->mc_ds, mc->mc_ss, mc->mc_es, mc->mc_fs,
+           mc->mc_gs);
+       switch (run) {
+       case 0:
+               mc->mc_ds = 0x1111;
+               break;
+       case 1:
+               mc->mc_es = 0x1111;
+               break;
+       case 2:
+               mc->mc_fs = 0x1111;
+               break;
+       case 3:
+               mc->mc_gs = 0x1111;
+               break;
+       case 4:
+               mc->mc_ss = 0x1111;
+               break;
+       case 5:
+               _exit(11);
+       }
+       run++;
+}
+
+void
+fault(void)
+{
+
+       __asm__ volatile(".globl\tfault_instr;fault_instr:\ttestl\t\$0,0\n");
+}
+
+int
+main(int argc, char *argv[])
+{
+       struct sigaction sa;
+
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_sigaction = sigsegv_sigaction;
+       sa.sa_flags = SA_SIGINFO;
+       if (sigaction(SIGSEGV, &sa, NULL) == -1) {
+               fprintf(stderr, "sigaction: %s\n", strerror(errno));
+               return (1);
+       }
+       if (sigaction(SIGBUS, &sa, NULL) == -1) {
+               fprintf(stderr, "sigaction: %s\n", strerror(errno));
+               return (1);
+       }
+
+       fault();
+
+       return (0);
+}
+EOF
+       cc -o fault_static_i386 -Wall -static fault.c
+       rm fault.c
+fi
+
+if [ "`uname -p`" = "amd64" ]; then
+       [ -x ldt_static_i386 ]    && ./ldt_static_i386
+       [ -x ioperm_static_i386 ] && ./ioperm_static_i386
+       [ -x fault_static_i386 ]  && ./fault_static_i386
+fi
diff --git a/test/stress/stress2/misc/ldt2.sh b/test/stress/stress2/misc/ldt2.sh
new file mode 100755 (executable)
index 0000000..dfe3506
--- /dev/null
@@ -0,0 +1,102 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+# Test the implementation of i386_get_ldt() and i386_set_ldt() for 32 bit
+# processes on amd64 by running wine and mplayer with a 32 bit codec.
+
+# This is not a test script, but more of a howto document.
+
+[ `uname -p` != "amd64" ] && echo "Must run on amd64" && exit
+
+exit 0
+
+This are notes of how to perform the test.
+
+
+First of all you will need a i386 jail on amd64. This could be build like
+this:
+
+cat > jailbuild.sh <<EOF
+#!/bin/sh
+
+jail=/var/tmp/jail2 # Change this
+
+mount | grep $jail | grep -q devfs && umount $jail/dev
+
+here=`pwd`
+chflags -R 0 $jail
+rm -rf $jail
+mkdir -p $jail
+
+cd /var/tmp/deviant2 # You will need to change this!
+make -j4 TARGET=i386 TARGET_ARCH=i386 DESTDIR=$jail world
+make     TARGET=i386 TARGET_ARCH=i386 DESTDIR=$jail distribution
+
+mount -t devfs devfs $jail/dev
+
+cp /etc/fstab /etc/hosts /etc/resolv.conf $jail/etc
+cp /boot/kernel/kernel $jail/boot/kernel
+EOF
+
+Before changing to the jail you may need these files:
+- Fetch the Firefox i386 installer. (http://www.mozilla.com)
+- Fetch a clip for a win32 codec:
+  ftp http://www.jhepple.com/support/SampleMovies/Real_Media.rm
+
+and place these in for examle $jail/root
+
+
+Chroot to /var/tmp/jail /bin/sh
+
+1) Install wine. For example by "UNAME_m=i386 pkg_add -r wine"
+3) Run wine on the Firefox installer.
+
+
+The mplayer test:
+
+It would seem that the default build of mplayer does not contain
+the i386 codec, so you have to build mplayer your self with option
+"Enable win32 codec set on the IA32 arch".
+Remember to set the environment variable UNAME_m to "i386".
+
+cat > mplayer.sh <<EOF
+#!/bin/sh
+
+export DISPLAY=<your display host goes here>:0
+while true;do
+       pos=100
+       for i in `jot 5`; do
+               mplayer -vc rv40win -geometry $pos:$pos /root/samples/Real_Media.rm < \
+                       /dev/null > /dev/null 2>&1 &
+               pos=$((pos + 50))
+       done
+       for i in `jot 5`; do
+               wait
+       done
+done
+EOF
diff --git a/test/stress/stress2/misc/libMicro.sh b/test/stress/stress2/misc/libMicro.sh
new file mode 100755 (executable)
index 0000000..17961a8
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test using OpenSolaris libmicro-0.4.0.tar.gz benchmark
+# Has shown page fault with the cascade_lockf test
+
+. ../default.cfg
+
+odir=`pwd`
+
+cd $RUNDIR
+ftp http://www.opensolaris.org/os/project/libmicro/files/libmicro-0.4.0.tar.gz
+[ ! -r libmicro-0.4.0.tar.gz ] && exit 1
+tar zxfv libmicro-0.4.0.tar.gz
+cat > $RUNDIR/libMicro-0.4.0/Makefile.FreeBSD <<2EOF
+CC=            gcc
+
+CFLAGS=                -pthread
+CPPFLAGS=      -DUSE_SEMOP -D_REENTRANT
+MATHLIB=       -lm
+
+ELIDED_BENCHMARKS= \
+       cachetocache \
+       atomic
+
+
+include ../Makefile.com
+2EOF
+
+cd libMicro-0.4.0
+gmake
+ed bench <<3EOF
+/ARCH
+s/arch -k/uname -m/
+w
+q
+3EOF
+./bench > output &
+for i in `jot $((30 * 60))`; do
+       ps | grep -q bench || break
+       sleep 1
+done
+ps | grep bin/connection | grep -v grep | awk '{print $1}' | xargs kill        # hack
+cd ..;rm -rf libMicro-0.4.0
diff --git a/test/stress/stress2/misc/lockf.sh b/test/stress/stress2/misc/lockf.sh
new file mode 100755 (executable)
index 0000000..2acc762
--- /dev/null
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Page fault in nfs_advlock
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+trap "rm -f /tmp/$0.$$.*" 0
+mount | grep "$mntpoint" | grep nfs > /dev/null && umount $mntpoint
+
+for i in `jot 100`; do
+       mount -t nfs -o tcp -o retrycnt=3 -o intr -o soft -o rw 127.0.0.1:/tmp $mntpoint
+
+       for j in `jot 50`; do
+#              sh -c "lockf -t 10 $mntpoint/$0.$$.$j sleep 3" &
+               lockf -t 10 $mntpoint/$0.$$.$j sleep 3 &
+       done
+
+       while mount | grep -q ${mntpoint}; do
+               umount -f $mntpoint > /dev/null 2>&1
+       done
+       for j in `jot 50`; do
+               wait
+       done
+done
diff --git a/test/stress/stress2/misc/lookup_shared.sh b/test/stress/stress2/misc/lookup_shared.sh
new file mode 100755 (executable)
index 0000000..f18aea0
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+saved=`sysctl vfs.lookup_shared | awk '{print $NF}'`
+
+export runRUNTIME=10m            # Run tests for 10 minutes
+for i in 1 0; do
+   sysctl vfs.lookup_shared=$i
+   (cd /home/pho/stress2; ./run.sh disk.cfg)
+done
+
+sysctl vfs.lookup_shared=$saved
diff --git a/test/stress/stress2/misc/mac.sh b/test/stress/stress2/misc/mac.sh
new file mode 100755 (executable)
index 0000000..b85d476
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+if sysctl security.mac.test 2>&1 | grep -q unknown; then
+   echo "Kernel must be configured with MAC and MAC_TEST!"
+   exit 1
+fi
+
+./crossmp.sh
+
+sysctl security.mac.test
diff --git a/test/stress/stress2/misc/mac_chkexec.sh b/test/stress/stress2/misc/mac_chkexec.sh
new file mode 100755 (executable)
index 0000000..b29315e
--- /dev/null
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Regression test for panic in second ls
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+sysctl -a | ! grep -q security.mac.chkexec && echo "chkexec.ko must be loaded" && exit 1
+
+mount | grep "${mntpoint}" | grep -q md${mdstart}${part} && umount $mntpoint
+mdconfig -l | grep -q md$mdstart &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t swap -s 12m -u $mdstart
+bsdlabel -w md$mdstart auto
+
+newfs md${mdstart}${part} > /dev/null
+tunefs -l enable /dev/md${mdstart}${part}
+mount /dev/md${mdstart}${part} $mntpoint
+
+cp /bin/ls $mntpoint
+setfmac chkexec/md5:`md5 -q $mntpoint/ls` $mntpoint/ls
+sysctl security.mac.chkexec.enforce=1
+$mntpoint/ls $mntpoint/ls
+setfmac chkexec/none $mntpoint/ls
+$mntpoint/ls $mntpoint/ls
+sysctl security.mac.chkexec.enforce=0
+
+umount $mntpoint
+mdconfig -d -u $mdstart
diff --git a/test/stress/stress2/misc/md.sh b/test/stress/stress2/misc/md.sh
new file mode 100755 (executable)
index 0000000..26420fa
--- /dev/null
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Caused panic: ffs_truncate3
+# The problem is caused by a full FS with Soft-updates disabled.
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+mount | grep "${mntpoint}" | grep md${mdstart}${part} > /dev/null && umount ${mntpoint}
+mdconfig -l | grep md${mdstart} > /dev/null &&  mdconfig -d -u ${mdstart}
+
+mdconfig -a -t swap -s 2m -u ${mdstart}
+bsdlabel -w md${mdstart} auto
+newfs md${mdstart}${part} > /dev/null
+mount /dev/md${mdstart}${part} ${mntpoint}
+
+export RUNDIR=${mntpoint}/stressX
+export KBLOCKS=30000           # Exaggerate disk capacity
+export INODES=8000
+
+for i in `jot 500`; do
+   (cd ../testcases/rw;./rw -t 2m -i 20)
+done
+
+while mount | grep -q ${mntpoint}; do
+   umount $([ $((`date '+%s'` % 2)) -eq 0 ] && echo "-f" || echo "") ${mntpoint} > /dev/null 2>&1
+done
+
+mdconfig -d -u ${mdstart}
diff --git a/test/stress/stress2/misc/md2.sh b/test/stress/stress2/misc/md2.sh
new file mode 100755 (executable)
index 0000000..dff6246
--- /dev/null
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# panic: ufs_dirbad: /mnt: bad dir ino 32899 at offset 16896: mangled entry
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+mount | grep "$mntpoint" | grep md${mdstart} > /dev/null && umount $mntpoint
+mdconfig -l | grep md${mdstart} > /dev/null &&  mdconfig -d -u ${mdstart}
+
+mdconfig -a -t malloc -s 256m -u ${mdstart}
+
+for i in 1 2; do
+       newfs -O$i -i1024 /dev/md${mdstart} > /dev/null 2>&1
+       mount /dev/md${mdstart} ${mntpoint}
+       df -i $mntpoint
+
+       export RUNDIR=$mntpoint/stressX
+       export runRUNTIME=10m
+       cd /home/pho/stress2; ./run.sh
+
+       umount ${mntpoint}
+done
+mdconfig -d -u $mdstart
diff --git a/test/stress/stress2/misc/md3.sh b/test/stress/stress2/misc/md3.sh
new file mode 100755 (executable)
index 0000000..7deaab5
--- /dev/null
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $Id: nfs.sh,v 1.2 2008/02/25 16:31:43 pho Exp $
+#
+
+# Test scenario for deadlock fixed in r200447
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+mount | grep -q "$mntpoint" && umount $mntpoint
+mdconfig -l | grep -q $mdstart &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t swap -s 1400m -u $mdstart
+bsdlabel -w md${mdstart} auto
+
+newfs -U md5${part} > /dev/null
+mount /dev/md5${part} /mnt
+
+# Stop FS "out of inodes" problem by only using 70%
+set `df -ik /mnt | tail -1 | awk '{print $4,$7}'`
+export KBLOCKS=$(($1 / 10 * 7))
+export INODES=$(($2 / 10 * 7))
+
+export RUNDIR=$mntpoint/stressX
+export runRUNTIME=10m
+
+(cd /home/pho/stress2; ./run.sh marcus.cfg)
+
+umount $mntpoint
+mount | grep -q "$mntpoint" && umount -f $mntpoint
+mdconfig -d -u $mdstart
diff --git a/test/stress/stress2/misc/mlockall.sh b/test/stress/stress2/misc/mlockall.sh
new file mode 100755 (executable)
index 0000000..fed9ec1
--- /dev/null
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# "panic: swap_reserved < decr" seen. Fixed in r195329
+
+. ../default.cfg
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+odir=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > mlockall.c
+cc -o mlockall -Wall mlockall.c
+rm -f mlockall.c
+
+for i in `jot 10`; do
+       /tmp/mlockall &
+       sleep 1
+       ps | grep /tmp/mlockall | grep -v grep | awk '{print $1}' | while read pid; do
+               kill -2 $pid
+               kill -9 $pid
+       done
+done
+
+rm -f /tmp/mlockall
+exit
+EOF
+#include <err.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+void
+child(void)
+{
+       if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1)
+               err(1, "mlockall(MCL_CURRENT | MCL_FUTURE)");
+       fork();
+       sleep(60);
+}
+
+int
+main(int argc, char **argv)
+{
+       int status;
+
+       if (fork() == 0)
+               child();
+       wait(&status);
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/mmap.sh b/test/stress/stress2/misc/mmap.sh
new file mode 100755 (executable)
index 0000000..bccdf11
--- /dev/null
@@ -0,0 +1,66 @@
+#!/bin/sh
+
+#
+# $FreeBSD$
+#
+
+# Test scenario by Michiel Boland <michiel@boland.org>
+
+# panic: pmap_remove_all: page 0xc491f000 is fictitious
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+odir=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > mmap.c
+cc -o mmap -Wall mmap.c
+rm -f mmap.c
+
+./mmap
+rm -f ./mmap
+exit
+
+EOF
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+
+static const off_t map_address = 0xa0000;
+static const size_t map_size = 0x1000;
+
+static int testit(int fd)
+{
+        void *p;
+        int rv;
+
+        p = mmap(NULL, 2 * map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
+                  map_address);
+        if (p == MAP_FAILED) {
+                perror("mmap");
+                return -1;
+        }
+        rv = *(char *) p;
+        if (munmap(p, map_size) == -1) {
+                perror("munmap");
+                return -1;
+        }
+        return rv;
+}
+
+int main(void)
+{
+        int fd, rv;
+
+        fd = open("/dev/mem", O_RDWR);
+        if (fd == -1) {
+                perror("open");
+                return 1;
+        }
+        rv = testit(fd);
+        close(fd);
+        return rv;
+}
diff --git a/test/stress/stress2/misc/mmap2.sh b/test/stress/stress2/misc/mmap2.sh
new file mode 100755 (executable)
index 0000000..7ece8ab
--- /dev/null
@@ -0,0 +1,176 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+#   Stress mmap by having at most 100 threads mapping random areas within
+#   a 100 Mb range.
+
+# Test scenario by kib@
+
+odir=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > mmap2.c
+cc -o mmap2 -Wall mmap2.c -lpthread
+rm -f mmap2.c
+
+for i in `jot 10`; do
+       ./mmap2
+done
+rm -f ./mmap2
+exit
+
+EOF
+#include <sys/types.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <sys/mman.h>
+#include <sys/param.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#define THREADS 100
+#define STARTADDR 0x50000000U
+#define ADRSPACE  0x06400000U /* 100 Mb */
+
+static void
+work(int nr)
+{
+       int fd, m;
+       void *p;
+       size_t left, len;
+       char path[128];
+
+       p = (void *)STARTADDR + trunc_page(arc4random() % ADRSPACE);
+       left = ADRSPACE - (size_t)p + STARTADDR;
+       len = trunc_page(arc4random() % left) + PAGE_SIZE;
+       fd = -1;
+
+       if (arc4random() % 100 < 90)
+               sprintf(path, "/tmp/mmap.%06d.%04d", getpid(), nr);
+       else
+               sprintf(path, "/dev/zero");
+       if (arc4random() % 2 == 0) {
+               if ((fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0622)) == -1)
+                       err(1,"open()");
+               if (ftruncate(fd, len) == -1)
+                       err(1, "ftruncate");
+               if (arc4random() % 2 == 0) {
+                       if ((p = mmap(p, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) ==
+                                       MAP_FAILED) {
+                               if (errno == ENOMEM)
+                                       return;
+                               err(1, "mmap()");
+                       }
+               } else {
+                       if ((p = mmap(p, len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0)) ==
+                                       MAP_FAILED) {
+                               if (errno == ENOMEM)
+                                       return;
+                               err(1, "mmap()");
+                       }
+               }
+               if (fd > 0 && strcmp(path, "/dev/zero"))
+                       if (unlink(path) == -1)
+                               err(1, "unlink(%s)", path);
+       } else {
+               if ((p = mmap(p, len, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0)) == MAP_FAILED) {
+                       if (errno == ENOMEM)
+                               return;
+                       err(1, "mmap()");
+               }
+               strcpy(path, "anon");
+       }
+#if 0
+       printf("nr = %d, %-14s, start = %p, end = %p, len = 0x%08x, (%5d pages)\n",
+               nr, path, p, p + len, len, len>>PAGE_SHIFT);
+#endif
+
+       *(int *)p = 1;
+
+       if (arc4random() % 2 == 0) {
+               m = arc4random() % 10;
+               if (madvise(p, len, m) == -1)
+                       warn("madvise(%p, %d, %d)", p, len, m);
+       }
+       if (arc4random() %2 == 0)
+               if (mprotect(p, trunc_page(arc4random() % len), PROT_READ) == -1 )
+                       err(1, "mprotect failed with error:");
+       if (arc4random() % 2 == 0) {
+               if (arc4random() %2 == 0) {
+                       if (msync(p, 0, MS_SYNC) == -1)
+                               err(1, "msync(%p)", p);
+               } else {
+                       if (msync(p, 0, MS_INVALIDATE) == -1)
+                               err(1, "msync(%p)", p);
+               }
+       }
+       if (munmap(p, len) == -1)
+               err(1, "munmap(%p)", p);
+       close(fd);
+}
+
+void *
+thr(void *arg)
+{
+       int i;
+
+       for (i = 0; i < 512; i++) {
+               work(*(int *)arg);
+       }
+       return (0);
+}
+
+int
+main(int argc, char **argv)
+{
+       pthread_t threads[THREADS];
+       int nr[THREADS];
+       int i, n, r;
+
+//     printf("Address start 0x%x, address end 0x%x, pages %d\n",
+//             STARTADDR, STARTADDR + ADRSPACE, ADRSPACE>>PAGE_SHIFT);
+       n = arc4random() % THREADS + 1;
+       for (i = 0; i < n; i++) {
+               nr[i] = i;
+               if ((r = pthread_create(&threads[i], NULL, thr, (void *)&nr[i])) != 0)
+                       err(1, "pthread_create(): %s\n", strerror(r));
+       }
+
+       for (i = 0; i < n; i++) {
+               if (pthread_join(threads[i], NULL) != 0)
+                       err(1, "pthread_join(%d)", i);
+       }
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/mmap3.sh b/test/stress/stress2/misc/mmap3.sh
new file mode 100755 (executable)
index 0000000..cb7c7c3
--- /dev/null
@@ -0,0 +1,159 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Variation of mmap2.sh with focus on random arguments for mprotect()
+
+odir=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > mmap3.c
+cc -o mmap3 -Wall mmap3.c -lpthread
+rm -f mmap3.c
+
+for i in `jot 20`; do
+       ./mmap3
+done
+for i in `jot 100`; do
+       ./mmap3 random
+done
+rm -f mmap3 mmap3.core /tmp/mmap.0*
+exit
+
+EOF
+/*
+   Stress mmap by having max 18 threads mapping random areas within
+   a 100 Mb range.
+ */
+#include <sys/types.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <sys/mman.h>
+#include <sys/param.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#define THREADS 100
+#define STARTADDR 0x50000000U
+#define ADRSPACE  0x06400000U /* 100 Mb */
+
+static int
+ra;
+
+void
+trash(void *p)
+{
+       mprotect(p, 0x570e3d38, 0x2c8fd54f);
+
+       if (ra) {
+               madvise((void *)arc4random(), arc4random(), arc4random());
+               mprotect((void *)arc4random(), arc4random(), arc4random());
+               msync((void *)arc4random(), arc4random(), arc4random());
+       }
+
+}
+
+void
+work(int nr)
+{
+       int fd, m;
+       void *p;
+       size_t len;
+       char path[128];
+
+       p = (void *)STARTADDR;
+       len = ADRSPACE;
+
+       sprintf(path, "/tmp/mmap.%06d.%04d", getpid(), nr);
+       if ((fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0622)) == -1)
+               err(1,"open()");
+       if (ftruncate(fd, len) == -1)
+               err(1, "ftruncate");
+       if ((p = mmap(p, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) ==
+                       MAP_FAILED) {
+               if (errno == ENOMEM)
+                       return;
+               err(1, "mmap()");
+       }
+       if (unlink(path) == -1)
+               err(1, "unlink(%s)", path);
+
+       trash(p);
+
+       m = arc4random() % 10;
+       if (madvise(p, len, m) == -1)
+               warn("madvise(%p, %d, %d)", p, len, m);
+       if (mprotect(p, trunc_page(arc4random() % len), PROT_READ) == -1 )
+               err(1, "mprotect failed with error:");
+       if (msync(p, 0, MS_SYNC) == -1)
+               err(1, "msync(%p)", p);
+       if (munmap(p, len) == -1)
+               err(1, "munmap(%p)", p);
+       close(fd);
+}
+
+void *
+thr(void *arg)
+{
+       int i;
+
+       for (i = 0; i < 512; i++) {
+               work(*(int *)arg);
+       }
+       return (0);
+}
+
+int
+main(int argc, char **argv)
+{
+       pthread_t threads[THREADS];
+       int nr[THREADS];
+       int i, n, r;
+
+       n  = arc4random() % 14 + 5;
+       ra = argc != 1;
+//     printf("Address start 0x%x, address end 0x%x, pages %d, n %d\n",
+//             STARTADDR, STARTADDR + ADRSPACE, ADRSPACE>>PAGE_SHIFT, n);
+       for (i = 0; i < n; i++) {
+               nr[i] = i;
+               if ((r = pthread_create(&threads[i], NULL, thr, (void *)&nr[i])) != 0)
+                       err(1, "pthread_create(): %s\n", strerror(r));
+       }
+
+       for (i = 0; i < n; i++) {
+               if (pthread_join(threads[i], NULL) != 0)
+                       err(1, "pthread_join(%d)", i);
+       }
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/mmap4.sh b/test/stress/stress2/misc/mmap4.sh
new file mode 100755 (executable)
index 0000000..fc35d23
--- /dev/null
@@ -0,0 +1,118 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2010 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test overcommit of the file system capacity
+# Causes panic: 1 vncache entries remaining
+
+# Scanario by kib@
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+here=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $here/$0 > mmap4.c
+cc -o mmap4 -Wall -O2 mmap4.c
+rm -f mmap4.c
+
+mount | grep -q "$mntpoint" && umount $mntpoint
+mdconfig -l | grep -q $mdstart &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t swap -s 40m -u $mdstart
+bsdlabel -w md${mdstart} auto
+
+newfs -U md${mdstart}${part} > /dev/null
+mount /dev/md${mdstart}${part} $mntpoint
+
+/tmp/mmap4 /$mntpoint/file
+ls -lh $mntpoint
+df -h
+
+cd $here
+rm -f /tmp/mmap4
+
+while mount | grep -q $mntpoint; do
+       sync;sync;sync
+       sleep 1
+       umount $mntpoint
+done
+
+mdconfig -d -u $mdstart
+exit 0
+EOF
+#include <sys/types.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/param.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#define STARTADDR 0x0U
+#define ADRSPACE  0x06400000U /* 100 Mb */
+
+int
+main(int argc, char **argv)
+{
+       int fd, ps;
+       void *p;
+       size_t len;
+       char *c, *path;
+
+       p = (void *)STARTADDR;
+       len = ADRSPACE;
+
+       path = argv[1];
+       if ((fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0622)) == -1)
+               err(1,"open()");
+       if (ftruncate(fd, len) == -1)
+               err(1, "ftruncate");
+       if ((p = mmap(p, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) ==
+                       MAP_FAILED) {
+               if (errno == ENOMEM)
+                       return (1);
+               err(1, "mmap(1)");
+       }
+
+       c = p;
+       ps = getpagesize();
+       for (c = p; (void *)c < p + len; c += ps) {
+               *c = 1;
+       }
+
+       close(fd);
+
+       return (0);
+}
diff --git a/test/stress/stress2/misc/mount.sh b/test/stress/stress2/misc/mount.sh
new file mode 100755 (executable)
index 0000000..1057623
--- /dev/null
@@ -0,0 +1,76 @@
+#!/bin/sh
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Mount regression test
+
+# panic: vm_fault: fault on nofault entry, addr: deadc000
+# cpuid = 1
+# KDB: enter: panic
+# [thread pid 69453 tid 100388 ]
+# Stopped at      kdb_enter+0x2b: nop
+# db> where
+# Tracing pid 69453 tid 100388 td 0xc4b5c1b0
+# kdb_enter(c091d9db) at kdb_enter+0x2b
+# panic(c0938fa0,deadc000,e6b44834,c06c650e,c0a57d20,...) at panic+0x14b
+# vm_fault(c1869000,deadc000,1,0) at vm_fault+0x1e0
+# trap_pfault(e6b4499c,0,deadc112) at trap_pfault+0x137
+# trap(8,c0910028,28,deadc0de,deadc0de,...) at trap+0x3f5
+# calltrap() at calltrap+0x5
+# --- trap 0xc, eip = 0xc0667def, esp = 0xe6b449dc, ebp = 0xe6b44a00 ---
+# g_io_request(c66d6bdc,c4a1d840,d7c99940,d7c99940,e6b44a34,...) at g_io_request+0x5f
+# g_vfs_strategy(c40624c4,d7c99940,d7c99940,0,c4e16dec,...) at g_vfs_strategy+0x49
+# ffs_geom_strategy(c40624c4,d7c99940,4ba0,0,c09dad00,...) at ffs_geom_strategy+0x141
+# ufs_strategy(e6b44a7c) at ufs_strategy+0xb5
+# VOP_STRATEGY_APV(c09da7c0,e6b44a7c) at VOP_STRATEGY_APV+0x95
+# bufstrategy(c50d2be0,d7c99940) at bufstrategy+0x55
+# breadn(c50d2b2c,0,0,1000,0,...) at breadn+0xf7
+# bread(c50d2b2c,0,0,1000,0,...) at bread+0x20
+# ffs_read(e6b44bb0) at ffs_read+0x23f
+# VOP_READ_APV(c09da7c0,e6b44bb0) at VOP_READ_APV+0x7e
+# ufs_readdir(e6b44c38) at ufs_readdir+0xd1
+# VOP_READDIR_APV(c09da7c0,e6b44c38) at VOP_READDIR_APV+0x7e
+# getdirentries(c4b5c1b0,e6b44d04) at getdirentries+0x13f
+# syscall(3b,3b,3b,8240160,1,...) at syscall+0x256
+
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+mount | grep /tmp && umount -f /tmp
+
+# The test:
+
+mount -r /tmp
+mount -r /tmp
+umount /tmp
+
+ls -lR /tmp > /dev/null        # panic
+
+# End of test
+
+mount /tmp
diff --git a/test/stress/stress2/misc/mount2.sh b/test/stress/stress2/misc/mount2.sh
new file mode 100755 (executable)
index 0000000..2e76c9f
--- /dev/null
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Stress test by performing parallel calls to mount and umount. Alternate
+# between forced and non-forced unmounts
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+mounts=15      # Number of parallel scripts
+D=$diskimage
+
+if [ $# -eq 0 ]; then
+       for i in `jot $mounts`; do
+               m=$(( i + mdstart - 1 ))
+               [ ! -d ${mntpoint}$m ] && mkdir ${mntpoint}$m
+               mount | grep "${mntpoint}" | grep -q md$m && umount ${mntpoint}$m
+               mdconfig -l | grep -q md$m &&  mdconfig -d -u $m
+
+               dd if=/dev/zero of=$D$m bs=1m count=1 > /dev/null 2>&1
+               mdconfig -a -t vnode -f $D$m -u $m
+               bsdlabel -w md$m auto
+               newfs md${m}${part} > /dev/null 2>&1
+       done
+
+       # start the parallel tests
+       for i in `jot $mounts`; do
+               m=$(( i + mdstart - 1 ))
+               ./$0 $m &
+       done
+
+
+       for i in `jot $mounts`; do
+               wait
+       done
+
+       for i in `jot $mounts`; do
+               m=$(( i + mdstart - 1 ))
+               mdconfig -d -u $m
+               rm -f $D$m
+       done
+
+else
+       # The test: Parallel mount and unmounts
+       for i in `jot 1024`; do
+               m=$1
+               opt=`[ $(( m % 2 )) -eq 0 ] && echo -f`
+               mount /dev/md${m}${part} ${mntpoint}$m
+               while mount | grep -q ${mntpoint}$m; do
+                       umount $opt ${mntpoint}$m > /dev/null 2>&1
+               done
+       done
+fi
diff --git a/test/stress/stress2/misc/mountro.sh b/test/stress/stress2/misc/mountro.sh
new file mode 100755 (executable)
index 0000000..6184bbe
--- /dev/null
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+
+. ../default.cfg
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+D=$diskimage
+dede $D 1m 128 || exit
+
+mount | grep "$mntpoint"    | grep -q /md  && umount -f ${mntpoint}
+mdconfig -l | grep -q ${mdstart}  &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t vnode -f $D -u $mdstart
+
+bsdlabel -w md${mdstart} auto
+newfs -U md${mdstart}${part} > /dev/null 2>&1
+mount /dev/md${mdstart}${part} $mntpoint
+
+mkdir ${mntpoint}/stressX
+chmod 777 ${mntpoint}/stressX
+
+export RUNDIR=${mntpoint}/stressX
+export runRUNTIME=4m
+(cd /home/pho/stress2; ./run.sh disk.cfg) &
+sleep 30
+
+for i in `jot 10`; do
+       mount $mntpoint -u -o ro > /dev/null 2>&1
+       sleep 3
+       mount $mntpoint -u -o rw > /dev/null 2>&1
+       sleep 3
+done
+df -i $mntpoint
+
+umount -f $mntpoint    > /dev/null 2>&1
+mdconfig -d -u $mdstart
+rm -f $D
+kill `ps | grep run.sh | grep -v grep | awk '{print $1}'`
diff --git a/test/stress/stress2/misc/mountro2.sh b/test/stress/stress2/misc/mountro2.sh
new file mode 100755 (executable)
index 0000000..54b33f4
--- /dev/null
@@ -0,0 +1,57 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test scenario by Matthew D. Fuller <fullermd@over-yonder.net>
+
+
+. ../default.cfg
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+D=$diskimage
+dede $D 1m 20 || exit
+
+mount | grep "$mntpoint"    | grep -q /md  && umount -f ${mntpoint}
+mdconfig -l | grep -q ${mdstart}  &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t vnode -f $D -u $mdstart
+
+bsdlabel -w md${mdstart} auto
+newfs -U md${mdstart}${part} > /dev/null 2>&1
+mount /dev/md${mdstart}${part} $mntpoint
+
+mtree -deU -f /etc/mtree/BSD.usr.dist -p $mntpoint/ >> /dev/null
+sync ; sync ; sync
+
+rm -rf $mntpoint/*
+mount -u -o ro $mntpoint
+
+umount -f $mntpoint    > /dev/null 2>&1
+mdconfig -d -u $mdstart
diff --git a/test/stress/stress2/misc/mountro3.sh b/test/stress/stress2/misc/mountro3.sh
new file mode 100755 (executable)
index 0000000..dd41d15
--- /dev/null
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test scenario by barbara <barbara.xxx1975@libero.it>
+# kern/121809: unable to umount
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+
+D=$diskimage
+dede $D 1m 64 || exit 1
+
+mount | grep "$mntpoint" | grep md${mdstart}${part} > /dev/null && umount $mntpoint
+mdconfig -l | grep md${mdstart} > /dev/null &&  mdconfig -d -u ${mdstart}
+
+mdconfig -a -t vnode -f $D -u ${mdstart}
+bsdlabel -w md${mdstart} auto
+newfs -U md${mdstart}${part} > /dev/null 2>&1
+
+mount /dev/md${mdstart}${part} $mntpoint
+touch $mntpoint/file
+umount $mntpoint
+
+mount /dev/md${mdstart}${part} $mntpoint
+rm $mntpoint/file
+mount -u -o ro $mntpoint       # Should fail with "Device busy"
+
+umount $mntpoint
+mdconfig -d -u ${mdstart}
+rm -f $D
diff --git a/test/stress/stress2/misc/msdos.sh b/test/stress/stress2/misc/msdos.sh
new file mode 100755 (executable)
index 0000000..d03c612
--- /dev/null
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2008-2010 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+# LOR seen. Fixed by r204467.
+
+. ../default.cfg
+
+mount | grep "$mntpoint" | grep -q md$mdstart && umount -f ${mntpoint}
+mdconfig -l | grep -q ${mdstart} &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t swap -s 1g -u $mdstart
+bsdlabel -w md${mdstart} auto
+newfs_msdos /dev/md${mdstart}a > /dev/null
+mount -t msdosfs /dev/md${mdstart}a $mntpoint
+
+export RUNDIR=$mntpoint/stressX
+export runRUNTIME=10m            # Run tests for 10 minutes
+(cd ..; ./run.sh disk.cfg)
+
+while mount | grep "$mntpoint" | grep -q md$mdstart; do
+       umount $mntpoint || sleep 1
+done
+fsck -t msdosfs -y /dev/md${mdstart}a
+mdconfig -d -u $mdstart
diff --git a/test/stress/stress2/misc/msdos2.sh b/test/stress/stress2/misc/msdos2.sh
new file mode 100755 (executable)
index 0000000..aea3453
--- /dev/null
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2010 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# panic: __lockmgr_args: recursing on non recursive lockmgr devfs @ ../../../kern/vfs_subr.c:2204
+# Scenario by kib@
+
+[ `id -u` -ne 0 ] && echo "Must be root!" && exit 1
+
+
+. ../default.cfg
+
+mount | grep "$mntpoint" | grep -q md$mdstart && umount -f $mntpoint
+mdconfig -l | grep -q $mdstart &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t swap -s 1g -u $mdstart
+bsdlabel -w md${mdstart} auto
+newfs_msdos /dev/md${mdstart}a > /dev/null
+mount -t msdosfs /dev/md${mdstart}a $mntpoint
+
+u=$((mdstart + 1))
+mdconfig -l | grep -q $u &&  mdconfig -d -u $u
+mdconfig -a -t swap -s 1g -u $u
+bsdlabel -w md${u} auto
+newfs_msdos /dev/md${u}a > /dev/null
+mount -u /dev/md${u}a $mntpoint > /dev/null 2>&1 # panic
+
+ls $mntpoint > /dev/null
+
+while mount | grep "$mntpoint" | grep -q md$mdstart; do
+       umount $mntpoint || sleep 1
+done
+mdconfig -d -u $mdstart
+mdconfig -d -u $u
diff --git a/test/stress/stress2/misc/msdos3.sh b/test/stress/stress2/misc/msdos3.sh
new file mode 100755 (executable)
index 0000000..bc3cd52
--- /dev/null
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2010 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Page fault seen
+# Scenario by kib@
+
+[ `id -u` -ne 0 ] && echo "Must be root!" && exit 1
+
+
+. ../default.cfg
+
+mount | grep "$mntpoint" | grep -q md$mdstart && umount -f $mntpoint
+mdconfig -l | grep -q $mdstart &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t swap -s 1g -u $mdstart
+bsdlabel -w md${mdstart} auto
+newfs_msdos /dev/md${mdstart}a > /dev/null
+
+mount -t msdosfs /dev/md${mdstart}a $mntpoint
+mount -t msdosfs /dev/md${mdstart}a $mntpoint
+
+ls $mntpoint > /dev/null
+
+while mount | grep "$mntpoint" | grep -q md$mdstart; do
+       umount $mntpoint || sleep 1
+done
+mdconfig -d -u $mdstart
diff --git a/test/stress/stress2/misc/msdos4.sh b/test/stress/stress2/misc/msdos4.sh
new file mode 100755 (executable)
index 0000000..9b1b19f
--- /dev/null
@@ -0,0 +1,65 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2010 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+[ `id -u` -ne 0 ] && echo "Must be root!" && exit 1
+
+# "panic: leaf should be empty" seen
+
+. ../default.cfg
+
+mount | grep "$mntpoint" | grep -q md$mdstart && umount -f ${mntpoint}
+mdconfig -l | grep -q ${mdstart} &&  mdconfig -d -u $mdstart
+
+mdconfig -a -t swap -s 1g -u $mdstart
+bsdlabel -w md${mdstart} auto
+newfs_msdos /dev/md${mdstart}a > /dev/null
+mount -t msdosfs /dev/md${mdstart}a $mntpoint
+
+export RUNDIR=$mntpoint/stressX
+export runRUNTIME=20m
+export TESTPROGS='
+testcases/lockf2/lockf2
+testcases/openat/openat
+testcases/rw/rw
+testcases/fts/fts
+testcases/lockf/lockf
+testcases/creat/creat
+testcases/mkdir/mkdir
+testcases/rename/rename
+testcases/swap/swap
+'
+
+(cd ..; ./run.sh)
+
+while mount | grep "$mntpoint" | grep -q md$mdstart; do
+       umount $mntpoint || sleep 1
+done
+fsck -t msdosfs -y /dev/md${mdstart}a
+mdconfig -d -u $mdstart
diff --git a/test/stress/stress2/misc/namecache.sh b/test/stress/stress2/misc/namecache.sh
new file mode 100755 (executable)
index 0000000..644d395
--- /dev/null
@@ -0,0 +1,212 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2009 Peter Holm <pho@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Test case for vfs.lookup_shared=1 that shows possible name cache
+# inconsistency:
+
+# $ ls -l /tmp/file.05015?
+# ls: /tmp/file.050150: No such file or directory
+# $ fsdb -r /dev/ad4s1e
+# ** /dev/ad4s1e (NO WRITE)
+# Examining file system `/dev/ad4s1e'
+# Last Mounted on /tmp
+# current inode: directory
+# I=2 MODE=41777 SIZE=5120
+#         BTIME=May  7 05:54:47 2006 [0 nsec]
+#         MTIME=Apr  2 11:27:36 2009 [0 nsec]
+#         CTIME=Apr  2 11:27:36 2009 [0 nsec]
+#         ATIME=Apr  2 12:00:30 2009 [0 nsec]
+# OWNER=root GRP=wheel LINKCNT=35 FLAGS=0 BLKCNT=c GEN=65f71df4
+# fsdb (inum: 2)> lookup file.050150
+# component `file.050150': current inode: regular file
+# I=198 MODE=100600 SIZE=0
+#         BTIME=Apr  2 11:24:33 2009 [0 nsec]
+#         MTIME=Apr  2 11:24:33 2009 [0 nsec]
+#         CTIME=Apr  2 11:24:33 2009 [0 nsec]
+#         ATIME=Apr  2 11:24:33 2009 [0 nsec]
+# OWNER=pho GRP=wheel LINKCNT=1 FLAGS=0 BLKCNT=0 GEN=1deaab3a
+# fsdb (inum: 198)> quit
+# $
+
+# Consistency is restored by a umount + mount of the FS
+
+# Observations:
+#    No problems seen with vfs.lookup_shared=0.
+#    Does not fail in a "private" subdirectory
+
+. ../default.cfg
+
+odir=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > namecache.c
+cc -o namecache -Wall namecache.c
+rm -f namecache.c
+
+#dir=/tmp/namecache.dir        # No problems seen
+dir=/tmp
+[ -d $dir ] || mkdir -p $dir
+cd $dir
+
+for i in `jot 30`; do
+       for j in `jot 10`; do
+               /tmp/namecache &
+       done
+
+       for j in `jot 10`; do
+               wait
+       done
+done
+
+if ls -l ${dir}/file.0* 2>&1 | egrep "file.0[0-9]" | grep -q "No such file"; then
+       echo "ls -l ${dir}/file.0*"
+       ls -l ${dir}/file.0*
+fi
+
+rm -f /tmp/namecache # /${dir}/file.0*
+exit
+EOF
+/* Test scenario for possible name cache problem */
+
+#include <sys/types.h>
+#include <dirent.h>
+#include <err.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+static char path[MAXPATHLEN+1];
+static char buf[64 * 1024];
+
+void
+pm(void)
+{
+       int fd, n;
+       int space = sizeof(buf);
+       struct stat statb;
+       long base;
+       struct dirent *dp;
+       char *bp = buf;
+
+       if ((fd = open(".", O_RDONLY)) == -1)
+               err(1, "open(%s)", ".");
+
+       do {
+               if ((n = getdirentries(fd, bp, space, &base)) == -1)
+                       err(1, "getdirentries");
+               space = space - n;
+               bp   = bp + n;
+       } while (n != 0);
+       close(fd);
+
+       bp = buf;
+       dp = (struct dirent *)bp;
+       for (;;) {
+               if (strcmp(path, dp->d_name) == 0) {
+
+           &