| .. |
| |
| ====================================== |
| 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) or 0x5F (PERSISTENT RESERVE OUT). |
| |
| - 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 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. |