DragonFlyBSD Kernel Audit
DF-0823 / trigger_v2.sh
← back to finding ↓ download raw
#!/bin/sh
# DF-0823 trigger v2 — cleaner trigger without cleanup trap.
# Explicitly unmounts everything in the correct order.
# All state is left in place for post-mortem if the guest survives.

set -e

IMG_A=/tmp/h2a.img
IMG_B=/tmp/h2b.img
VN_A=vn0
VN_B=vn1
MNT_DATA_A=/mnt/h2a
MNT_DATA_B=/mnt/h2b
MNT_CLUSTER=/mnt/test
PFS_LABEL=testpfs
IMG_SIZE=256

echo "[1] Creating images and devices..."
dd if=/dev/zero of=${IMG_A} bs=1m count=${IMG_SIZE} 2>&1 | tail -1
dd if=/dev/zero of=${IMG_B} bs=1m count=${IMG_SIZE} 2>&1 | tail -1
vnconfig -c ${VN_A} ${IMG_A}
vnconfig -c ${VN_B} ${IMG_B}
newfs_hammer2 /dev/${VN_A} 2>&1 | tail -1
newfs_hammer2 /dev/${VN_B} 2>&1 | tail -1

echo "[2] Creating MASTER PFS on device A..."
mkdir -p ${MNT_DATA_A}
mount_hammer2 /dev/${VN_A}@DATA ${MNT_DATA_A}
hammer2 -s ${MNT_DATA_A} pfs-create ${PFS_LABEL} 2>&1

echo "[3] Mounting MASTER PFS (nchains=1)..."
mkdir -p ${MNT_CLUSTER}
mount_hammer2 /dev/${VN_A}@${PFS_LABEL} ${MNT_CLUSTER}

echo "[4] Getting clid..."
CLID=$(hammer2 -s ${MNT_CLUSTER} pfs-list 2>&1 | grep "${PFS_LABEL}" | awk '{print $2}')
echo "    clid=${CLID}"

echo "[5] Mounting device B and creating SLAVE PFS..."
mkdir -p ${MNT_DATA_B}
mount_hammer2 /dev/${VN_B}@DATA ${MNT_DATA_B}
hammer2 -t slave -u ${CLID} -s ${MNT_DATA_B} pfs-create ${PFS_LABEL} 2>&1

echo "[6] I/O to spin up XOP threads..."
ls -la ${MNT_CLUSTER}/ 2>&1 || true
echo "trigger" > ${MNT_CLUSTER}/testfile 2>&1 || true
sync

echo "[7] Unmounting device B @DATA (SLAVE chain stays)..."
umount ${MNT_DATA_B}

echo "[8] Unmounting cluster PFS (cleanup: nchains=2, pfs_nmasters=1)..."
umount ${MNT_CLUSTER}

echo "[9] Unmounting device A @DATA..."
umount ${MNT_DATA_A}

echo "[10] Waiting 20s for any delayed orphan..."
sleep 20

echo "[SUCCESS] Guest survived — no panic (FIXED kernel)."
exit 0