持久预留的块层支持¶
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。