DragonFlyBSD Kernel Audit
DF-2832 / race_witness2.sh
← back to finding ↓ download raw
#!/bin/sh
# DF2832 witness race v2 (root, guest, witness-v2 kernel).
# Scopes the in-kernel park to the TEST mount's syncer ctx via
# debug.df2832_target so the root filesystem is unaffected.
ITER=${1:-10}
IMG=/root/h2img
MNT=/mnt/t

rm -f $IMG
dd if=/dev/zero of=$IMG bs=1m count=0 seek=512 >/dev/null 2>&1
vnconfig -u vn0 >/dev/null 2>&1
vnconfig -c -S 512m vn0 $IMG
newfs_hammer2 /dev/vn0 >/dev/null 2>&1
mkdir -p $MNT

sysctl vfs.hammer2.limit_dirty_chains=16 >/dev/null
sysctl vfs.hammer2.limit_dirty_inodes=4 >/dev/null

mount_hammer2 /dev/vn0 $MNT >/dev/null 2>&1 || { echo "mount failed"; exit 1; }
chmod 777 $MNT

# lock witness onto THIS mount's ctx (latest CREATE line)
CTX=$(dmesg | grep 'DF2832: CREATE' | tail -1 | sed 's/.*ctx=\([^ ]*\).*/\1/')
echo "test mount ctx = $CTX"
sysctl debug.df2832_target=$CTX

# unpriv respawner (churners hold no fds on the mount while stalled)
(
	end=$(( $(date +%s) + 3000 ))
	while [ $(date +%s) -lt $end ]; do
		n=$(pgrep -u nobody churn_open | wc -l)
		while [ $n -lt 6 ]; do
			su -m nobody -c "/tmp/df2832/churn_open /mnt/t 600 >&/dev/null &"
			n=$(( n + 1 ))
		done
		n=$(pgrep -u nobody dirty_writer | wc -l)
		while [ $n -lt 3 ]; do
			su -m nobody -c "/tmp/df2832/dirty_writer /mnt/t/b$n.dat 600 >&/dev/null &"
			n=$(( n + 1 ))
		done
		sleep 0.2
	done
) &
RESPAWNER=$!

n=0
while [ $n -lt $ITER ]; do
	echo "--- iteration $n ---"
	umount -f $MNT 2>&1 | head -1
	sleep 0.3
	mount_hammer2 /dev/vn0 $MNT >/dev/null 2>&1
	if [ $? -ne 0 ]; then
		echo "[$n] remount failed; waiting"
		sleep 2
		mount_hammer2 /dev/vn0 $MNT >/dev/null 2>&1 || echo "[$n] remount STILL failed"
	fi
	chmod 777 $MNT
	CTX=$(dmesg | grep 'DF2832: CREATE' | tail -1 | sed 's/.*ctx=\([^ ]*\).*/\1/')
	sysctl debug.df2832_target=$CTX >/dev/null
	sleep 1.5
	n=$(( n + 1 ))
done

kill $RESPAWNER 2>/dev/null
killall -u nobody churn_open >/dev/null 2>&1
sleep 1
echo "=== counters ==="
sysctl debug.df2832_starts debug.df2832_hits
echo "=== DF2832 lines ==="
dmesg | grep DF2832 | tail -30
umount -f $MNT >/dev/null 2>&1
vnconfig -u vn0 >/dev/null 2>&1
echo "race_witness2: done"