DragonFlyBSD Kernel Audit
DF-2832 / race_witness3.sh
← back to finding ↓ download raw
#!/bin/sh
# DF2832 witness race v3 (root, guest, witness-v3 kernel).
# The in-kernel park auto-skips the root fs; unpriv writers/churners on the
# TEST hammer2 mount drive trigger_syncer*() stalls while umount -f/mount
# cycles tear the syncer ctx down.
ITER=${1:-10}
IMG=/root/h2img
MNT=/mnt/t
B=/usr/local/df2832

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

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

n=0
while [ $n -lt $ITER ]; do
	echo "--- iteration $n (starts=$(sysctl -n debug.df2832_starts) hits=$(sysctl -n debug.df2832_hits)) ---"
	umount -f $MNT 2>&1 | head -1
	sleep 0.3
	if ! mount_hammer2 /dev/vn0 $MNT >/dev/null 2>&1; then
		echo "[$n] remount failed; retry"
		sleep 2
		mount_hammer2 /dev/vn0 $MNT >/dev/null 2>&1 || echo "[$n] remount STILL failed"
	fi
	chmod 777 $MNT
	sleep 1.5
	n=$(( n + 1 ))
done

kill $RESPAWNER 2>/dev/null
killall -u nobody churn_open dirty_writer >/dev/null 2>&1
sleep 1
echo "=== counters ==="
sysctl debug.df2832_starts debug.df2832_hits
echo "=== HIT lines ==="
dmesg | grep "DF2832: HIT" | tail -20
echo "=== last teardown lines ==="
dmesg | grep "thr_stop FREE" | tail -3
umount -f $MNT >/dev/null 2>&1
vnconfig -u vn0 >/dev/null 2>&1
echo "race_witness3: done"