#!/bin/sh
# DF-5026 — A/B: original vs fixed sink pattern on the guest.
set -e
rm -rf /tmp/ab6; mkdir -p /tmp/ab6/orig /tmp/ab6/fixed
cp /tmp/df5026.c /tmp/ab6/orig/
cp /tmp/Makefile.df5026 /tmp/ab6/orig/Makefile
cp /tmp/df5026_fixed.c /tmp/ab6/fixed/df5026.c
cp /tmp/Makefile.df5026 /tmp/ab6/fixed/Makefile
cp /tmp/df5026_trigger.c /tmp/ab6/
cc -O -o /tmp/ab6/df5026_trigger /tmp/ab6/df5026_trigger.c
(cd /tmp/ab6/orig && make >/dev/null 2>&1)
(cd /tmp/ab6/fixed && make >/dev/null 2>&1)
echo "builds OK:"
ls -l /tmp/ab6/orig/df5026.ko /tmp/ab6/fixed/df5026.ko

echo "== ORIGINAL pattern: offline then read =="
kldload /tmp/ab6/orig/df5026.ko
sleep 1
D=/dev/df50260
/tmp/ab6/df5026_trigger offline $D
/tmp/ab6/df5026_trigger wedge $D > /tmp/ab6/w.out 2>&1 &
WPID=$!
sleep 2
echo "wedge pid: $WPID"
ps -o pid,stat,wchan -p $WPID || echo "(already gone)"
kill -9 $WPID 2>/dev/null || true
sleep 1
if ps -o pid,stat,wchan -p $WPID 2>/dev/null; then
	echo "SURVIVES SIGKILL (original pattern)"
fi
/tmp/ab6/df5026_trigger poke $D
sleep 1
ps -o pid,stat,wchan -p $WPID 2>/dev/null || echo "gone after poke (original pattern)"
cat /tmp/ab6/w.out
kldunload df5026

echo "== FIXED pattern: offline then read =="
kldload /tmp/ab6/fixed/df5026.ko
sleep 1
/tmp/ab6/df5026_trigger offline $D
/tmp/ab6/df5026_trigger wedge $D && echo "wedge returned immediately (fixed pattern)"
sleep 1
if ps ax | grep "df5026_trigger wedge" | grep -v grep >/dev/null; then
	echo "UNEXPECTED: wedge process still present (fixed)"
else
	echo "no wedge process remains (fixed pattern)"
fi
kldunload df5026
echo "== A/B complete, guest clean =="
