DF-2832 / race_witness2.sh
#!/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" |