#!/bin/sh
# DF-2990 run: create a fresh softdep UFS filesystem on vn0, mount it,
# and hammer it with unprivileged parallel churn while watching for the
# newblk hash-chain race (panic: "lost block"/"Bad link"/"found block").
#
# usage: run.sh <secs> [img_mb]   (defaults: 900, 2048)
# run as root inside the DragonFly guest; churn executes as uid 1001.
set -e
SECS=${1:-900}
MB=${2:-2048}
IMG=/root/df2990.img
MNT=/mnt/df2990

echo "### uname: $(uname -a)  ncpu: $(sysctl -n hw.ncpu)"
umount $MNT 2>/dev/null || true
vnconfig -u vn0 2>/dev/null || true

echo "### create ${MB}MB image + attach vn0 + softdep newfs"
dd if=/dev/zero of=$IMG bs=1m count=$MB status=none
vnconfig -c vn0 $IMG
newfs -U /dev/vn0

echo "### mount (softdep comes from the FS_SOFTUPDATE superblock flag)"
mkdir -p $MNT
mount /dev/vn0 $MNT          # NOTE: '-o softdep' is NOT a DFly option
mount | grep $MNT
chmod 1777 $MNT

echo "### launch churn as an unprivileged user (maxx, uid 1001)"
ssh localhost "nohup /tmp/df2990_churn $MNT $SECS > /tmp/churn.out 2>&1 &" 2>/dev/null \
	|| su nobody -s /bin/sh -c "/tmp/df2990_churn $MNT $SECS" || true

sleep 5
echo "### churning for ${SECS}s; poll dmesg"
START=$(date +%s)
while [ $(( $(date +%s) - START )) -lt $SECS ]; do
	sleep 30
	if dmesg 2>/dev/null | grep -qiE "bad link|lost block|found block|panic"; then
		echo "!!! RACE MARKER / PANIC DETECTED"
		dmesg | grep -iE "bad link|lost block|found block|panic" | head
		break
	fi
	echo "--- t+$(($(date +%s) - START))s: no markers yet; $(df $MNT | tail -1)"
done
wait || true
echo "### final state"
dmesg | grep -iE "bad link|lost block|found block|panic" | head || echo "no panic markers"
uptime
