持久预留的块层支持

Linux 内核支持一个用户空间接口,用于简化持久预留,这些预留映射到支持这些预留的块设备(如 SCSI)。持久预留允许在共享存储设置中限制对特定发起者的块设备的访问。

本文档概述了支持的 ioctl 命令。有关更详细的参考,请参阅 SCSI 主命令标准,特别是关于预留的部分以及“PERSISTENT RESERVE IN”和“PERSISTENT RESERVE OUT”命令。

所有实现都应确保预留在断电后仍然存在,并覆盖多路径环境中的所有连接。这些行为在 SPC 中是可选的,但将由 Linux 自动应用。

支持以下类型的预留:

  • PR_WRITE_EXCLUSIVE

    只有拥有预留的发起者才能写入设备。任何发起者都可以从设备读取。

  • PR_EXCLUSIVE_ACCESS

    只有拥有预留的发起者才能访问设备。

  • PR_WRITE_EXCLUSIVE_REG_ONLY

    只有具有已注册密钥的发起者才能写入设备,任何发起者都可以从设备读取。

  • PR_EXCLUSIVE_ACCESS_REG_ONLY

    只有具有已注册密钥的发起者才能访问设备。

  • PR_WRITE_EXCLUSIVE_ALL_REGS

    只有具有已注册密钥的发起者才能写入设备,任何发起者都可以从设备读取。所有具有已注册密钥的发起者都被视为预留持有者。如果您想使用此类型,请参考 SPC 规范中关于预留持有者的含义。

  • PR_EXCLUSIVE_ACCESS_ALL_REGS

    只有具有已注册密钥的发起者才能访问设备。所有具有已注册密钥的发起者都被视为预留持有者。如果您想使用此类型,请参考 SPC 规范中关于预留持有者的含义。

支持以下 ioctl:

1. IOC_PR_REGISTER

如果 new_key 参数为非空,则此 ioctl 命令注册新的预留。如果不存在现有预留,则 old_key 必须为零,如果应替换现有预留,则 old_key 必须包含旧的预留密钥。

如果 new_key 参数为 0,则它将注销 old_key 中传递的现有预留。

2. IOC_PR_RESERVE

此 ioctl 命令预留设备,从而根据 type 参数限制其他设备的访问。key 参数必须是由 IOC_PR_REGISTER、IOC_PR_REGISTER_IGNORE、IOC_PR_PREEMPT 或 IOC_PR_PREEMPT_ABORT 命令获取的设备的现有预留密钥。

3. IOC_PR_RELEASE

此 ioctl 命令释放由 key 和 flags 指定的预留,从而删除由此隐含的任何访问限制。

4. IOC_PR_PREEMPT

此 ioctl 命令释放 old_key 引用的现有预留,并将其替换为预留密钥 new_key 的 type 类型的新预留。

5. IOC_PR_PREEMPT_ABORT

此 ioctl 命令的工作方式类似于 IOC_PR_PREEMPT,但它还会中止通过 old_key 标识的连接发送的任何未完成的命令。

6. IOC_PR_CLEAR

此 ioctl 命令注销 key 和向设备注册的任何其他预留密钥,并删除任何现有预留。

标志

所有 ioctl 都有一个标志字段。目前仅支持一个标志

  • PR_FL_IGNORE_KEY

    忽略现有预留密钥。这通常支持 IOC_PR_REGISTER,并且某些实现可能支持 IOC_PR_RESERVE 的标志。

对于所有未知的标志,内核将返回 -EOPNOTSUPP。