I have a xen system with images on zfs, and have also been able to boot GENERIC instead of xen, and then run qemu, using the same image zvols.
from my qemu script IMG=/dev/zvol/rdsk/tank0/vm/n9-amd64 /usr/pkg/bin/qemu-system-x86_64 \ -m 3000 \ -vnc 127.0.0.1:${vnc_port} \ -nographic \ -drive format=raw,file=${IMG},if=none,id=hd0 \ -device virtio-blk-pci,drive=hd0 \ -netdev tap,id=${IFACE},ifname=${IFACE},script=no \ -device virtio-net-pci,netdev=${IFACE},mac=${MAC} and $ zfs get all tank0/vm/n9-amd64 tank0/vm/n9-amd64 volblocksize 8K - I am fuzzy on the blocksize issues, and haven't tried to do anything special. My pool is on a disklabel partition on a 1T ssd, with the partition and zvol created: 2021-02-11.19:27:50 zpool create pool1 /dev/wd0f 2023-07-08.08:54:25 zfs create -p -V 32G tank0/vm/n9-amd64 according to `zpool history`. All of my zvols are the volblocksize 8K.