Live migration does not work for SCSI Persistent Reservations acquired on scsi-block devices. This patch series migrates the reservation key and reservation type so that the destination QEMU can take over the persistent reservation with the PREEMPT service action upon live migration.
The approach involves snooping PERSISTENT RESERVE OUT replies and tracking the scsi-block device's current reservation key and reservation type. In most cases this involves no additional SCSI commands. This approach isn't perfect: if another machine modifies the reservation on the physical LUN, then QEMU's state becomes stale. Persistent reservations are inherently cooperative, so this is acceptable as long as real applications don't run into problems. I am also working on a test suite called pr-tests that runs sg_persist(8) commands across multiple machines in order to exercise various scenarios: https://gitlab.com/stefanha/pr-tests Stefan Hajnoczi (4): scsi: track SCSI reservation state for live migration scsi: generalize scsi_SG_IO_FROM_DEV() to scsi_SG_IO() scsi: add error reporting to scsi_SG_IO() scsi: save/load SCSI reservation state include/hw/scsi/scsi.h | 15 +- include/scsi/constants.h | 21 +++ hw/core/machine.c | 4 +- hw/scsi/scsi-bus.c | 3 + hw/scsi/scsi-disk.c | 53 +++++++- hw/scsi/scsi-generic.c | 286 +++++++++++++++++++++++++++++++++++++-- hw/scsi/trace-events | 2 + 7 files changed, 369 insertions(+), 15 deletions(-) -- 2.52.0
