| .. | |
| ====================================== | |
| Persistent reservation helper protocol | |
| ====================================== | |
| QEMU's SCSI passthrough devices, ``scsi-block`` and ``scsi-generic``, | |
| can delegate implementation of persistent reservations to an external | |
| (and typically privileged) program. Persistent Reservations allow | |
| restricting access to block devices to specific initiators in a shared | |
| storage setup. | |
| For a more detailed reference please refer to the SCSI Primary | |
| Commands standard, specifically the section on Reservations and the | |
| "PERSISTENT RESERVE IN" and "PERSISTENT RESERVE OUT" commands. | |
| This document describes the socket protocol used between QEMU's | |
| ``pr-manager-helper`` object and the external program. | |
| .. contents:: | |
| Connection and initialization | |
| ----------------------------- | |
| All data transmitted on the socket is big-endian. | |
| After connecting to the helper program's socket, the helper starts a simple | |
| feature negotiation process by writing four bytes corresponding to | |
| the features it exposes (``supported_features``). QEMU reads it, | |
| then writes four bytes corresponding to the desired features of the | |
| helper program (``requested_features``). | |
| If a bit is 1 in ``requested_features`` and 0 in ``supported_features``, | |
| the corresponding feature is not supported by the helper and the connection | |
| is closed. On the other hand, it is acceptable for a bit to be 0 in | |
| ``requested_features`` and 1 in ``supported_features``; in this case, | |
| the helper will not enable the feature. | |
| Right now no feature is defined, so the two parties always write four | |
| zero bytes. | |
| Command format | |
| -------------- | |
| It is invalid to send multiple commands concurrently on the same | |
| socket. It is however possible to connect multiple sockets to the | |
| helper and send multiple commands to the helper for one or more | |
| file descriptors. | |
| A command consists of a request and a response. A request consists | |
| of a 16-byte SCSI CDB. A file descriptor must be passed to the helper | |
| together with the SCSI CDB using ancillary data. | |
| The CDB has the following limitations: | |
| - the command (stored in the first byte) must be one of 0x5E | |
| (PERSISTENT RESERVE IN), 0x5F (PERSISTENT RESERVE OUT), or 0xFF (PR HELPER | |
| CLEANUP, see below). | |
| - the allocation length (stored in bytes 7-8 of the CDB for PERSISTENT | |
| RESERVE IN) or parameter list length (stored in bytes 5-8 of the CDB | |
| for PERSISTENT RESERVE OUT) is limited to 8 KiB. | |
| For PERSISTENT RESERVE OUT, the parameter list is sent right after the | |
| CDB. The length of the parameter list is taken from the CDB itself. | |
| The PR HELPER CLEANUP command is a vendor-specific command without a parameter | |
| list that has the following effect on Linux device-mapper multipath devices and | |
| otherwise has no effect. This command is intended for cleaning up the multipath | |
| device on the source host after live migration has completed successfully: | |
| 1. Sends "unsetprkey map <dm-target>" to multipathd. | |
| 2. Sends "unsetprstatus map <dm-target>" to multipathd. | |
| 3. Performs PERSISTENT RESERVE OUT with the REGISTER AND IGNORE EXISTING KEY | |
| service action containing zero values for the RESERVATION KEY and SERVICE | |
| ACTION RESERVATION KEY. | |
| The helper's reply has the following structure: | |
| - 4 bytes for the SCSI status | |
| - 4 bytes for the payload size (nonzero only for PERSISTENT RESERVE IN | |
| and only if the SCSI status is 0x00, i.e. GOOD) | |
| - 96 bytes for the SCSI sense data | |
| - if the size is nonzero, the payload follows | |
| The sense data is always sent to keep the protocol simple, even though | |
| it is only valid if the SCSI status is CHECK CONDITION (0x02). | |
| The payload size is always less than or equal to the allocation length | |
| specified in the CDB for the PERSISTENT RESERVE IN command. | |
| If the protocol is violated, the helper closes the socket. |