1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- ..
- ======================================
- 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.
|