DF-2990 / run.sh
#!/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 |