Empty barriers are the mechanism now used to request block device flushes.
After the block layer changed, we had no flushing support through dm devices for a long time as the new method was tricky for us to use. Eventually we worked around the problems and the solution is mostly in place, as you have discovered.
You should think about whether you're limiting the applicability/usefulness of your software if you don't also implement support for empty barriers in virtio_blk.
Empty barriers are the mechanism now used to request block device flushes.
After the block layer changed, we had no flushing support through dm devices for a long time as the new method was tricky for us to use. Eventually we worked around the problems and the solution is mostly in place, as you have discovered.
You should think about whether you're limiting the applicability/ usefulness of your software if you don't also implement support for empty barriers in virtio_blk.