持久保留辅助程序协议

QEMU 的 SCSI 直通设备 scsi-block 和 scsi-generic 可将持久保留的实现委托给 外部程序,该程序通常有特权。持久保留可在共享存储中将块设备访问限制为特定发起端。

详细参考见 SCSI Primary Commands 标准的 Reservations 部分, 以及 PERSISTENT RESERVE IN、PERSISTENT RESERVE OUT 命令。

本文描述 QEMU 的 pr-manager-helper 对象与外部程序之间的套接字协议。

连接与初始化

套接字传输的全部数据均为大端。

连接后,辅助程序先写四字节 supported_features,开始简单的功能协商。 QEMU 读取后,写回四字节 requested_features,表示希望启用的功能。

requested_features 的某位为 1、supported_features 对应位为 0 时, 辅助程序不支持该功能,连接关闭。 反过来则允许,即请求位为 0、支持位为 1 时不启用该功能。

目前没有定义功能,双方始终写入四个零字节。

命令格式

同一套接字上不能并发发送多个命令,但可建立多个连接, 为一个或多个文件描述符发送多个命令。

命令包含请求与响应。请求为 16 字节 SCSI CDB, 必须通过辅助数据随 CDB 一同传入文件描述符。

CDB 有以下限制:

  • 首字节命令必须为 0x5E(PERSISTENT RESERVE IN)或 0x5F(PERSISTENT RESERVE OUT)。

  • IN 的分配长度位于 CDB 字节 7–8,OUT 的参数列表长度位于字节 5–8, 均限制为 8 KiB。

OUT 的参数列表紧随 CDB,其长度由 CDB 本身提供。

响应结构:

  • 4 字节 SCSI 状态。

  • 4 字节载荷大小,仅 IN 且状态为 0x00(GOOD)时可能非零。

  • 96 字节 SCSI sense 数据。

  • 大小非零时,随后为载荷。

为简化协议,始终发送 sense 数据,尽管仅在 CHECK CONDITION(0x02)时有效。

载荷大小始终不超过 IN 命令 CDB 指定的分配长度。

违反协议时,辅助程序关闭套接字。